Menu
CoddyTech

按下、按住、松开

本课属于 Coddy Unity 学习旅程的“Unity 脚本基础”单元。第 19 课,共 85 课。

Unity 可以告诉你按键的三种不同状态,每种状态都在 Update() 中检测:

  • Input.GetKeyDown(KeyCode.Space):这一帧按下了空格键吗?每次按下时,它只会在一帧内为 true。
  • Input.GetKey(KeyCode.Space):现在空格键处于按下状态吗?只要按住空格键,它在每一帧中都会为 true。
  • Input.GetKeyUp(KeyCode.Space):这一帧松开了空格键吗?按键松开时,它只会在一帧内为 true。

如果以每秒 60 帧的速度按住空格键半秒,GetKey 会在 30 帧中为 true,GetKeyDown 会在其中第一帧为 true,而 GetKeyUp 会在最后一帧之后的那一帧为 true。每次按下只发射一发炮弹的大炮要检测 GetKeyDown;如果使用 GetKey,按一次就会发射 30 发炮弹:

public int shots = 0;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        shots++;
        Debug.Log("Shots fired: " + shots);
    }
}

GetKeyUp 用于检测玩家松开按键时发生的情况,例如冲刺结束。三种方法都只检测当前帧的状态,因此应该放在 Update() 中:它会在每一帧运行,而 Start() 只运行一次,几乎会错过所有按键操作。

challenge icon

挑战

简单

按住空格键时,弹弓会蓄力;松开时会报告本次射击的蓄力值。

  1. 在 Update() 中,当 Input.GetKey(KeyCode.Space) 为 true 时,将 Time.deltaTime 加到 charge 上。
  2. 当触发 Input.GetKeyUp(KeyCode.Space) 时,记录 "Charge: " + charge,然后将 charge 设为 0。

按“开始”,按住空格键再松开:Console 会显示类似 Charge: 1.5 的一行内容。然后按“检查”。

亲手试试

using UnityEngine;

public class Slingshot : MonoBehaviour
{
    float charge = 0f;

    void Update()
    {
        // 按住 Space 时:charge 每秒增加 1。
        // 松开 Space 时:记录 charge 的值,然后将它重置为 0。
    }
}

Unity 脚本基础中的所有课

自己练习: Unity 在线编辑器