2017-01-26 8 views
2

У меня есть объект в моей игре, подобный силовому объекту: когда мой плеер входит в силу, он должен активировать панель, которая указывает, что власть была схвачена, и за последние 3 секунды это панель должна исчезнуть. На данный момент моя панель появляется, когда я нажимаю на нее, но она не исчезает. Я использую сопрограмму так:Coroutine не выполняет 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: что внутри обновление не зависит от того, что мне нужно сделать, так что я думаю, что это не INTERFER с моими потребностями.

+0

"curoutine" вы имеете в виду "сопрограмму"? – Richard

+0

Пожалуйста, сообщите нам, если наши ответы были/были неправильными, и если вам нужна дополнительная помощь. – Maakep

ответ

0

Я думаю, что вы можете уничтожить GameObject до того, как закончится WaitForSeconds(3f), что предотвратит выполнение panel.SetActive(false).

В инструкции «else» метода Update для if (temp.x> 0) «вы уничтожаете GameObject, который пытается показать/скрыть панель.

Если вам абсолютно необходимо уничтожить этот игровой объект, вы должны разбить свой IEnumerator на другой скрипт и вызвать его из этого сценария (shrink.cs).

+1

спасибо, что я думаю, что ваш ответ подходит, но я уже решил, что он не поддерживает рендерер, мне не нужно уничтожать игровой объект: D, поэтому я могу использовать сценарий до конца: D –

0

Возможно, вам стоит проверить, не является ли ваш игровой объект (сжатие) неактивным или уничтоженным. В сопрограмме coroutine не работает с unactive gameobject.

0

Возможна разрушение объекта до 3 секунд. Вы можете проверить, поставив два журнала:

1- После строки "Object.Destroy" 2- После "WaitForSeconds"

 Смежные вопросы

  • Нет связанных вопросов^_^