在Unity开发中,我们通常需要获取并处理用户的输入,这时我们就需要用到Unity的Input类。它允许我们通过键盘,鼠标,触摸屏,游戏手柄等多种方式从用户那里接收输入。在本篇文章中,我会用一万字以上深度解析Unity的Input类,并提供其属性和方法的详细使用方式。
Input.anyKey
:如果用户按下任何键,返回true(只读)Input.anyKeyDown
:如果用户在当前帧中按下任何键,返回true(只读)Input.GetKey(KeyCode key)
:如果按着指定的键,则返回 trueInput.GetKeyDown(KeyCode key)
:如果按下了指定的键,则返回 trueInput.GetKeyUp(KeyCode key)
:如果释放了指定的键,则返回 trueInput.anyKey: 检测最后一帧中是否有任何键被按下(bool)
如果用户按下了任何键,或者按下了鼠标按钮,或者触控设备有任何的触控输入,这里的"任何键"包括键盘按键,鼠标按键,以及触控输入。它会在用户按住键不放的整个过程中一直返回 true
void Update()
{
if (Input.anyKey)
{
Debug.Log("按着一个键");
}
}
Input.anyKeyDown: 检测在当前帧中是否有任何键被按下(bool)
只在用户刚刚开始按下任何键的那一帧,也就是说,只有在按键刚被按下的那一帧,它才会返回 true,之后的帧,即使按键仍然被按住,它也会返回 false。同样的,这里的"任何键"也包括键盘按键,鼠标按键,以及触控输入
void Update()
{
if (Input.anyKeyDown)
{
Debug.Log("刚按了一个键");
}
}
Input.GetKey(KeyCode key):这个方法可以用来检测用户是否按下了任何指定的键。如果用户按下了指定的键,该方法会返回true,否则返回false,键的名称以KeyCode的形式作为参数。
如果用户一直按住该键,那么此方法会在每一帧都返回 true。
Input.GetKeyDown(KeyCode):只在用户开始按下指定的键的那一帧返回 true。也就是说,只有在按键刚被按下的那一帧,它才会返回 true,之后的帧,即使按键仍然被按住,它也会返回 false
Input.GetKeyUp(KeyCode):只在用户释放指定的键的那一帧返回 true。当用户松开按键时,这个方法在那一帧返回 true,其余时间返回 false
void Update() {
if (Input.GetKey(KeyCode.Space)) {
Debug.Log("空格键被按着");
}
if (Input.GetKeyDown(KeyCode.Space)) {
Debug.Log("空格键被按下");
}
if (Input.GetKeyUp(KeyCode.Space)) {
Debug.Log("空格键被松开");
}
}
Input.GetButton(string buttonName)
:如果按着指定的虚拟按钮,则返回 trueInput.GetButtonDown(string buttonName)
:如果按下了指定的虚拟按钮,则返回 trueInput.GetButtonUp(string buttonName)
:如果释放了指定的虚拟按钮,则返回 trueInput.GetButton(string buttonName):如果用户按下了指定的虚拟按钮,该方法会返回true,否则返回false。按钮的名称以字符串的形式作为参数。如果一直按住该按钮,那么此方法会在每一帧都返回 true
Input.GetButtonDown(string buttonName):只在用户开始按下指定的按钮的那一帧返回 true。也就是说,只有在按钮刚被按下的那一帧,它才会返回 true,之后的帧,即使按钮仍然被按住,它也会返回 false
Input.GetButtonUp(string buttonName):只在用户释放指定的按钮的那一帧返回 true。当用户松开按钮时,这个方法在那一帧返回 true,其余时间返回 false。
void Update() {
if (Input.GetButton("Jump")) {
Debug.Log("Jump按钮被按住.");
}
if (Input.GetButtonDown("Jump")) {
Debug.Log("Jump按钮被按下.");
}
if (Input.GetButtonUp("Jump")) {
Debug.Log("Jump按钮被松开.");
}
}
Input.mousePresent
:如果有鼠标设备连接上,返回 true(只读)Input.mousePosition
:返回当前的鼠标位置(只读)Input.mouseScrollDelta
:返回鼠标滚轮的滚动量(只读)Input.GetMouseButton(int button)
:如果按着鼠标按钮,则返回 trueInput.GetMouseButtonDown(int button)
:如果按下了鼠标按钮,则返回 trueInput.GetMouseButtonUp(int button)
:如果释放了鼠标按钮,则返回 trueInput.mousePresent:这是一个布尔值,如果用户的设备支持并且连接了鼠标设备,则返回 true,否则返回 false。在下面这个例子中,我们在游戏启动时检查鼠标是否连接。
void Start()
{
if (Input.mousePresent)
{
Debug.Log("“鼠标已连接");
}
else
{
Debug.Log("“鼠标未连接");
}
}
Input.mousePosition:获取鼠标在屏幕上的位置,这是一个 Vector3 类型的值,表示当前鼠标在屏幕上的位置。位置的 x 和 y 值表示鼠标在屏幕上的像素坐标,z 值通常为 0(在 2D 空间中)。请注意,此坐标的原点(0,0)在屏幕的左下角。
void Update()
{
Vector3 mousePosition = Input.mousePosition;
Debug.Log(mousePosition); //(-16.0, 221.0, 0.0)
}
Input.mouseScrollDelta:这是一个 Vector2 类型的值,表示自上一帧以来鼠标滚轮的滚动量。x 值表示水平滚动,y 值表示垂直滚动。
void Update()
{
Vector2 scrollDelta = Input.mouseScrollDelta;
if (scrollDelta.y > 0){
Debug.Log("鼠标滚轮向上滚动: " + scrollDelta.y);
}
else if (scrollDelta.y < 0){
Debug.Log("鼠标滚轮向下滚动: " + scrollDelta.y);
}
}
Input.GetMouseButton(int button):此方法接收一个整数参数,代表鼠标的按钮索引(0 表示左键,1 表示右键,2 表示中键),并在按钮被持续按下时返回 true
Input.GetMouseButtonDown(int button):此方法同样接收一个整数参数代表鼠标的按钮索引,并只在按钮被首次按下的那一帧返回 true
Input.GetMouseButtonUp(int button):此方法同样接收一个整数参数,代表鼠标的按钮索引,并只在按钮被释放的那一帧返回 true
void Update()
{
if (Input.GetMouseButton(0)){
Debug.Log("“正在按鼠标左键");
}
if (Input.GetMouseButtonDown(0)){
Debug.Log("“按下了鼠标左键");
}
if (Input.GetMouseButtonUp(0)){
Debug.Log("“松开了鼠标左键");
}
}
Input.GetAxis(string axisName)
:根据指定的轴名返回轴的值Input.GetAxisRaw(string axisName)
:根据指定的轴名返回轴的值,没有平滑过滤。Input.IsJoystickPreconfigured(string joystickName)
:检查名为 joystickName 的手柄是否已在 Unity 输入管理器中预配置Input.GetJoystickNames()
:返回当前连接的所有游戏控制器的名称Input.GetAxis(string axisName): 返回指定虚拟轴的值,轴的名称以字符串的形式作为参数。该值在 -1 和 1 之间,这个值会在没有输入时平滑地返回到 0。这个方法非常有用,可以用来获取预定义的虚拟轴的值,如“Horizontal”或“Vertical”:
void Update() {
float horizontalInput = Input.GetAxis("Horizontal");
float verticalInput = Input.GetAxis("Vertical");
Debug.Log("水平输入: " + horizontalInput);
Debug.Log("垂直输入: " + verticalInput);
}
Input.GetAxisRaw(string axisName):提供和GetAxis方法类似的功能,但是该方法不会对值进行平滑处理,它直接返回输入值。当你需要更精确的控制时可以使用该方法,示例同上。
Input.IsJoystickPreconfigured(string joystickName):检查名为 joystickName 的手柄是否已经在 Unity 的输入管理器中预配置。返回 true 表示已经预配置,false 表示没有预配置。
bool isPreconfigured = Input.IsJoystickPreconfigured("Xbox360Controller");
Input.GetJoystickNames():返回当前连接的所有游戏控制器的名称,返回的是一个字符串数组。
string[] joystickNames = Input.GetJoystickNames();
foreach(string joystickName in joystickNames)
{
Debug.Log(joystickName);
}
Input.touchCount
:返回当前帧中的触摸数量(只读)Input.touches
:返回从触摸屏接收的所有触摸信息的数组(只读)Input.multiTouchEnabled
:设置或获取是否启用多点触控。Input.touchSupported
:如果设备支持触摸输入,则返回trueInput.simulateMouseWithTouches
:如果启用,则将触摸事件作为鼠标事件进行处理,返回布尔值Input.stylusTouchSupported
:如果设备支持使用触摸笔作为输入,则返回trueInput.touchPressureSupported
:如果设备支持检测触摸压力,则返回trueInput.GetTouch(int index)
:返回触摸数据。可以访问正在发生触摸的特定指数Input.touchCount: 返回一个整数,代表在当前帧被触摸的触摸点数量。对于多点触控设备非常有用,例如在触摸屏设备上实现手势操作。
void Update()
{
int touchCount = Input.touchCount;
Debug.Log("触摸数量: " + touchCount); //触摸数量:2
}
Input.touches: 返回一个 Touch[] 数组,包含了当前帧所有的触摸点。每个 Touch 对象包含了该触摸点的详细信息,如位置、压力、相对于上一帧的移动等。
void Update()
{ //遍历所有的触摸点,并在控制台输出它们的位置
foreach (Touch touch in Input.touches)
{
Debug.Log("触摸位置: " + touch.position);
}
}
Input.multiTouchEnabled: 这个属性是一个布尔值,用于开启或关闭多点触控功能。默认情况下该功能是开启的。如果设为 false,则不论设备上有多少个触摸点,Input.touches 只会返回最早的那个触摸点。
void Start()
{
//多点触控功能关闭
Input.multiTouchEnabled = false;
}
Input.touchSupported:是一个只读的布尔值属性,它用于检查当前设备是否支持触摸输入。如果支持,它将返回 true,否则返回 false。
if (Input.touchSupported)
{
Debug.Log("“本设备支持触摸");
}
else
{
Debug.Log("“本设备不支持触摸");
}
Input.simulateMouseWithTouches: 获取或设置是否应该模拟鼠标输入的触摸事件(bool)。
默认情况下,Input.simulateMouseWithTouches 为 true,触控点将模拟鼠标事件,这意味着在多点触控设备上,你可以像在使用鼠标一样处理用户的输入。然而,如果你的应用程序需要处理多点触控,你可能需要将此设置为 false,以防止对触控事件的鼠标模拟。
//禁用模拟触摸鼠标
Input.simulateMouseWithTouches = false;
Input.stylusTouchSupported: 获取设备是否支持手写笔输入(bool),在开发针对触控笔的应用程序时,这是非常有用的
if (Input.stylusTouchSupported)
{
Debug.Log("本设备支持手写笔");
}
else
{
Debug.Log("本设备不支持手写笔");
}
Input.touchPressureSupported:是一个只读的布尔值属性,它用于检查当前设备是否支持触摸压力(深度触摸)。如果支持,它将返回 true,否则返回 false。对于像 Apple 的 3D Touch 功能这样的技术,这是非常有用的。
if (Input.touchPressureSupported)
{
Debug.Log("该设备支持触摸压力");
}
else
{
Debug.Log("该设备不支持触摸压力");
}
Input.GetTouch(int index): 这个方法返回指定索引的 Touch 对象。索引应该小于 Input.touchCount数量,否则会抛出异常。下面例子中,如果存在触摸点,就获取第一个触摸点,并输出它的位置。
void Update()
{
if (Input.touchCount > 0)
{
Touch firstTouch = Input.GetTouch(0);
Debug.Log("第一个触摸点: " + firstTouch.position);
}
}
Input.acceleration
:返回由加速度传感器测量的设备当前加速度(只读)Input.accelerationEventCount
:返回当前帧中发生的加速度事件的数量(只读)Input.accelerationEvents
:返回一个包含所有在当前帧中发生的加速度事件的数组(只读)Input.acceleration: 返回从加速度传感器中获取的设备加速度(Vector3)
void Update()
{
Vector3 acceleration = Input.acceleration;
Debug.Log(acceleration);//可能会输出如"(-0.00, -0.70, 0.10)"这样的三维向量,这些数字表示设备在x, y, z轴上的加速度。
}
Input.accelerationEventCount: 返回加速度传感器事件的数量(int)
void Update()
{
int accelerationEvents = Input.accelerationEventCount;
Debug.Log(accelerationEvents);//可能会输出类似于"1"或"0"的数字,这取决于最后一帧中发生了多少加速度事件。
}
Input.accelerationEvents: 这个属性返回一个 AccelerationEvent[] 数组,包含了当前帧所有的加速度事件。每个 AccelerationEvent 对象包含了该事件的详细信息,如加速度和时间戳。这个属性通常用于处理设备的加速度数据。
void Update()
{
//遍历所有的加速度事件,并在控制台输出它们的加速度值
foreach (AccelerationEvent accEvent in Input.accelerationEvents)
{
Debug.Log("加速度: " + accEvent.acceleration);
}
}
Input.backButtonLeavesApp
:当这个值为 true 时,按下返回按钮会导致应用程序退出,否则,操作系统将处理返回按钮Input.backButtonLeavesApp: 设置 Android 的返回按钮是否会让应用程序离开(bool)。以下示例设置返回按钮使应用退出:(只能在Android、Windows Phone或Windows平板电脑上使用)
void Start()
{
Input.backButtonLeavesApp = true;
}
Input.compensateSensors
:启用或禁用输入传感器是否根据屏幕方向进行自动补偿Input.deviceOrientation
:设备的方向(只读)Input.compass
:访问设备的指南针,返回一个Compass对象Input.gyro
:访问设备的陀螺仪,返回一个Gyroscope对象。Input.compensateSensors: 这是一个布尔值类型的属性,用于启用或禁用是否应补偿设备的自然方向,默认值为 false。当启用此设置时,Unity将尝试自动调整传感器数据,以便自然方向对应于屏幕向上的方向。注意,此设置可能会影响到陀螺仪、加速度计和指南针的数据。
void Start()
{
Input.compensateSensors = true;//启用了自动补偿
}
Input.deviceOrientation: 返回设备的物理方向
void Update()
{
DeviceOrientation orientation = Input.deviceOrientation;
Debug.Log(orientation);//可能会输出"Portrait", "LandscapeLeft", "LandscapeRight"等等,这取决于设备的当前方向。
}
Input.compass: 提供设备罗盘的访问
这个属性返回一个 Compass 对象,它可以提供设备指南针的数据。在使用指南针数据之前,需要先通过调用 Input.compass.enabled = true 来启用指南针
void Start()
{
Input.compass.enabled = true;
}
void Update()
{
Debug.Log("罗盘方向: " + Input.compass.trueHeading);
}
//上述代码首先启用了指南针,然后每一帧都打印出真实的地理方向。
Input.gyro: 提供设备陀螺仪的访问
这个属性返回一个 Gyroscope 对象,可以提供设备陀螺仪的数据。在使用陀螺仪数据之前,需要先通过调用 Input.gyro.enabled = true 来启用陀螺仪
void Start()
{
if (SystemInfo.supportsGyroscope) //利用SystemInfo类,判断设备是否支持陀螺仪
{
Input.gyro.enabled = true;
}
void Update()
{
Debug.Log("陀螺仪旋转速度: " + Input.gyro.rotationRate);
}
}
Input.compositionCursorPos
:获取或设置输入法编辑器(IME)的位置。返回一个Vector2,表示IME的屏幕坐标Input.compositionString
:返回用户正在使用输入法编辑器(IME)输入的字符串Input.imeCompositionMode
:获取或设置当前的输入法编辑器(IME)组合模式Input.imeIsSelected
:检查输入法编辑器(IME)是否在活动状态并且已选择一个区域进行组合(只读)Input.inputString
:返回上一帧中键盘或按键输入的字符(只读)Input.location
:访问设备的位置功能,返回一个LocationService对象Input.ResetInputAxes()
:重置所有输入,这将忽略所有的按键/按钮输入和轴移动Input.compositionCursorPos:这是一个Vector2类型的属性,表示IME组合字符串的屏幕位置。你可以通过设置这个属性来改变屏幕上组合字符串的位置。
Input.compositionCursorPos = new Vector2(100, 200);
//上面的代码将组合字符串的位置设置为屏幕上的(100, 200)的位置
Input.compositionString:这是一个字符串属性,表示当前正在由IME组合的字符串。这在处理非拉丁字符输入时非常有用,如中文输入
string composition = Input.compositionString;
Debug.Log(composition); // 输出:正在输入的IME组合字符串
Input.imeCompositionMode:控制系统如何处理在屏幕键盘中的文本输入
①这是一个枚举类型的属性(IMECompositionMode枚举),用于控制IME的组合模式。
②允许用户通过标准键盘输入复杂的字形,如中文、日文或韩文等非拉丁语系的语言。
③这个属性有三个值:Auto和On、Off。
On:开启IME。当你希望用户使用IME输入文本时,应将此属性设置为On
Off:关闭IME。如果你不希望用户使用IME输入文本,例如在需要处理原始键盘输入的情况下,应将此属性设置为Off
Auto:自动开启或关闭IME。Unity将根据用户是否正在编辑可输入的文本字段来自动开启或关闭IME。如果用户正在编辑文本字段,IME将开启;否则,IME将关闭。
例如:在用户打开一个需要输入文本的UI界面时,你可能想要开启IME,以便用户可以输入复杂的字形。在用户关闭这个界面时,你可能想要关闭IME,以便可以直接处理键盘输入。
// 开启IME,以便用户可以输入复杂的字形
Input.imeCompositionMode = IMECompositionMode.On;
// 当用户完成输入后,关闭IME
Input.imeCompositionMode = IMECompositionMode.Off;
// 或者,让Unity根据是否有文本字段正在编辑,自动处理IME的开启或关闭
Input.imeCompositionMode = IMECompositionMode.Auto;
Input.imeIsSelected:是一个只读的布尔型属性,用于判断当前是否选中了输入法编辑器(IME)的输入字段。
当IME正在编辑状态时,这个属性值为true,否则为false
Input.inputString: 返回自上次帧的字符输入(string)
void Update()
{
string input = Input.inputString;
if (!string.IsNullOrEmpty(input))
{
Debug.Log(input);
}
}
Input.location: 提供了一个用于获取设备的地理位置信息的服务。这个服务可以提供如经度、纬度、海拔、方向和速度等信息
注意
:这个服务默认是关闭的,你需要通过调用 Input.location.Start() 来启动位置服务。启动服务可能会消耗一些时间,所以你可能需要一些机制来等待服务完全启动。在启动服务后,你可以通过检查 Input.location.status 来确认位置服务的状态。
//检查用户是否开启服务
if (!Input.location.isEnabledByUser)
{
Debug.Log("用户未启用位置服务");
}
//开启位置服务
Input.location.Start();
//检查位置服务是否可用
if (Input.location.status == LocationServiceStatus.Failed)
{
Debug.Log("无法确定设备位置");
}
else
{
Debug.Log("位置: " + Input.location.lastData.latitude + " " + Input.location.lastData.longitude); //Location: 37.785834 122.406417
}
//停止位置服务
Input.location.Stop();
注意
:当你不再需要位置服务时,应通过调用 Input.location.Stop() 来停止服务,以节省设备的电池寿命。
如果想了解更多关于location里的方法和属性的相关内容,有需要的话我会在之后的文章详细说明。
Input.ResetInputAxes() :重置所有输入,这通常用于情况更改时,需要重置可能已经启动并影响输入的动作。
例如,您可能在游戏暂停并重新开始时使用它,以防止玩家在暂停菜单中按下按钮并在游戏恢复后立即生效。
public void ResumeGame()
{
// 假设我们当前的游戏暂停了,并且在这里正在恢复游戏...
// 在恢复游戏之前,我们需要重置输入输入,以防止在暂停期间发生的任何输入影响游戏
Input.ResetInputAxes();
// 然后我们可以继续游戏...
}
在上面例子中,Input.ResetInputAxes() 在游戏恢复之前被调用,以清除在暂停期间发生的任何输入
通过使用Unity的Input类,我们可以轻松地获取和处理用户的输入,它是我们在Unity开发中处理用户输入的关键,它使我们能够创建出交互丰富、响应流畅的游戏,希望这篇文章能帮助你更好地理解和使用Unity的Input类。