WaitForSeconds不起作用

时间:2015-09-22 21:02:15

标签: c# unity3d coroutine

我有一个改变播放器速度的课程。这是代码:

$('#main').on('scroll'...

我有两个问题,第一个是在启动协同程序并且flag变量设置为true之后,再次调用方法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; } } ,并且标志为false并且所有内容都会再次执行。第二个问题是方法OnTriggerExit似乎从未被执行过,它只是将速度倍增并且永远不会恢复正常。任何帮助表示赞赏。

编辑: 在尝试了LasseKlüver建议的方法之后,这是我的代码:

backToNormal

但是我有完全相同的问题。

2 个答案:

答案 0 :(得分:0)

尝试使用此脚本:

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;
    }
}

答案 1 :(得分:0)

如果你想在给定的时间(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;
}

当然,您需要使用&#34; SpeedBoostPowerUp&#34;标记您的游戏对象。标签。使用该标志,因此您不能同时进行多次速度提升。 如果您使用&#34;静态&#34;这应该可以正常工作电源UPS - 具有固定行为的电源UPS。如果你想给玩家一个随机的提升等等,如果它打到电源 - 例如在马里奥卡丁车 - 我会不同的结构。但是这对于你想达到的目标来说太复杂了。

注意:我不会通过 speed = speed / multiplier 恢复到正常速度,而是使用变量来存储速度,然后乘以它,因为它应该更不容易出错。像那样:

private float speedBeforeBoost;

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

public void BackToNormal()
{
    this.speed = this.speedBeforeBoost;
}