变量声明:ide
1 public PlayerInput p; //表示控制代码用来得到用户是否按下 2 public float rotateSpeed = 50f; //旋转速度 3 private GameObject playerHandle; //游戏物体的父节点 4 private GameObject cameraHandle; //相机节点 5 public float euler=15; //X轴的初始旋转角度
在学习中,使用欧拉角控制物体视野左右平移没有什么可注意的简单一句就能够学习
playerHandle.transform.Rotate(Vector3.up, p.Dright2 * rotateSpeed * Time.deltaTime);
让主角视野上下移动而且设定一个范围时,好比旋转角在【-40,30】之间,则spa
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);
如此作是否是就能够完成了?code
大错特错!orm
只有在【0,30】角度变换时运行效果如你所愿,但旋转角度一旦小于0,结果会出乎意料直接变成30.知道为何吗?blog
在unity中旋转角(我的理解,错了请指出。)只能是正数。什么意思呢?游戏
咱们经过cameraHandle.transform.localEulerAngles.x 得到的X轴旋转角度只会是正数。那么负数如何表示呢?在unity中当其值为负数时,会再加360°,天然转换为正数。由于-30°效果和330°同样。因此当咱们cameraHandle.transform.localEulerAngles.x得到-40时,其实得到到的是320,天然会转换成30(Mathf.Clamp())。it
解决方法:event
很简单,既然不能直接获取localEulerAngles.x的负数值,那么咱们直接自定义一个Float值在每帧进行旋转角度计算。以下:form
1 euler -= p.Dup2 * rotateSpeed * Time.deltaTime; 2 euler = Mathf.Clamp(euler, -40, 30); 3 cameraHandle.transform.localEulerAngles=new Vector3(euler , 0, 0);
若是简写成以下:
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);
虽然看起来简洁,其实实际运行很差,由于euler的值,在咱们一直按下旋转键时,会一直变化,只是transform.localEulerAngles值只会在【-40,30】,当euler过大,等于100时,当我按下向下视角时只有等到euler的数值变为小于30,才会发生变化,反之亦然。用户体验太差。
小白自我记录,有错之处请多包涵。