2017-01-08 2 views
0

Ich möchte Gegner davon abhalten, zu spawnen, wenn einer von ihnen das "Ende" -Tag trifft.Wie verhindere ich, dass Gegner in Unity 3D spawnen?

Hier ist das Skript, die Feinde laichen:

public class spawn : MonoBehaviour { 

    public GameObject enemy; 
    private float spawnpoint; 
    public float xlimit = 12f; 
    float spawnNewEnemyTimer = 1f; 

    void Start() 
    { 

    } 

    public void Update() 
    { 
     spawnNewEnemyTimer -= Time.deltaTime; 

     if (spawnNewEnemyTimer <= 0) 
     { 
      spawnNewEnemyTimer = 3; 
      GameObject nemico = Instantiate(enemy); 
     } 
    } 

Hier ist das Skript, das die Feinde erscheinen zufällig Punkt zu machen und bewegen:

public class nemici : MonoBehaviour { 

    float speed = 4f; 

    public GameObject enemy; 
    public float xlimit = 12f; 
    private float currentPosition; 
    public GameObject spawn; 
    bool endGame = false; 

    void Start() 
    { 
     if (endGame == false) 
     { 
      Vector3 newPosition = transform.position; 
      newPosition.x = Random.Range(-xlimit, xlimit); 
      transform.position = newPosition; 
     } 
     else if (endGame == true) 
     { 
      return; 
     } 
    } 

    void Update() 
    { 
     if (endGame == false) 
     { 
      //per farlo muovere verso il basso 
      Vector3 movimento = new Vector3(0f, -speed, 0f); //(x, y, z) 
      transform.position += movimento * Time.deltaTime; 
     } 
     else if (endGame == true) 
     { 
      return; 
     } 
    } 

    void OnTriggerEnter(Collider other) 
    { 
     if (other.tag == "Player") 
     { 
      Destroy(enemy); 
     } 

     else if (other.tag == "Finish") 
     { 
      Debug.Log("hai perso!"); 
      endGame = true; 
     } 
     } 
    } 

Was ist mit diesem Code falsch? Vielen Dank!

Antwort

0

Die Logik, die neue Feinde hervorbringt, ist in der Spawn-Klasse. Die Logik, die darüber entscheidet, ob Sie aufhören sollten, Gegner zu spawnen, liegt in der Klasse der Gegner.

Sie setzen das Endgame-Boolean erfolgreich auf "Wahr", wenn Sie möchten, dass Gegner nicht mehr erscheinen, wenn sie ein Objekt mit dem Ziel-Tag treffen.

void OnTriggerEnter(Collider other){ 
    if (other.tag == "Finish"){ 
     Debug.Log("hai perso!"); 
     endGame = true; 
    } 
} 

Großartig! Aber Sie verwenden es nicht, um Spawn zu stoppen. Bisher ist diese Variable lokal für jeden Feind. Wenn Sie also die Start- und Update-Funktionen checken, werden sie nur aktiviert, wenn der betreffende Gegner das Zielobjekt berührt hat. Das ist nicht was du willst.

Sie möchten, dass die Spawn-Klasse die Endspielvariable überprüft und, falls sie aktiv ist, aufhört, Gegner zu spawnen.

Dazu müssen Sie irgendwie auf die Endspielvariable von Spawn zugreifen können. Ich empfehle, dass Sie die EndGame-Variable zu einem Mitglied der Spawn-Klasse machen. Und das du einen Hinweis auf den Spawn in jedem Feind eingibst.

Alles zusammen könnte es etwa so aussehen:

public class Spawn: MonoBehaviour{ 
    public boolean endgame = false; 
    GameObject nemico = Instantiate(Enemy); 
    nemico.ParentSpawn = this 
} 

public class Enemy: MonoBehaviour{ 
    public Spawn spawn; 
    void OnTriggerEnter(Collider other){ 
     if (other.tag == "Finish"){ 
      Spawn.endGame = true; 
     } 
    } 
} 

Und dann können Sie das endgame boolean aus Spawn verwenden um zu überprüfen, ob Sie Laich Feinde halten sollte.

Verwandte Themen