NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/AI/AIManager.cs

95 lines
2.5 KiB
C#

using System.Collections.Generic;
using BehaviorDesigner.Runtime;
using Cysharp.Threading.Tasks;
using Gameplay.BT.Variables;
using Gameplay.BT;
using UnityEngine;
using PhxhSDK;
namespace Gameplay.AI
{
public class AIManager : Singlenton<AIManager>, IInitable, IUpdatable
{
private BTImplement _iaiImplement;
private List<BehaviorTree> bts;
private List<BehaviorTree> btsForSelf;
public void Init()
{
bts = new List<BehaviorTree>();
btsForSelf = new List<BehaviorTree>();
_iaiImplement = BTImplement.Instance;
_iaiImplement.Init();
PVEManager.Instance.AutoFight = false;
}
public void Release()
{
btsForSelf = null;
bts = null;
_iaiImplement.Release();
}
public void Update(float deltaTime)
{
_iaiImplement.Update(deltaTime);
}
public void StartAllNpcAI()
{
foreach (var bt in bts)
{
bt.EnableBehavior();
}
}
/// <summary>
/// 开启或关闭可操作单位
/// </summary>
public void EnableAllSelfAI(bool enable)
{
if (enable)
foreach (var bt in btsForSelf)
{
bt.EnableBehavior();
}
else
foreach (var bt in btsForSelf)
{
bt.DisableBehavior();
}
}
public void EnableSingleAI(GameObject go, bool enable)
{
var bt = go.GetComponent<BehaviorTree>();
if (bt == null) return;
if (enable)
bt.EnableBehavior();
else
bt.DisableBehavior();
}
public async UniTask<BehaviorTree> RegisterAI(GameObject go, string aiName, bool isSelf = false)
{
var name = string.IsNullOrEmpty(aiName) ? "AIBehavior" : aiName;
var bt = await _iaiImplement.RegisterAI(go, name);
if (isSelf)
btsForSelf.Add(bt);
else
bts.Add(bt);
return bt;
}
public void UnRegisterAI(GameObject go)
{
_iaiImplement.UnRegisterAI(go);
}
public async UniTask PreLoadAI(HashSet<string> aiNames, int initCount)
{
await _iaiImplement.PreLoadAI(aiNames, initCount);
}
}
}