自学内容网 自学内容网

Unity简单漫游摄像机

        可以wasd漫游场景,q/e来上升下降,可以调用TeleportAndLookAtTarget来传送到一个Transform附近并注视它,挂到摄像机上就能使用.

using UnityEngine;

public class CameraController : MonoBehaviour
{
    public float moveSpeed = 5f; // 相机移动速度
    public float sprintMultiplier = 2f; // 按住 Shift 时的加速倍数
    public float lookSpeedX = 2f; // 水平旋转速度
    public float lookSpeedY = 2f; // 垂直旋转速度
    public float upperLookLimit = 80f; // 垂直旋转的最大角度
    public float lowerLookLimit = -80f; // 垂直旋转的最小角度

    private float rotationX = 0f;
    private float rotationY = 0f;
    private bool isRightMousePressed = false; // 用来检测右键是否按下

    public Vector3 offset = new Vector3(0, 2, -5);

    private void Update()
    {
        // 检查是否按下右键
        if (Input.GetMouseButton(1)) // 鼠标右键按下
        {
            isRightMousePressed = true;
        }
        else
        {
            isRightMousePressed = false;
        }

        // 只有在按住右键的情况下,才允许旋转
        if (isRightMousePressed)
        {
            // 旋转相机
            rotationX -= Input.GetAxis("Mouse Y") * lookSpeedY; // 垂直旋转
            rotationY += Input.GetAxis("Mouse X") * lookSpeedX; // 水平旋转

            // 限制垂直旋转的范围
            rotationX = Mathf.Clamp(rotationX, lowerLookLimit, upperLookLimit);

            // 设置相机的旋转
            transform.localRotation = Quaternion.Euler(rotationX, rotationY, 0);
        }

        // 获取是否按住 Shift 键来加速移动
        bool isSprinting = Input.GetKey(KeyCode.LeftShift);

        // 根据是否按住 Shift 键来调整移动速度
        float currentMoveSpeed = isSprinting ? moveSpeed * sprintMultiplier : moveSpeed;

        // 相机前后左右移动(WASD)
        float moveX = Input.GetAxis("Horizontal") * currentMoveSpeed * Time.deltaTime; // A/D 左右
        float moveZ = Input.GetAxis("Vertical") * currentMoveSpeed * Time.deltaTime; // W/S 前后

        // 上下升降(Q/E)
        float moveY = 0f;
        if (Input.GetKey(KeyCode.Q)) // Q 键升
        {
            moveY = currentMoveSpeed * Time.deltaTime;
        }

        if (Input.GetKey(KeyCode.E)) // E 键降
        {
            moveY = -currentMoveSpeed * Time.deltaTime;
        }

        // 移动相机
        transform.Translate(moveX, moveY, moveZ);
    }

    // 传送摄像机并让它注视目标
    public void TeleportAndLookAtTarget(Transform target)
    {
        // 设置摄像机的位置,并确保它在目标物体的偏移位置
        transform.position = target.position + offset;

        // 让摄像机注视目标物体
        transform.LookAt(target);
        Quaternion currentRotation = transform.localRotation;
        rotationX = currentRotation.eulerAngles.x;
        rotationY = currentRotation.eulerAngles.y;

        // 处理 rotationX 范围(确保不超出 0 到 360 度)
        if (rotationX > 180) rotationX -= 360;
        if (rotationY > 180) rotationY -= 360;
    }
}


原文地址:https://blog.csdn.net/R3333355726856/article/details/143798325

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!