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



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

Unity中实现UI序列帧动画

以前做动画都是使用Animation来制作的。但是当遇到美术给到序列帧动画的时候应该如何直接把序列帧动画放到UI上来实现呢?一定会有人说,直接转换Sprite然后把所有的序列帧选中拖到Hierarch...
  • m0_37679113
  • m0_37679113
  • 2017年05月31日 11:04
  • 1186

C# FSM (仿Unity 中的Mecanim动画系统的状态机)

FSM 精简版
  • linjf520
  • linjf520
  • 2014年03月11日 14:25
  • 17033

设计模式——状态机(AI)(Unity3D中的应用)

在Unity3D中对状态模式的应用当属于有限状态机的使用,利用状态机管理游戏物体的状态的管理,实现一个AI系统。...
  • PirateCode
  • PirateCode
  • 2016年08月27日 22:53
  • 1992

可视化的状态机(FSM)

状态机这个概念已经在网上的博客和论坛中都已经说烂了,随便一搜都有一大堆。相关的废话就不多说了,在这里主要是分享一下如何可视化的设计状态机,如何增强项目的灵活性。这里通过一个生活中的电梯来了解一下状态机...
  • u014805066
  • u014805066
  • 2017年03月22日 15:00
  • 570

Unity精灵动画状态机自动切换

  • 2017年03月26日 11:22
  • 193KB
  • 下载

如何添加UI动画效果

项目中有功能需要在代码中动态创建UGUI对象,但是在网上搜索了很久都没有找到类似的教程,最后终于在官方文档中找到了方法,趁着记忆犹新,写下动态创建UGUI的方法,供需要的朋友参考 一、新建一...
  • qq_26270779
  • qq_26270779
  • 2017年04月20日 17:39
  • 2902

【Unity3d】UGUI 之 Animator, Animation 动画系统学习笔记

这几天体验了一把UGUI,用起来感觉棒棒哒。直接进入正题吧,如果要写一个全面的教程,估计还是要花点精 力,如果要写好,就更不容易。那么,我还是以给自己做笔记为目的来写这篇文章吧,还是比较适合我这...
  • sunnywei_yiyi
  • sunnywei_yiyi
  • 2016年08月17日 13:56
  • 6549

【Unity3d】UGUI 之 Animator, Animation 动画系统学习笔记

这几天体验了一把UGUI,用起来感觉棒棒哒。直接进入正题吧,如果要写一个全面的教程,估计还是要花点精 力,如果要写好,就更不容易。那么,我还是以给自己做笔记为目的来写这篇文章吧,还是比较适合我这种小菜...
  • a237653639
  • a237653639
  • 2015年09月19日 18:44
  • 6173

UGUI 实现界面 渐隐渐现 FadeIn/Out 效果

其实熟悉NGUI的人,应该知道  实现渐隐渐现 FadeIn/Out 效果是很方便的,因为父对象 的 改变会自动影响到子对象。 比如 UIWidget、UIPanel等组件都有 Alpha属性,在In...
  • u010019717
  • u010019717
  • 2015年07月10日 09:11
  • 8421

Unity 客户端框架(四):资源管理器

资源管理器,顾名思义就是加载资源用的 作用: 当一个项目非常庞大的时候,我们不可能每次都手动去加载释放,这时候需要一个管理器来帮我们实现并管理他们 目前并不完整 //资源类 ...
  • lovethRain
  • lovethRain
  • 2016年08月04日 08:17
  • 2740
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity3D之利用新动画状态机设计的UI框架
举报原因:
原因补充:

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