天天看点

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