41 lines
1.4 KiB
C#
41 lines
1.4 KiB
C#
using BaseGames.AI;
|
|
|
|
namespace BaseGames.Enemies
|
|
{
|
|
/// <summary>
|
|
/// E001(草蛭)的 AI 定义:巡逻 → 追击(接触即伤害,无需攻击能力)→ 搜查 → 巡逻。
|
|
/// 数值目前用字面量常量;后续可外挂 SO 做热调。
|
|
/// </summary>
|
|
[AiDefinition("E001")]
|
|
public sealed class E001CaoZhiAi : AiScript
|
|
{
|
|
const float LoseTimeout = 2.5f; // 丢失玩家判定
|
|
const float SearchTime = 3f; // 搜查后返回巡逻
|
|
|
|
protected override void Build(BrainBuilder b)
|
|
{
|
|
b.Entry("Patrol");
|
|
|
|
// 死亡:全局事件,终止决策
|
|
b.Global().To("Dead").OnEvent(AiSignal.Died);
|
|
|
|
b.State("Patrol")
|
|
.Tick(c => c.Mover.WalkRandom())
|
|
.To("Chase").When(c => c.Sensor.SeesPlayer(), "SeesPlayer");
|
|
|
|
b.State("Chase")
|
|
.OnEnter(c => c.Mover.FacePlayer())
|
|
.Tick(c => c.Mover.MoveTo(c.Sensor.LastKnown)) // 冲向玩家,接触即由 BodyContactDamage 造成伤害
|
|
.To("Search").When(c => c.Sensor.LostFor(LoseTimeout), "LostFor");
|
|
|
|
b.State("Search")
|
|
.OnEnter(c => c.Mover.LookAround())
|
|
.To("Chase").When(c => c.Sensor.SeesPlayer(), "SeesPlayer")
|
|
.To("Patrol").After(SearchTime);
|
|
|
|
b.State("Dead")
|
|
.OnEnter(c => c.Mover.Stop());
|
|
}
|
|
}
|
|
}
|