Unity3D 控制摄像机(二)

本文介绍如何使用Unity3D实现第三人称摄像机控制,包括围绕目标对象旋转及限制旋转角度等功能,并提供具体代码实现。

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.youkuaiyun.com/candycat1992/article/details/41254799
关于角度参考:https://blog.youkuaiyun.com/juice521cai/article/details/78970560
关于旋转和缩放摄像机的改进步骤参考:https://blog.youkuaiyun.com/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是完全相等的
这里写图片描述
这里写图片描述
也就意思味相同的eulerAngles.x值都是有2个指向(如果仅判断x值 欧拉的三值是有顺序,x值相同 位置不同的话 y和z是不同的,使用ShowEulerAngles.cs脚本观察)
同时对应编辑器Rotation的值如下图 不转动超过2圈的前提下
这里写图片描述
如果继续转动数值继续增加 反向转动则减少 增减都无限制

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值