只有你足够强,别人才会和你讲道理。
文章: 278
浏览: 2,531,714
  • 博主:笨木头
  • 关注:Unity、Net Core、Blazor
  • 邮箱:musicvs@163.com
笨木头  2018-03-07 17:17     Unity3D,Game Framework     阅读(18350)     评论(37)
转载请注明,原文地址: http://www.benmutou.com/archives/2564
文章来源:笨木头与游戏开发
本文 Game Framework 版本:3.0.9

本文 Unity3D 版本:2017.3

更多GF教程和实例:https://github.com/mutouzdl/gameframework_demo.git

 
转载请注明,原文地址:http://www.benmutou.com/archives/2564 文章来源:笨木头与游戏开发
 

对于Demo2,可能写的有点乱,因为我没想到切换流程和场景是要涉及到多个知识点的,我的错。

这次我们简单一点,来演示一下如何用Game Framework框架加载UI,不涉及其他操作。

1.创建基础项目

请确保你已经阅读过Demo1和Demo2,或者你已经知道如何创建Game Framework空项目,以及切换流程的方式。

我们需要新建一个Demo3项目,并且把初始场景和菜单场景给创建好,文件列表如下:

Demo3:初始场景

Demo3_Menu:菜单场景

Demo3_ProcedureLaunch.cs:初始流程脚本

Demo3_ProcedureMenu.cs:菜单流程脚本

至于初始场景要把Game Framework的基础组件预制体拖到场景里这种事情我就不啰嗦了。

2.初始流程脚本

Demo3_ProcedureLaunch脚本的内容如下:

using System.Collections;

using System.Collections.Generic;

using GameFramework;

using GameFramework.Procedure;

using UnityEngine;

using UnityGameFramework.Runtime;

using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;

public class Demo3_ProcedureLaunch : ProcedureBase {

    protected override void OnEnter(ProcedureOwner procedureOwner)

    {

        base.OnEnter(procedureOwner);

        SceneComponent scene

            = UnityGameFramework.Runtime.GameEntry.GetComponent<SceneComponent>();

        // 切换场景

        scene.LoadScene("Demo3_Menu", this);

        // 切换流程

ChangeState<Demo3_ProcedureMenu>(procedureOwner);

    }

}

即,在一开始的时候就切换到菜单场景和菜单流程。

3.菜单流程脚本

Demo3_ProcedureMenu脚本内容如下:

using System.Collections;

using System.Collections.Generic;

using GameFramework;

using GameFramework.Procedure;

using UnityEngine;

using UnityGameFramework.Runtime;

using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;

public class Demo3_ProcedureMenu : ProcedureBase {

    protected override void OnEnter(ProcedureOwner procedureOwner)

    {

        base.OnEnter(procedureOwner);

        // 加载框架UI组件

        UIComponent UI

            = UnityGameFramework.Runtime.GameEntry.GetComponent<UIComponent>();

        // 加载UI

        UI.OpenUIForm("Assets/Demo3/UI_Menu.prefab", "DefaultGroup");

    }

}

这里就要稍微啰嗦一下了,UIComponent是Game Framework框架的基础组件,专门用于处理界面相关的逻辑。

比如我们现在要加载UI,就需要用到它的OpenIUIForm的函数。

函数的第一个参数需要的是UI预制体所在的路径,需要完整路径,从Assets目录开始。

函数的第二个参数需要的是UI所属的分组,比如不同的UI分组显示的层次会不一样,这里我们随便填一个"DefaultGroup"就好,应该没关系的吧,呵呵。(旁白:总感觉好随意啊!不是很靠谱的感觉)

4.UI_Menu.prefab预制体

UI_Menu是我们自己创建的预制体,怎么创建的,我就不说了,这个是Unity3D基础中的基础,如果连这个都不知道的话…(旁白:你大声说出来)

那我就稍微说两句吧,直接在Hierarchy视图里创建一个TextUI,然后调调文字,改改颜色,大家自己喜欢就好。

然后把它拖到Project视图,它就会变成一个蓝色的东西:



这个就是预制体了,Hierarchy视图里的那个UI就可以删掉了。

5.运行测试

在运行之前,记得把我们的流程给勾上,初始流程也要选上:



然后运行Demo3场景,你们会发现…(旁白:报错了!)

对,它报错了,说找不到UI什么的…

果然,UI分组的名称不能乱填呢,呵呵的(旁白:刀我已经买好了,大家说句话就行)

选中Demo3场景的Hierarchy视图里的UI组件,然后给它添加一个分组即可:



然后运行,应该能看到效果:



OK,已经看到我们的UI加载出来了,本次Demo完美结束。(旁白:等等!又报错了!)

那么,下一篇我们再演示点别的什么吧(旁白:别走!报错了!)

6.UI逻辑处理

好吧,果然逃不掉呢。

是的,又报了新的错误:Can not get UI form logic,意思是,无法获得能量,运行失败…才怪呢。是因为缺少UI的逻辑处理脚本了。

我们新建一个脚本,命名为Demo3_UIMenu.cs:

using GameFramework;

using UnityEngine;

using UnityGameFramework.Runtime;

public class Demo3_UIMenu : UIFormLogic {

}

对,就是这么简单,但是必须继承UIFormLogic,这个脚本是用于处理UI逻辑的。

然后把这个脚本拖到UI_Menu预制体上:



OK,真的没问题了。
37 条评论
  • 冥月深渊    2022-04-26 13:38:15

    从gameframework找过来的,看到大佬这么热心,爱了
    回复
    • 笨木头    2022-04-27 13:42:52

      😎
      回复
  • BaBiQL    2022-04-02 18:09:18

    Ecs和Game Framework,有区别吗,先学习哪个,有点麻大佬?
    回复
    • 笨木头    2022-04-07 08:14:49

      Game Framework是一个游戏框架,包括很多的功能(如场景切换、状态机、缓存等)。
      Unity的ECS更像是一种开发模式,具体介绍可以看看我这篇文章:http://www.benmutou.com/archives/2772

      这两者没什么关联的,你可以都学,也可以都不学
      回复
    • 笨木头    2022-04-07 08:14:33

      Game Framework是一个游戏框架,包括很多的功能(如场景切换、状态机、缓存等)。
      Unity的ECS更像是一种开发模式,具体介绍可以看看我这篇文章:http://www.benmutou.com/archives/2772

      这两者没什么关联的,你可以都学,也可以都不学
      回复
  • 孙权威    2020-08-18 16:11:14

    总的来说 就是通过 UIComponent 创建的的UI 统统都会跑到Framework 里面 UI下面。无论你打开几个场景UI始终都是在框架所在场景内的
    回复
  • 冬阳1993    2020-06-29 16:47:11

    确实需要一个画布来显示UI。不然UI的位置和显示都会出问题。所以将一个画布作为预制体UI加载比较好。所以在UIGroups里面设置了一个Depth?
    回复
  • by    2020-06-13 04:56:38

    我发现为什么我不显示ui了,仔细看你的UI_Menu挂了Graphic Raycaster,很棒我加了这个自动添加了一个canvas上去,显示确实显示了,我不确定真的是这么操作的
    回复
  • by    2020-06-13 04:29:36

    我也没有显示Ui啊,作者辛苦了,这样看确实很容易上手了
    回复
    • 江志远    2020-06-21 16:49:58

      加上Graphic Raycaster插件就可以
      回复
  • suxsho    2019-11-22 11:34:18

    直接使用scene.LoadScene(“Demo3_Menu”, this); 无法加载场景,使用demo2的全路径可以加载
    回复
    • 阿爆    2019-12-10 18:05:17

      源码里面有资源路径限制,必须Asset开头,unity结尾
      回复
    • et群里的leo    2022-03-04 16:29:23

      例如, scene.LoadScene("Assets/Demo/3/Demo3_Menu.unity", this); 这样才可以
      回复
  • 清水    2019-08-23 16:41:06

    木头君这是...精分了啊,可能是代码写多了叭 0.0
    回复
    • 笨木头    2019-08-26 08:16:06

      创作的事情嘛,怎么能说是精分呢(狼头
      回复
  • 沉寂轩梦    2019-06-08 23:30:40

    教程很好,好人一生平安
    回复
  • 598867756    2019-02-22 22:17:41

    初始流程脚本中场景资源路径错了
    回复
发表评论
粤ICP备16043700号

本博客基于 BlazorAnt Design Blazor 开发