Unity3d脚本从唤醒到销毁有着一套比较完善的生命周期,请举几个例子?

2020-05-14 10:00发布

3条回答
男孩无衣
1楼 · 2020-05-14 10:28.采纳回答

image.png


Awake、OnEnable、Start:回调方法执行一次,其中OnEnable可有条件多次执行(游戏对象从不激活到激活状态)


FixedUpdate、Update、LateUpdate、OnGUI又叫游戏“帧”,也叫一个“游戏循环”,可反复、多次执行。


OnDisable、OnDestroy:执行一次,其中Ondisable可由条件多次执行(从激活到不激活状态)。

Ross
2楼 · 2020-05-14 11:40

生命周期

Reset:在用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。
Reset最常用于在检视面板中给定一个默认值。

Awake(一次):Awake在所有对象被初始化之后调用,用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内Awake仅被调用一次。Awake不能用来执行协同程序。
每个游戏物体上的Awake以随机的顺序被调用。所以在一般时候,用Awake来设置脚本间的引用,然后用Start来传递信息。

OnEnable:在Awake之后调用。控制脚本中组件的启动与禁用。
例如:this.enable=false,则会直接跳转到OnDisable方法执行一次,其它的任何方法,将不再被执行。

Start(一次):Start函数总是在Awake函数之后调用。Start在生命周期中只被调用一次。
Start和Awake的不同是Start只在脚本实例被启用时调用。你可以按需调整延迟初始化代码,协调初始化顺序。

FixedUpdate(每帧):固定帧(固定的时间间隔,不受帧率(FPS)影响)更新,更新频率默认为0.02s。
FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。

Update(每帧):正常帧更新,每一帧都执行,用于更新逻辑。
Update比较适合做控制。如果卡帧了Update就不会再执行,而FixedUpdate则继续执行。

LateUpdate(每帧):在所有Update函数调用后被调用,和fixedupdate一样都是每一帧都被调用执行。
LateUpdate可用于调整脚本执行顺序。例如:相机跟随就可以用这个函数,即人物移动在Update中实现,相机跟随在LateUpdate()中实现,播放后的效果是:角色移动发生在前,相机移动紧跟其后。(如果相机也在Update里执行,就可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。)

OnGUI(每帧)在渲染和处理GUI事件时调用。每帧都执行。
在界面显示一个button或label时常常用到它。

OnDisable:脚本被卸载时,OnDisable将被调用(脚本不会被销毁)。OnDisable不能用于协同程序。
常用于一些用于清理的事件。

OnDestroy:当MonoBehaviour将被销毁时,这个函数被调用。OnDestroy只会在预先已经被激活的游戏物体上被调用。OnDestroy也不能用于协同程序。

函数执行顺序:

**Awake→OnEable→ Start → FixedUpdate→Update  →LateUpdate →OnGUI →Reset → OnDisable →OnDestroy **

最先执行的方法是Awake,这是生命周期的开始,用于进行激活时的初始化代码,如果在这个地方将当前脚本禁用:this.enable=false,则会直接执行OnDisable方法,其它的任何方法,都将不再被执行。

如果当前脚本处于可用状态:this.enable =true,则按正常的执行顺序是继续向下执行OnEnable

再向下执行,会进行一个判断,如果Start方法还没有被执行,则会被执行一次,如果已经被执行了,则不会再被执行。这是个什么意思呢?我们可以在某个脚本中将组件禁用this.enable=false,再启用时会转到OnEnable处执行,这时继续向下走,发现Start执行过了,将不再被执行。比如说:第一次启用时,将怪物的初始位置定在了(0,0,0)点,然后怪物可能会发生了位置的变换,后来被禁用了,再次启用时,不会让怪物又回到初始的(0,0,0)位置。

继续向后执行,就是FixedUpdate了,然后是Update,再然后是LateUpdate,如果后面写了Reset,则会又回到Update,在这4个事件间可以进行循环流动

再向后执行,就进入了渲染模块(Rendering),非常重要的一个方法就是OnGUI,用于绘制图形界面,每帧都执行。

再向后,就是卸载模块(TearDown),当被禁用(enable=false)时,会执行OnDisable方法,但是这个时候,脚本并不会被销毁,在这个状态下,可以重新回到OnEnable状态(enable=true)。

当手动销毁或附属的游戏对象被销毁时,OnDestroy才会被执行,当前脚本的生命周期结束。



作者:FLY旳影子
链接:https://www.jianshu.com/p/32ce8768607f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


蜗牛
3楼 · 2020-05-15 10:15

1.Awake() ※

唤醒事件,只执行一次。

2.OnEnable()

启用事件,只执行一次。当脚本组件被启用的时候执行一次。

3.Start() ※

开始事件,只执行一次。

4.FixedUpdate() ※

固定更新事件,执行 N 次,0.02 秒执行一次。

所有物理组件相关的更新都在这个事件中处理。

5.Update() ※

更新事件,执行 N 次,每帧执行一次。

6.LateUpdate()

稍后更新事件,执行 N 次,在 Update 事件执行完毕后再执行。

7.OnGUI()

GUI 渲染事件,执行 N 次,执行的次数是 Update 事件的两倍。

8.OnDisable()

禁用事件,执行一次。在 OnDestroy 事件前执行。

或者当该脚本组件被“禁用”后,也会触发该事件。

9.OnDestroy() ※

销毁事件,执行一次。当脚本所挂载的游戏物体被销毁时执行。

10.注意事项

生命周期事件,全部是由系统定义好的,且系统会自动调用。

系统调用这些事件的顺序,和我们代码里面的书写顺序无关


相关问题推荐

  • 回答 6

    第一步:对着Assets点击右键,选择ExportPackage第二步:选择场景文件以及和场景相关的资源或者素材,然后点击Export第三步:给导出的资源取名,并且选择要保存的位置即可

  • 回答 87
    已采纳

    玩游戏玩的很好,说明你对于游戏里面的规则、剧情设置还是比较了解的,对于从事游戏相关岗位来说也是优势之一。但是学习游戏开发还是要对游戏开发的工作内容做进一步的了解,游戏开发涉及代码较多,可以通过进一步的了解,判断自己是否适合学习这个方向,另外...

  • 回答 11

    游戏开发入门不难。后期发展需要你有丰富的奇思妙想。游戏开发肯定是培训好,自学学得不系统,并且不易发现自身薄弱之处。游戏开发的学习时长还是要看你自己对知识与技术的掌握能力,一般来说,游戏开发的学习时长大约在五个月左右。...

  • 回答 18

    个人觉得如果有一定的技术基础的话还是可以考虑自学,如果零基础的话可能会有些难度

  • 回答 10

    问题还是出在粒子的sorting fudge。在unity的2d模式下,游戏本身的背景相当于是sorting fudge的0,当你把粒子的sorting fudge设为0以上的时候,粒子就都会被背景盖住。所以在3d模式下给alpha正值来给add垫底的话,到了2d模式下就会通通不显示。所以遇上这样的...

  • 回答 17

    虚幻4引擎,你会看到和平精英加载页面左下角有这个图标。

  • 回答 8
    已采纳

    转载知乎上的两位答友的回答,各有道理。作者:风小锐链接:https://www.zhihu.com/question/322249959/answer/675883379来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。未来Unity有可能出现3A大作吗? 有可能。基于Unity已...

  • 回答 11

    在Assets文件夹里面.点击右键Create/Material即可以创建材质球

  • 回答 23

    可以让模型师直接作出这样的形状,如果用纯Unity制作,就要用基本游戏对象拼接了,包括楼梯,城堡,都可以拼接出来。正常情况不会这样做,因为不够精美,都是建模师来实现,毕竟Unity不属于专业的建模软件,侧重于实现功能。...

  • 回答 18

    粒子系统由粒子发射器、粒子动画器和粒子渲染器三部分组成,主要用于游戏场景中一些特殊效果,如水、烟火等等

  • 回答 18

    首先,Python开发游戏非常尴尬,原因是没有好用的游戏开发库。Python开发游戏仅推荐PyGame,PyGame是对多年以前很流行的游戏开发库——SDL的封装。但是说实话功能太简陋了,做个动画都得考虑刷新的问题。楼主要做简单小游戏,只需要画一两周熟悉Unity引擎,然...

  • 回答 9

    1.标记水体碰撞的位置2.计算水波的传递 通过波动公式,3D或者2D 波动公式都行3.水面顶点采样波动传递结果计算结果做顶点Y轴偏移

  • 回答 15

    Unity3D中两种阴影的实现传统的ShadowMapShadowMap说起来十分简单,把摄像机和光源的位置重叠,那么场景中该光源的阴影区域就是那些摄像机看不到的地方,主要应用在前向渲染路径中。具体实现分以下几个步骤:如果有平行光开启了阴影,Unity就会为该光源计算它...

  • 回答 18

    Doozy UI是Unity UI视图层的框架,本身使用的还是UGUI的组件,但提供了一套强大的UI管理功能,可以很方便的实现一些炫酷效果,方便的UI系统管理与事件传递机制。

  • 回答 12

    Unity3d更好,因为U3D占有的市场更大,目前cocos大都是用来开发棋牌游戏的,在这方面它有着巨大的优势。而Unity3d既可以用来开发大型3D游戏,也可以用来开发vr游戏、vr应用,这是比较不错的,未来有着巨大的前景。另外ue4也是个不错的选择,近年来用ue4开发的...

  • 回答 11

    当Unity 需要做热更新的时候(2013年开始),而普通的C#又做不到的时候,而对于游戏行业来说Lua脚本热更新已经是很成熟的方案,自然Lua 热更新就成为了Unity热更新的首选。

没有解决我的问题,去提问