Destroy(Object)慎用

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

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

image

用起来,大概如下:

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++;

}

原来的做法:

//每次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();

}

这种做法,在重设Table的位置时,因为Destory不是及时了,所以老是残留着之前的child悲伤

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

你可能感兴趣的:(object)