本文为博主原创文章,欢迎转载。请保留博主链接: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

Unity编程标准导引-3.2 MonoBehavior 组件父类重构的更多相关文章

  1. Unity编程标准导引-3.1 Component 组件脚本及其基本生命周期

    本文为博主原创文章,欢迎转载,请保留出处:http://blog.csdn.net/andrewfan 3.1组件 Component 组件是Unity中最核心的一个概念,它是一切编程的基础.没有组件 ...

  2. Unity编程标准导引-3.4 Unity中的对象池

    本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的对象池 本节通过一个简单的射击子弹的示例来介绍T ...

  3. Unity编程标准导引-Unity中的基本概念-2.1界面概览

    Unity中的基本概念 本文我们介绍Unity中的基本概念,包括:场景.游戏对象.组件.预制件.资源等. 2.1.界面概览 打开Unity之后,我们大概可以看到以上画面,以上画面中即显示了我们最常用到 ...

  4. Unity编程标准导引-2.2Unity中的基本概念

    2.2Unity中的基本概念 上述介绍提到了几个概念:游戏对象.场景.资源.相机,这个小节我们来深入了解,同时进行一些实践性操作.不过首先,我们需要大概了解一下Unity的工程文件夹. 2.2.1工程 ...

  5. Unity编程标准导引-1.2官方资源介绍

    1.2.官方资源介绍 Unity官方提供了丰富的学习和参考资源,有以下类别: Unity手册以及API文档 Unity的官方教程 AssetStore 1.2.1 Unity手册以及API文档 前述文 ...

  6. Unity编程标准导引-3.3 Transform

    本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan 每个游戏对象(GameObject),其存在于游戏世界,都有一个位置.朝向.大小等基本定位信息 ...

  7. Unity编程标准导引-1.1下载和安装Unity

    本文为博主原创文章,欢迎转载,请保留出处:http://blog.csdn.net/andrewfan 1.1.下载和安装Unity 1.1.1 选取版本 首先找到Unity官方网站https://s ...

  8. Atitit 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)的区别和联系

    Atitit 面向对象编程(OOP).面向组件编程(COP).面向方面编程(AOP)和面向服务编程(SOP)的区别和联系 1. 面向组件编程(COP) 所以,组件比起对象来的进步就在于通用的规范的引入 ...

  9. 【Unity编程】四元数(Quaternion)与欧拉角

    版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 欧拉旋转.四元数.矩阵旋转之间的差异 除了欧拉旋转以外,还有两种表示旋转的方式:矩 ...

随机推荐

  1. iOS开发——MD5加密

    #import <CommonCrypto/CommonDigest.h> - (NSString *)md5:(NSString *)str { const char *cStr = [ ...

  2. XCode里的模拟器到底在哪里?我的App被放到哪里了?如何寻找真机的沙盒文件?

    一. 开发iOS,必然少不了和XCode这个家伙打交道.平时我们调试自己的App的时候,最常用到的就是模拟器Simulator了,调试的时候,我们的App会自动被XCode安装到模拟器中去,不过: 你 ...

  3. ios 屏幕方向的设置

    ref: http://www.cnblogs.com/niit-soft-518/p/5611298.html 实际的项目需求.root是TabBarController,里面有4个navigati ...

  4. IAR for STM8 错误

    一个IAR for STM8 v1.3 的工程,换到1.4版后出现如下错误 unable to allocate space for sections/blocks with a total esti ...

  5. eclipse 完全智能提示

     1.添加智能提示 eclipse的代码提示是按”.”这个字符提示的,而如果想在其他的条件下触发,则需要按Alt + / 或者是 Ctrl + Space手动调用 (Ctrl + Space原先是Ec ...

  6. Apache Bench安装与使用

    一.Apache Bench简介 ApacheBench 是 Apache 服务器自带的一个web压力测试工具,简称ab.ab又是一个命令行工具,对发起负载的本机要求很低,根据ab命令可以创建很多的并 ...

  7. HTML CSS基础(三)

    3种列表:有序列表.无序列表和定义列表 表1 3种列表记忆 标签 语义 说明 ol ordered list 有序列表 ul unordered list 无序列表 dl definition lis ...

  8. ZOJ 1108 & HDU 1160 - FatMouse's Speed

    题目大意:给你n只老鼠的体重w和速度s,让你找出最长的子序列使得w[i] < w[j] 且 s[i] > s[j] (i < j).求最长序列的长度并输出该序列. LIS(Longe ...

  9. UVa 10041 - Vito's Family

    题目大意:给出一些点,找到一个位置使这个位置到所有的点的距离的和最短. 很明显,排序,找中位数.关于中位数:有n个从小到大的数,k=(n+1)/2,若n为奇数,k为中位数,若n为偶数,k为中间那两个数 ...

  10. 一分钟完成MySQL5.7安装部署

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://suifu.blog.51cto.com/9167728/1855415 Part ...