U1L8——Input输入相关

Input

输入 - Unity 手册

访问输入系统的接口。这是老输入系统,新输入系统请看这里 ——> U4S1
Input类 提供了大部分和输入相关的内容,包括:鼠标 键盘 触屏 手柄 重力感应
对于我们目前来说,鼠标 键盘 是必须掌握的核心知识
重点是鼠标和键盘相关的API:GetAxis

注意!输入相关内容一定写在Update中

本章代码关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Input                        //访问输入系统的接口
//鼠标相关
Input.mousePosition //获取鼠标在屏幕的位置,返回值是Vector3,但是只有x和y有值
Input.GetMouseButtonDown() //鼠标按下一瞬间返回True的方法,参数:0左键 1右键 2中键
Input.GetMouseButtonUp() //鼠标抬起一瞬间返回True的方法(只会进入一次)参数:0左键 1右键 2中键
Input.GetMouseButton() //鼠标长按按下抬起都会返回Ture的方法,如果一直按就一直返回True,结束后不再进入,参数:0左键 1右键 2中键
Input.mouseScrollDelta //中键滚动,返回值的y -1为下、0没有动、1为上,它的返回值是Vector2的值,鼠标中键滚动会改变其中的Y值
//键盘相关
Input.GetKeyDown() //键盘对应键按下一瞬间返回True的方法
Input.GetKeyUp() //键盘对应键抬起一瞬间返回True的方法
Input.GetKey() //键盘对应键长按按下抬起都会返回Ture的方法,如果一直按就一直返回True,结束后不再进入
Input.GetAxis() //检测默认轴输入,通过参数确认是哪个轴,来帮助控制对象的位移和旋转
Input.GetAxisRaw(); //GetAxis使用方式相同,只不过它的返回值只会是-1、0、1不会有中间值
Input.anyKey //是否有任意键或者鼠标长按
Input.anyKeyDown //是否有任意键或鼠标按下
Input.inputString //获取这一帧的键盘输入
//手柄相关
Input.GetJoystickNames() //得到连接的手柄的所有按钮的名字
Input.GetButtonDown() //某一个手柄键按下返回True的方法
Input.GetButtonUp() //某一个手柄键抬起返回True的方法
Input.GetButton() //某一个手柄键长按返回True的方法
//移动设备相关
Input.touchCount //移动设备触摸点数
Input.touches[] //移动设备触摸点的数组
Touch.position //移动设备触摸点位置
Touch.deltaPosition //移动设备触摸点相对上次位置的变化
Input.multiTouchEnabled //是否启用多点触控
Input.gyro.enabled //是否开启陀螺仪,只有开启,才能正常使用
Input.gyro.gravity //陀螺仪的重力加速度向量
Input.gyro.rotationRate //陀螺仪的旋转速度
Input.gyro.attitude //陀螺仪的当前的旋转的四元数

鼠标相关

获取鼠标在屏幕位置

屏幕坐标的原点 是在 屏幕的左下角 往右是X轴正方向 往上时Y轴正方向

image
返回值时Vector3 但是只有x和y有值 z一直是0 是因为屏幕本来就是2D的 不存在z轴

1
print(Input.mousePosition);

检测鼠标输入

鼠标按下相关检测 对于我们来说
可以做例如发射子弹的逻辑、控制摄像机转动

鼠标按下

0左键 1右键 2中键
只有按下的这一瞬间 进入一次(只会进入一次)

1
2
3
4
if (Input.GetMouseButtonDown(0))
{
print("鼠标某一个键按下了");
}

鼠标抬起

0左键 1右键 2中键
鼠标抬起一瞬间 进入(只会进入一次)

1
2
3
4
if (Input.GetMouseButtonUp(0))
{
print("鼠标某一个键抬起了");
}

鼠标长按

鼠标长按按下抬起都会进入
当按住按键不放是 会一直进入这个判断(结束后不再进入)0左键 1右键 2中键
只有按下的这一瞬间 进入一次(只会进入一次)

1
2
3
4
if (Input.GetMouseButton(1))
{
print("右键有操作");
}

中键滚动

返回值的y:-1为下、0为没有动、1为上
它的返回值是Vector2​的值 我们鼠标中键滚动 会改变其中的Y值

1
print(Input.mouseScrollDelta);

键盘相关

类似于检测鼠标输入,例如 按下一个键释放一个技能或者移动等

键盘按下

1
2
3
4
if (Input.GetKeyDown(KeyCode.W))
{
print("W键按下");
}

以下的方法都有传入字符串的重载
这里传入的字符串 不能是大写的 否则报错!!!
只能传入小写字符串

1
2
3
4
if (Input.GetKeyDown("space"))
{
print("Space键按下");
}

键盘抬起

1
2
3
4
if (Input.GetKeyUp(KeyCode.A))
{
print("A抬起");
}

键盘长按

1
2
3
4
if (Input.GetKey(KeyCode.S))
{
print("S按下");
}

检测默认轴输入

鼠标 键盘输入 主要是用来控制玩家 例如旋转 位移等等
而Unity提供了 更方便的方法 来帮助我们控制 对象的 位移和旋转
在Edit–Project Setting–Input Manager可以使用的默认轴如下:

image
同时,对它们可以修改,也可以自行添加默认轴(修改Size即可)

1
2
3
4
5
6
7
8
9
10
11
12
13
//键盘AD按下时 返回 -1到1中间的变换
//相当于得到的这个值 就是我们的 左右方向 我们可以通过它来控制 对象左右移动 或者左右旋转
print(Input.GetAxis("Horizontal"));

//键盘SW按下时 返回 -1到1之间的变换
//相当于得到的这个值 就是我们的 上下方向 我们可以通过它来控制 对象上下移动 或者上下旋转
print(Input.GetAxis());

//鼠标横向移动时 -1 到 1 左右
print(Input.GetAxis("Mouse X"));

//鼠标竖向移动时 -1 到 1 下上
print(Input.GetAxis("Mouse Y"));

我们默认的 GetAxis方法是有渐变的 会在 -1到1 之间 会出现小数

无渐变的轴输入

GetAxisRaw​方法 和 GetAxis​ 使用方式相同
只不过它的返回值只会是-1、0、1,不会有中间值

1
Input.GetAxisRaw();

键盘鼠标其他输入

检测是否有任意键或者鼠标长按

1
2
3
4
if (Input.anyKey)
{
print("有一个键正在被按住");
}

检测是否有任意键或鼠标按下

1
2
3
4
if (Input.anyKeyDown)
{
print("有一个键按下");
}

检测获取这一帧的键盘输入

和Input.anyKeyDown​配合可以用来进行改键的处理

1
print(Input.inputString);

手柄输入相关

得到连接的手柄的所有按钮的名字

1
string[] strs = Input.GetJoystickNames();

某一个手柄键按下

1
2
3
4
if (Input.GetButtonDown("Jump"))
{

}

某一个手柄键抬起

1
2
3
4
if (Input.GetButtonUp("Jump"))
{

}

某一个手柄键长按

1
2
3
4
if (Input.GetButton("Jump"))
{

}

移动设备触摸相关

1
2
3
4
5
6
7
8
9
if (Input.touchCount > 0)
{
Touch t1 = Input.touches[0];

//位置
print(t1.position);
//相对上次位置的变化
print(t1.deltaPosition);
}

是否启用多点触控

1
Input.multiTouchEnabled = false;

陀螺仪(重力感应)

是否开启陀螺仪

若要使用陀螺仪,此项必须开启才能正常使用

1
Input.gyro.enabled = true;

重力加速度向量

1
print(Input.gyro.gravity);

旋转速度

1
print(Input.gyro.rotationRate);

陀螺仪 当前的旋转的四元数

比如用这个角度信息来控制场景上的一个3D物体受到重力影响,手机/手柄怎么动 它怎么动

1
print(Input.gyro.attitude);