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

时间:2014-11-11 11:03:27

标签: c# unity3d

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

这是我卸载的代码:

GameObject _tmp = MapGeneration.Map[Mathf.Abs(y)][x];
DestroyImmediate(MapGeneration.Map[Mathf.Abs(y)][x].gameObject);
MapGeneration.Map[Mathf.Abs(y)][x] = _tmp;

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

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

我收到此错误:

  

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

2 个答案:

答案 0 :(得分:4)

您不想销毁该对象,您希望将其禁用,以便它不会占用处理资源。使用Destroy()意味着对象消失了,完全消失了。

查看SetActive()

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

它基本上是检查器面板中对象/组件左上角的小刻度框的代码。虽然不活动,但引擎将跳过"跳过"它,但这也包括Find()GetComponent()等功能,因此请确保在将其设置为无效之前存储了对游戏主体的引用,否则您将无法执行#34} ;发现"再一次。

答案 1 :(得分:0)

在销毁后无法访问任何游戏对象。

要解决此问题,您必须为对象创建预制件,以下步骤说明如何使用预制件创建和销毁一个对象:

1-为您的某个对象创建预制件。 (例如“terrain1”对象) 2-在脚本(类级别)中,按如下所示定义以下变量:

public GameObject terrain1Prefab;
GameObject terrain1Instance;

3-将公共变量“terrain1Prefab”链接到您创建的预制件。

4-在你的函数中,创建一个“terrain1Prefab”的实例并按如下方式存储它的实例:

terrain1Instance = Instantiate(terrain1Prefab, new Vector3(x, y, 0), Quaternion.identity);

5-现在,你可以按如下方式销毁你的实例:

Destroy(terrain1Instance);