unity中的UI状态机,用于各界面之间的切换和跳转

摘要:
使用System.Collections。通用的foreach(KeyValuePair<usingSystem.Collections.Generic;CSingleton<publicFiniteStateMachineGetFSM(字符串名){FiniteStateMachine fsm;outsm)){returnnull;

首先感谢姜雪松先生,大家可以去他的博客查看注释以及代码等,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<string, string> transitionMap = new Dictionary<string, string>();


    public virtual void Init(FiniteStateMachine belongToFSM)
    {
        StateName = GetType().Name;

        BelongToFSM = belongToFSM;
        BelongToFSM.Register(StateName, this);

        foreach (KeyValuePair<string, string> 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;

/// <summary>
/// 状态机管理器
/// </summary>
public class StateMachineManager : CSingleton<StateMachineManager>
{
    //protected StateMachineManager() { }

    protected Dictionary<string, FiniteStateMachine> m_FiniteStateMachineDic = new Dictionary<string, FiniteStateMachine>();
    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<string, FiniteStateMachine> 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<CommonManager>
{
    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.好了,就这么多吧

免责声明:文章转载自《unity中的UI状态机,用于各界面之间的切换和跳转》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇WebSocketGolang的切片学习下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android 分辨率适配方法

1、先获取屏幕分辨率。 Display d = getWindowManager().getDefaultDisplay(); int h = d.getHeight(); int w = d.getWidth(); Log.i("xxxx", h+"x"+w); 2、在项目res下面创建相应的分辨率的values文件...

使用pageHelper遇到的问题

在做SSM整合的时候,遇到一个小问题,在我使用pageHelper的时候,分页的效果总是无法正确显示,卡了我几个小时,现在来说一下我的问题。  1.首先导入pageHelper的包: <!--引入pageHelper分页插件 --> <dependency> <groupId>com.github.pagehelper&...

tomcat8热部署配置--maven自动发布项目到tomcat8(如何支持远程访问部署)

1、tomcat8实现热部署的配置  我们实现热部署后,自然就可以通过maven操作tomcat了,所以就需要maven取得操作tomcat的权限,现在这一步就是配置tomcat的可操作权限. #进入tomcat安装目录 cd /usr/local/devlop/tomcat #进入conf文件夹修改tomcat-users.xml vim conf/...

Vue vue-resource 请求数据

<template> <!-- 所有的内容要被根节点包含起来 --> <div id="home"> 首页组件 <button @click="getData()">请求数据</button> <hr&g...

三层架构+存储过程实现分页

首先在项目下加入BLL,DAL,DataAccess,MODEL类库 -------前台界面--------- <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="原始刷新分页.aspx.cs" Inherits="分页.原始刷新分页" %> <!DOCTYPE html P...

freemark使用总结

1.下拉框中使用三元表达式: <option value="1类" ${(bean.col5!?string="1类")?string('selected','')}>1类</option> 2.ftl页面中保留小数 <td><input type="text" class="form-control" valu...