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

3.2MonoBehavior 组件父类重构

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

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

最新文章

  1. A/B Testing的简要知识
  2. UVA 10692 Huge Mods(指数循环节)
  3. HTML5魔法堂:全面理解Drag &amp; Drop API
  4. golang,liteide设置 windows7(64)
  5. java 16 -7 泛型方法和泛型接口(泛型类相似)
  6. 通过继承Rect类编写一个具有确定位置的矩形类PlainRect,其确定位置用 矩形的左上角坐标来标识,包含: 添加两个属性:矩形左上角坐标startX和startY。 两个构造方法: 带4个参数的构造方法,用于对startX、startY、width和height属性 初始化; 不带参数的构造方法,将矩形初始化为左上角坐标、长和宽都为0 的矩形; 添加一个方法: 判断某个点是否在矩形内部的方法
  7. buildroot ntp 网络时钟同步
  8. (高精度运算4.7.26)POJ 1220 NUMBER BASE CONVERSION(高精度数的任意进制的转换——方法:ba1-----&gt;10进制-----&gt;ba2)
  9. 【Python】python读取文件操作mysql
  10. 【Cocos2d入门教程二】Cocos2d-x基础篇
  11. struts2启动报错com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1
  12. codeforces 617B Chocolate
  13. 循环训练(for的嵌套、while、do while)以及异常处理
  14. vim目录说明
  15. 管理支撑办公系统技术架构选型对照讨论(J2EE与SOA对照)
  16. CodeForces 696C PLEASE
  17. Cookie 简单使用记录浏览记录
  18. 【机器学习笔记之五】用ARIMA模型做需求预测用ARIMA模型做需求预测
  19. Xamarin android CardView的使用详解
  20. spring的依赖注入是什么意思

热门文章

  1. MySQL master/slave 模式
  2. iOS开发——判断是否第一次启动
  3. Web前端开发中的各种CSS规范
  4. HUSTOJ 2796 &amp;&amp; SPOJ1811
  5. iOS 之 导航栏按钮
  6. Delphi的时间与字符串函数代码示例
  7. Struts2拦截器介绍
  8. Android离线缓存
  9. React Router基础使用
  10. Bootstrap入门(十三)组件7:导航条