经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
unity3D 使用欧拉角控制视野注意点
来源:cnblogs  作者:无名之士  时间:2019/6/3 8:41:31  对本文有异议

变量声明:

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

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

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

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

  1. 1 cameraHandle.transform.Rotate(Vector3.right, -p.Dup2 * rotateSpeed * Time.deltaTime);
  2. 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. 1 euler -= p.Dup2 * rotateSpeed * Time.deltaTime;
  2. 2 euler = Mathf.Clamp(euler, -40, 30);
  3. 3 cameraHandle.transform.localEulerAngles=new Vector3(euler , 0, 0);
View Code

如果简写成如下:

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

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

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

 

原文链接:http://www.cnblogs.com/unknown6248/p/10964922.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号