Unity3D 控制摄像机(一)
摄像机跟随
Main Camera上按 Ctrl+Alt+F 使镜头对齐当前视角
参考:Unity3D中摄像机跟随方法https://blog.csdn.net/bobowang1991/article/details/54097075
直接把Camera拖动到被角色下作为角色子物体
角色移动时 镜头作为子物体一起移动
优点:最省事
只旋转摄像机自身 和 Player无关 作为第一人称摄像机
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RotateCamera001 : MonoBehaviour {
//本例是第一人称摄像机
public float xSpeed = 2f; //左右旋转摄像机的速度
public float ySpeed = 2f; //上下旋转摄像机的速度
public float yMinLimit = -90f; //上下旋转摄像机的最小角度限制
public float yMaxLimit = 90f; //上下旋转摄像机的最大角度限制
//是否旋转镜头 鼠标右键按下时启用
private bool isRotate;
//左右旋转的角度 相对世界原始位置 非transform初始位置(沿三维Y轴)
private float x;
//上下旋转的角度 相对世界原始位置 非transform初始位置(沿三维X轴)
private float y;
void Start ()
{
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)
{
//x 和 y 是绝对值 相对于世界坐标没有转动的位置的最终转动位置
//鼠标的上下移动 移动的Y值 在三维中相当于沿X轴转动
y -= Input.GetAxis("Mouse Y") * ySpeed;
//上下需要限定范围 在完全俯视 和 完全仰视之间
//去掉该限制的话可以使摄像机倒置
y = Mathf.Clamp(y, yMinLimit, yMaxLimit);
//鼠标的左右移动 移动的X值 在三维中相当于沿Y轴转动
//左右是允许360度旋转的 不需要限制到最大最小范围
x += Input.GetAxis("Mouse X") * xSpeed;
//Quaternion rotation = Quaternion.Euler(y, x, 0);
//transform.rotation = rotation;
//和上面2句等价
transform.eulerAngles = new Vector3(y, x, 0);
}
}
}
该脚本效果 图示为Local坐标系 旋转引发Local坐标系的变化
几点说明
- Input.GetMouseButtonDown 只会在鼠标按键变化时触发一次 保持按住状态不会触发 因此需要使用全局变量IsRotate来判断是否旋转
比如下述方法就是错误的:
if (Input.GetMouseButtonDown(1))
{
直接处理旋转
} - transform.eulerAngles欧拉角必须三个值一起设置
- transform.eulerAngles欧拉角设置的是最终位置 最终位置是相对于世界坐标系 而非Local坐标系 也不是相对当前位置的改变量
- 第一人称摄像机鼠标右键按下时 本身只改变Rotation而不改变Position
- 上下的旋转需要限定位置 上下旋转即沿红色轴(X)轴旋转(世界坐标系) 左右旋转目前没有限定位置 正常人只能看左右-90 至90