2017-04-11 5 views
2

Hallo Ich mache mein erstes Einheitsspiel in 2D und ich habe diesen Code jetzt. Ich habe 3 verschiedene GameObjects (nenne sie a, b, c) in den Array-Pfeilen und ich möchte wissen, welcher von ihnen erzeugt wird (damit ich ihn in einer anderen Funktion benutzen kann) und den vorherigen aus der Szene löschen. Jetzt erscheint nur alle 5 Sekunden ein GameObject auf einem anderen und ich weiß nicht, welcher von beiden zufällig darauf spawnte. Irgendeine Idee?Gelegentliches Laichen in Unity (C#)

public GameObject[] arrows; 
public float interval = 5; 

// Use this for initialization 
void Start() 
{ 
    StartCoroutine(SpawnArrow()); 
} 
public IEnumerator SpawnArrow() 
{ 
    WaitForSeconds delay = new WaitForSeconds(interval); 
    while (true) 
    { 
     GameObject prefab = arrows[UnityEngine.Random.Range(0, arrows.Length)]; 
     GameObject clone = Instantiate(prefab, new Vector3(0.02F, 2.18F, -1), Quaternion.identity); 
     yield return delay; 


    } 
}` 
+0

Sie verwenden nur das Objekt, das Sie als Parameter erstellt haben. Sie setzen eine 'YourOtherFunction (Klon)' in der While-Schleife. Wenn das nicht das ist, was Sie suchen, müssen Sie genauer angeben, was Sie zu tun versuchen. Nehmen Sie auch die andere Funktion in Ihr Codebeispiel auf. –

+0

Wenn Sie nach Unity fragen, müssen Sie das Tag [tag: Unity3d] auf Ihre Frage setzen. Andernfalls erhalten Sie möglicherweise Antworten, die für Unity nicht geeignet sind. –

Antwort

2

zu verfolgen, was von Objekten Sie instanziiert Sie eine List von GameObject und erstellen können, wenn Sie ein Objekt instanziert es im List hinzufügen können. Dann können Sie jede GameObject in dieser Liste verwenden, um zu tun, was Sie brauchen.

public GameObject[] arrows; 
public float interval = 5; 
private List<GameObject> myObjects = new List<GameObject>(); 

// Use this for initialization 
void Start() 
{ 
    StartCoroutine(SpawnArrow()); 
} 
public IEnumerator SpawnArrow() 
{ 
    WaitForSeconds delay = new WaitForSeconds(interval); 
    while (true) 
    { 
     GameObject prefab = arrows[UnityEngine.Random.Range(0, arrows.Length)]; 
     GameObject clone = Instantiate(prefab, new Vector3(0.02F, 2.18F, -1), Quaternion.identity); 

     //Add the object to the list 
     myObjects.Add(clone); 

     yield return delay; 


    } 
} 

Und zum Laichen Objekt wie, dass es besser wäre, InvokeRepeating zu verwenden, können Sie es die Wiederholrate passieren und wenn Sie es starten wollen. More information on InvokeRepeating

Dies ist, wie es wie mit InvokeRepeating

public GameObject[] arrows; 
public float interval = 5; 
private List<GameObject> myObjects = new List<GameObject>(); 

// Use this for initialization 
void Start() 
{ 
    InvokeRepeating("SpawnArrow", 0f, interval); 
} 

void SpawnArrow() 
{ 
    //Check if there's something in the list 
    if (myObjects.Count > 0) 
    { 
     //Destroy the last object in the list. 
     Destroy(myObjects.Last()); 

     //Remove it from the list. 
     myObjects.RemoveAt(myObjects.Count - 1); 
    } 

    GameObject prefab = arrows[UnityEngine.Random.Range(0, arrows.Length)]; 
    GameObject clone = Instantiate(prefab, new Vector3(0.02F, 2.18F, -1), Quaternion.identity); 

    //Add the object to the list 
    myObjects.Add(clone); 

} 

Sie können Destroy(myObjects.Last());, indem Sie das letzte gelaicht Objekt in der Liste zerstören aussehen könnte, wird es das letzte Objekt in der Liste zurückzukehren und sie zerstören. Sie sollten es dann auch aus der Liste entfernen myObjects.RemoveAt(myObjects.Count - 1);

+0

Danke, wie kann ich wissen, welches Objekt zuletzt erzeugt wurde (ich möchte es gerne verwenden: wenn ein Objekt dann erzeugt wird ...) und woher weiß ich, welches Objekt davor erzeugt wurde, damit ich es aus der Szene zerstören kann?(Ich verwende diesen InvokeRepeating-Code jetzt): D –

+0

@ KlemenŠkrlj Ich habe am Ende meiner Antwort hinzugefügt, wie Sie es tun könnten. – CNuts

+0

Und wo im Code stelle ich diese zwei Zeilen? (Ich weiß .. Ich bin ein Noob) Es sagte, dass ich System.Linq hinzufügen muss und wenn ich es ausführe sagt ich: InvalidOperationException: Operation ist ungültig aufgrund des aktuellen Status des Objekts System.Linq.Enumerable.Last [ GameObject] (IEnumerable'1 Quelle) –

-2

Ich weiß nicht, wie viel wird dies helfen, aber haben Sie versucht, machen jedes einzelne ein Objekt Pfeil, und dann zurückkehrt nur dieses Objekt an die Methode, die Sie benötigen.

public GameObject SpawnArrow(<some params>){ 
    GameObject prefab = arrows[UnityEngine.Random.Range(0, arrows.Length)]; 
    while(interval > 0){ 
     if(interval = 0){ 
      prefab = arrows[UnityEngine.Random.Range(0, arrows.Length)]; 
      GameObject clone = Instantiate(prefab, new Vector3(0.02F, 2.18F, -1), Quaternion.identity); 
     } else { 
      System.Threading.Thread.sleep(1000) // wait for the second. 
      interval = interval - 1; 
     } 
    } 
    return prefab; 
} 

IDK Einheit - es nie benutzt, aber Sie müssen entweder die Funktion schreiben Sie den Pfeil-Objekt (nicht die Verzögerung Objekt) an die aufrufende Funktion zurückzukehren. Natürlich sollte der obige Code als NICHT funktionierend und nur Pseudo-Code betrachtet werden, da ich keine Einheit verwende. Aber das Wesentliche ist nur einen besseren Weg zu finden, um einen Pfeil in einer Methode zu erzeugen, die ihn zurückgeben kann.

+0

So funktioniert es in Unity nicht, die 'Instantiate' erzeugt in der aktuellen Szene ein' GameObject'. Was 'yield return delay;' does ist die Wartezeit bis zum Fortfahren. – CNuts

+0

Ich habe es wieder bearbeitet - Wie auch immer, ich kenne keine Einheit, nur C# Ich erklärte dies in der Bearbeitung. –

+1

Sie rufen niemals 'System.Threading.Thread.Sleep' in einem Unity-Projekt auf. –