WaitForSeconds不起作用

本文关键字:不起作用 WaitForSeconds | 更新日期: 2023-09-27 18:13:56

我有一个改变玩家速度的类。下面是代码:

using UnityEngine;
using System.Collections;
public class MultiplySpeed : MonoBehaviour {
    public int multiplier = 2;
    public Controls player;
    bool flag = false;
    void OnTriggerExit(Collider c){
        if(c.tag == "Player"){
            player = c.gameObject.GetComponent<Controls>();
            if(!flag){
                multiplySpeed();
                StartCoroutine(powerUp());
            }
            flag = true;
        }
    }
    public IEnumerator powerUp(){
        yield return new WaitForSeconds(10);
        backToNormal ();
        StopCoroutine(powerUp ());
    }
    public void multiplySpeed(){
        player.speed = player.speed * multiplier;
    }
    public void backToNormal(){
        player.speed = player.speed/ multiplier;
    }
}

我有两个问题,第一个是在启动协程并将标志变量设置为true之后,再次调用方法OnTriggerExit,并且标志为false并且再次执行所有内容。第二个问题是方法backToNormal似乎从未执行过,它只是将速度乘以,并且从未将其恢复正常。如有任何帮助,不胜感激。

编辑:在尝试了Lasse kl ver建议的方法后,下面是我的代码:

using UnityEngine;
using System.Collections;
public class MultiplySpeed : MonoBehaviour {
    public int multiplier = 2;
    public Controls player;
    bool flag = false;
    float timer = 5.0f;
    void update(){
        timer -= Time.deltaTime;
        if (timer == 0) {
            backToNormal();
            timer = -1f;
        }
    }
    void OnTriggerExit(Collider c){
        if(c.tag == "Player"){
            player = c.gameObject.GetComponent<Controls>();
            if(!flag){
                timer = 5.0f;
                flag = true;
                multiplySpeed();
            }
        }
    }
    public void multiplySpeed(){
        player.speed = player.speed * multiplier;
    }
    public void backToNormal(){
        player.speed = player.speed/ multiplier;
    }
}

但是我也有同样的问题

WaitForSeconds不起作用

尝试使用这个脚本:

using UnityEngine;
using System.Collections;
using UnityEngine;
using System.Collections;
public class MultiplySpeed : MonoBehaviour
{
    public int multiplier = 2;
    public Controls player;
    bool flag = false;
    float timer = 5.0f;
    bool countDown = false;
    void update()
    {
        if (countDown)
        {
            timer -= Time.deltaTime;
            if (timer <= 0)
            {
                backToNormal();
                countDown = false;
            }
        }
    }
    void OnTriggerExit(Collider c)
    {
        if (c.tag == "Player")
        {
            player = c.gameObject.GetComponent<Controls>();
            if (!flag)
            {
                countDown = true;
                timer = 5.0f;
                flag = true;
                multiplySpeed();
            }
        }
    }
    public void multiplySpeed()
    {
        player.speed = player.speed * multiplier;
    }
    public void backToNormal()
    {
        player.speed = player.speed / multiplier;
    }
}

如果你想在特定时间(5秒)内改变玩家的速度,那么我就会采取相反的方法。我不会在能量道具内部做计时——因为我认为它应该在玩家击中它后立即被摧毁——我会根据玩家附带的脚本来做。下面的代码应该可以工作:

using UnityEngine;
public class SpeedBoostPowerUp : MonoBehaviour
{
    private void OnTriggerEnter(Collider c)
    {
        if(c.tag == "Player")
        {
            Destroy(gameObject);
        }
    }
}

然后你可以在移动组件(Controls.cs)中添加速度提升代码。您可以这样做(我不想更改太多代码):

// INSIDE CONTROLS COMPONENT
private void OnTriggerEnter(Collider c)
{
    if(c.tag == "SpeedBoostPowerUp")
    {
        if (!flag)
        {
            StartCorouting(BoostSpeed);
        }
    }
}
public void MultiplySpeed()
{
    this.speed = this.speed * this.multiplier;
}
public void BackToNormal()
{
    this.speed = this.speed / this.multiplier;
}
private IEnumerator BoostSpeed()
{
    flag = true;
    MultiplySpeed();
    yield return new WaitForSeconds(5);
    BackToNormal();
    flag = false;
}

当然,你需要用"SpeedBoostPowerUp"标签来标记你的游戏对象。使用了旗子,所以你不能一次有多个速度提升。如果你使用的是"静态"能量道具,也就是具有固定行为的能量道具,那么这种方法就会很有效。如果你想给玩家一个随机的提升等等,如果它碰到了能量提升——比如在《马里奥赛车》中——我会以不同的方式来构建它。但是我猜这对于你想要达到的目标来说太复杂了。

注意:我不会通过speed = speed/multiplier返回正常速度,而是在乘以它之前使用一个变量来存储速度,因为它应该更不容易出错。像这样:

private float speedBeforeBoost;
public void MultiplySpeed()
{
    this.speedBeforeBoost = this.speed;
    this.speed *= this.multiplier;
}
public void BackToNormal()
{
    this.speed = this.speedBeforeBoost;
}