您当前的位置: 首页 >  unity

Allen Su

暂无认证

  • 1浏览

    0关注

    431博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Unity3D 教程系列第 10 篇】Unity 脚本中的生命周期流程图

Allen Su 发布时间:2018-11-16 21:35:22 ,浏览量:1

这是【Unity3D 教程系列第 10 篇】,如果觉得有用的话,欢迎关注专栏。

文章目录
      • 一:生命周期流程图
      • 二:常用的生命周期函数
      • 三:脚本初始化和销毁
      • 四:脚本的动态添加与静态添加
      • 五:Awake 与 Start 谁更适合访问脚本数据?
      • 六:渲染用到的周期函数

一:生命周期流程图

Unity 脚本有一套完整的生命周期,脚本需要挂在任意游戏对象上,并且同一个游戏对象可以挂不同的脚本,各个脚本执行自己的生命周期,它们可以相互组合并且互不干扰。

学习脚本的生命周期之前,我们不得不引用文档中非常经典的一张图,这张图完整地描述了脚本的生命周期,如下图所示 在这里插入图片描述 生命周期中的所有方法都是 Unity 系统自己回调的,不需要手动调用,主要有编辑脚本,初始化,物理碰撞事件,更新回调,渲染和销毁等。

二:常用的生命周期函数
  • Awake :Awake 隔帧后会调用 Start,并且只会调用一次,OnEnable 每次被激活时都会被调动。
  • FixedUpdate :固定更新,会按照设置的时间固定频率来循环更新,关于FixedUpdate与Update,LateUpdate之间的区别
  • yield :协程任务会在每一帧 Update 后,LateUpdate 之前执行。
  • OnDisisable :在禁用脚本时调用,重新激活时将调用 OnEnable 方法。
三:脚本初始化和销毁

脚本挂在游戏对象上,运行时就会立即执行初始化方法 Awake,它是一个同步方法,如果游戏对象被删除,或者挂在它身上的脚本被删除,就会执行 OnDestroy 销毁方法。

需要记住的是,初始化或销毁,在脚本的生命周期中只会执行一次。

此外,游戏对象还有个状态,叫禁用状态,如下图红色标记,打对勾表示激活,取消对勾表示禁用。 在这里插入图片描述 在程序运行的过程中,可以多次设置激活/禁用,同时系统会分别回调生命周期中的 OnEnable 函数和 OnDisable 函数。

四:脚本的动态添加与静态添加

脚本既可以在运行时动态添加在游戏对象上,也可以运行游戏前预制挂在游戏对象上。动态添加的脚本按添加的先后顺序决定执行顺序,但是静态脚本因为提前挂在了游戏对象上,所以初始化的顺序就不一样了。

五:Awake 与 Start 谁更适合访问脚本数据?

例如,A 脚本先执行,B 脚本后执行,如果 A 脚本在自己的 Awake 方法中获取 B 脚本的数据,那么就会出错。

因为此时 B 脚本的初始化方法还没有执行。这就说明为什么在脚本生命周期中会提供 Start 方法,所以 Awake 方法适合做初始化,而在 Start 方法才适合安全地访问其它脚本数据。

特别注意 脚本挂得越多,执行效率就越低,这些脚本都需要执行生命周期的方法,此时 unity 需要遍历它们,然后再反射调用每个脚本的方法,所以我们能做的优化就是避免挂太多的脚本。

尤其避免在脚本中写入这种空方法,虽然没执行任何功能,但 unity 还是会去调用,所以,如果不需要,就把它删掉 在这里插入图片描述

六:渲染用到的周期函数

下面这些是关于渲染的周期函数,想了解的可以看下。

OnPreCull 作用:在相机剔除场景之前调用此函数。相机可见的对象取决于剔除。OnPreCull 函数调用发生在剔除之前。 OnBecameVisible / OnBecameInvisible 作用:在对象对于相机可见/不可见时调用此函数。 OnWillRenderObject 作用:如果对象可见,则为每个相机调用一次此函数。 OnPreRender 作用:在相机开始渲染场景之前调用此函数。 OnRenderObject 作用:在完成所有常规场景渲染后调用此函数。可使用 GL 类或 Graphics.DrawMeshNow 绘制自定义几何图形。 OnPostRender 作用:在相机完成场景渲染后调用此函数。 OnRenderImage 作用:在完成场景渲染后调用此函数,以便对屏幕图像进行后处理(仅限专业版)。 OnDrawGizmos 用于在场景视图中绘制小图示 (Gizmos),以实现可视化目的。 OnGUI 作用:在每帧上多次调用此函数,以响应 GUI 事件。程序首先将处理 Layout 和 Repaint 事件,然后再处理每个输入事件的 Layout 和 keyboard 鼠标事件。

你的问题得到解决了吗?欢迎在评论区留言。

赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。

结束语 技术是一点一点积累的,大神也不是一天就可以达到的。原地不动就是退步,所以每天进步一点点。 最后,附上一句格言:"好学若饥,谦卑若愚",望共勉。
关注
打赏
1656491068
查看更多评论
立即登录/注册

微信扫码登录

0.0378s