销毁游戏对象,但也将其保存在变量中以供以后使用

Mob*_*dde 0 c# unity-game-engine

我正在创建一个程序生成的游戏,它将永远生成新的“地形”,这样做我的游戏开始滞后,所以我尝试卸载一些块,稍后我想再次加载(如果玩家再次回到那个特定位置)...

这是我的卸载代码:

GameObject _tmp = MapGeneration.Map[Mathf.Abs(y)][x];
DestroyImmediate(MapGeneration.Map[Mathf.Abs(y)][x].gameObject);
MapGeneration.Map[Mathf.Abs(y)][x] = _tmp;
Run Code Online (Sandbox Code Playgroud)

后来当我尝试再次实例化该块时:

Instantiate(MapGeneration.Map[Mathf.Abs(y)][x].gameObject, new Vector3(x, y, 0), Quaternion.identity);
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

MissingReferenceException:“GameObject”类型的对象已被销毁,但您仍在尝试访问它。您的脚本应该检查它是否为空,或者您不应该销毁该对象。UnityEngine.Object.Internal_InstantiateSingle(UnityEngine.Object数据,Vector3位置,四元数旋转) UnityEngine.Object.Instantiate(UnityEngine.Object原始,Vector3位置,四元数旋转)MapGeneration.Update()(位于Assets/Scripts/MapGeneration.cs:53 )

小智 5

您不想销毁该对象,而是想禁用它,以便它不占用处理资源。使用Destroy()意味着该物体消失了,完全消失了。

看一下SetActive()

http://docs.unity3d.com/ScriptReference/GameObject.SetActive.html

它本质上是相当于检查器面板中对象/组件左上角的小复选框的代码。当不活动时,引擎将“跳过”它,但这还包括 和 等函数Find()GetComponent()因此在将游戏对象设置为不活动之前,请确保您有一个存储的对游戏对象的引用,否则您将无法再次“发现”它。