我试图移动我的玩家来摧毁怪物,第一次摧毁怪物我有以下错误:
MissingReferenceException:类型' GameObject'的对象已被破坏,但你仍然试图访问它。 您的脚本应该检查它是否为null或者您不应该销毁该对象。
如何将其复制为新的GameObject?
这是我的剧本:
using System.Collections.Generic;
using UnityEngine;
public class TimeMap: MonoBehaviour {
public GameObject selectedUnit;
public GameObject selectedMonster;
public TileType[] tileTypes;
try{
if(selectedMonster.GetComponent<Monster>().tileX == selectedUnit.GetComponent<Unit>().tileX && selectedMonster.getComponent<Monsters>().tileY == selectedUnit..GetComponent<Unit>())
Destroy(selectedMonster);
}
public void SpawnMon() {
if(counter % 5 == 0){
Debug.Log(" counter % 5 == 0");
Instantiate(selectedMonster.GetComponent<Monsters>().Monster, new Vector3(Random.Range(1,8), Random.Range(1,8), -1), Quaternion.identity);
}
}
}
所以我尝试每5次移动创建相同的对象或克隆它,但是在执行时我遇到了错误。
答案 0 :(得分:3)
<强>问题:强>
你正试图像这样访问你的怪物:
selectedMonster.GetComponent<Monster>()
这意味着如果你的场景中有多个Monster类型的GameObject,Unity将无法确定你指的是哪一个。
此外,当您实例化怪物时,只需使用
Instantiate(selectedMonster.GetComponent<Monsters>().Monster, new Vector3(Random.Range(1,8), Random.Range(1,8), -1), Quaternion.identity);
因此,您无法在场景中区分一个实例与另一个实例。
<强>解决方案:强>
如果您想继续使用这种方法,在那里检查tileX和tileY的怪物是否与您的单位匹配(我认为是你的英雄或类似物),你应该让所有怪物都在一个数组中,这样你就可以迭代它们在某种程度上,你很容易引用你要破坏的那个。
您可以尝试FindObjectsOfType并传递您的怪物类型:
Monster [] monsters= FindObjectsOfType(typeof(Monster )) as Monster [];
然后你迭代
foreach (Monster thisMonster in monsters){
//check things here
}
另一种选择是在实例化它们时将怪物存储在数组中
//Define as global variable a list of Monsters
List<GameObject> monsterList = new List<GameObject>();
//Then you instantiate then like
monsterList .add((GameObject)Instantiate(selectedMonster.GetComponent<Monsters>().Monster, new Vector3(Random.Range(1,8), Random.Range(1,8), -1), Quaternion.identity));
然后像以前一样使用foreach迭代它们
更好的解决方案(从我的角度来看)
然而,既然你的主要目标,如果我错了就纠正我,就是检测一个单位的位置何时与怪物的位置相匹配,以后来摧毁那个特定的怪物。我会改用colliders。在GameObject中,你调用Unit I会添加TriggerEnter
。既然你使用了TileX和TileY,我怀疑你正在创建一个2D游戏,所以它会是这样的:
void OnTriggerEnter2D(Collider2D other) {
Destroy(other.gameObject);
}
有了这个,你就会摧毁任何接触你“单位”的怪物,你就不会有参考问题。