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是完全相等的
也就意思味相同的eulerAngles.x值都是有2个指向(如果仅判断x值 欧拉的三值是有顺序,x值相同 位置不同的话 y和z是不同的,使用ShowEulerAngles.cs脚本观察)
同时对应编辑器Rotation的值如下图 不转动超过2圈的前提下
如果继续转动数值继续增加 反向转动则减少 增减都无限制