mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-06-26 19:34:47 +00:00
73 lines
2.3 KiB
C#
73 lines
2.3 KiB
C#
|
namespace BehaviorTreeSlayer
|
|||
|
{
|
|||
|
public class Sequence : CompositeNode
|
|||
|
{
|
|||
|
private TreeNode last;
|
|||
|
|
|||
|
public override void Enter(object args)
|
|||
|
{
|
|||
|
Index = 0;
|
|||
|
}
|
|||
|
public override void Add(TreeNode component)
|
|||
|
{
|
|||
|
base.Add(component);
|
|||
|
Index = 0;
|
|||
|
state = TaskResult.None;
|
|||
|
}
|
|||
|
public override TaskResult Tick(double dt, object args = null)
|
|||
|
{
|
|||
|
childs.Sort((a, b) => a.x < b.x ? -1 : 1);
|
|||
|
for (int i = Index; i < childs.Count; i++)
|
|||
|
{
|
|||
|
if (last != childs[i])
|
|||
|
{
|
|||
|
childs[i].Enter(args);
|
|||
|
}
|
|||
|
TaskResult rst = childs[i].Tick(dt, args);
|
|||
|
childs[i].state = rst;
|
|||
|
last = childs[i];
|
|||
|
if (rst == TaskResult.OK || rst == TaskResult.None)
|
|||
|
{
|
|||
|
childs[i].Exit(args);
|
|||
|
Index = i + 1;
|
|||
|
}
|
|||
|
else if (rst == TaskResult.Running)
|
|||
|
{
|
|||
|
bool cdt = true;
|
|||
|
int cdtCount = 0;
|
|||
|
for (int j = 0; j < i; j++)
|
|||
|
{
|
|||
|
if (childs[j] is ConditionalNode)
|
|||
|
{
|
|||
|
cdtCount++;
|
|||
|
cdt &= (childs[j] as ConditionalNode).Check(dt, args);
|
|||
|
}
|
|||
|
}
|
|||
|
if (cdt && cdtCount > 0)
|
|||
|
{
|
|||
|
for (int j = 0; j < i; j++)
|
|||
|
{
|
|||
|
if (childs[j] is ConditionalNode)
|
|||
|
{
|
|||
|
(childs[j] as ConditionalNode).IsConditionOK = false;
|
|||
|
}
|
|||
|
}
|
|||
|
childs[i].Exit(args);
|
|||
|
Index = i + 1;
|
|||
|
return TaskResult.OK;
|
|||
|
}
|
|||
|
return TaskResult.Running;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
childs[i].Exit(args);
|
|||
|
Index = i + 1;
|
|||
|
return TaskResult.Fail;
|
|||
|
}
|
|||
|
}
|
|||
|
return TaskResult.OK;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|