我有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);
}
}
}
答案 0 :(得分:3)
Thread.sleep
永远不会回答"我想推迟一些事情"因为Thread.sleep
会导致程序无法响应。
如果你想推迟一项行动,你可以做三件事:
Update()
Time.deltaTime
期间将其递增,直到所需的持续时间消失为止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);
}
}