unity3D 使用欧拉角控制视野注意点

本文详细解析了在Unity游戏开发中,如何利用欧拉角实现角色视野的平滑控制,尤其关注了视野旋转角度的限制及正确处理负角度的方法,避免了因角度转换造成的视觉跳跃。

变量声明:

1  public PlayerInput p;                  //表示控制代码用来获得用户是否按下
2     public float rotateSpeed = 50f;              //旋转速度
3     private GameObject playerHandle;        //游戏物体的父节点
4     private GameObject cameraHandle;      //相机节点
5     public float euler=15;                          //X轴的初始旋转角度
View Code

在学习中,使用欧拉角控制物体视野左右平移没有什么可注意的简单一句就可以

 playerHandle.transform.Rotate(Vector3.up, p.Dright2 * rotateSpeed * Time.deltaTime);

让主角视野上下移动并且设定一个范围时,比如旋转角在【-40,30】之间,则

1  cameraHandle.transform.Rotate(Vector3.right, -p.Dup2 * rotateSpeed * Time.deltaTime);
2         cameraHandle.transform.localEulerAngles = new Vector3(Mathf.Clamp(cameraHandle.transform.localEulerAngles.x,-40,30), 0, 0);
View Code

如此做是不是就可以完成了?

大错特错!

只有在【0,30】角度变换时运行效果如你所愿,但旋转角度一旦小于0,结果会出乎意料直接变成30.知道为什么吗?

在unity中旋转角(个人理解,错了请指出。)只能是正数。什么意思呢?

我们通过cameraHandle.transform.localEulerAngles.x 获得的X轴旋转角度只会是正数。那么负数如何表示呢?在unity中当其值为负数时,会再加360°,自然转换为正数。因为-30°效果和330°一样。所以当我们cameraHandle.transform.localEulerAngles.x获得-40时,其实获得到的是320,自然会转换成30(Mathf.Clamp())。

 

解决方法:

很简单,既然不能直接获取localEulerAngles.x的负数值,那么我们直接自定义一个Float值在每帧进行旋转角度计算。如下:

1  euler -= p.Dup2 * rotateSpeed * Time.deltaTime;
2         euler = Mathf.Clamp(euler, -40, 30);
3         cameraHandle.transform.localEulerAngles=new Vector3(euler , 0, 0);
View Code

如果简写成如下:

1  euler -= p.Dup2 * rotateSpeed * Time.deltaTime;
2         //euler = Mathf.Clamp(euler, -40, 30);
3         //cameraHandle.transform.localEulerAngles=new Vector3(euler , 0, 0);
4         cameraHandle.transform.localEulerAngles = new Vector3(Mathf.Clamp(euler, -40, 30), 0, 0);
View Code

虽然看起来简洁,其实实际运行不好,因为euler的值,在我们一直按下旋转键时,会一直变化,只是transform.localEulerAngles值只会在【-40,30】,当euler过大,等于100时,当我按下向下视角时只有等到euler的数值变为小于30,才会发生变化,反之亦然。用户体验太差。

小白自我记录,有错之处请多包涵。

 

转载于:https://www.cnblogs.com/unknown6248/p/10964922.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值