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); } } }