MMORPG相机跟随物体自定义旋转效果

2019-09-23  本文已影响0人  周末的游戏之旅
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraFollowing : MonoBehaviour {

    [Header("摄像机水平旋转灵敏度")]
    [Range(10, 50)]
    public float xSensitivity = 10;
    [Header("摄像机垂直旋转灵敏度")]
    [Range(10, 50)]
    public float ySensitivity = 10;
    [Header("摄像机缩放的灵敏度")]
    public float zSensitivity = 10;

    [Header("摄像机垂直旋转的最小角度限制")]
    public float minDegress = 10;
    [Header("摄像机垂直旋转的最大角度限制")]
    public float maxDegress = 60;

    [Header("摄像机距离玩家的最小间距")]
    public float minDistance = 2;
    [Header("摄像机距离玩家的最大间距")]
    public float maxDistance = 20;

    // 跟随对象
    public Transform _player;
    // 摄像机与对象偏移量
    private Vector3 _offset;

    void Start()
    {
        // 让对象处于屏幕中心
        transform.LookAt(_player);
        // 计算初始偏移量
        _offset = transform.position - _player.position;
    }

    void Update()
    {
        // 摄像机跟随玩家
        transform.position = _player.position + _offset;

        RotateContrli();

        ZoomControl();
    }

    /// <summary>
    /// 摄像机旋转
    /// </summary>
    void RotateContrli()
    {
        if (Input.GetMouseButton(1))
        {
            // 获取鼠标水平方向与垂直方向偏移量
            float x = Input.GetAxis("Mouse X");
            float y = Input.GetAxis("Mouse Y");

            // 记录旋转前摄像机初始位置
            Vector3 originalPosition = transform.position;
            Quaternion originalRotation = transform.rotation;

            // 水平方向旋转
            transform.RotateAround(_player.position, Vector3.up, x * xSensitivity * Time.deltaTime);
            // 垂直方向旋转
            transform.RotateAround(_player.position, transform.right, -y * ySensitivity * Time.deltaTime);

            // 判断是否越界
            float xx = transform.root.eulerAngles.x;
            if (xx > maxDegress || xx < minDegress)
            {
                transform.position = originalPosition;
                transform.rotation = originalRotation;
            }

            // 重新计算偏移量
            _offset = transform.position - _player.position;
        }
    }

    void ZoomControl()
    {
        float z = Input.GetAxis("Mouse ScrollWheel");

        // 记录移动前的初始距离
        Vector3 originalPosition = transform.position;
        // 移动摄像机
        transform.Translate(Vector3.forward * z * zSensitivity * Time.deltaTime);

        // 判断是否越界
        float distance = Vector3.Distance(transform.position, _player.position);
        if (distance > maxDistance || distance < minDistance)
            transform.position = originalPosition;

        // 重新计算偏移量
        _offset = transform.position - _player.position;
    }

}
上一篇下一篇

猜你喜欢

热点阅读