using UnityEngine; public class LimitedBillboard : MonoBehaviour { public Camera targetCamera; [Header("Y轴(左右)限制")] public float minYAngle = -45f; public float maxYAngle = 45f; [Header("X轴(上下)限制")] public float minXAngle = -20f; public float maxXAngle = 20f; private Vector3 initialForward; void Start() { if (targetCamera == null) targetCamera = Camera.main; // 记录初始朝向(用于相对旋转) initialForward = transform.forward; } void Update() { if (targetCamera == null) return; Vector3 directionToCamera = targetCamera.transform.position - transform.position; // 计算相对方向 Quaternion lookRotation = Quaternion.LookRotation(directionToCamera); Vector3 targetEuler = lookRotation.eulerAngles; // 处理角度跨越360°的情况(转换为 -180 ~ 180) float yAngle = Mathf.DeltaAngle(0f, targetEuler.y - transform.eulerAngles.y); float xAngle = Mathf.DeltaAngle(0f, targetEuler.x - transform.eulerAngles.x); // 限制角度 yAngle = Mathf.Clamp(yAngle, minYAngle, maxYAngle); xAngle = Mathf.Clamp(xAngle, minXAngle, maxXAngle); // 应用角度(保留当前本地角度,只改X和Y) Vector3 currentEuler = transform.eulerAngles; currentEuler.y += yAngle; currentEuler.x += xAngle; transform.eulerAngles = currentEuler; } }