脚本挂到相机上,下面是具体实现
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 摄像机控制
/// 跟随 旋转 视野缩放
/// </summary>
public class MainCameraMoveControl : MonoBehaviour
{
//获取玩家
private Transform player;
//记录摄像机与玩家之间的位置
private Vector3 offset;
//水平旋转灵敏度
private float xSensitivity = 50;
//垂直旋转灵敏度
private float ySensitivity = 50;
//鼠标滚轮缩放灵敏度
private float zSensitivity = 50;
private float minDegress = 10f;//摄像机垂直最小旋转角度
private float maxDegress = 60f;//摄像机垂直最大旋转角度
private float minDistance = 5f;//摄像机距离玩家最小距离
private float maxDistance = 20f;//摄像机距离玩家最大距离
private void Awake()
{
player = GameObject.FindWithTag("Player").transform;
//看向玩家
transform.LookAt(player);
//计算相对位置
offset = transform.position - player.transform.position;
}
private void Update()
{
//摄像机跟随
transform.position = player.transform.position + offset;
//摄像机旋转
RotateControl();
//摄像机缩放
//ZoomControl();
ZoomControl2();
}
/// <summary>
/// 摄像机水平,垂直,旋转
/// </summary>
private void RotateControl()
{
//旋转前获取摄像机的位置和角度
Vector3 originalPosition = transform.position;
Quaternion originalRotation = transform.rotation;
if (Input.GetKey(KeyCode.Mouse0))
{
//获取鼠标水平方向的偏移量
float X = Input.GetAxis("Mouse X");
//获取鼠标垂直方向偏移量
float Y = Input.GetAxis("Mouse Y");
//水平旋转
transform.RotateAround(player.position, Vector3.up, X * xSensitivity * Time.deltaTime);
//垂直旋转
transform.RotateAround(player.position, transform.right, -Y * ySensitivity * Time.deltaTime);
//临界判断
//获取旋转后,摄像机的角度
float xDegress = transform.rotation.eulerAngles.x;
//如果垂直旋转超越限制还原位置和角度
if (xDegress>maxDegress||xDegress<minDegress)
{
transform.position = originalPosition;
transform.rotation = originalRotation;
}
//重新计算偏移量
offset = transform.position - player.position;
}
}
/// <summary>
/// 摄像机缩放
/// 第一种实现方式
/// </summary>
private void ZoomControl()
{
//获取鼠标滚轮
float z = Input.GetAxis("Mouse ScrollWheel");
//记录原始的位置
Vector3 originaloffset = offset;
offset += z * zSensitivity * Time.deltaTime * offset.normalized;
//如果超出限制就还原
if (offset.magnitude>maxDistance||offset.magnitude<minDistance)
{
offset = originaloffset;
}
}
/// <summary>
/// 摄像机缩放
/// 第二种实现方式
/// </summary>
private void ZoomControl2()
{
//获取鼠标滚轮
float z = Input.GetAxis("Mouse ScrollWheel");
//记录原始的位置
Vector3 originaloffset = offset;
transform.Translate(Vector3.forward * z * zSensitivity * Time.deltaTime);
//计算距离
float distance = Vector3.Distance(transform.position,player.position);
if (distance>maxDistance||distance<minDistance)
{
transform.position = originaloffset;
}
//从新计算偏移量
offset = transform.position - player.position;
}
}