Unity3D 控制摄像机(二)
日期: 2018-07-02 分类: 跨站数据测试 312次阅读
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不相等
关于角度参考:除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:Unity3D
精华推荐