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