脚本延迟

时间:2017-05-30 16:08:30

标签: c# unity3d

我有2个脚本,1个用于玩家移动,第2个用于他的权力,如果玩家按下" q"他使用了他的力量,我延迟了第二个脚本,以防止他不间断地按下它。但是整个游戏都会发生火灾,我想知道是否有一些方法可以让应用程序冻结,但只是为这种力量添加冷静。

以下是代码:

using UnityEngine;
using System.Collections;   

public class SuperPower1 : MonoBehaviour
{   
    public Rigidbody rb;
    public float forwardForce = 2000f;  // Variable that determines the forward force
    bool Break;
    void FixedUpdate()
    {   
        //Break
        {
            if (Input.GetKey("q"))
            {
                Break = true;
                int milliseconds = 2000;
                Thread.Sleep(milliseconds);
            }
            else
            {
                Break = false;
            }
        }
        if (Break == true)
        {
            rb.AddForce(0, 0, 500f * Time.deltaTime);
        }
        else
        {
            rb.AddForce(0, 0, forwardForce * Time.deltaTime);
        }
    }
}

3 个答案:

答案 0 :(得分:3)

Thread.sleep永远不会回答"我想推迟一些事情"因为Thread.sleep会导致程序无法响应。

如果你想推迟一项行动,你可以做三件事:

  1. 创建一个计时器变量,并在Update() Time.deltaTime期间将其递增,直到所需的持续时间消失为止
  2. use a coroutine
  3. 使用补间引擎并在补间的onComplete处理程序中执行延迟代码。

答案 1 :(得分:1)

如@ Draco18s所示,由于您的Unity游戏仅在一个线程中运行,Thread.sleep将暂停您的整个游戏。这是一个你可以尝试的简单脚本。我没有测试过,但你会得到这个想法;)

public Rigidbody rb;
public float forwardForce = 2000f;
public float bonusDuration = 2.0f;   
private float endBonusTime = 0 ;

void FixedUpdate()
{   
    if ( endBonusTime < Time.time )
    {
        if( Input.GetKeyDown("q") )
            endBonusTime = Time.time + bonusDuration ;
        else   
           rb.AddForce(0, 0, forwardForce * Time.deltaTime);            
    }
    if (endBonusTime >= Time.time ) // Don't put "else if"
    {
        rb.AddForce(0, 0, 500f * Time.deltaTime);
    }
}

如果您想对此进行冷却,请尝试以下脚本:

public Rigidbody rb;
public float forwardForce = 2f;
public float bonusDuration = 2.0f;   
private float endBonusTime = 0 ;
private float cooldown = 5.0f;

void FixedUpdate()
{   
    if ( endBonusTime < Time.time + cooldown && Input.GetKeyDown("q") )
    {
        endBonusTime = Time.time + bonusDuration ;
    }
    else if ( endBonusTime < Time.time )
    {
        rb.AddForce(0, 0, forwardForce * Time.deltaTime);
    }
    if (endBonusTime >= Time.time ) // Don't put "else if"
    {
        rb.AddForce(0, 0, 1 * Time.deltaTime);
    }
}

答案 2 :(得分:0)

我不知道Unity代码,因此可能需要稍微转换一下,但在普通的C#代码中,您可以只使用一个变量来定义何时允许加电。这样,当用户使用电源时,您将值更新为当前时间加上您要等待的时间量。然后,您只需在授予权力之前检查该变量与当前时间:

private float nextAllowedPowerUpTime = 0;

void FixedUpdate()
{
    if (Input.GetKey("q") && Time.time >= nextAllowedPowerUpTime)
    {
        rb.AddForce(0, 0, 500f * Time.deltaTime);

        // Set the next allowed power-up time to the current time plus two seconds
        nextAllowedPowerUpTime = Time.time + 2;
    }
    else
    {
        rb.AddForce(0, 0, forwardForce * Time.deltaTime);
    }
}