unity第三人称鼠标控制视角_unity第三人称控制移动

unity第三⼈称⿏标控制视⾓_unity第三⼈称控制移动
键盘WSAD控制⾏⾛
最简单的就是使⽤Input.GetKeyDown()函数接收键盘 值输⼊,但在这⾥还有更简单的⽅法去实现
利⽤Input.GetAxis()来获取坐标轴的改变。在InputManager中有许多参数,对应⽬前的需求只要Horizontal和Vertical这两个,前者对应坐标系的左右,后者对应前后。
float H = Input.GetAxis("Horizontal");fm0
float V = Input.GetAxis("Vertical");
//Debug.Log("H: " + H + " V: " + V);
Vector3 direction = H * m_transform.right + V * m_transform.forward;
Vector3 NewPosition = m_rigidbody.position + direction;
m_rigidbody.MovePosition(NewPosition);
摄像机固定在主⾓的后上⽅
铍铜代码需要绑定在主摄像机上,基本思想就是在Update()中检测主⾓的坐标轴,然后根据主⾓的坐标算出摄像机应该所在的位置,在利⽤LookAt()函数使摄像机⾓度转向主⾓。
这⾥为了使摄像机的转向趋于平滑,可以使⽤Lerp()函数。
可降解塑料袋子吹膜机Vector3 NextPos = target.forward * -1 * distance + target.up * high + target.position;
m_trans.position = Vector3.ansform.position, NextPos, smoothSpeed); // 平滑跟进
m_trans.LookAt(target);
⿏标控制主⾓在⽔平⽅向旋转
⽬前采⽤的⽅法是Input.GetAxis()来获取⿏标的Mouse X参数值,再配合Rotate()函数可以实现旋转效果。
float h = 10.0f * Input.GetAxis("Mouse X");
transform.Rotate(0, h, 0);
添加⿏标控制摄像机上下旋转功能
鼠标跟随想要添加这个功能,我差不多要把前⾯的代码全部重构⼀遍。因为之前的代码为了让摄像机跟随⼈物,我使⽤了LookAt()函数;⽽左右旋转只是主⾓的操作,摄像机只需要跟随就好。
但涉及摄像机上下旋转之时,我们不可能也给主⾓添加⼀个上下旋转的功能。LookAt()是不可以使⽤的了,但为了让摄像机跟随主⾓,我们需要⽤其他⽅式实现同样的功能。
我在⽹上看到⼀个很巧妙的解决⽅式,利⽤的是三⾓函数:
// 通过camera的Y轴旋转⾓度(即左右偏转⾓)及确定的直⾓斜边distance,计算直⾓三⾓形的两条直⾓边(分别对应x, z的后移量)
// 该⽅法可保证相机位置永远在player后⽅,但相机镜头需要对准player或与之朝向⼀致
float angle = m_transform.eulerAngles.y;
float distance_X = distance * Mathf.Sin(angle * Mathf.PI / 180);
float distance_Z = distance * Mathf.Cos(angle * Mathf.PI / 180);
Vector3 newPosition = new Vector3(player.position.x - distance_X, player.position.y + high, player.position.z - distance_Z);
筛片// 平滑移动
m_transform.position = Vector3.Lerp(m_transform.position, newPosition, smoothMoveTime);
此处有两个坑需要注意: 其⼀,⽤这种计算的⽅式到位置,对性能消耗可能⽐较⼤; 其⼆,就这⼏天上⽹搜索的结果看,简单的移动有太多⽅法了,⽽且这些⽅法还涉及到性能的问题,emmm,以后填吧。
上⾯说到需要借助camera的Y偏转⾓来实现跟随,其实也可以通过player的偏转⾓来实现。两者间的性能差距我看不出来。
下⾯是利⽤GetAxis()来获得⿏标的偏移量,从⽽实现偏转。
float Mouse_X = Input.GetAxis("Mouse X") * smoothRotateAmount;
float Mouse_Y = Input.GetAxis("Mouse Y") * smoothRotateAmount;
rotation.x -= Mouse_Y;
rotation.y += Mouse_X; // 使之与⿏标移动⽅向⼀致
rotation.z = 0; // 固定z轴
//m_transform.Rotate(rotation, Space.Self); // Rotate()会产⽣天翻地覆的效果,原因不知,猜测是它太快了
车库门开门机m_transform.eulerAngles = rotation; // 会有卡顿现象,可能性能消耗⼤,但是在本项⽬中离奇有⽤
// 放在PlayController上⽐较好,因为不能基于camera来计算偏转⾓
//float horizontal = smoothRotateAmount * Input.GetAxis("Mouse X");
//player.eulerAngles = new Vector3(0, horizontal, 0);
这⾥有坑,已经踩了很久了。暂时先这样,等下次再遇到的时候解决,附上⼀篇还看得不是很懂的⽂章:Unity学习笔记10——旋转(四元数和欧拉⾓)。

本文发布于:2024-09-25 16:38:44,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/339527.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:摄像机   需要   旋转   性能   实现   对应   函数
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议