Object.Destroy慎用

简介:



Object.Destory

Destory(Object)并没有立刻,马上,及时的删除这个Object。

举例

在使用NGUI的Table或Grid进行布局时,就需要注意了:尽量不要使用Destroy 来销毁GameObject,而是使用gameObject.SetActive(false);

image

建议方法

建议使用setactive(false)替代destory

复制代码
int max = parent.childCount;
//全部都隐藏
for (int i = 0; i < max; i++)
{
    parent.GetChild(i).gameObject.SetActive(false);
}
int idx = 0;
//根据需要显示,并设置值
foreach (CWeaponVo weaponVo in weapons)
{
    UILabel atkLabel;
    var nature = weaponVo.Info.Nature.ToLower();
    
    if (!propertyLabels.TryGetValue(nature, out atkLabel))
    {
        newObj = parent.GetChild(idx).gameObject;
        newObj.SetActive(true);
        sprite = newObj.GetComponent<UISprite>();
        sprite.spriteName = iconWpProperty[nature];
        atkLabel = GetControl<UILabel>("TotalLabel", newObj.transform);
        propertyLabels[nature] = atkLabel;
    }
    idx++;
}
复制代码

慎用Destory

复制代码
//每次Refresh时都销毁之前的
void Refresh()
{
    foreach (var obj in PropertyObjList)
    {
        Destroy(obj);
    }
    PropertyObjList.Clear();
}
void RenderUI()
{
    foreach (CWeaponVo weaponVo in weapons)
    {
        UILabel atkLabel;
        var nature = weaponVo.Info.Nature.ToLower();

        //生成新的    
        if (!propertyLabels.TryGetValue(nature, out atkLabel))
        {
            newObj = Instantiate(properTemplate) as GameObject;
            CBase.Assert(newObj);
            newObj.SetActive(true);
            CTool.SetChild(newObj, parent.gameObject);
            sprite = newObj.GetComponent<UISprite>();
            sprite.spriteName = iconWpProperty[nature];
            atkLabel = GetControl<UILabel>("TotalLabel", newObj.transform);
            propertyLabels[nature] = atkLabel;
            PropertyObjList.Add(newObj);
        }
    }
    //重设Table位置
    properTable.Reposition();
}
复制代码

意外后果

使用Destory(obj),在重设Table的位置时,因为Destory不及时 所以残留着之前的child悲伤

Instance GameObject

Instance NGUI widget

在Instance 绑有ngui组件的prefab时,建议把gameobject.setActive(false)之后再instance。不然很容易引起多生成一个UICamera。

NGUI版本:3.6.x

生成多的UICamera?

因为ngui的panel在渲染时,会检查组件是否在UICamera下,instance生成的临时对像没有ParentRoot,很容易引起bug。

 

文档资料

文档:http://game.ceeger.com/Script/Object/Object.Destroy.html


本文转自赵青青博客园博客,原文链接:http://www.cnblogs.com/zhaoqingqing/p/4104955.html,如需转载请自行联系原作者

相关文章
|
7月前
|
缓存 监控 Java
ThreadLocal 源码解析get(),set(), remove()用不好容易内存泄漏
ThreadLocal 源码解析get(),set(), remove()用不好容易内存泄漏
90 1
|
2月前
|
JavaScript 前端开发 大数据
在JavaScript中,Object.assign()方法或展开语法(...)来合并对象,Object.freeze()方法来冻结对象,防止对象被修改
在JavaScript中,Object.assign()方法或展开语法(...)来合并对象,Object.freeze()方法来冻结对象,防止对象被修改
38 0
|
4月前
|
JavaScript 前端开发
Object.freeze() 和 const 的区别详解
【8月更文挑战第31天】
38 0
|
Java API 调度
JobService源码探究之 onStartJob()返回false立马被destroy
JobService源码探究之 onStartJob()返回false立马被destroy
JobService源码探究之 onStartJob()返回false立马被destroy
为何每次用完ThreadLocal都要调用remove()?
什么是内存泄漏 内存泄漏指的是,当某一个对象不再有用的时候,占用的内存却不能被回收,这就叫作内存泄漏。
ES6中对象冻结Object.freeze()的使用及注意事项
ES6中对象冻结Object.freeze()的使用及注意事项
解决办法:对‘operator delete(void*)’未定义的引用
解决办法:对‘operator delete(void*)’未定义的引用
198 0
|
C++
C++学习008-delete与delete[]的差别
对于简单的数据类型,delete与delete[]是没啥差别的,就是等价的
121 0
C++学习008-delete与delete[]的差别
Object.create()方法与new操作的区别
Object.create()方法与new操作的区别
150 0
Object.create()方法与new操作的区别
|
JavaScript 前端开发
Object.freeze() 方法小记
在vue中的应用:如果你有一个巨大的数组或Object,并且确信数据不会修改,可以使用 Object.freeze() 方法冻结该数据,这样vue就不会对该对象的getter和setter做转换,从而让性能得以大幅提升。
1657 0

热门文章

最新文章