天天看點

unity相機跟随旋轉視野縮放

腳本挂到相機上,下面是具體實作

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;
    }
}