using System; using Colosseum.Skills; using Unity.Behavior; using UnityEngine; using Action = Unity.Behavior.Action; using Unity.Properties; /// /// 지정된 스킬을 사용하는 Behavior Tree Action. /// 스킬 실행이 완료될 때까지 Running 상태를 유지합니다. /// [Serializable, GeneratePropertyBag] [NodeDescription(name: "Use Skill", story: "[스킬] 사용", category: "Action", id: "799f1e8cfafa78b2d52ef61a6bbb29b9")] public partial class UseSkillAction : Action { [SerializeReference] public BlackboardVariable 스킬; [SerializeReference] public BlackboardVariable Target; private SkillController skillController; protected override Status OnStart() { // 스킬 데이터 확인 if (스킬?.Value == null) { Debug.LogWarning("[UseSkillAction] 스킬이 null입니다."); return Status.Failure; } // SkillController 컴포넌트 가져오기 skillController = GameObject.GetComponent(); if (skillController == null) { Debug.LogWarning($"[UseSkillAction] SkillController를 찾을 수 없습니다: {GameObject.name}"); return Status.Failure; } // 스킬 실행 시도 bool success = Target?.Value != null ? skillController.ExecuteSkill(스킬.Value, Target.Value) : skillController.ExecuteSkill(스킬.Value); if (!success) { // 이미 다른 스킬 사용 중이거나 쿨타임 return Status.Failure; } // jumpToTarget 스킬이면 타겟 위치 전달 if (스킬.Value.JumpToTarget && Target?.Value != null) { var enemyBase = GameObject.GetComponent(); enemyBase?.SetJumpTarget(Target.Value.transform.position); } return Status.Running; } protected override Status OnUpdate() { // SkillController가 해제된 경우 if (skillController == null) { return Status.Failure; } // 스킬 애니메이션이 종료되면 성공 if (!skillController.IsPlayingAnimation) return skillController.LastExecutionResult == SkillExecutionResult.Completed ? Status.Success : Status.Failure; return Status.Running; } protected override void OnEnd() { skillController = null; } }