销毁物体和ExecuteInEditMode

来源:互联网 发布:python sum(axis=1) 编辑:程序博客网 时间:2024/05/21 22:46

今天在使用Destroy函数销毁物体的时候,出现了一些状况。


首先来看一下这样一段简单的代码:


    [ExecuteInEditMode]    public class Test : MonoBehaviour    {        public GameObject TestGameobject;        public void Start()        {            Instantiate(TestGameobject);        }

按照Unity 场景的序列化和反序列化的机制(也就是常说的在Play模式下所有修改都不会生效)。

在点击Play按钮之后,执行脚本后会创建一个物体,然后再次点击Play退出游戏后,原先场景的数据会执行反序列化恢复到原状,也就是说物体会被销毁。


但是,运行这一段脚本会发现,实例化之后的TestGameobject并没有随着游戏的退出而自动销毁,而是随着游戏的每次运行退出之后都不断增加。


经过研究发现问题出现在[ExecuteInEditMode]这个属性上。

官方文档上的解释是:

Makes a script execute in edit mode.

By default, script components are only executed in play mode. By adding this attribute, each script component will also have its callback functions executed while the Editor is not in playmode.

让脚本在编辑器模式下也能运行。


实际上,这个属性的对Awake和Start这样的函数会有下面的影响:

    当该MonoBehavior在编辑器中被赋于给GameObject的时候,Awake, Start 将被执行。
    当Play按钮被按下游戏开始以后,Awake, Start 将被执行。
    当Play按钮停止后,Awake, Start将再次被执行。
    当在编辑器中打开包含有该MonoBehavior的场景的时候,Awake, Start将被执行。


编辑器在每次更新的时候,都会执行一次Awake和Start。


这样就能解释上面的情况。

开始游戏的时候,Start被执行创建了一个物体,退出游戏后场景反序列化该物体被删除,但是这时候编辑器的视图也更新了,又触发了一次Start创建了一个物体。所以每次开始和退出游戏之后,都会多出一个物体。

也就是说,退出游戏之后多出来的那个物体和进入游戏时创建的那个物体不是同一个。

通过在Start函数里面输出日志的办法证实了我的想法。


参考资料:

http://www.cnblogs.com/xpvincent/p/3178042.html

http://docs.unity3d.com/ScriptReference/ExecuteInEditMode.html

0 0
原创粉丝点击