13

我对 C# 很陌生。我正在 Unity 中创建一些东西来帮助我更好地学习 C# 和 Unity。

我想知道为什么:

Input.GetKeyDown(KeyCode.UpArrow))

放置在以下范围内时只会触发一次:

void Update()

由于更新是一个循环,为什么在我按住键时它没有被触发(在我的情况下导致球体移动)?

我已经设法通过使用两个在按下和释放键时改变的布尔值来使其工作。

这是我用来移动球体并模拟加速/减速的完整脚本:

using UnityEngine;
using System.Collections;

public class sphereDriver : MonoBehaviour {
int x ;
bool upPressed = false ;
bool downPressed = false ;
void Start()
{
    x = 0 ;
}

void Update ()
{
    if(x > 0) {
        x -= 1 ;
    }
    if(x < 0) {
        x += 1 ;
    }
    if(Input.GetKeyDown(KeyCode.UpArrow))
    {
        upPressed = true ;
    }
    else if(Input.GetKeyUp(KeyCode.UpArrow))
    {
        upPressed = false ;
    }

    if(upPressed == true)
    {
        x += 5  ;
    }

    if(Input.GetKeyDown(KeyCode.DownArrow))
    {
        downPressed = true ;
    }
    else if(Input.GetKeyUp(KeyCode.DownArrow))
    {
        downPressed = false ;
    }

    if(downPressed == true)
    {
        x -= 5  ;
    }

    transform.Translate(x * Time.deltaTime/10, 0, 0) ;
}

}
4

2 回答 2

7

文档说这是正常的预期行为。

您可能想改用GetButtonGetAxis,因为只要按住键,它们就表示“按下”(GetButton 返回 true,GetAxis 返回 1)。

于 2012-07-06T19:54:01.630 回答
6

来自Input.GetKeyDown的文档。

您需要从 Update 函数中调用此函数,因为每帧都会重置状态。在用户释放键并再次按下它之前,它不会返回 true。

此方法对于打开​​菜单或其他一次性事件最有用。比如继续对话。

您可以使用上面提到的方法,但是您可以使用Input.GetKey来实现您的目标。

当用户按住 name 标识的键时返回 true。

于 2013-06-14T22:20:27.347 回答