欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity学习笔记(一)事件函数

程序员文章站 2022-05-23 11:48:28
...

一.前言

  • 自学了一段时间Unity,感觉一些知识零零散散的在网上查找,不易于自己吸收理解,特此把一些易混淆的知识点整理出来,以供自己回顾理解。

二.事件函数(部分)

  • Unity中脚本运行时,自带的一些事件函数会根据相应的顺序进行执行,我们来讲一下部分事件函数的作用(按顺序)
  • 我们先来看一下Unity官网给出的顺序图
    Unity学习笔记(一)事件函数
    Unity学习笔记(一)事件函数
    Unity学习笔记(一)事件函数
    接下来我们一个个来解释

(1)Reset()

  • 根据上图给出的英文解释,我们可以知道Reset()适用于编辑器情况中脚本依附到场景某个物体中或被初始化的时候才会调用
    我们来作下测试,先在Unity中创建一个test脚本,如下编写Reset()函数
public class test : MonoBehaviour
{
    private void Reset()
    {
        Debug.Log("This is Reset");
    }
}
  • 接着,我们再在场景中创建一个Cube物体,然后将我们的test脚本拖拽至Cube物体身上,然后我们就会发现输出了我们脚本中的This is Reset
    Unity学习笔记(一)事件函数
    当然,还有一种触发Reset()方式,就是在我们的Cube物体的Inspector面板中,对脚本test进行Reset时也会触发
    Unity学习笔记(一)事件函数
    Unity学习笔记(一)事件函数

(2)Awake()、OnEnable()、Start()

  • Awake():即在脚本初始化的时候执行一次
  • OnEnable():脚本依附在GameObject上后,只有在.SetActive(true)情况才会执行
  • Start():脚本开始运作执行一次
    顺序:Awake()->OnEnable()->Start()
    我们来作下测试:创建新的test2脚本,代码如下
public class test1 : MonoBehaviour {

    void Awake()
    {
        Debug.Log("this is Awake");
    }
    void OnEnable()
    {
        Debug.Log("this is OnEnable");
    }
    void Start()
    {
        Debug.Log("this is Start");
    }
}

将其附在新的Cube物体上,然后我们点击运行,发现如下图
Unity学习笔记(一)事件函数
证实了执行顺序是正确的

接下来我们将Cube隐藏,然后再次运行,我们会发现3个函数都不会执行,因为此时物体被禁用了,相应的脚本不会起到作用
Unity学习笔记(一)事件函数
接着,我们在运行的情况下,勾选Cube物体,将其显示,会发现只有OnEnable()执行了
Debug.Log(“this is Update”);
这是为什么?其实将物体勾选显示,调用了SetActive(true)这句指令,而起内部会同时触发响应OnEnable()函数(说白了就是OnEnable()嵌套在SetActive内部),相应的为什么不触发Awake()和Start()呢,因为物体不是被实例化的,勾选了物体,只能表示我让你显示出来,谁让你一开始启动的时候被隐藏了,所以调用不了Awake()和Start(),这两个函数只能在初次实例化的时候执行,否则无法执行。
ps:OnDisable()其实就是OnEnable()的相反情况,就不细说了

(3)FixedUpdate()、Update()、LateUpdate()

  • FixedUpdate():不受帧率的影响,是一个非常可靠的计时器哦
  • Update():每一秒执行相应的次数,这里的次数即帧数,是根据硬件设备以及内部函数复杂度决定的,可能上一秒60帧,这一秒就是80帧,不唯一
  • LateUpdate():和Update()在同一帧执行
    同样我们来作下测试,代码如下
public class test2 : MonoBehaviour {
    void FixedUpdate()
    {
        Debug.Log("this is FixedUpdate");
    }
    void Update()
    {
        Debug.Log("this is Update");
    }
    void LateUpdate()
    {
        Debug.Log("this is LateUpdate");
    }
}

我们将其依附到Cube上运行,得到如下结果
Unity学习笔记(一)事件函数
可以看到,Update()和LateUpdate()执行相同次数,FixedUpdate()不受帧率影响,说白了FixedUpdate()是匀速直线运动,另外两个是变速直线运动。


三.结尾

目前我接触的较多的就是上面几个了,其余的一些事件函数大家可以自己去作测试了解一下作用,今天就先到这啦,如果上面有错误或者解释有问题的也请大大们指出~

相关标签: Unity3d