纳金网

标题: 强烈建议大家使用DestroyImmediate,而不是Destroy来删除物体。 [打印本页]

作者: gogomercury    时间: 2014-1-7 20:38
标题: 强烈建议大家使用DestroyImmediate,而不是Destroy来删除物体。
官方API说强烈建议使用Destroy代替DestroyImmediate,结果被坑了。
大家可以自己试试,
使用Destroy,然后调用其他方法(如Start),GameObject根本不能被销毁。
DestroyImmediate就不存在这问题。

大家知道这是为什么吗?

by the way,Unity可以像android开发一样看API的源代码就好了。。


作者: libufan    时间: 2014-1-7 21:10
我使用Destroy没有发现什么问题啊?!
作者: 狂风大尉    时间: 2014-1-7 23:12
Destroy貌似不会有啥问题啊
作者: ku    时间: 2014-1-8 08:11
一个是立即断开与所有资源的关联并销毁,一个是等几有与其关联的资源离开计算范围后它才销毁
作者: pz789as    时间: 2014-1-8 08:55
一直用的Destory
作者: xiduxiaoyu    时间: 2014-1-8 21:36
晕Destroy后Assets再释放一下unused资源就行了。
作者: gogomercury    时间: 2014-1-8 23:00
libufan 发表于 2014-1-7 21:10
我使用Destroy没有发现什么问题啊?!

我代码有问题吗?

先:
DestroyImmediate(SubObjects);//使用Destroy(SubObjects)绝对删除不了



然后:
SequenceObjectButRandomSprite(){

        GameObject newObject = new GameObject();
               
        newObject.name = xxx;

              
        newObject.transform.parent = ThisGameObject.transform;

        newObject.transform.localScale = new Vector3(xxx);
      
              
        newObject.transform.localPosition = new Vector3(xxx);

        UISprite uisprite = newObject.AddComponent<UISprite>();

        uisprite.atlas = MyUIAtlas;

        uisprite.spriteName = xxx;

        newObject.AddComponent<BoxCollider>();

        newObject.AddComponent<UIButtonColor>();

xxx


}
作者: gogomercury    时间: 2014-1-8 23:01
狂风大尉 发表于 2014-1-7 23:12
Destroy貌似不会有啥问题啊

我代码这样写有冲突吗?

先:
DestroyImmediate(SubObjects);//使用Destroy(SubObjects)绝对删除不了



然后:
SequenceObjectButRandomSprite(){
xxx
        GameObject newObject = new GameObject();
               
        newObject.name = xxx;

              
        newObject.transform.parent = ThisGameObject.transform;

        newObject.transform.localScale = new Vector3(xxx);
      
              
        newObject.transform.localPosition = new Vector3(xxx);

        UISprite uisprite = newObject.AddComponent<UISprite>();

        uisprite.atlas = MyUIAtlas;

        uisprite.spriteName = xxx;

        newObject.AddComponent<BoxCollider>();

        newObject.AddComponent<UIButtonColor>();

xxx


}
作者: gogomercury    时间: 2014-1-8 23:04
ku 发表于 2014-1-8 08:11
一个是立即断开与所有资源的关联并销毁,一个是等几有与其关联的资源离开计算范围后它才销毁 ...

如果这样的话,那我碰到的现象可能就好解释了。我要删除的gameObjec是我代码new的,我为这些new的gameObject添加了一些组件,还和NGUI的Atlas中的sprite有引用关系,所以Unity就一直不让删除。

代码如下:
先:
DestroyImmediate(SubObjects);//使用Destroy(SubObjects)删除不了

然后:
SequenceObjectButRandomSprite(){

        GameObject newObject = new GameObject();
               
        newObject.name = xxx;

              
        newObject.transform.parent = ThisGameObject.transform;

        newObject.transform.localScale = new Vector3(xxx);
      
              
        newObject.transform.localPosition = new Vector3(xxx);

        UISprite uisprite = newObject.AddComponent<UISprite>();

        uisprite.atlas = MyUIAtlas;

        uisprite.spriteName = xxx;

        newObject.AddComponent<BoxCollider>();

        newObject.AddComponent<UIButtonColor>();

xxx


}
作者: gogomercury    时间: 2014-1-8 23:05
xiduxiaoyu 发表于 2014-1-8 21:36
晕Destroy后Assets再释放一下unused资源就行了。

怎么弄的?
作者: likunhan    时间: 2014-1-9 09:06
表示用Destroy没问题。但Destroy后Assets再释放一下unused资源没用过,同求详解。
作者: 徐徐的风    时间: 2014-1-9 11:21
使用AssetBundle或者Resource加载的时候可以使用。

使用AB对象的unload(false);
然后
Resources.UnloadUnusedAssets();

或者直接使用AB对象的unload(true);方法

来释放内存。
作者: leifd1120    时间: 2014-4-12 18:46
谢谢楼主分享
作者: heise    时间: 2014-4-12 21:20
个人还是建议使用Destroy,因为这个是删除后,内存交给系统托管,这个本身就是自动回收机制,你可以通过自动回收的管理来管理内存(比如GC一下),Resources API中也有对未使用的资源进行清空,在编辑模式代码中使用后一个,这样子才能真正的删这个东西,在很久以前如果在运行时使用后一个API,控制台会提示警告,要你使用Destroy。




欢迎光临 纳金网 (http://go.narkii.com/club/) Powered by Discuz! X2.5