73 lines
2.3 KiB
C#
Raw Permalink Normal View History

2024-08-17 14:12:46 +08:00
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;
}
}
}