2016-04-17 6 views
0

Ich versuche, ein Element in einer Liste in meinem LevelManager-Skript hinzuzufügen. Es ist für einen Feind, dass wenn er stirbt, ein Prefab seiner Leiche mit den notwendigen Collidern etc. für den LevelManager hinzugefügt wird.Listen in Unity2D - Problem Hinzufügen

Der Feind Skript ist:

using UnityEngine; 
using System.Collections; 

public class EnemyController : MonoBehaviour { 

    public Rigidbody2D rb; 
    public Animator anim; 
    public GameObject deadGuy; 
    public LevelManager manager; 

    // Use this for initialization 
    void Start() { 

     rb = GetComponent<Rigidbody2D>(); 
     anim = GetComponent<Animator>(); 
     manager = GetComponent<LevelManager>(); 

    } 

    // Update is called once per frame 
    void Update() { 

     if(anim.GetBool("Dead")) 
     { 
      StartCoroutine("Die"); 
     } 

    } 

    private IEnumerator Die() 
    { 
     yield return new WaitForSeconds(anim.GetCurrentAnimatorStateInfo(0).length); 
     Instantiate(deadGuy, gameObject.transform.position, gameObject.transform.rotation); 
     manager.worldObjects.Add(deadGuy); 
     DestroyObject(gameObject); 
    } 
} 

Die Todesanimation spielt und dann wird das Fertig als „Dead Guy (Klon)“ in der Hierarchie hinzugefügt, aber dann die Animation spielt immer mehr prefabs instanziiert. Aber wenn ich diese Codezeile entferne:

Dann wird die Animation abgespielt, das Prefab hinzugefügt und das gegnerische Objekt gelöscht.

+0

Ich denke, dass Sie ein anderes Bool in Ihrem Update brauchen, um die Coroutine nur einmal zu starten. –

+0

Wenn das GameObject zerstört wird, sollte es nicht erneut ausgeführt werden, da das gegnerische Skript an das gegnerische Objekt angehängt ist. Es funktioniert, wenn die Codezeile entfernt wird: manager.worldObjects.Fügen Sie hinzu (deadGuy); so scheint es, dass die Linie verhindert, dass sie die nächste Zeile erreicht, wo sie das gameObject selbst zerstört, wenn es nicht entfernt wird –

Antwort

1

So schien es die beste Methode war, die Behandlung der Leiche in ein anderes Skript zu nehmen und es an das Prefab anzuhängen. Deshalb konnte ich das Fertig instanziiert, löschen Sie die Gameobject, die ohne die Liste in Stufe Manager für die instantiate und tun genannt

1

einfache Lösung

Wie in den Kommentaren erwähnt; Das liegt daran, dass der Bool Dead vom Animator auf "True" gesetzt ist und dass für jeden Aufruf von Unity an Update ein neuer Dead Player erstellt wird. Der lebende Spieler GameObject wird erst zerstört, nachdem die Todesanimation des toten Spielers gespielt wurde, und das Update wird während dieser Animation viele Male aufgerufen.

Um dies zu beheben, fügen Sie eine Bool zu Ihrer Klasse wie;

private bool m_instantiatedDeadPlayer; 

Und dann in Ihrer Update-Schleife, ändern Sie die if-Anweisung zu sein;

public void Update (
{ 
    if(anim.GetBool("Dead") && !m_instantiatedDeadPlayer) 
    { 
     m_instantiatedDeadPlayer = true; 
     StartCoroutine("Die"); 
    } 
} 

komplizierte Lösung

Ein besserer aber komplizierter Ansatz wäre der Tod Animation zu haben, in dem gleichen Animator als lebendig Feind, enthielt die notwendigen Beschleuniger usw. zu aktivieren und zu habe den Übergang von der aktuellen lebendigen Animation zur toten Animation ein Trigger, das du einstellst, wenn die Gesundheit der Feinde gleich 0 ist. Dies setzt voraus, dass du eine Methode an den Feind angehängt hast, um Schaden zu nehmen, der ungefähr so ​​aussehen würde;

public void ApplyDamage(int p_amount) 
{ 
    if(!m_isDead) 
    { 
     m_health = Mathf.Clamp(m_health - p_amount, 0, 100); 

     if(m_health == 0) 
      m_animator.SetTrigger("Dead"); 
    } 
} 

Sie daher die Notwendigkeit für die Coroutine beseitigen, statt den Feind in die Liste der Objekte hinzuzufügen, wenn der Feind hervorgebracht wird, und wann immer Sie alle toten Feinde müssen, haben eine Methode, die die private Variable m_isDead auf die beigefügten zurück der Feind.

Hoffen Sie, dass dies hilft, lassen Sie mich wissen, wenn Sie weitere Details wünschen.