1、添加脚本的顺序安全
这是一张官方的脚本顺序图spa
通常,当咱们把脚本绑定在游戏对象上时,或者点击绑定好的脚本的reset按钮时,会调用Reset()指针
当咱们初始化一个对象时,会先调用Awake()在调用OnEnable()code
GameObject.instantiate(o);
start()在第一次调用update()前调用,有时候start()会在Awake(),OnEnable()执行完后马上执行,处于同一帧component
onDisable()和onDestroy()的执行顺序有点特别:对象
第一种状况:blog
对于不一样对象上的不一样的脚本,执行是没有前后规律的,且必须成对执行(调用完了onDisable()必须再调用onDestroy())索引
eg:游戏
gameobject1:
sc1.cs
sc2.cs
gameobject2:
sc3.cs
sc4.cs
gameobject3:
sc5.cs
sc6.cs
gameobject1.sc1.onDisable()->gameobject1.sc1.onDestroy()->gameobject3.sc5.onDisable()->ip
gameobject3.sc5.onDestroy()
[若是按前面的规则的话,应该先执行gameobject3的脚本,但这里不是]
第二种状况:
在同一个对象的不一样的脚本上,这两个方法按照脚本
在m_component中的索引按顺序执行的,并且不是成对执行,索引自小到大执行,最先加入的最先调用onDisable()和onDestroy()
gemeobject2.sc3.onDisable()->gameobject2.sc4.onDisable()->
gameobject2.sc3.onDestroy->gameobject2.sc4.onDestroy()
这里这些脚本先依次调用onDisable()才调用onDestroy()。
2、如何自定义多个脚本的执行顺序
划重点:在unity里面能够点击edit->project settings->Script->Execution Order中自定义脚本执行顺序,
当咱们没有设置脚本执行顺序时,脚本按照Default Time的标准执行(你能够把unity里面hireachy里面添加对象和在inspector里面添加脚本
视做一个栈,按照先进先出原则,优先执行后添加的对象的先添加的Script。
能够单击+号添加对象到执行列表中
1是脚本的执行顺序,当你的值execution order越小时,越先执行,在default time上方的在执行default time前执行,在default time下方
的在default time后执行
上面的设置,是经过修改每个脚本对应的meta文件(去本身的代码目录看一下)的excution order来实现的。
3、脚本执行顺序的本质
在咱们的场景文件.unity,场景文件是一个YAML文档
每个脚本对应一个fileid,fileid越小越有先执行
4.运用
若是你的脚本A会用到另外一个脚本B中的某一个对象c,为了防止你在B初始化以前去调用c,出现空指针,你必须让脚本B在A以后挂载(这样B就会先初始化),
还有一个很重要的地方,你必须把对象c的初始化写在脚本B的Awake()方法里面,由于start()并非在初始化就马上调用的,而是在当前更新一帧时,start()
会在update()第一次调用前调用一次,这样的话若是你把对象c的初始化写在脚本B的start()方法里面,颇有可能全部脚本的awake()都跑完了,对象c却没有初始化,
这样就出现了空指针。所以,把对象c的初始化在脚本B的awake()方法,而把调用对象c写在脚本A的start()足够安全