【问题标题】:How do i make update function run every frame after I use OnTriggerEnter2D function in Unity?在 Unity 中使用 OnTriggerEnter2D 函数后,如何让更新函数每帧运行一次?
【发布时间】:2017-03-22 15:37:03
【问题描述】:

所以我正在设计一个游戏,一旦对象与通电发生碰撞,它应该等待 10 秒并恢复正常。我正在使用更新函数来保持计数,但是一旦使用 OnTriggerEnter 函数,更新函数就会停止运行每一帧。我该如何反击。请帮忙

   public class Powerup_1act : MonoBehaviour {
    //This powerup temporarily passes through all lasers

    public GameObject EffectiveTo;
    private float TimeRemaining;
    int flag=0;
    float timer=0.0f;
    public float alphalevel=.20f;
    public GameObject laserfield;
    float flag2=0f;
    float countdown=0;
    void OnTriggerEnter2D(Collider2D other) 
    {
        //Check the provided Collider2D parameter other to see if it is tagged "PickUp", if it is...
        if (other.gameObject.CompareTag("Player"))
        {
            gameObject.SetActive(false); 
            laserfield.gameObject.tag = "Temp";
            flag2 = 1;
            changealpha ();
            Debug.Log ("Active?"+gameObject.activeInHierarchy);
            StartCoroutine(Powerup());
        }
    }
    private IEnumerator Powerup()
    {
        countdown = 10f;
        while (countdown >= 0) {
            Debug.Log (timer);
            timer += Time.deltaTime;
            if (flag2 == 1) {
//changes the alpha level between 0.2f and 0 
                if (alphalevel > 0 && flag == 0) {
                    alphalevel -= .05f;
                    changealpha ();
                } else if ((alphalevel == 0 || flag == 1) && alphalevel < .20) {
                    alphalevel += .05f;
                    changealpha ();
                    Debug.Log (alphalevel);
                    flag = 1;
                } else if (alphalevel == .20) {
                    flag = 0;
                }
                countdown-=Time.smoothDeltaTime;
                yield return null;
            }
        }
            alphalevel = 1f;
            changealpha ();
            laserfield.gameObject.tag = "Laser";
            flag2 = 0;
     }
    //heres a function to change transparency of player when a powerup is in effect
        void changealpha()
        {
            EffectiveTo.GetComponent<SpriteRenderer> ().color = new Color (1f, 1f, 1f, alphalevel);
        }


    }

【问题讨论】:

  • 当它发生碰撞时,你是否也在禁用你的脚本或脚本附加的游戏对象?
  • 您应该提供您正在使用的实际代码。您显示的代码不会导致您描述的行为。 @Cnuts 所说的听起来很可能是原因。
  • @Fredrik 生病编辑问题并添加完整代码。

标签: c# unity3d


【解决方案1】:

使用Coroutine 为您带来优势:

void OnTriggerEnter2D(Collider2D other) 
{
     StartCoroutine(PowerUp());
}

private IEnumerator PowerUp()
{
    countDown = 10f;       
    while (countDown >= 0)
    {
        // Logic during the 10 seconds

        countDown -= Time.smoothDeltaTime;
        yield return null;
    }         
}

【讨论】:

  • 如果他禁用了包含脚本的游戏对象,协程也会停止工作。
  • @CNuts OP 是否在谈论禁用他的 GameObjekt? ?
  • 好吧,他是说他的更新功能停止工作,这可能意味着他正在做的事情。
  • @CNuts 让我们等待 OP 的下一次更新并将其标记为不清楚。
  • @Smartis 我试过了,但它说“无法启动协程,因为游戏对象 'Powerup1' 处于非活动状态”
【解决方案2】:

发生的情况是,当您禁用游戏对象时,该游戏对象的脚本也停止工作。

在您的情况下,当OnTriggerEnter2D 被触发时,您将游戏对象设置为 false gameObject.SetActive(false);,这意味着该脚本将停止工作,因为您还将该脚本放置在您刚刚禁用的游戏对象上。

您应该将OnTriggerEnter2D 事件移到另一个没有被禁用的对象上,然后您可以从那里禁用这个游戏对象。你在Update 中所做的事情也会被移动到其他游戏对象中。

From Unity documentation:

使游戏对象处于非活动状态将禁用所有组件,关闭任何附加的渲染器、碰撞器、刚体、脚本等...例如,您附加到游戏对象的任何脚本将不再调用 Update()。

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 1970-01-01
    • 2019-01-13
    • 2017-10-19
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多