using UnityEngine; using UnityEngine.Scripting.APIUpdating; namespace Streamingle.Utils.LerpConstraints { [MovedFrom(true, "Streamingle.Utils.RoughConstraints", "Assembly-CSharp", "RoughLookAtConstraint")] [ExecuteAlways] [AddComponentMenu("Streamingle Utilities/Constraints/Lerp Look At Constraint")] public class LerpLookAtConstraint : LerpConstraintBase { [Header("Look At")] public Vector3 forwardAxis = Vector3.forward; public Vector3 worldUpVector = Vector3.up; public Vector3 targetPositionOffset; public Vector3 rotationOffset; protected override void ExecuteConstraint(float followT) { if (!TryGetWeightedPosition(out var targetPosition)) { return; } targetPosition += targetPositionOffset; var direction = targetPosition - transform.position; if (direction.sqrMagnitude < 0.000001f) { return; } var targetRotation = LookRotationForAxis(direction, worldUpVector, forwardAxis, Vector3.up); targetRotation *= Quaternion.Euler(rotationOffset); transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, followT * weight); } protected override void CaptureOffsetsFromCurrentPose() { if (!TryGetWeightedPosition(out var targetPosition)) { return; } targetPosition += targetPositionOffset; var direction = targetPosition - transform.position; if (direction.sqrMagnitude < 0.000001f) { return; } var baseRotation = LookRotationForAxis(direction, worldUpVector, forwardAxis, Vector3.up); rotationOffset = (Quaternion.Inverse(baseRotation) * transform.rotation).eulerAngles; } } }