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