Unity3D之利用新动画状态机设计的UI框架

原创 2017年08月13日 21:47:58

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。

CSDN视频网址:http://edu.csdn.net/lecturer/144

利用Unity3D引擎开发游戏,经常会使用各种架构设计,网上关于这方面的架构设计也很多,比如MVC,FSM等,架构设计没有好坏之分,使用方便就可以。这里给读者介绍一种新的设计方式,在这里给读者介绍一种利用新动画状态机对UI进行的架构设计,UI之间的切换是通过新动画状态机实现的,新动画状态机的实现效果如图所示:


对应的实现代码如下所示:

public abstract class BaseView : MonoBehaviour
    {

        public virtual void OnEnter(BaseContext context)
        {

        }

        public virtual void OnExit(BaseContext context)
        {

        }

        public virtual void OnPause(BaseContext context)
        {

        }

        public virtual void OnResume(BaseContext context)
        {

        }

        public void DestroySelf()
        {
            Destroy(gameObject);
        }
	}
    这个是作为基类使用的,具体实现类是在它们的子类中实现的,代码如下所示:

  public abstract class AnimateView : BaseView 
    {
        [SerializeField]
        protected Animator _animator;

        public override void OnEnter(BaseContext context)
        {
            _animator.SetTrigger("OnEnter");
        }

        public override void OnExit(BaseContext context)
        {
            _animator.SetTrigger("OnExit");
        }

        public override void OnPause(BaseContext context)
        {
            _animator.SetTrigger("OnPause");
        }

        public override void OnResume(BaseContext context)
        {
            _animator.SetTrigger("OnResume");
        }

	}
在参数中使用了BaseContext类,该类是承接上下文的,具体的UI类动作设计如下所示:

public class OptionMenuView : AnimateView
    {

        public override void OnEnter(BaseContext context)
        {
            base.OnEnter(context);
        }

        public override void OnExit(BaseContext context)
        {
            base.OnExit(context);
        }

        public override void OnPause(BaseContext context)
        {
            base.OnPause(context);
        }

        public override void OnResume(BaseContext context)
        {
            base.OnResume(context);
        }

		public void BackCallBack()
        {
            Singleton<ContextManager>.Instance.Pop();
        }

        public void NextCallBack()
        {
            Singleton<ContextManager>.Instance.Push(new NextMenuContext());
        }
    }
在此调用了两个接口,BackCallBack函数和NextCallBack函数,目的是将显示的类放到堆栈中便于统一管理,函数实现如下所示:

   public class ContextManager
    {
        private Stack<BaseContext> _contextStack = new Stack<BaseContext>();

        private ContextManager()
        {
            Push(new MainMenuContext());
        }

        public void Push(BaseContext nextContext)
        {

            if (_contextStack.Count != 0)
            {
                BaseContext curContext = _contextStack.Peek();
                BaseView curView = Singleton<UIManager>.Instance.GetSingleUI(curContext.ViewType).GetComponent<BaseView>();
                curView.OnPause(curContext);
            }

            _contextStack.Push(nextContext);
            BaseView nextView = Singleton<UIManager>.Instance.GetSingleUI(nextContext.ViewType).GetComponent<BaseView>();
            nextView.OnEnter(nextContext);
        }

        public void Pop()
        {
            if (_contextStack.Count != 0)
            {
                BaseContext curContext = _contextStack.Peek();
                _contextStack.Pop();

                BaseView curView = Singleton<UIManager>.Instance.GetSingleUI(curContext.ViewType).GetComponent<BaseView>();
                curView.OnExit(curContext);
            }

            if (_contextStack.Count != 0)
            {
                BaseContext lastContext = _contextStack.Peek();
                BaseView curView = Singleton<UIManager>.Instance.GetSingleUI(lastContext.ViewType).GetComponent<BaseView>();
                curView.OnResume(lastContext);
            }
        }

        public BaseContext PeekOrNull()
        {
            if (_contextStack.Count != 0)
            {
                return _contextStack.Peek();
            }
            return null;
        }
    }
将该脚本挂接到对象上的效果如下所示:



在这里只是给读者提供一种思路,代码下载地址:链接:http://pan.baidu.com/s/1pLLoUKF 密码:xxy0



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

读《经济学》 第3章

供给与需求的基本原理              诸如油价波动等问题,经济学拥有非常有力的工具来解释。这个工具就是供给与需求基本理论。该理论说明消费者的偏好如何影响商品的消费需求,同时企业成本又如...

【Unity3D】基础知识学习笔记

Unity3D基础知识学习笔记 1、基础知识: 标题栏 菜单栏 工具栏:变换工具、gizmos切换、播放控件、层列表、布局列表 功能窗口 2、资源及资源类型:在project里面能够create的资...

UGUI研究院之Text文本渐变(十一)

这是我无意间逛国外论坛发现的,感觉还可以就分享给大家。原文 http://pastebin.com/dJabCfWn 如下图所示,用法和UGUI自带的outline和shadow一样,可以同时使用。...

【Unity3D】学习笔记(第4记) 2D游戏开发基本技巧之人物动画

接下来是人物动画部分,下面主要实现几个基本动作(跳跃、)

提高数据库性能,需要注意的某些事项

●查询速度慢的原因很多,常见如下几种: 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 ...

3D游戏引擎系列一

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》...

【C#】笔试知识点

C#笔试知识点1.String与Stringbuilder的区别: String自动分配内存大小,每次往里面写新东西,就会重新分配一段内存,然后把地址指向新的这块空间,是由C#内存管理自动管理的。 ...

【Unity3D】Unity3D工具、Mono工具、内部脚本工作原理以及跨平台特性

Unity3D工具、Mono工具、内部脚本工作原理以及跨平台特性 1、几个概念的理解: Unity3D主要包括两个部分:Unity Engine和Unity Editor。提供了UnityEngine...

【Unity3D】常用API学习笔记

【Unity3D】常用API学习笔记 1、MonoBehaviour类(UnityEngine命名空间中定义): Awake:最开始调用,做一些初始化工作。建议少用,此刻物体可能还没有实例化出来,会影...

webservice接口问题

之前在做项目时,调用接口调试了很长时间就是不通,总是报空指针异常,经过很长时间的调试,最终发现是jar包冲突的问题,项目里使用了到了生成图表的gnujaxp.jar包,和webservice使用的ax...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)