Coroutine不会执行setActive(false)

时间:2017-01-26 09:38:13

标签: c# unity3d unity5

我的游戏中有一个对象就像一个强力对象:当我的玩家进入电源时,它应该激活一个面板,指示电源被抓住,过去3秒钟面板应该消失。目前,当我击中电源时,我的面板出现了,但它并没有消失。我正在使用这样的Coroutine:

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:更新中的内容与我需要做的事情无关,所以我认为它并不会影响我的需求。

3 个答案:

答案 0 :(得分:0)

也许您应该检查您的游戏对象(缩小版)是否无效或被破坏。 coroutine不适用于非活动的游戏对象。

答案 1 :(得分:0)

我认为您可能会在WaitForSeconds(3f)结束之前销毁GameObject,这会阻止panel.SetActive(false)执行。

在您的Update-method&#34; else语句中if(temp.x&gt; 0)&#34;你正在摧毁试图显示/隐藏面板的GameObject。

如果您当时绝对需要销毁此游戏对象,则应将IEnumerator分解为另一个脚本并从此(shrink.cs)脚本调用它。

答案 2 :(得分:0)

在3秒之前销毁对象可能是个问题。您可以通过输入两个日志进行检查:

1- After&#34; Object.Destroy&#34;线 2-&#34; WaitForSeconds&#34;