BehaviorTree / Samples / Nodes / FindClosestDestination.cs
FindClosestDestination.cs
Raw
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

namespace AI.BT
{
  
    public class FindClosestDestination : BTTask
    {
        public BlackboardKeySelector Destination;

        private GameObject m_ClosestDestination;

        protected override void OnStart() 
        { 
            base.OnStart();

        }

        protected override void OnBeginExecute(NavMeshAgent agent) 
        {
            base.OnBeginExecute(agent);

            var destinations = GameObject.FindObjectsByType<Destination>(FindObjectsSortMode.None);

            float mindistane =float.MaxValue;
            foreach (var dest in destinations)
            {
                Vector3 position = dest.transform.position;
                float distance = Vector3.Distance(position, agent.transform.position);
                if (distance < mindistane)
                {
                    mindistane = distance;
                    m_ClosestDestination = dest.gameObject;
                }
            }
        }

        protected override ENodeState OnExecute(NavMeshAgent agent) 
        {
            if(m_ParentTree.m_Blackboard.TrySet(Destination.KeyName, m_ClosestDestination))
            {
                return ENodeState.Success;
            }

            return ENodeState.Failure;
        }

        protected override void OnEndExecute() 
        { 
            base.OnEndExecute();

        }

        protected override void OnAbort() 
        { 
            base.OnAbort();

        }
    }
}