博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
unity中的UI状态机,用于各界面之间的切换和跳转
阅读量:4631 次
发布时间:2019-06-09

本文共 5348 字,大约阅读时间需要 17 分钟。

首先感谢姜雪松先生,大家可以去他的博客查看注释以及代码等,http://jxwgame.blog.51cto.com/943299/1613585 

言归正传:

1.在开发项目的过程中,总是会遇到这样的问题,从一个界面跳转到另外一个界面,每次操作都要对一些对象进行显示与隐藏,操作很麻烦也不方便维护修改。

2.于是很多人在这样的一个基础上开发出了很多便于维护和管理的UI框架或者UI状态机。
3.所以简单说下UI状态机,来管理项目中各个界面之间的切换等

1.UI界面的基类

using System.Collections;using System.Collections.Generic;using UnityEngine;public class StateBehaviour : MonoBehaviour, IState{    public FiniteStateMachine BelongToFSM { get; protected set; }    public string StateName { get; protected set; }    protected Dictionary
transitionMap = new Dictionary
(); public virtual void Init(FiniteStateMachine belongToFSM) { StateName = GetType().Name; BelongToFSM = belongToFSM; BelongToFSM.Register(StateName, this); foreach (KeyValuePair
pair in transitionMap) { BelongToFSM.State(StateName).On(pair.Key).Enter(pair.Value); } } public virtual void OnEnter(string prevState) {#if UNITY_EDITOR Debug.LogWarning("[" + BelongToFSM.Name + "] On Enter State: " + StateName + ", previous state is: " + prevState + transitionMap.Count);#endif } public virtual void OnExit(string nextState) {#if UNITY_EDITOR Debug.LogWarning("[" + BelongToFSM.Name + "] On Exit State: " + StateName + ", next state is: " + nextState);#endif } public virtual void OnUpdate() { }}

2.状态机管理器

using UnityEngine;using System.Collections.Generic;/// /// 状态机管理器/// public class StateMachineManager : CSingleton
{ //protected StateMachineManager() { } protected Dictionary
m_FiniteStateMachineDic = new Dictionary
(); public FiniteStateMachine GetFSM(string name) { FiniteStateMachine fsm; if (!m_FiniteStateMachineDic.TryGetValue(name, out fsm)) { return null; } return fsm; } public FiniteStateMachine UiFSM { get; protected set; } public FiniteStateMachine ControlUiFSM { get; protected set; } public void Awake() { UiFSM = AddFSM("UI FSM"); // 设置第一个状态 UiFSM.EntryPoint(typeof(LoginPanelUI).Name); } public void Start() { // 设置第一个状态 UiFSM.EntryPoint(typeof(LoginPanelUI).Name); //ControlUiFSM.EntryPoint(typeof(ConMainPanel).Name); } public FiniteStateMachine AddFSM(string name) { if (m_FiniteStateMachineDic.ContainsKey(name)) { return m_FiniteStateMachineDic[name]; } FiniteStateMachine fsm = new FiniteStateMachine(); fsm.Name = name; m_FiniteStateMachineDic.Add(fsm.Name, fsm); return fsm; } public bool RemoveFSM(string name) { return m_FiniteStateMachineDic.Remove(name); } public void Update() { foreach (KeyValuePair
pair in m_FiniteStateMachineDic) { pair.Value.Update(); } } public void OnDestroy() { m_FiniteStateMachineDic.Clear(); UiFSM.ClearAllStates(); UiFSM = null; ControlUiFSM.ClearAllStates(); ControlUiFSM = null; }}

3.登录界面的UI脚本

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class LoginPanelUI : StateBehaviour{    public Button btn;    protected void Awake()    {        transitionMap["Login"] = typeof(MainPanelUI).Name;        // 注意:该方法必须在transitionMap初始化后调用!        Init(StateMachineManager.Instance.UiFSM);        btn.onClick.AddListener(Onchlic_load);    }    public override void OnEnter(string prevState)    {        base.OnEnter(prevState);        gameObject.SetActive(true);        Debug.Log("OnEnter");    }    public override void OnExit(string nextState)    {        base.OnExit(nextState);        gameObject.SetActive(false);        Debug.Log("OnExit");    }    public override void OnUpdate()    {        base.OnUpdate();        Debug.Log("OnUpdate");    }    public void Onchlic_load()    {        BelongToFSM.Trigger("Login");    }      }

4.主菜单界面的UI脚本

using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class MainPanelUI : StateBehaviour{    public Button btn_back;    protected void Awake()    {        transitionMap["GoBack"] = typeof(LoginPanelUI).Name;        // 注意:该方法必须在transitionMap初始化后调用!        Init(StateMachineManager.Instance.UiFSM);        gameObject.SetActive(false);        btn_back.onClick.AddListener(GoBack);    }    public override void OnEnter(string prevState)    {        base.OnEnter(prevState);        gameObject.SetActive(true);    }    public override void OnExit(string nextState)    {        base.OnExit(nextState);        gameObject.SetActive(false);    }    public void GoBack()    {        BelongToFSM.Trigger("GoBack");    }}

5.公共类脚本

using System.Collections.Generic;using UnityEngine;using UnityEngine.VR;public class CommonManager : Singleton
{ protected CommonManager() { } protected StateMachineManager m_StateMachineManager; protected void Awake() { m_StateMachineManager = StateMachineManager.Instance; m_StateMachineManager.Awake(); } protected void Start() { m_StateMachineManager.Start(); } protected void Update() { m_StateMachineManager.Update(); }}

6.好了,就这么多吧

转载于:https://www.cnblogs.com/nanyang0310/p/9121917.html

你可能感兴趣的文章
资源 | 普通程序员如何自学机器学习
查看>>
如何判断一个数是否为素数
查看>>
基本控件学习以( RadioGroup和RadioButton 的学习使用)
查看>>
Test Scenarios for Excel Export functionality
查看>>
5月3日上课笔记-XML解析
查看>>
【嵌入式开发】Raspberry Pi 树莓派性能测试
查看>>
【Qt开发】设置Qt应用程序图标
查看>>
CentOS 6.2 安装kdbg
查看>>
libevent源码分析:event_assign、event_new
查看>>
a new start in cnblogs
查看>>
luogu 2216 理想的正方形 单调队列(其实没有DP)
查看>>
在控制台应用程序下,创建窗口,避开WinMain函数入口
查看>>
最大连续子数组和--dp
查看>>
英文词频统计预备,组合数据类型练习
查看>>
缓存整个页面
查看>>
PHP范例注册审核
查看>>
jquery知识简单运用
查看>>
KMP算法练习
查看>>
git
查看>>
特殊变量的处理(一)onehot&dummy
查看>>