腳本挂到相機上,下面是具體實作
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;
}
}