2017-01-26 3 views
2

Ich habe ein Objekt in meinem Spiel, das wie ein Power-Objekt ist: Wenn mein Spieler die Macht eingibt sollte es ein Panel aktivieren, das anzeigt, dass die Macht ergriffen wurde, und nach 3 Sekunden Panel sollte verschwinden. Im Moment erscheint mein Panel, wenn ich das Gerät einschalte, aber es verschwindet nicht. Ich verwende einen Coroutine wie folgt aus:Coroutine führt nicht setActive (false)

using UnityEngine; 
using System.Collections; 

public class shrink : MonoBehaviour { 

    public float value = 0.1f; //1 by default in inspector 
    private bool colided = false; 
    private float speed; 
    Manager gameManager; 
    public GameObject panel; 
    // Update is called once per frame 
    void Start(){ 
     speed = 3.4f; 
     gameManager = GameObject.Find ("GameController").GetComponent<Manager>(); 
    } 

    void OnTriggerEnter(Collider c) 
    { 
     if (c.gameObject.tag == "Player") { 
      colided = true; 
      gameManager.powerUp1 = true; 
      StartCoroutine(menuOp()); 
     } 
    } 

    //This method is executed every frame 
    void Update(){ 
     if (colided) { 
      Vector3 temp = transform.localScale; 
      //We change the values for this saved variable (not actual transform scale) 
      temp.x -= value * Time.time; 
      temp.y -= value * Time.time; 

      if (temp.x > 0) { 
       speed += 0.02f; 
       transform.Rotate (0f, 0f, Time.deltaTime * 90 * speed); 
       transform.localScale = temp; 
      } else { 
       Object.Destroy (this.gameObject); 
      } 
     } 
    } 


    IEnumerator menuOp(){ 
     panel.SetActive (true); 
     yield return new WaitForSeconds (3f); 
     panel.SetActive (false); 
    } 
} 

Ps: was im Inneren des Update ist unabhängig von dem, was ich tun muss, so dass ich denke, es ist nicht meine Bedürfnisse nicht interferieren.

+0

"curoutine" meinst du "Koroutine"? – Richard

+0

Bitte lassen Sie uns wissen, ob unsere Antworten richtig waren/waren und ob Sie etwas für weitere Hilfe benötigen. – Maakep

Antwort

0

Ich denke, Sie könnten das GameObject zerstören, bevor die WaitForSeconds(3f) beendet wurde, was panel.SetActive(false) davon abhält, auszuführen.

In der "else" -Anweisung Ihrer Update-Methode zu if (temp.x> 0) "zerstören Sie das GameObject, das versucht, das Panel anzuzeigen/auszublenden.

Wenn Sie dieses Spielobjekt zu diesem Zeitpunkt unbedingt zerstören müssen, sollten Sie Ihren IEnumerator zu einem anderen Skript ausbrechen und aus diesem Skript (shrink.cs) aufrufen.

+1

danke ich denke, deine antwort ist akzeptabel, aber ich löse es schon, indem ich den renderer deaktiviere, ich muss das spielobjekt nicht zerstören: D damit ich das skript bis zum ende behalten kann: D –

0

vielleicht sollten Sie überprüfen, ob Ihr Spielobjekt (Shrinks) inaktiv oder zerstört ist. Coroutine funktioniert nicht mit inaktiven Gameobject.

0

Das Objekt vor 3 Sekunden zu zerstören könnte das Problem sein. Sie können, indem sie zwei Protokolle überprüfen:

1- Nach "Object.Destroy" -Linie 2- Nach "WaitForSeconds"