我们先来看⼀些有趣Unity实例顺序的⼩实验。有图有!!
注:以上打印的代码语句如下: [csharp]
1. void Start () { 2. print(\"-----\" + this.transform.name); 3. }
从以上的打印我们⾄少可以得出的实验结果!
总结:Unity从树形⽬录的最底端的最深层开始实例化对象,然后逐个向上实例!
我们再来实验下关于脚本⽣命周期的⼩实验:
关于脚本的⽣命周期⽹上和官⽅都有很多资源,这⾥主要实验是关于对象的实例顺序及对象依附脚本的执⾏顺序!
脚本代码: [csharp]
1. public class GroupData : MonoBehaviour 2. { 3. 4. void Awake() 5. { 6. print(\"--\" + this.transform.name+ \"-------Awake-----------------\"); 7. } 8. 9. // Use this for initialization 10. void Start() 11. { 12. print(\"----Start-\" + this.transform.name); 13. } 14. 15. // Update is called once per frame 16. void Update() 17. { 18. 19. } 20. 21. void OnDestroy() 22. { 23. print(\"*******************\"+ this.transform.name + \"********Destroy!\"); 24. } 25. }
运⾏效果图: 初始化的状态
由以上的打印可以看出,在初始对象以及脚本的调⽤上,Unity的实例始终是按照树形结构从最底层开始加载调⽤,然后逐层向上!终⽌状态:
奇妙的事情发⽣啦! 哈~ 在对象销毁的时候,Unity是优先Destroy上层的对象,再操作它的⼦对象(从上于下的顺序)销毁!
最后我们关注下,⼀个对象关联多个脚本时的输出情况,这⾥也关注初始化和销毁两个⾏为!
每个对象的脚本绑定形式:
三个脚本的打印形式如: [csharp]
1. // Use this for initialization 2. voidStart() 3. { 4. print(\"----Start-\" + this.transform.name + \5. } 6. 7. // Update is called once per frame 8. void Update() 9. { 10. 11. } 12. 13. void OnDestroy() 14. { 15. print(\"*******************\"+ this.transform.name + \"********Destroy!\" + \16. }
我们先从当个脚本的执⾏情况看看:
我们再交换下三个脚本的顺序,看看打印的情况: 总结:
初始化:对于同⼀对象绑定多个脚本,初始化加载总会从⽬录的最底层开始,再逐级向上!销毁:也许是因为同级⽬录,所以销毁的顺序按⽬录层,从上到下依次执⾏!
最后我们看看多层多脚本的执⾏情况: 总结:
对于对象视图,依然从最底开始,再到单⼀对象的脚本视图,⼜从底部开始! 个⼈来说这⾥有点⼩意外这⾥!!哈哈~~以下为销毁效果图:
销毁的顺序跟我们上⾯的实验结果没有多⼤的相差!
假如:我们把Group20和Group210的脚本都减少⼀个,只放置⼀个脚本,看看脚本的执⾏情况!
以下是销毁的效果图:
我们试着按代码的思路去写的话我猜有可能是这样⼦的:
1.查找对象的脚本绑定,记录最⼤的脚本绑定层数2.查找对象的分布层数,建⽴树形层级
3.对于加载过程,从脚本层数开始的最底端开始遍历整个对象分布的树形层
4.对于销毁过程,则反过来由对象视图的树形层开始,依然销毁对象的脚本,并且优先销毁最底层的⽗节点,依次向上!
仅为记录⼯作中的⼀些疑问,有不对的地⽅,欢迎⼤家指正,交流!谢谢理解!
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务