美文网首页Unity标准编程导引unity3D技术分享程序员
Unity编程标准导引-3.2 MonoBehavior 组件

Unity编程标准导引-3.2 MonoBehavior 组件

作者: AndrewFan | 来源:发表于2017-02-18 12:34 被阅读55次

    本文为博主原创文章,欢迎转载。请保留博主链接http://blog.csdn.net/andrewfan


    Unity编程标准导引-3.2 MonoBehavior 组件父类重构

    为了让我们的组件类用起来更方便,我们将上一节的代码进行重构。改写成如下:

    using UnityEngine;
    using System.Collections;
    
    namespace Assets.AndrewBox.Comp
    {
        /// <summary>
        /// 初始化状态
        /// </summary>
        public enum InitState
        {
            NothingInited,
            FirstInited,
            SecondInited
        }
        public abstract class BaseBehavior : AbstractBehavior
        {
            /// <summary>
            /// 当前的初始化状态
            /// </summary>
            protected InitState m_initState = InitState.NothingInited;
            //变换对象
            public Transform m_transform;
            /// <summary>
            /// 在此完成第一阶段的初始化
            /// </summary>
            protected override sealed void Awake()
            {
                m_transform = transform;
                DoInit(InitState.FirstInited);
            }
            /// <summary>
            /// 在此完成第二阶段的初始化
            /// </summary>
            protected override sealed void Start()
            {
                DoInit(InitState.SecondInited);
            }
            /// <summary>
            /// 执行更新
            /// </summary>
            protected override sealed void Update()
            {
                if (m_initState != InitState.SecondInited)
                {
                    return;
                }
                OnUpdate();
            }
            /// <summary>
            /// 用于首次初始化,完成外部需访问的公共成员的初始化
            /// </summary>
            protected abstract void OnInitFirst();
            /// <summary>
            /// 用于二次初始化,完成内部私有成员的初始化
            /// </summary>
            protected abstract void OnInitSecond();
            /// <summary>
            /// 执行更新
            /// </summary>
            protected abstract void OnUpdate();
            /// <summary>
            /// 用于外部主动调用初始化
            /// </summary>
            /// <param name="targetState">初始化的目标状态</param>
            public void DoInit(InitState targetState=InitState.SecondInited)
            {
                if (m_initState == InitState.NothingInited&& m_initState<targetState)
                {
                    OnInitFirst();
                    m_initState = InitState.FirstInited;
                }
                if (m_initState == InitState.FirstInited && m_initState<targetState)
                {
                    OnInitSecond();
                    m_initState = InitState.SecondInited;
                }
            }
    
    
        }
    
        public abstract class AbstractBehavior : MonoBehaviour
        {
            protected virtual void Awake()
            {
            }
    
            protected virtual void Start()
            {
            }
    
            protected virtual void Update()
            {
            }
        }
    
    }
    

    接下来,原先的TestComponent类将变成如下形式:

    using UnityEngine;
    using System.Collections;
    using Assets.AndrewBox.Util;
    using Assets.AndrewBox.Comp;
    
    public class TestComponenets : BaseBehavior 
    {
        protected override void OnInitFirst()
        {
            Debuger.LogAtFrame("OnInitFirst");
        }
    
        protected override void OnInitSecond()
        {
            Debuger.LogAtFrame("OnInitSecond");
        }
    
        protected override void OnUpdate()
        {
            Debuger.LogAtFrame("OnUpdate");
        }
    
        protected void OnEnable()
        {
            Debuger.LogAtFrame("OnEnable");
        }
        protected void OnDisable()
        {
            Debuger.LogAtFrame("OnDisable");
        }
        protected void OnDestroy()
        {
            Debuger.LogAtFrame("OnDestroy");
        }
    }
    

    这样的好处是让继承类严格按照格式进行初始化,也可以在组件创建的早期,手动进行立刻完整初始化。简单说就是遵循了设计模式:紧内聚、松耦合的开闭原则。


    本文为博主原创文章,欢迎转载。请保留博主链接http://blog.csdn.net/andrewfan

    相关文章

      网友评论

        本文标题: Unity编程标准导引-3.2 MonoBehavior 组件

        本文链接:https://www.haomeiwen.com/subject/mxirwttx.html