如何在统一中摧毁和创造相同的游戏对象

时间:2017-10-17 04:24:24

标签: c# unity3d unity5

我试图移动我的玩家来摧毁怪物,第一次摧毁怪物我有以下错误:

  

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次移动创建相同的对象或克隆它,但是在执行时我遇到了错误。

1 个答案:

答案 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);
    }

有了这个,你就会摧毁任何接触你“单位”的怪物,你就不会有参考问题。