You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity C# 限制环绕目标旋转的相机轨道问题求助

解决Unity相机环绕旋转的两个问题:垂直范围限制与朝向锁定

嘿,我看了你的相机环绕代码和遇到的两个问题,这俩在Unity相机控制里确实是挺常见的坑,给你调整了代码,完美解决这两个问题:

修改后的完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Lean.Touch;

public class CameraOrbit : TopClass {
    [Tooltip("Ignore fingers with StartedOverGui?")]
    public bool ignoreGuiFingers = true;
    [Tooltip("Ignore fingers if the finger count doesn't match? (0 = any)")]
    public int requiredFingerCount = 1;
    [Tooltip("The sensitivity of the movement, use -1 to invert")]
    public float sensitivity = 0.25f;
    public Vector3 target = Vector3.zero;

    // 新增:垂直旋转角度限制,可在Inspector调整
    [Tooltip("最小垂直旋转角度(向下的极限)")]
    public float minVerticalAngle = -80f;
    [Tooltip("最大垂直旋转角度(向上的极限)")]
    public float maxVerticalAngle = 80f;

    // 用于跟踪当前垂直旋转角度
    private float currentVerticalAngle = 0f;

    protected void LateUpdate() {
        // 获取符合条件的手指
        List<LeanFinger> fingers = LeanTouch.GetFingers(ignoreGuiFingers, requiredFingerCount);
        if (fingers.Count == 0) return;

        // 获取手指滑动的缩放增量
        Vector2 delta = LeanGesture.GetScaledDelta(fingers);

        // 1. 处理水平旋转:绕世界Y轴旋转,确保左右旋转不会导致相机倾斜
        transform.RotateAround(target, Vector3.up, delta.x * sensitivity);

        // 2. 处理垂直旋转:计算角度变化并限制范围
        float verticalDelta = delta.y * sensitivity;
        currentVerticalAngle += verticalDelta;
        // 把角度限制在设定的范围内
        currentVerticalAngle = Mathf.Clamp(currentVerticalAngle, minVerticalAngle, maxVerticalAngle);

        // 计算相机到目标的方向,然后基于当前垂直角度调整俯仰
        Vector3 directionToTarget = target - transform.position;
        Quaternion targetRotation = Quaternion.LookRotation(directionToTarget, Vector3.up);
        // 应用垂直旋转角度,同时保持水平旋转不变
        Quaternion verticalRotation = Quaternion.Euler(currentVerticalAngle, transform.eulerAngles.y, 0f);
        transform.rotation = verticalRotation;

        // 最后确保相机始终看向目标
        transform.LookAt(target);
    }
}

关键改动说明

  • 垂直旋转范围限制:
    新增了currentVerticalAngle变量跟踪当前垂直旋转角度,每次滑动时计算角度变化,用Mathf.Clamp把角度死死限制在你设定的minVerticalAngle和maxVerticalAngle之间(默认设为-80到80度,你可以根据需求在Inspector里调整),彻底解决了顶部翻转的问题。

  • 锁定相机向上方向:
    水平旋转依然绕世界Y轴进行,垂直旋转通过Quaternion.Euler单独控制俯仰角度,并且始终以Vector3.up(世界Y轴)作为相机的向上参考,这样不管怎么旋转,相机都不会出现左右倾斜或者倒置的情况,始终保持正常的朝向逻辑。

另外,我还加了一个空判断,如果没有符合条件的手指就直接返回,避免无意义的计算。

内容的提问来源于stack exchange,提问作者June

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:42:47