Unity【KeyCode键位】的使用

举报
黄_huawei云 发表于 2024/10/23 10:09:36 2024/10/23
【摘要】 Unity中的键位KeyCode使用情况


目录


主要用途

检测按键事件:

处理键盘输入:

基本键位 

常用键:

字母键:

数字键:

功能键:

方向键:

控制键:

鼠标键:

其他特殊键:

  代码示例

按下与抬起空格

 检测方向键来移动游戏对象

同时检测多个键

暂停和恢复

通过数字键切换武器

注意事项

在不同操作系统(如Windows、MacOS、Linux)上的差异

处理特殊键(如Ctrl、Alt、Shift)的事件

 Input.GetKeyDown(KeyCode) 与 Input.GetKeyDown() 的区别

所有类型的键盘输入


主要用途

  1. 检测按键事件

    • 使用 Input.GetKeyDown(KeyCode) 方法可以检测用户是否按下特定的键。例如,Input.GetKeyDown(KeyCode.Space) 可以检测空格键是否被按下。
    • 在 Event 类中,Event.keyCode 返回键盘事件的原始键代码,这些键代码直接映射到物理键盘键。
  2. 处理键盘输入

    在 OnGUI 方法中,可以通过 Event.current.keyCode 获取当前按键的 KeyCode 值,并进行相应的处理。

基本键位 

  1. 常用键

    • KeyCode.Backspace:退格键 
    • KeyCode.Delete:删除键 
    • KeyCode.Tab:Tab键 
    • KeyCode.Clear:清除键 
    • KeyCode.Return:回车键 
    • KeyCode.Pause:暂停键 
    • KeyCode.Escape:Esc键 
    • KeyCode.Space:空格键 编辑
  2. 字母键

    KeyCode.A 到 KeyCode.Z:字母键A到Z 

  3. 数字键

    • KeyCode.Alpha0 到 KeyCode.Alpha9:主键盘上的数字键0到9 
    • KeyCode.Keypad0 到 KeyCode.Keypad9:数字键盘上的数字键0到9 
  4. 功能键

    KeyCode.F1 到 KeyCode.F12:功能键F1到F12 

  5. 方向键

    • KeyCode.UpArrow:上箭头键 
    • KeyCode.DownArrow:下箭头键 
    • KeyCode.LeftArrow:左箭头键 
    • KeyCode.RightArrow:右箭头键 
  6. 控制键

    • KeyCode.LeftControl:左Ctrl键 
    • KeyCode.RightControl:右Ctrl键 
    • KeyCode.LeftShift:左Shift键 
    • KeyCode.RightShift:右Shift键 
    • KeyCode.LeftAlt:左Alt键 
    • KeyCode.RightAlt:右Alt键 编辑
  7. 鼠标键

    • KeyCode.Mouse0:鼠标左键 
    • KeyCode.Mouse1:鼠标右键 
    • KeyCode.Mouse2:鼠标中键 
  8. 其他特殊键

    • KeyCode.Insert:插入键 
    • KeyCode.Home:Home键 
    • KeyCode.End:End键 
    • KeyCode.PageUp:Page Up键 
    • KeyCode.PageDown:Page Down键 

  代码示例

按下与抬起空格

using system;
using UnityEngine;
public class ctrl_cv :MonoBehaviour    //假设我的类名叫做ctrl_cv,即我的脚本scripts名称
{
    void Start
    {
        //只调用一帧
    }
    void Update
    {
        //每一帧都调用
        if(Input.GetKeyDown(KeyCode.Space))
        {
            Debug.Log("按下空格")
        }
        if(Input.GetKeyUp(KeyCode.Space))
        {
            Debug.Log("抬起空格")
        }
        if(Input.GetButtonDown("Jump"))
        {
            Debug.Log("跳跃")          //跳跃键默认为Space空格键,Unity中可在偏好设置中调节
        }
        
    }
} 

 检测方向键来移动游戏对象

using UnityEngine;

public class MoveWithArrowKeys : MonoBehaviour
{
    public float speed = 5f;

    void Update()
    {
        Vector3 move = Vector3.zero;

        // 使用方向键移动游戏对象
        if (Input.GetKey(KeyCode.UpArrow))
        {
            move += Vector3.forward;
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            move += Vector3.back;
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            move += Vector3.left;
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            move += Vector3.right;
        }

        transform.Translate(move * speed * Time.deltaTime);
    }
}

同时检测多个键

using UnityEngine;

public class MultiKeyInputExample : MonoBehaviour
{
    void Update()
    {
        // 检测玩家是否同时按下了 "A" 键和 "D" 键
        if (Input.GetKey(KeyCode.A) && Input.GetKey(KeyCode.D))
        {
            Debug.Log("同时按下了 A 和 D 键");
        }
    }
}

暂停和恢复

using UnityEngine;

public class PauseGameExample : MonoBehaviour
{
    private bool isPaused = false;

    void Update()
    {
        // 按下 Esc 键暂停或恢复游戏
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            isPaused = !isPaused;
            Time.timeScale = isPaused ? 0 : 1;
            Debug.Log(isPaused ? "游戏已暂停" : "游戏已恢复");
        }
    }
}

通过数字键切换武器

using UnityEngine;

public class WeaponSwitchExample : MonoBehaviour
{
    public GameObject[] weapons;

    void Update()
    {
        // 按下数字键 1 到 3 切换武器
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            SwitchWeapon(0);
        }
        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            SwitchWeapon(1);
        }
        if (Input.GetKeyDown(KeyCode.Alpha3))
        {
            SwitchWeapon(2);
        }
    }

    void SwitchWeapon(int index)
    {
        for (int i = 0; i < weapons.Length; i++)
        {
            weapons[i].SetActive(i == index);
        }
        Debug.Log($"切换到武器 {index + 1}");
    }
}

注意事项

  • KeyCode 值直接映射到物理键盘键,因此在不同平台和语言设置下,这些键码可能会有所不同。
  • 如果需要处理光标键、功能键等特殊按键,可以使用 Event.keyCode 来获取相应的 KeyCode 值。

通过使用 KeyCode,开发者可以方便地处理键盘输入事件,从而实现各种交互功能。

在不同操作系统(如Windows、MacOS、Linux)上的差异

在Unity中,KeyCode值用于表示键盘上的物理按键。然而,在不同操作系统(如Windows、MacOS、Linux)上,这些键的识别和映射可能会有所不同。

  1. 修饰键的差异:在macOS上,某些修饰键可能无法通过Event.current.keyCode 来识别。这表明在macOS上使用keyCode时需要特别注意修饰键的处理方式。

  2. 控制键的统一性:尽管在不同的操作系统中,控制键的功能有所不同,但在Unity中,它被统一为KeyCode control,分别代表Windows和Linux上的Control键以及macOS上的Command键。

  3. Alt键的差异:在macOS上,Alt键被称为Option键,因此在编写跨平台代码时需要注意这一点。

  4. 字符与键码的区别keyCode表示的是物理按键,而character属性则表示特定字符的输入。例如,在小写和大写字母的情况下,它们都返回相同的keyCode值(即(KeyCode.A),但字符本身会有所不同。

处理特殊键(如Ctrl、Alt、Shift)的事件

1、在Unity中处理特殊键(如Ctrl、Alt、Shift)的事件,可以使用Input.GetKey方法。这个方法可以检测某个键是否被一直按住。例如,如果你想检测用户是否一直按住Ctrl键,你可以这样写:

if (Input.GetKey(KeyCode.Ctrl))
{
    // Ctrl键一直被按住时执行的代码
}

2、然而,对于特殊组合键(如Ctrl+Shift),你可能需要同时检查多个键的状态。这可以通过组合使用Input.GetKey来实现,例如:

if (Input.GetKey(KeyCode.Ctrl) && Input.GetKey(KeyCode.Shift))
{
    // Ctrl和Shift键同时被按住时执行的代码
}

 Input.GetKeyDown(KeyCode) 与 Input.GetKeyDown() 的区别

Unity的 Input.GetKeyDown(KeyCode) 方法与 Input.GetKeyDown() 方法之间的区别主要在于它们对按键事件的响应方式。

  1. Input.GetKeyDown(KeyCode) :这个方法用于检测特定按键是否被按下一次。当按键被按下时,该方法会返回 true,但只在按键被按下的那一帧内有效。即使按键一直保持按下状态,该方法也不会再次触发。例如,在射击游戏中,当你按下空格键开枪时,Input.GetKeyDown(KeyCode.Space) 只会在你第一次按下空格键时返回 true,而不会在你继续按住空格键时持续返回 true。

  2. Input.GetKeyDown() :这个方法没有提供具体的参数,因此它实际上是一个语法错误或不存在的方法。在 Unity 中,正确的用法应该是 Input.GetKeyDown(KeyCode),其中 KeyCode 是一个枚举值,代表键盘上的某个按键。

所有类型的键盘输入

Unity中的 KeyCode 并不直接支持所有类型的键盘输入,包括触摸屏和游戏手柄。然而,Unity提供了多种机制来处理不同类型的输入设备。

  1. 键盘输入:Unity原生支持键盘输入,并且可以通过 KeyCode 来识别不同的按键。

  2. 游戏手柄和操纵杆输入:Unity也支持游戏手柄和操纵杆输入。开发者可以在输入管理器 (Input Manager) 中创建虚拟轴和按钮,并通过脚本访问这些设置。

  3. 触摸屏输入:对于移动设备,Unity可以跟踪最多五根手指同时触摸屏幕的状态。开发者可以通过访问 Input.touches  属性数组来获取触摸状态。此外,Unity还提供了一个名为 Input-touchSupported 的属性,用于确定当前设备是否支持触摸输入。

  4. 多平台适配:在进行多平台适配时,Unity的 InputSystem 插件可以帮助开发者在PC端(鼠标与键盘)、手机端(触摸屏)以及主机手柄上同步实现角色移动与跳跃功能。




【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。