2017-10-17 63 views
-1

我想將我的球員破壞怪物創建相同的遊戲物體和我第一次摧毀一個怪物,我有以下錯誤:如何銷燬,團結

MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object.

我怎樣才能使它複製本身作爲一個新的遊戲對象?

這是我的腳本:

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的克隆,但我有錯誤,同時這樣做。

+2

請不要張貼您的代碼的屏幕截圖。改爲發佈代碼。 – Programmer

回答

3

問題:

您試圖訪問你的怪物是這樣的:

selectedMonster.GetComponent<Monster>()

這意味着,如果你在場景中有一個類型的怪物不止一個遊戲對象,統一不會確定你指的是哪一個。

此外,當您實例化一個怪物,你只使用

Instantiate(selectedMonster.GetComponent<Monsters>().Monster, new Vector3(Random.Range(1,8), Random.Range(1,8), -1), Quaternion.identity); 

所以,你將無法在場景中區分不同的實例。

解決方案:

如果你想繼續使用這種方法,你是否tileX和怪物比賽tileY與你單位(我以爲是你的英雄或類似的),你應該有所有怪物在一個數組中,所以你可以用你想要摧毀的怪物的方式來遍歷它們。

你可以嘗試FindObjectsOfType,有傳你的怪物類型:當實例他們

//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)); 

Monster [] monsters= FindObjectsOfType(typeof(Monster)) as Monster []; 

然後迭代

foreach (Monster thisMonster in monsters){ 
    //check things here 
} 

另一種選擇是怪物存放在數組

然後像前面一樣使用foreach迭代它們

更好的解決方案(從我的角度來看)

然而,由於你的主要目標,糾正我,如果我錯了,是檢測當一個單位匹配的一個怪物的位置的位置,以後再摧毀那個怪物。我會用colliders來代替。並且在GameObject中,您將調用Unit I將添加一個TriggerEnter。由於您使用的TileX和TileY我懷疑你正在創建一個2D遊戲,所以這將是這樣的:

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

有了這個,你摧毀觸動「單位」的任何怪物,你會不會有參考問題。