Unity笔记-07
Unity笔记-07
了解虚拟轴及其属性
首先通过Unity
栏目:Edit
->Project Setting
->搜索Input Manager
可以查看Unity已经设置好的虚拟轴
以Horizontal
为例,首先Horizontal表示水平的意思,这只是这个虚拟轴名称,可以随意更改但是要记住因为在代码里会用到。Descriptive Name
和Descriptive Negative Name
分别是正负操作的语言描述。说到这里必须要知道,每一个虚拟轴设置都是有正向和负向之分。在界面里可以看到,Negative
表示负向,Positive
表示正向。那么就很好理解了,Negative Button
和Alt Negative Button
对应的就是负向的实际键盘对应键,二者都是设定具体按键的属性。以下都以负向为例子,正向同理。在上述栏目中,Alt Negative Button
的值被设定为a
,那么键盘上的a
就是这个虚拟轴的负向按键,为了区别正向和负向,按钮有一个值。在按钮不按的时候它为0
,按下负向按键,它会逐渐变为-1
,变化速度由Sensitivity
值决定,值越大,变化速度越快;当你松开此按键,它又会从-1
逐渐变灰0
,复原速度由Gravity
值决定,值越大,变化速度越快。Type
值表示你的虚拟轴来源于什么,当前选项为Key or Mouse Button
意思是,这个虚拟轴绑定的具体按键可以来源于鼠标按键或者键盘按键,而Axis
则表示轴向,当前选项为X axis
,意思是水平轴向。
Snap正反按键都作用时,虚拟轴的值视为0 Invert正反按钮发送的值取反
Type输入设备类型
为了解释Axis,这里讲一下Mouse X
这个虚拟轴
这里的Type
选项为Mouse Movement
,意思是虚拟轴来源为鼠标移动,那么此时的Axis
选项为X axis
表示水平方向,这里所有的Button
都没有设定,因为鼠标移动不需要具体按键。当鼠标向右移动,值就会变为正值,最大为1,鼠标移动越快,数值越大,最大为1,向左同理。以此来表示鼠标的移动变化。
获取具体虚拟轴
代码:Input.GetButton("虚拟轴名称")
代码:Input.GetButtonDown("虚拟轴名称")
代码:Input.GetButtonUp("虚拟轴名称")
上述三种方法都可以通过虚拟轴名称来获取虚拟轴,但是他们只能判断虚拟轴绑定的按键是否被按下,无法判断正向和负向,这并不是我们想要的。这三种方法之间的区别请看《Unity笔记-06》,这里不再赘述。
代码:Input.GetAxis("虚拟轴名称")
代码:Input.GetAxisRaw("虚拟轴名称")
这两种方法获取虚拟轴,当你按下虚拟轴绑定的正向按键,他们会返回正值(最大为1,负值最大为0),按下负向按键会返回负值,区别在于:
第一种方法,在你按下正向按键的时候,它返回的值会从0
变化到1
,而非瞬间变成1
;
第二种方法,则是瞬间变化,按下正向按键则瞬间返回1
根据不同场景选择合适的方法
虚拟轴的应用
应用一:鼠标控制镜头朝向
private void move()
{
x = Input.GetAxis("Mouse X");
y = Input.GetAxis("Mouse Y");
x *= speed;
y *= speed;
transform.Rotate(-y, 0, 0);//上下应该是自身坐标系
transform.Rotate(0, x, 0, Space.World);//左右必须是世界坐标系,因为当你抬头或者低头时,自身的Y轴就以及变了
}
private void Update()
{
Cursor.lockState=CursorLockMode.Locked;
move();
}
鼠标控制镜头旋转:
通过Input.GetAxis("Mouse X")
和Input.GetAxis("Mouse Y")
获得鼠标水平和垂直移动的变化值,通过乘以speed来控制灵敏度。
鼠标水平移动应该是的摄像头水平旋转,水平旋转应当绕Y轴旋转,而垂直移动是沿着X轴方向旋转,因此可以用以下代码
transform.Rotate(-y,x,0)
,由于GetAxis
的正向值为向上移动,但是绕着X轴向上旋转需要负值,所以这里要用-y
但是在调试过程中很快发现这种代码会有问题,视角会随着鼠标移动导致不断颠倒。原因也很明显:这里的旋转都是以自身坐标系为基准的。分析可知,上下旋转应当以自身坐标系旋转,但是左右旋转应当以世界坐标系旋转,因为当你已经向上或者向下旋转后,Y轴的方向就不再是垂直了,而会变成斜向的,但是左右旋转应当是水平的。
因此拆分代码:
transform.Rotate(-y, 0, 0);
transform.Rotate(0, x, 0, Space.World);
另外:在调试中还会发现,鼠标会移除屏幕外,导致体验很差。
这里加入代码:
Cursor.lockState=CursorLockMode.Locked
;
此代码可以将鼠标锁在窗口中央,另外: Cursor.lockState=CursorLockMode.Confined;
可以将鼠标约束在窗口内部
如果需要隐藏鼠标,可以使用代码:Cursor.visible = false;
应用二:WASD控制物体上下左右移动
private void MoveTest()
{
x = Input.GetAxis("Horizontal");//记录键盘的水平位移
y = Input.GetAxis("Vertical");//记录键盘的垂直位移
x *= speed*Time.deltaTime;
y *= speed*Time.deltaTime;
transform.Translate(x,0,y);
}
private void Update()
{
MoveTest();
}
这个相对简单,这里不再多说。
相关文章
- 操作系统概念学习笔记 9 线程
- CSRF漏洞实战靶场笔记
- wxpython笔记:wx.lib.pubsub与PyPubSub发布订阅
- 电脑还能这样做笔记?来看看笔记软件上隐藏的分类功能
- [Aaronyang] 写给自己的WPF4.5 笔记10[层次数据需求处理,TreeView绿色文章1/4]
- ObjectArx学习笔记-UCS创建及应用
- 论文笔记(2):Deep Crisp Boundaries: From Boundaries to Higher-level Tasks
- MATLAB学习笔记 K-means 聚类
- Opencv学习笔记 - imread源码解读
- Scala学习笔记:how to convert a StringRDD to Array
- 【Android笔记24】Android中图形图像处理技术的介绍及使用
- Spark源代码阅读笔记之MetadataCleaner
- C++语言笔记系列之十六——赋值兼容规则&多继承的二义性
- Java学习笔记(十)——多态
- kinect学习笔记(三)——深度数据的提取
- 数据结构与算法笔记总结
- 论文理解与笔记【CVPR_2022.6】Region-Aware Face Swapping