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
相关产品推荐
相关产品推荐

