unity使用localEulerAngles、rotation和Rotate进行旋转的区别

来源:互联网 发布:软件过程管理 编辑:程序博客网 时间:2024/06/16 04:02

在学习关于旋转的脚本时,发现有几种旋转手段:localEulerAngles、rotation、Rotate,然而对于像我一样的新手来说总是会把他们搞糊涂,特此总结一下他们之间的区别。

使用localEulerAngles进行旋转的时候,我们要使用transform.localEulerAngles = new Vector3(x, y,z); 这样的语句来实现旋转操作,而实际上此条语句是给localEulerAngles赋了一个新的旋转角度值,使Gameobject以欧拉角旋转到 new Vector3(x, y,z) 这个角度位置,因此,当我们用它来进行旋转时,所传入的new Vector3(x, y,z)必须是我们想要Gameobject旋转到的最终角度,并且,其旋转的基准是其三个轴都没有旋转时的自身轴。

使用rotation进行旋转时,我们要先得到其欧拉角旋转值new Vector3(x, y,z) ,因为transform.rotation是一个四元数(Quaternion),故利用Quaternion.Euler(new Vector3(x, y,z) )将欧拉角旋转值转化为四元数旋转值,再利用transform.rotation=Quaternion.Euler(new Vector3(x, y,z) ); 将此四元数赋值给Gameobject的rotation,最终得以完成旋转。此方法和localEulerAngles类似,都是采用了以最终的角度从新给gameobject赋值并覆盖之前的旋转角度信息来完成旋转的,因此,当我们用它来进行旋转时,所传入的new Vector3(x, y,z)必须是我们想要Gameobject旋转到的最终角度,并且,其旋转的基准是世界坐标轴。

使用Rotate进行旋转时,可以直接使用transform.Rotate(x, y,z)来进行旋转,但是此种旋转是在Gameobject原有的旋转角度基础之上绕自身轴进行的,故在多轴旋转使用它时要注意自身轴随着gameobject的旋转而偏移。

以下面第三人称视角代码为例:

(1)使用localEulerAngles或者rotation进行旋转

using System.Collections;using System.Collections.Generic;using UnityEngine;public class ThirdPersonView_PlayerFollowMouse : MonoBehaviour {    //选择第三人称视角载体,也可以在void start里面用target=GameObject.Find("目标名称字符串")语句来锁定载体    public GameObject Player;    public float X_sensitivity = 10f;//镜头跟随鼠标x向移动灵敏度    public float Y_sensitivity = 10f;//镜头跟随鼠标y向移动灵敏度    public float MouseWheel_sensitivity = 5f;//镜头跟随鼠标滚轮灵敏度    public float MinX_rotation = 5F;//镜头绕自身x轴旋转角度,抬头极限,z轴正方向是模型运动的前方    public float MaxX_rotation = 80F;//镜头绕自身x轴旋转角度,低头极限    public float Distance = 2f;//设置镜头初始距离    float X_rotation = 0f;//镜头绕自身x轴旋转值    float Y_rotation = 0f;//镜头绕自身y轴旋转值    public float maxDistance = 10f;//镜头最大距离    public float minDistance = 0.5f;//镜头最小距离          // Use this for initializationvoid Start () {}// Update is called once per framevoid Update ()     {        //首先设置镜头位置与角色位置一致        transform.position = Player.transform.position;                //当按下鼠标右键时,镜头旋转         if (Input.GetMouseButton(1))        {            //绕自身y轴旋转值,等于镜头自身绕y轴旋转的欧拉角度加上鼠标横向移动反馈乘以灵敏度的值            Y_rotation = transform.localEulerAngles.y +Input.GetAxis("Mouse X") * X_sensitivity;            //绕自身x轴旋转值,等于自身的旋转值减去鼠标纵向移动反馈乘以灵敏度的值(此处的加还是减看需要,需要鼠标上划抬头,就是减,需要鼠标上划低头,就是加)            X_rotation -= Input.GetAxis("Mouse Y") * Y_sensitivity;            //将绕自身X轴旋转值限制在一定的范围之间            X_rotation = Mathf.Clamp(X_rotation, MinX_rotation, MaxX_rotation);            //使用localEulerAngles完成角度随鼠标移动旋转            transform.localEulerAngles = new Vector3(X_rotation, Y_rotation, 0);    //使用rotation完成角度随鼠标移动旋转            transform.rotation = Quaternion.Euler(new Vector3(X_rotation, Y_rotation, 0));                             }        setdistance();//镜头向自身后方移动一定距离与player拉开距离(注:沿自身z轴向z轴负方向移动,对于任何gameobject,其正方向都是z轴正方向) }    void setdistance()//方法(函数),用于设置镜头与角色距离    {        if (Distance >= minDistance && Distance <= maxDistance)//如果距离数据在最大距离和最小距离之间        {            //距离等于自身减去鼠标滚轮反馈乘以灵敏度的值(此处加与减同样根据需求来定)            Distance -= Input.GetAxis("Mouse ScrollWheel")*MouseWheel_sensitivity;        }        else if (Distance < minDistance)//若距离数据小于最小值,则等于最小值        {            Distance = minDistance;        }        else if (Distance > maxDistance)//若距离数据大于最小值,则等于最大值        {            Distance = maxDistance;        }        //完成镜头距离设置        transform.Translate(Vector3.back * Distance );    }}


(2)使用Rotate进行旋转

using System.Collections;using System.Collections.Generic;using UnityEngine;public class ThirdPersonView_PlayerFollowMouse : MonoBehaviour {    //选择第三人称视角载体,也可以在void start里面用target=GameObject.Find("目标名称字符串")语句来锁定载体    public GameObject Player;    public float X_sensitivity = 10f;//镜头跟随鼠标x向移动灵敏度    public float Y_sensitivity = 10f;//镜头跟随鼠标y向移动灵敏度    public float MouseWheel_sensitivity = 5f;//镜头跟随鼠标滚轮灵敏度    public float MinX_rotation = 5F;//镜头绕自身x轴旋转角度,抬头极限,z轴正方向是模型运动的前方    public float MaxX_rotation = 80F;//镜头绕自身x轴旋转角度,低头极限    public float Distance = 2f;//设置镜头初始距离    float X_rot= 0f;//镜头绕自身x轴旋转值    float Y_rot = 0f;//镜头绕自身y轴旋转值    public float maxDistance = 10f;//镜头最大距离    public float minDistance = 0.5f;//镜头最小距离          // Use this for initializationvoid Start () {}// Update is called once per framevoid Update ()     {        //首先设置镜头位置与角色位置一致        transform.position = Player.transform.position;                //当按下鼠标右键时,镜头旋转         if (Input.GetMouseButton(1))        {                        //绕自身y轴旋转值,等于鼠标横向移动反馈乘以灵敏度的值            Y_rot =Input.GetAxis("Mouse X") * X_sensitivity;            //绕自身x轴旋转值,等于鼠标纵向移动反馈乘以灵敏度的值(此处的正还是负看需要,需要鼠标上划抬头,就是负,需要鼠标上划低头,就是正)            X_rot = -Input.GetAxis("Mouse Y") * Y_sensitivity;            //完成y轴旋转,因为rotate是在原有基础上旋转,故绕y轴旋转时不能以自身y轴为旋转轴            transform.Rotate(0, Y_rot,0,Space.World);            //将绕自身X轴总的旋转值限制在一定的范围之间,当原有的旋转值加上X_rot后的值超出许可范围则不作反应,当其在许可范围内时进行旋转            if (transform.localEulerAngles.x + X_rot >= MinX_rotation && transform.localEulerAngles.x + X_rot <= MaxX_rotation)            {                transform.Rotate(X_rot, 0, 0, Space.Self); //完成x轴旋转            }                               }                setdistance();//镜头向自身后方移动一定距离与player拉开距离(注:沿自身z轴向z轴负方向移动,对于任何gameobject,其正方向都是z轴正方向)               }    void setdistance()//方法(函数),用于设置镜头与角色距离    {        if (Distance >= minDistance && Distance <= maxDistance)//如果距离数据在最大距离和最小距离之间        {            //距离等于自身减去鼠标滚轮反馈乘以灵敏度的值(此处加与减同样根据需求来定)            Distance -= Input.GetAxis("Mouse ScrollWheel")*MouseWheel_sensitivity;        }        else if (Distance < minDistance)//若距离数据小于最小值,则等于最小值        {            Distance = minDistance;        }        else if (Distance > maxDistance)//若距离数据大于最小值,则等于最大值        {            Distance = maxDistance;        }        //完成镜头距离设置        transform.Translate(Vector3.back * Distance );    }}






阅读全文
0 0
原创粉丝点击