我正在创建一个程序生成的游戏,它将永远产生新的“地形”,对此我的游戏开始滞后,所以我试图卸载一些块,我后来又想加载(如果玩家再次回到该特定位置)...
这是我卸载的代码:
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)
答案 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);