MonoBehaviour生命周期与对象数据池应用
预热游戏对象:
tempObject = Instantiate(cubePrefab) as GameObject ;
tempObject .SetActive( false );
游戏对象tempObject调用三个方法:
Awake()、OnEnable()、OnDisable()
暂停游戏,启用游戏对象:
游戏对象tempObject调用如下几个方法:
OnEnable()、Start()、OnGUI()(连续调用2次)、OnWillRenderObject()
补充:
OnGUI():在游戏暂停状态下,每次快速点击鼠标,会连续6次调用该方法,慢速移动鼠标,会连续2次调用该方法。
OnWillRenderObject():在游戏暂停状态下,每次快速点击键盘,会连续2次调用该方法。
OnWillRenderObject调用次数还受摄像机数量影响
播放下一帧:
游戏对象tempObject调用如下几个方法:
FixedUpdate()、Update()、LateUpdate()、OnGui(连续调用2次)、OnWillRenderObject()
之后每一帧均重复如上
再次禁用游戏对象:
游戏对象tempObject调用如下方法:
OnDisable()
再次启用游戏对象:
游戏对象tempObject调用如下方法:
OnEnable()、OnGUI(连续调用2次)、OnWillRenderObject()
结论1:初始化游戏对象后立即禁用游戏对象,初始化方法中仅执行Awake()方法和OnEnable()方法。由于在整个实验过程中,Awake()仅执行一次,因此可在此处进行资源的预加载
结论2:Start()方法如果在一开始没有执行,则在Enable()时会执行一次,且仅会执行一次。目前没有想到比较好的应用场景。
结论3:OnEnable()方法在游戏对象创建及每次启用的时候都会执行,结合对象数据池,比较用作适合游戏对象的数据初始化。
结论4:在OnDisable()方法中对游戏对象的数据进行重置,称为立即重置。在OnEnable()方法中对游戏对象的数据进行重置,称为使用时重置。
参考资料:
Simple Reusable Object Pool - Help limit your instantiations!
http://forum.unity3d.com/threads/simple-reusable-object-pool-help-limit-your-instantiations.76851/#userconsent#
C# Memory Management for Unity Developers (part 3 of 3)
http://www.gamasutra.com/blogs/WendelinReich/20131127/203843/C_Memory_Management_for_Unity_Developers_part_3_of_3.php