【问题标题】:How to destroy and create same gameobject in unity如何统一销毁和创建相同的游戏对象
【发布时间】:2017-10-17 04:24:23
【问题描述】:

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

MissingReferenceException:“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 次移动创建相同的对象或它的克隆,但在执行此操作时出错。

【问题讨论】:

  • 请不要发布您的代码截图。而是发布代码。

标签: c# unity3d unity5


【解决方案1】:

问题:

你正试图像这样访问你的怪物:

selectedMonster.GetComponent&lt;Monster&gt;()

这意味着如果您的场景中有多个 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。在你称之为 Unit 的 GameObject 中,我会添加一个TriggerEnter。由于您使用 TileX 和 TileY,我怀疑您正在创建一个 2D 游戏,所以它会是这样的:

void OnTriggerEnter2D(Collider2D other) {
        Destroy(other.gameObject);
    }

这样你就可以摧毁任何接触到你的“单位”的怪物,而且你不会有参考问题。

【讨论】: