2017-10-17 12 views
-1

Je suis en train de déplacer mon lecteur pour détruire les monstres et la première fois que je détruis un monstre que j'ai l'erreur suivante:Comment détruire et créer même gameobject dans l'unité

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.

Comment puis-je faire pour dupliquer lui-même comme un nouveau GameObject?

Ceci est mon script:

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

J'essaie donc de créer le même objet ou un clone de celui-ci tous les 5 coups, mais je rencontre des erreurs tout en le faisant.

+2

Veuillez ne pas poster de capture d'écran de votre code. Postez le code à la place. – Programmer

Répondre

3

Problèmes:

Vous essayez d'accéder à vos monstres comme ceci:

selectedMonster.GetComponent<Monster>()

Cela signifie que si vous avez dans votre scène plus d'un gameobject de type Monstre, l'unité ne sera pas Assurez-vous de laquelle vous parlez.

également lorsque vous instancier un monstre, vous utilisez juste

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

Alors vous ne serez pas en mesure de distinguer un cas d'une autre dans la scène.

Solutions:

Dans le cas où vous vouliez poursuivre dans cette voie, où vous vérifier si TILEX et Tiley du match monstre avec votre unité (que je suppose est votre héros ou similaire), vous devriez avoir tous monstres à l'intérieur d'un tableau de sorte que vous pouvez les itérer tous d'une manière que vous référez facilement à celui que vous voulez détruire.

Vous pouvez essayer FindObjectsOfType et il passer votre type de monstre:

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

Ensuite, vous itérer

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

Une autre option est de stocker les monstres dans un tableau lorsque vous les instancier

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

Et vous les itérez en utilisant le foreach comme avant

meilleure solution (De mon point de vue)

Cependant, depuis votre objectif principal, corrigez-moi si je me trompe, est de détecter la position d'un match de l'unité avec la position d'un monstre, pour détruire plus tard ce monstre particulier. J'utiliserais plutôt colliders. Et dans le GameObject que vous appelez Unit, j'ajouterais un TriggerEnter. Puisque vous utilisez le TILEX et Tiley Je suppose que vous créez un jeu en 2D, donc ce serait quelque chose comme ceci:

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

Avec cela, vous détruisez tout monstre qui touche votre « unité » et vous n'avez des problèmes de référence .