using System; using Colosseum.Combat; using Unity.Behavior; using UnityEngine; using Action = Unity.Behavior.Action; using Unity.Properties; [Serializable, GeneratePropertyBag] [NodeDescription(name: "RotateToTarget", story: "[대상을] 바라보도록 회전", category: "Action", id: "30341f7e1af0565c0aca0253341b3e28")] public partial class RotateToTargetAction : Action { [SerializeReference] public BlackboardVariable Target; [SerializeReference] public BlackboardVariable RotationSpeed = new BlackboardVariable(10f); [SerializeReference] public BlackboardVariable AngleThreshold = new BlackboardVariable(5f); protected override Status OnUpdate() { if (Target.Value == null) { return Status.Failure; } Vector3 direction = TargetSurfaceUtility.GetHorizontalDirectionToSurface(GameObject.transform.position, Target.Value); if (direction == Vector3.zero) { return Status.Success; } Quaternion targetRotation = Quaternion.LookRotation(direction); float angleDifference = Quaternion.Angle(GameObject.transform.rotation, targetRotation); // 임계값 이내면 성공 if (angleDifference <= AngleThreshold.Value) { return Status.Success; } // 부드럽게 회전 GameObject.transform.rotation = Quaternion.Slerp( GameObject.transform.rotation, targetRotation, RotationSpeed.Value * Time.deltaTime ); return Status.Running; } }