zoukankan      html  css  js  c++  java
  • unity3D 使用欧拉角控制视野注意点

    变量声明:

    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,才会发生变化,反之亦然。用户体验太差。

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

  • 相关阅读:
    996工作制是奋斗还是剥削?
    动态链接的PLT与GOT
    The Product-Minded Software Engineer
    缓冲区溢出
    golang的加法比C快?
    C errno是否是线程安全的
    golang 三个点的用法
    GDB 单步调试汇编
    为什么CPU需要时钟这种概念?
    fliebeat配置手册
  • 原文地址:https://www.cnblogs.com/unknown6248/p/10964922.html
Copyright © 2011-2022 走看看