【酷熊科技】工作积累 ----------- Unity 3D中的 SetActive() 与 OnEnable()、OnDisable()要注意的
2016-11-30 17:54
495 查看
转载的文章
其实这三之前的关系很简单:
SetActive(true),很触发MonoBehaviour.OnEnable()事件,就算对象之前本就是activeSelf==true,事件依然会发生;
SetActive(false),很触发MonoBehaviour.OnDisable()事件,就算对象之前本就是activeSelf==false,事件依然会发生;
这样问题就来了,比如,我们连续多次都调用了SetActive(true),也会多次响应OnEnable()。就是说我们在保持对象是activeSelf==true的状态没有变化的情况下,OnEnable()方法会被多次执行。这时就它就会出问题了,当然也可能不会出问题,这个主要看人在OnEnable()实现的逻辑了。
同理,SetActive(false),和OnDisable()与会有同样的问题。
我们可以封装一个自己的SetActive方法,来代替它:
Unity 3D中的 SetActive() 与 OnEnable()、OnDisable()要注意的
一、
Unity 3D中的 GameObject.SetActive() 与 MonoBehaviour.OnEnable()、MonoBehaviour.OnDisable()其实这三之前的关系很简单:
SetActive(true),很触发MonoBehaviour.OnEnable()事件,就算对象之前本就是activeSelf==true,事件依然会发生;
SetActive(false),很触发MonoBehaviour.OnDisable()事件,就算对象之前本就是activeSelf==false,事件依然会发生;
二、问题
在实际的开发中,对SetActive的使用是非常频繁的,所以以对已经是activeSelf==true的对象,设置SetActive(true),和对已经是activeSelf==false的对象,设置SetActive(false)。很正常的,或者说是不可避免的。这样问题就来了,比如,我们连续多次都调用了SetActive(true),也会多次响应OnEnable()。就是说我们在保持对象是activeSelf==true的状态没有变化的情况下,OnEnable()方法会被多次执行。这时就它就会出问题了,当然也可能不会出问题,这个主要看人在OnEnable()实现的逻辑了。
同理,SetActive(false),和OnDisable()与会有同样的问题。
三、解决
其实解决这个问题的办法也很简单的,就是在每次SetActive()之先检测对就的activeSelf状态。我们可以封装一个自己的SetActive方法,来代替它:
static public void SetActive(GameObject go, bool state) { if (go == null) { return; } if (go.activeSelf != state) { go.SetActive(state); } }
相关文章推荐
- Unity 3D中的 SetActive() 与 OnEnable()、OnDisable()要注意的
- 【酷熊科技】工作积累 ----------- unity scrollview 点击后会有偏移问题(有图片)
- 【酷熊科技】工作积累 ----------- unity 动态设置 Animator组件的Controller
- 【酷熊科技】工作积累 ----------- 【Unity】减少GC回收
- 【酷熊科技】工作积累 ----------- Unity3d中的Awake()、OnEnable()、Start()等默认函数的执行顺序和生命周期
- 【酷熊科技】工作积累 ----------- 随机数 (带权重的随机数)
- 【酷熊科技】工作积累 ----------- Unity3D UITable协程加载问题 (转载 ---- 关于NGUI中UiTable和UIGrid脚本的一点感受)
- 【酷熊科技】工作积累 ----------- Unity3D grid 显示问题
- 【酷熊科技】工作积累 ----------- C#自动添加using引用命名空间
- 【酷熊科技】工作积累 ----------- Unity3D 读取 图片
- 【酷熊科技】工作积累 ----------- 在unity3d里怎样隐藏物体
- 【酷熊科技】工作积累 ----------- Unity3D button 回调事件
- 【酷熊科技】工作积累 ----------- Unity3D / c 语言 使用 Stringbuilder 引用头文件 using System.Text
- 【酷熊科技】工作积累 ----------- Unity3D的基本界面介绍
- 【酷熊科技】工作积累 ----------- 内存优化之GC.MarkDependencies
- 【酷熊科技】工作积累 ----------- android 6.0 权限问题
- 【酷熊科技】工作积累 ----------- 动画播放 直接写代码控制的
- unity 3d 注意事项
- 【图说】Eclipse与Unity 3D协同工作