using System;
using System.Collections;
using System.Collections.Generic;
using BITFALL.AI.States;
using BITFALL.Entities.Equipment;
using BITKit;
using BITKit.AI.States;
using BITKit.Entities;
using BITKit.Sensors;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.PlayerLoop;
namespace BITFALL.AI
{
///
/// AI服务
///
[CustomType(typeof(AIService))]
public class AIService : StateBasedBehavior
{
[SerializeReference,SubclassSelector] private ITicker ticker;
[SerializeField] private NavMeshAgent agent;
[SerializeField] private RangeSensor rangeSensor;
[SerializeField] private AudioSensor audioSensor;
[SerializeField] private Tag selfTag;
[SerializeField] private Tag friendTag;
[SerializeField] private Tag enemyTag;
public IEntity CombatTarget { get; set; }
public RangeSensor RangeSensor => rangeSensor;
public AudioSensor AudioSensor => audioSensor;
public NavMeshAgent Agent => agent;
public ITag SelfTag => selfTag;
public ITag FriendTag => friendTag;
public ITag EnemyTag => enemyTag;
public IHealth Health => _health;
[Inject] private IHealth _health;
private event Action tick;
public void RegisterTick(Action action)
{
tick += action;
}
public void UnRegisterTick(Action action)
{
tick -= action;
}
public override void OnStart()
{
base.OnStart();
ticker.Add(OnTick);
TransitionState();
Health.OnSetAlive += OnSetAlive;
}
private void OnSetAlive(bool obj)
{
RangeSensor.enabled = obj;
audioSensor.enabled = obj;
}
private void OnTick(float obj)
{
if (Health.IsAlive is false) return;
UpdateState(obj);
tick?.Invoke(obj);
}
public override void OnDestroyComponent()
{
base.OnDestroyComponent();
ticker.Remove(OnTick);
}
}
}