如何在一段时间内更改变量

时间:2015-04-21 18:40:58

标签: c# unity3d

如何在Unity3D中更改变量仅持续5秒或直到某个事件?例如,改变速度:

void Start ()
{
    GetComponent<Rigidbody2D> ().velocity = Vector3.zero;
}

void Update ()
{
   if (Input.GetKey(KeyCode.W))
   {
       goUp ();
   }
}
public void goUp() {
   GetComponent<Rigidbody2D> ().velocity = new Vector2 (0, 10);
}

由于A被按下,物体一直在上升。如何使对象不是一直上升,而是按下A时的每一帧?当没有按下A时,物体的速度会回到零。我曾经这样做过:

void Start () {
   GetComponent<Rigidbody2D> ().velocity = Vector3.zero;
}

void Update () {

   GetComponent<Rigidbody2D> ().velocity = Vector3.zero;

   if (Input.GetKey(KeyCode.A)) {
       goUp ();
   }

}

public void goUp() {
   GetComponent<Rigidbody2D> ().velocity = new Vector2 (0, 10);
}

但是这种方法不合理并且会使CPU过载。另外,我不能使用Input.GetKeyUp(KeyCode.A)或“else”语句作为触发器。

3 个答案:

答案 0 :(得分:1)

我会使用x作为属性,就像速度一样。我只是psudeo代码吧.. 在每个帧的Update()上你只关心速度,所以你只需要调用它。您不必经常检查其他值,因为这些值应由其他事件处理。

Property Speed get;set;

    Void APressed()
{
     Speed = 5;
}

Void AReleased()
{
     Speed = 0;
}

对不起,我在5秒后忘记了第二部分.. 你可以添加这样的东西,如果Unity支持async关键字..你会更新你的A按下看起来像这样

   Void APressed()
    {
         Speed = 5;
ReduceSpeedAfter5Seconds();
    }


public async Task ReduceSpeedAfter5Seconds()
{
    await Task.Delay(5000);
    Speed = 0;
}

答案 1 :(得分:1)

你试过这个吗?

if (Input.GetKey(KeyCode.A)) {
       goUp ();
   }
else
{
    GetComponent<Rigidbody2D> ().velocity = Vector3.zero;
}

答案 2 :(得分:1)

在Unity / C#中查看CoRoutines: http://docs.unity3d.com/Manual/Coroutines.html

这可能完全符合您的需要。如果我正确理解你的问题,我在下面放了一些伪代码。

if (Input.GetKeyDown("a")) {
    goUp();
    StartCoroutine("ReduceSpeedAfter5Seconds");
}

IEnumerator ReduceSpeedAfter5Seconds() {
GetComponent<Rigidbody2D> ().velocity = new Vector2 (0, 10);
        yield return new WaitForSeconds(5.0f);
}