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

    在PHP中偶尔遇到字符串的压缩,比如一个长字符串,数据库开始设计的字段存不下,但是又不想改数据库字段存储长度,就可以用压缩的方式降低数据字段字符串的长度数量级,把几百个字符的字符串压缩到几十个字符.总 ...

  2. ios系统 ipa文件 打包流程详解 及 常见问题处理

    注:先反省一下,原本打算一天一篇,每天进步一点点,但是最近变懒了,居然三天没有更新,在此告诫各位道友及我自己,程序员需戒欲,搞技术需持之以恒,不能三天打鱼,两天晒外. 现在步入主题,前段时间使用xco ...

  3. Built-in functions

    转自::http://blog.csdn.net/luyuncheng/article/details/11674123   — Built-in Function: int __builtin_ff ...

  4. Unity3D ——强大的跨平台3D游戏开发工具(二)

    第二章 Unity3D的简单预览 每个Unity3D版本都会自带一个Demo源文件.在3.0的正式版中,自带的Demo就是网上展示的那款强大的射击游戏.在一般情况下,您只要第一次 打开Unity3D ...

  5. u-boot源码下载

    1. 使用git下载u-boot源码  1.1 clone u-boot源码仓库 可以使用git.HTTP.和 rsync协议来下载u-boot源码.你可以使用如下方法来克隆源码树: $ git cl ...

  6. 安卓 异步线程更新Ui

    异步跟新UI: 1.handler+Thread(runnable):如果handler和Thread都写在了一个Java文件中,就不说了,如果runnable定义在了一个单独的类文件中,可以通过在构 ...

  7. UVa 11631 - Dark roads

    题目大意:政府为了减小开支决定关闭一些路灯,同时保证照亮的路能连接所有路口. 又是一个MST问题,Kruskal算法,不过数据规模比较大,又Submission Error了...扔这吧... #in ...

  8. Java动态数组

    其中java动态数组: Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是ArrayList,ArrayList是javaAPI中自带的java.util.ArrayList. ...

  9. Twisted源码分析系列01-reactor

    转载自:http://www.jianshu.com/p/26ae331b09b0 简介 Twisted是用Python实现的事件驱动的网络框架. 如果想看教程的话,我觉得写得最好的就是Twisted ...

  10. word页眉页脚 首页 索引 正文各不同的处理方法

    1.在目录和正文之间,加入分隔符——分节符——下一页,然后再添加页眉页脚,然后再添加索引: