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

3.1组件 Component

组件是Unity中最核心的一个概念,它是一切编程的基础。没有组件,也就没有了Unity编程。

打开一个新Unity工程,我们在Project面板中右键可以直接创建出一个C#脚本。

脚本的内容如下:

using UnityEngine;
using System.Collections; public class NewBehaviourScript : MonoBehaviour { // Use this for initialization
void Start () { } // Update is called once per frame
void Update () { }
}

默认的脚本继承自MonoBehavior类,这个类是通常的自定义脚本组件继承类,也就是我们自己所编写的脚本的父类。而Unity内部组件,如相机等是继承自

MonoBehavior的父类Behavior或者再上层的父类Component。Unity为何要分成三个级别继承?从Component到Behavior只是增加了一个是否可以enable

的属性,用于区别有些组件是可以禁用的,而有些组件是不可以的。而从Behavior到MonoBehavior,则纯粹是为了Unity程序员准备的,因为它增加了很多响应

消息,包括上面代码中看到的Start、Update以及后面提到的LateUpdate、FixedUpdate等消息。这些消息均是为了让程序员可以方便地控制和响应组件,而这

些消息对于Unity内置组件来说它是不需要的,它内部自己知道什么时候需要进行启动、更新等等操作。

因此,我们尝试参考MonoBehavior的文档,将常见的消息响应全部都打印到控制台上,于是代码看起来是这样:

using UnityEngine;
using System.Collections;
using Assets.AndrewBox.Util; public class TestComponenets : MonoBehaviour
{ void Awake()
{
Debuger.LogAtFrame("Awake");
} void Start ()
{
Debuger.LogAtFrame("Start");
} // Update is called once per frame
void Update ()
{
//Debuger.LogAtFrame("Update");
}
void LateUpdate()
{
//Debuger.LogAtFrame("LateUpdate");
}
void FixedUpdate()
{
//Debuger.LogAtFrame("FixedUpdate");
} void OnEnable()
{
Debuger.LogAtFrame("OnEnable");
}
void OnDisable()
{
Debuger.LogAtFrame("OnDisable");
}
void OnDestroy()
{
Debuger.LogAtFrame("OnDestroy");
}
}

附加的Debuger类,用于打印消息,这里在显示消息的同时,记录了当前画面运行的帧数,以便于我们观察函数调用的次序以及时机:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine; namespace Assets.AndrewBox.Util
{
public static class Debuger
{
public static void LogAtFrame(string infor)
{
Debug.Log("["+Time.frameCount+"]"+infor);
}
}
}

准备好代码之后,在场景中新建一个Cube(其实任意GameObject都可以),将TestComponenets拖放其上,然后尝试启动运行,并且在Cube的TestComponenets组件上,

将勾选状态关闭再打开,可以看到控制台输出的内容。而后停止运行,将上述代码中的注释去掉,暴露出几个Update方法,再次运行以便查看结果。

最终,我们可以得出如下结论:

  • Awake 方法:当GameObject被启用时,立刻被执行,中文的字面意思就是说,组件已经苏醒,但是它还没有执行,只是准备好了而已。只执行一次。
  • OnEnable方法:当组件被启用时(如果GameObject都没启用,组件更谈不上启用),立刻执行,当多启用时反复执行。
  • OnDisable方法:与OnEnable对应,当组件被禁用时,立刻执行,当多禁用时反复执行。
  • Start方法:当组件被启用后的下一帧,才会被执行。只执行一次。【特别注意,这里是下一帧,如果不注意的话,在资源加载方面可能会出现问题】
  • OnDestroy方法:当组件被销毁时执行。
  • Update:每帧执行一次,每秒刷新次数取决于硬件图像的刷新速度。
  • LateUpdate:每帧执行一次,后于Update执行,这里一般用作绘制到屏幕的最后处理(如无此特殊需要,用Update即可)。
  • FixedUpdate:默认按每隔0.02秒(具体时间可以设置)执行一次,与图像刷新率无关,用于物理逻辑计算。

正常情况下,执行的顺序是如下图:

也就是说,在Awake、OnEnable、Start之后开始几种Update循环。

一般OnEnable用作处理开启和关闭组件时的开关量转换,那么对于此组件的初始化我们可以写在Awake和Start中。

由于Awake是加载和启用GameObject后立刻执行的,因此,如果本组件跟随GameObject加载后,应该立刻初始化本组件的共有成员,如果这些成员需要被其它代码所访问的话。

因为如果放在Start中初始化的话,那么还需要等待一帧,而这一帧过程中,很可能已经发生了对这些共有成员的访问,而此时尚未初始化。所以应该避免这种情况出现。

我们暂时将其成为二阶段初始化,以便更好的记忆。在后续的章节中我们会有更多的体现。

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

Unity编程标准导引-3.1 Component 组件脚本及其基本生命周期的更多相关文章

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

    本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 3.2MonoBehavior 组件父类重构 为了让我们的组件类用起来更方便,我们将上一节的 ...

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

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

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

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

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

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

  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. React Native组件的结构和生命周期

    React Native组件的结构和生命周期 一.组件的结构 1.导入引用 可以理解为C++编程中的头文件. 导入引用包括导入react native定义的组件.API,以及自定义的组件. 1.1 导 ...

  9. .Net组件程序设计之对象生命周期

    .Net组件程序设计之对象生命周期 .NET 垃圾回收 IDisposable() Using语句 .NET 垃圾回收 是CLR管理着垃圾回收器,垃圾回收器监控着托管堆,而我们使用的对象以及系统启动是 ...

随机推荐

  1. Python变量和字符串详解

    Python变量和字符串详解 几个月前,我开始学习个人形象管理,从发型.妆容.服饰到仪表仪态,都开始做全新改造,在塑造个人风格时,最基础的是先了解自己属于哪种风格,然后找到参考对象去模仿,可以是自己欣 ...

  2. mysql - 标识列

    #标识列 /* 又称为自增长列 含义:可以不用手动插入值,系统提供默认的序列值 特点: 1.表示列必须和主键搭配吗?不一定,但是要求是一个key 2.一个表中只能有一个标识列! 3.标识列的类型有限制 ...

  3. 20190820 On Java8 第十章 接口

    第十章 接口 接口和抽象类提供了一种将接口与实现分离的更加结构化的方法. 抽象类和方法 包含抽象方法的类叫做抽象类.如果一个类包含一个或多个抽象方法,那么类本身也必须限定为抽象的,否则,编译器会报错. ...

  4. Learning OSG programing---osgShape

    本例示范了osg中Shape ---- 基本几何元素的绘制过程.参照osg官方文档,Shape 类包含以下子类: 在示例程序中,函数createShapes函数用于生成需要绘制的几何形状. osg:: ...

  5. 《JAVA设计模式》之责任链模式(Chain of Responsibility)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  6. 《JAVA设计模式》之工厂方法模式 (Factory)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述工厂方法模式的: 工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymor ...

  7. SAS去空格

    data test;       x="  aaa     bbb hahaha";       x1=compress(x);       x2=left(x);       p ...

  8. django的配置

    1.django的默认配置 import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...) # 获取 ...

  9. A Bug’s Life POJ - 2492(种类并查集)

    题目链接 每次给出两个昆虫的关系(异性关系),然后发现这些条件中是否有悖论 就比如说第一组数据 1 2 2 3 1 3 1和2是异性,2和3是异性,然后说1和3是异性就显然不对了. 我们同样可以思考一 ...

  10. P4843 清理雪道(上下界网络流)

    P4843 清理雪道 上下界最小流 我们先搞一遍上下界可行流(转) 回忆上下界最大流的写法:在可行流的残量网络$s\ -\ t$上跑最大流,答案为可行流$+$残量网络的最大流 那么上下界最小流的写法呢 ...