销毁物体和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
- 销毁物体和ExecuteInEditMode
- 动态生成和销毁物体
- ExecuteInEditMode
- ue4 打中物体,物体销毁
- [ExecuteInEditMode] 和 [RequireComponent(typeof(UIRoot))]理解
- 在一个父物体下面创建并及时销毁物体
- unity销毁层级物体及 NGUI 深度理解总结
- unity3d 切换场景不销毁对象池中的物体方案
- Unity3D学习记录——碰撞销毁物体
- 窗口创建和销毁
- 对话框创建和销毁
- 创建和销毁对象
- 创建和销毁对象
- 创建和销毁对象
- 创建和销毁对象
- 创建和销毁对象
- 创建和销毁对象
- 创建和销毁对象
- java 获取文件 总行数 比较
- Andriod界面设计适配和Android Studio中的资源
- 设置导航栏控制器背景色
- SharePoint Server 2016 RC中的新功能(2)-- Fast Site Collection Creation
- 垂直滚动的galery(字体缩放)
- 销毁物体和ExecuteInEditMode
- 策略模式
- git stash 命令
- FZU 1894 志愿者选拔 - 单调队列
- [读书笔记]并发性:互斥和同步
- USACO 1.1.1
- Inside of Jemalloc
- Android 自定义扩展控件 一:ClearEditText
- 折纸问题