Unity(2022.3.38LTS) - 输入
目录
一. 简介
二. 实例
键盘输入:
鼠标输入:
触摸输入:
输入管理器:
一. 简介
在 Unity 中,输入(Input)是用于获取用户输入信息的重要部分。
键盘输入:
可以通过 Input.GetKey
、 Input.GetKeyDown
、 Input.GetKeyUp
等方法来检测键盘按键的状态。例如,判断是否按下了“W”键来控制角色向前移动。
鼠标输入:Input.mousePosition
可以获取鼠标在屏幕上的位置。 Input.GetMouseButton
系列方法用于检测鼠标按键的操作。
触摸输入:
在支持触摸的设备上,Unity 提供了相应的触摸输入检测方法。
轴输入:
可以在 Unity 的输入设置中定义轴(Axes),如水平轴(Horizontal)和垂直轴(Vertical),然后通过 Input.GetAxis
或 Input.GetAxisRaw
来获取轴的值,常用于控制角色的移动或其他连续的操作。
示例应用:
在一个射击游戏中,通过鼠标左键点击进行射击,通过键盘的“WASD”键控制角色移动。
在一个跑酷游戏中,利用手机的触摸滑动控制角色的跳跃和转向。
二. 实例
键盘输入:
使用 Input.GetKey
方法:
void Update()
{if (Input.GetKey(KeyCode.W)){// 执行当 W 键被持续按下时的操作}
}
使用 Input.GetKeyDown
方法:
void Update()
{if (Input.GetKeyDown(KeyCode.W)){// 执行当w键被按下时的操作}
}
使用 Input.GetKeyUp
方法:
void Update()
{if (Input.GetKeyUp(KeyCode.W)){// 执行当w键被松开时的操作}
}
例如,在一个简单的平台跳跃游戏中:
当持续按下 W
键时,角色向上跳跃;当按下空格键时,角色发动特殊技能;当松开 Esc
键时,暂停游戏。
代码:
using System.ComponentModel.Design;
using UnityEngine;public class InputTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){if (Input.GetKeyUp(KeyCode.W)){// 执行当 W 键被松开时的操作Debug.LogError("W被松开");}if (Input.GetKeyDown(KeyCode.W)){// 执行当 W 键被按下时的操作Debug.LogError("W被按下");}if (Input.GetKey(KeyCode.W)){// 执行当 W 键被持续按下时的操作Debug.LogError("W持续按下");}}
}
把这个代码脚本组件,添加到场景内物体上.然后运行游戏,按下键盘的W.
鼠标输入:
在 Unity 中,处理鼠标输入有多种方式。
获取鼠标位置:
可以使用 Input.mousePosition
来获取鼠标在屏幕上的位置。它返回的是一个 Vector3
类型的值,其中 x
和 y
分别表示鼠标在屏幕上的水平和垂直坐标。
检测鼠标按键按下:
Input.GetMouseButton(0)
:检测鼠标左键是否按下。Input.GetMouseButton(1)
:检测鼠标右键是否按下。Input.GetMouseButton(2)
:检测鼠标中键是否按下。
检测鼠标按键按下的瞬间:
Input.GetMouseButtonDown(0)
:检测鼠标左键按下的瞬间。Input.GetMouseButtonDown(1)
:检测鼠标右键按下的瞬间。Input.GetMouseButtonDown(2)
:检测鼠标中键按下的瞬间。
检测鼠标按键松开:
Input.GetMouseButtonUp(0)
:检测鼠标左键松开。Input.GetMouseButtonUp(1)
:检测鼠标右键松开。Input.GetMouseButtonUp(2)
:检测鼠标中键松开。
以下是一个简单的示例代码,用于在鼠标左键按下时打印信息:
using System.ComponentModel.Design;
using UnityEngine;public class InputTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){if (Input.GetMouseButtonDown(0)){Debug.Log("鼠标左键按下位置" + Input.mousePosition);}}
}
触摸输入:
在 Unity 中处理触摸输入,需要考虑移动端设备(如手机和平板)的触摸操作。
基本的触摸检测方法:
Input.touches
数组包含了当前所有触摸的信息。每个 Touch
对象具有位置、阶段(如开始、移动、结束)等属性。
示例代码:
using UnityEngine;public class TouchInputExample : MonoBehaviour
{void Update(){if (Input.touchCount > 0){Touch touch = Input.GetTouch(0);if (touch.phase == TouchPhase.Began){Debug.Log("触摸开始");}else if (touch.phase == TouchPhase.Moved){Debug.Log("正在触摸移动");}else if (touch.phase == TouchPhase.Ended){Debug.Log("触摸结束");}}}
}
多点触摸:
如果需要处理多点触摸,可以遍历 Input.touches
数组获取多个触摸的信息。
在游戏中的应用:
例如在一个跑酷游戏中,玩家通过手指在屏幕上滑动来控制角色的左右移动和跳跃。
或者在一个策略游戏中,通过手指的缩放操作来控制地图的缩放。
输入管理器:
在 Unity 中,输入管理器(Input Manager)是用于配置和管理各种输入设备输入的工具。
主要功能:
- 定义输入轴(Axes):您可以创建水平轴(Horizontal)、垂直轴(Vertical)等,并为其指定对应的按键或鼠标操作。
- 灵敏度设置:调整输入轴的灵敏度,以控制输入的响应速度。
- 反转设置:例如,反转某个轴的输入方向。
配置输入:
在 Unity 编辑器的菜单栏中,选择 “Edit” -> “Project Settings” -> “Input” 来打开输入管理器。
应用示例:
假设您正在制作一个赛车游戏,您可以创建一个 “Acceleration” 轴,并将其设置为对应键盘的 “W” 和 “S” 键,或者手柄的某个摇杆操作,然后在脚本中通过 Input.GetAxis("Acceleration")
来获取玩家的加速输入值。
优点:
- 统一管理:方便集中配置和查看所有的输入设置。
- 跨平台适配:可以为不同的平台(如 PC、移动设备、主机)进行针对性的输入配置。
属性: | 功能: |
---|---|
Name | 用于从脚本中检查此轴的字符串名称。 |
Descriptive Name | 独立构建的 Configuration 对话框的 Input 选项卡中显示的正值名称。 |
Descriptive Negative Name | 独立构建的 Configuration 对话框的 Input 选项卡中显示的负值名称。 |
Negative Button | 用于向负方向推动轴的按钮。 |
Positive Button | 用于向正方向推动轴的按钮。 |
Alt Negative Button | 用于向负方向推动轴的替代按钮。 |
Alt Positive Button | 用于向正方向推动轴的替代按钮。 |
Gravity | 未按下按钮的情况下,轴下降到中性点的速度(以单位/秒表示)。 |
Dead | 模拟盲区的大小。此范围内的所有模拟设备值都会映射到中性点。 |
Sensitivity | 轴向目标值移动的速度(以单位/秒表示)。仅用于数字设备。 |
Snap | 如果启用,按下相反方向的按钮时,轴值将重置为零。 |
Invert | 如果启用,则负按钮 (Negative Buttons) 将提供正值,反之亦然。 |
Type | 将控制此轴的输入类型。 |
轴 | 将控制此轴的已连接设备的轴。 |
Joy Num | 将控制此轴的已连接游戏杆。 |
void Update(){// 获取水平轴的值(例如:A 键和 D 键,或左摇杆左右移动)float horizontal = Input.GetAxis("Horizontal");// 获取垂直轴的值(例如:W 键和 S 键,或左摇杆上下移动)float vertical = Input.GetAxis("Vertical");Debug.Log("水平轴输入: " + horizontal);Debug.Log("垂直轴输入: " + vertical);}