Unity3D 控制摄像机(二)

  • Unity3D 控制摄像机(二)
    • 摄像机对准Player 围绕Player进行旋转 作为第三人称摄像机
    • 几点说明

Unity3D 控制摄像机(二)

摄像机对准Player 围绕Player进行旋转 作为第三人称摄像机

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotateCamera002 : MonoBehaviour {
    //本例是第三人称摄像机

    public GameObject Player;

    public float xSpeed = 2f; //左右旋转摄像机的速度
    public float ySpeed = 2f; //上下旋转摄像机的速度
    public float yMinLimit = -90f; //上下旋转摄像机的最小角度限制
    public float yMaxLimit = 90f;  //上下旋转摄像机的最大角度限制


    //是否旋转镜头 鼠标右键按下时启用
    private bool isRotate;
    //左右旋转的角度(沿三维Y轴)
    //private float x;
    //上下旋转的角度(沿三维X轴)
    private float y;


    void Start ()
    {
        if (Player == null)
        {
            Player = GameObject.FindGameObjectWithTag("Player");

            if (Player == null)
            {
                Debug.LogWarning("Don't found player tag please change player tag to Player");
            }
        }

        Vector3 angles = transform.eulerAngles;
        //鼠标的左右移动 在三维中相当于沿Y轴转动
        //x = angles.y;
        //鼠标的上下移动 在三维中相当于沿X轴转动
        y = angles.x;
    }


    void LateUpdate ()
    {
        //在LateUpdate中更新摄像机 可以更平滑 在Update中会有抖动
        RotateCamera();
    }

    void RotateCamera()
    {
        //鼠标右键按下状态启用旋转摄像机
        if (Input.GetMouseButtonDown(1))
        {
            isRotate = true;
        }

        //鼠标右键抬起状态停止旋转摄像机
        if (Input.GetMouseButtonUp(1))
        {
            isRotate = false;
        }

        if (isRotate)
        {
            //deltaX是相对值 相对原来玩家垂直位置的转动量 对应的操作是鼠标按住右键左右移动
            float deltaX = Input.GetAxis("Mouse X") * xSpeed;
            //围绕Player的Y轴进行旋转 不需要限制范围 可360度环绕观察
            transform.RotateAround(Player.transform.position, Player.transform.up, deltaX);

            //deltaY是相对值 相对原来相机x轴方向的转动量 对应的操作是鼠标按住右键上下移动
            //负值主要是修正上下对应视角的移动相反
            float deltaY = Input.GetAxis("Mouse Y") * -ySpeed;
            //如果使用了deltaY后的最终位置
            float newY = y + deltaY;
            //限制最终位置的范围 不能在地面下 不能越过头顶到另一侧
            newY = Mathf.Clamp(newY, yMinLimit, yMaxLimit);
            //在限制旋转位置后 计算真正需要的旋转量
            deltaY = newY - y;
            //更新转动后新的位置
            y = newY;
            //围绕摄像机的X轴进行旋转
            transform.RotateAround(Player.transform.position, transform.right, deltaY);
        }
    }
}

几点说明

  • Player是公有变量 需要摄像机注视的对象 可以直接从面板拖拽指定 如果没有设置 则从Tag标签中标为Player的查找指定
  • transform.RotateAround同时改变对象的旋转(rotation)和位置(position) 第一个参数是需要注视的位置 第二个参数是旋转的轴(注意2个方向的旋转必须针对不同的轴) 最后一个参数是角度改变量

Unity3D编辑器中Transform下的Rotation 3个值 实际上对应的值是该组件的欧拉角值(这句话不完全正确看下面)
eulerAngles的属性是Vector3
x -> transform.eulerAngles.x
y -> transform.eulerAngles.y
z -> transform.eulerAngles.z
而transform.rotation的属性是Quaterion(四元数)
quaterion.x .y .z .w 和 欧拉角的 x y z不相等
关于角度参考:https://blog.csdn.net/candycat1992/article/details/41254799
关于角度参考:https://blog.csdn.net/juice521cai/article/details/78970560
关于旋转和缩放摄像机的改进步骤参考:https://blog.csdn.net/yuxikuo_1/article/details/44988215
关于旋转和缩放摄像机参考:https://www.jianshu.com/p/c2fbb22eac05

-

网上所有的文章写的都是Unity3D编辑器中Transform下的Rotation 3个值 实际上对应的值是该组件的欧拉角值
实测并不是永远相等 在一定角度范围内相等
可用如下代码验证
transform.eulerAngles = new Vector3(135, 0, 0); 之后 读取eulerAngles.x的值是45
也就是说Unity3D编辑器中Transform下的Rotation 3个值可正向一直加超过360 可负向一直减-360 -720 等等
但是eulerAngles的范围只在0-360之间

以下图的位置方向锁定y和z轴 只转动X轴 观察eulerAngles值 和 编辑器的Rotation值
摄像机完全向下 相当于顶视图时 eulerAngles的x值是90 完全平视 相当于前视图是即是0也是360 这一段eulerAngles和Rotation是完全相等的
Unity3D 控制摄像机(二)_第1张图片
Unity3D 控制摄像机(二)_第2张图片
也就意思味相同的eulerAngles.x值都是有2个指向(如果仅判断x值 欧拉的三值是有顺序,x值相同 位置不同的话 y和z是不同的,使用ShowEulerAngles.cs脚本观察)
同时对应编辑器Rotation的值如下图 不转动超过2圈的前提下
Unity3D 控制摄像机(二)_第3张图片
如果继续转动数值继续增加 反向转动则减少 增减都无限制

你可能感兴趣的:(Unity3D)