using System; using System.Collections; using BehaviorDesigner.Runtime; using BehaviorDesigner.Runtime.Tasks; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.AI; using Action = BehaviorDesigner.Runtime.Tasks.Action; // ReSharper disable once CheckNamespace namespace BlueWaterProject { [TaskCategory("Custom/Action")] public class FindTarget : Action { [Title("Common variable")] [RequiredField] public SharedAiStat aiStat; [RequiredField] public SharedNavMeshAgent navMeshAgent; [RequiredField] public SharedTransform targetTransform; [Title("Offense Variable")] public SharedIslandInfo islandInfo; [Title("Defense Variable")] public SharedVector3 defensePos; private AiController aiController; private bool isFindTargetCoroutine; private static readonly WaitForSeconds FindTargetWaitTime = new(0.5f); public override void OnAwake() { aiController = GetComponent(); } public override void OnStart() { switch (aiStat.Value.AttackerType) { case EAttackerType.NONE: Debug.Log("AiStat.AttackerType == NONE Error"); break; case EAttackerType.OFFENSE: isFindTargetCoroutine = true; StartCoroutine(nameof(FindTargetInOffense)); break; case EAttackerType.DEFENSE: isFindTargetCoroutine = true; StartCoroutine(nameof(FindTargetInDefense)); break; default: throw new ArgumentOutOfRangeException(); } } public override TaskStatus OnUpdate() { return isFindTargetCoroutine ? TaskStatus.Running : TaskStatus.Success; } public IEnumerator FindTargetInOffense() { switch (aiStat.Value.OffenseType) { case EOffenseType.NONE: Debug.Log("AiStat.OffenseType == NONE Error"); break; case EOffenseType.NORMAL: if (islandInfo.Value.EnemyList.Count > 0) { aiController.SetNearestTargetInOffense(islandInfo.Value.EnemyList); } else if (islandInfo.Value.HouseList.Count > 0) { aiController.SetNearestTargetInOffense(islandInfo.Value.HouseList); } break; case EOffenseType.ONLY_HOUSE: if (navMeshAgent.Value.pathStatus == NavMeshPathStatus.PathPartial) { aiController.SetNearestTargetInOffense(islandInfo.Value.TargetAllList); } else { if (islandInfo.Value.HouseList.Count > 0) { aiController.SetNearestTargetInOffense(islandInfo.Value.HouseList); } else if (islandInfo.Value.EnemyList.Count > 0) { aiController.SetNearestTargetInOffense(islandInfo.Value.EnemyList); } } break; default: throw new ArgumentOutOfRangeException(); } if (targetTransform.Value && navMeshAgent.Value.enabled) { var distanceToTarget = Vector3.Distance(transform.position, targetTransform.Value.position); navMeshAgent.Value.isStopped = distanceToTarget <= navMeshAgent.Value.stoppingDistance; if (distanceToTarget > navMeshAgent.Value.stoppingDistance) { navMeshAgent.Value.SetDestination(targetTransform.Value.position); } } yield return FindTargetWaitTime; isFindTargetCoroutine = false; } public IEnumerator FindTargetInDefense() { switch (aiStat.Value.DefenseType) { case EDefenseType.NONE: Debug.Log("AiStat.DefenseType == NONE Error"); break; case EDefenseType.STRIKER: aiController.SetNearestTargetInDefense(transform.position, aiStat.Value.ViewRange); break; case EDefenseType.MIDFIELDER: aiController.SetNearestTargetInDefense(transform.position, aiStat.Value.ViewRange); break; case EDefenseType.DEFENDER: aiController.SetNearestTargetInDefense(defensePos.Value, aiStat.Value.DefenseRange); break; case EDefenseType.KEEPER: aiController.SetNearestTargetInDefense(transform.position, aiStat.Value.ViewRange); break; default: throw new ArgumentOutOfRangeException(); } if (targetTransform.Value && navMeshAgent.Value.enabled) { var distanceToTarget = Vector3.Distance(transform.position, targetTransform.Value.position); navMeshAgent.Value.isStopped = distanceToTarget <= navMeshAgent.Value.stoppingDistance; if (distanceToTarget > navMeshAgent.Value.stoppingDistance) { navMeshAgent.Value.SetDestination(targetTransform.Value.position); } } yield return FindTargetWaitTime; isFindTargetCoroutine = false; } public override void OnEnd() { StopAllCoroutines(); } } }