Unity 相机跟随人物移动(并支持缩放、水平、垂直查看)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 相机跟随角色
/// 功能:支持滚轮缩放,以及鼠标右键绕角色水平以及垂直查看
/// </summary>
public class CamFollowRole : MonoBehaviour
{
    // 缩放速度
    public float scrollSpeed = 2;
    // 旋转速度
    public float rotateXSpeed = 2;
    public float rotateYSpeed = 2;

    public float distance;
    // 偏移
    private Vector3 offset;
    // 相机跟随的角色
    private Transform player;
    private bool isRotate = false;

    // Start is called before the first frame update
    void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player").transform;
        offset = transform.position - player.position;
    }

    private void Update()
    {
        transform.position = player.position + offset;

        // 鼠标右键按下、抬起
        if (Input.GetMouseButtonDown(1))
            isRotate = true;
        if (Input.GetMouseButtonUp(1))
            isRotate = false;

        // 旋转
        if (isRotate)
        {
            float X = Input.GetAxis("Mouse X");
            if (X != 0)
            {
                // 绕对象物体水平旋转
                transform.RotateAround(player.position, player.up, X * rotateXSpeed);
            }

            float Y = Input.GetAxis("Mouse Y");
            if (Y != 0)
            {
                // 记录相机前一帧的位置与旋转
                Vector3 originalPos = transform.position;
                Quaternion originalRotation = transform.rotation;

                // 绕对象物体垂直旋转
                transform.RotateAround(player.position, transform.right, Y * rotateYSpeed);

                // 限制旋转角度 (当角度超过后,让旋转无效)
                float transX = transform.eulerAngles.x;
                if (transX < 10 || transX > 80)
                {
                    transform.position = originalPos;
                    transform.rotation = originalRotation;
                }
            }
            // 在旋转过程中,偏移也要跟随变化
            offset = transform.position - player.position;
        }

        // 缩放
        float scrollView = Input.GetAxis("Mouse ScrollWheel");
        if (scrollView != 0)
        {
            distance = offset.magnitude;
            distance += scrollView * scrollSpeed; // 拉近\拉远视野
            distance = Mathf.Clamp(distance, 3, 15); // 限制距离 拉近限制最小3,拉远限制最大15
            offset = offset.normalized * distance; //重新计算偏移(方向*距离)
        }
    }
}

        脚本挂在跟随物体的相机上,鼠标右键按下并拖拽后,相机可围绕对象进行水平(360度)、垂直旋转(可自行限制)。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值