Skip to content

Commit 8e39026

Browse files
committed
Added sequence, selector, and condition tree building commands
1 parent 41fd957 commit 8e39026

File tree

2 files changed

+168
-15
lines changed

2 files changed

+168
-15
lines changed

Assets/FluidBehaviorTree/Scripts/BehaviorTree/BehaviorTreeBuilder.cs

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,26 @@ public BehaviorTreeBuilder (GameObject owner) {
2222
_tree = new BehaviorTree(owner);
2323
_pointer.Add(_tree.Root);
2424
}
25-
26-
public BehaviorTreeBuilder Sequence (string name) {
27-
var sequence = new Sequence { Name = name };
28-
_tree.AddNode(Pointer, sequence);
29-
_pointer.Add(sequence);
25+
26+
private BehaviorTreeBuilder ParentTask<T> (string name) where T : ITaskParent, new() {
27+
var parent = new T { Name = name };
28+
_tree.AddNode(Pointer, parent);
29+
_pointer.Add(parent);
3030

3131
return this;
3232
}
33+
34+
public BehaviorTreeBuilder Sequence (string name = "sequence") {
35+
return ParentTask<Sequence>(name);
36+
}
37+
38+
public BehaviorTreeBuilder Selector (string name = "selector") {
39+
return ParentTask<Selector>(name);
40+
}
41+
42+
public BehaviorTreeBuilder Parallel (string name = "parallel") {
43+
return ParentTask<Parallel>(name);
44+
}
3345

3446
public BehaviorTreeBuilder Do (string name, Func<TaskStatus> action) {
3547
_tree.AddNode(Pointer, new ActionGeneric {
@@ -39,6 +51,23 @@ public BehaviorTreeBuilder Do (string name, Func<TaskStatus> action) {
3951

4052
return this;
4153
}
54+
55+
public BehaviorTreeBuilder Do (Func<TaskStatus> action) {
56+
return Do("action", action);
57+
}
58+
59+
public BehaviorTreeBuilder Condition (string name, Func<bool> action) {
60+
_tree.AddNode(Pointer, new ConditionGeneric {
61+
Name = name,
62+
updateLogic = action
63+
});
64+
65+
return this;
66+
}
67+
68+
public BehaviorTreeBuilder Condition (Func<bool> action) {
69+
return Condition("condition", action);
70+
}
4271

4372
public BehaviorTreeBuilder End () {
4473
_pointer.RemoveAt(_pointer.Count - 1);

Assets/FluidBehaviorTree/Scripts/BehaviorTree/Editor/BehaviorTreeBuilderTest.cs

Lines changed: 134 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
11
using Adnc.FluidBT.TaskParents.Composites;
22
using Adnc.FluidBT.Tasks;
3+
using Adnc.FluidBT.Tasks.Actions;
34
using NUnit.Framework;
45

56
namespace Adnc.FluidBT.Trees.Testing {
67
public class BehaviorTreeBuilderTest {
7-
public class SequenceMethod {
8-
private int _invokeCount;
9-
private BehaviorTreeBuilder _builder;
10-
11-
[SetUp]
12-
public void BeforeEach () {
13-
_invokeCount = 0;
14-
_builder = new BehaviorTreeBuilder(null);
15-
}
8+
private int _invokeCount;
9+
private BehaviorTreeBuilder _builder;
1610

11+
[SetUp]
12+
public void BeforeEach () {
13+
_invokeCount = 0;
14+
_builder = new BehaviorTreeBuilder(null);
15+
}
16+
17+
public class SequenceMethod : BehaviorTreeBuilderTest {
1718
[Test]
1819
public void Create_a_sequence () {
1920
var tree = _builder
20-
.Sequence("sequence")
21+
.Sequence()
2122
.Do("action", () => {
2223
_invokeCount++;
2324
return TaskStatus.Success;
@@ -115,5 +116,128 @@ public void Create_two_nested_sequences_with_actions () {
115116
Assert.AreEqual(2, _invokeCount);
116117
}
117118
}
119+
120+
public class SelectorMethod : BehaviorTreeBuilderTest {
121+
[Test]
122+
public void Create_a_selector () {
123+
var tree = _builder
124+
.Selector("selector")
125+
.Do("action", () => {
126+
_invokeCount++;
127+
return TaskStatus.Failure;
128+
})
129+
.Do("action", () => {
130+
_invokeCount++;
131+
return TaskStatus.Success;
132+
})
133+
.Build();
134+
135+
var selector = tree.Root.Children[0] as Selector;
136+
137+
Assert.AreEqual(tree.Root.Children.Count, 1);
138+
Assert.AreEqual(selector.Children.Count, 2);
139+
Assert.AreEqual(TaskStatus.Success, tree.Tick());
140+
Assert.AreEqual(2, _invokeCount);
141+
}
142+
}
143+
144+
public class ParallelMethod : BehaviorTreeBuilderTest {
145+
[Test]
146+
public void Create_a_selector () {
147+
var tree = _builder
148+
.Parallel()
149+
.Do("action", () => {
150+
_invokeCount++;
151+
return TaskStatus.Success;
152+
})
153+
.Do("action", () => {
154+
_invokeCount++;
155+
return TaskStatus.Success;
156+
})
157+
.Build();
158+
159+
var parallel = tree.Root.Children[0] as Parallel;
160+
161+
Assert.AreEqual(tree.Root.Children.Count, 1);
162+
Assert.AreEqual(parallel.Children.Count, 2);
163+
Assert.AreEqual(TaskStatus.Success, tree.Tick());
164+
Assert.AreEqual(2, _invokeCount);
165+
}
166+
}
167+
168+
public class ConditionMethod : BehaviorTreeBuilderTest {
169+
[Test]
170+
public void It_should_add_a_condition () {
171+
var tree = _builder
172+
.Sequence()
173+
.Condition("condition", () => {
174+
_invokeCount++;
175+
return true;
176+
})
177+
.Do("action", () => {
178+
_invokeCount++;
179+
return TaskStatus.Success;
180+
})
181+
.Build();
182+
183+
var sequence = tree.Root.Children[0] as Sequence;
184+
var condition = sequence.Children[0] as ConditionGeneric;
185+
186+
Assert.AreEqual(sequence.Children.Count, 2);
187+
Assert.IsNotNull(condition);
188+
Assert.AreEqual(TaskStatus.Success, tree.Tick());
189+
Assert.AreEqual(2, _invokeCount);
190+
}
191+
192+
[Test]
193+
public void It_should_add_a_condition_without_a_name () {
194+
var tree = _builder
195+
.Condition(() => {
196+
_invokeCount++;
197+
return true;
198+
})
199+
.Build();
200+
201+
var condition = tree.Root.Children[0] as ConditionGeneric;
202+
203+
Assert.IsNotNull(condition);
204+
Assert.AreEqual(TaskStatus.Success, tree.Tick());
205+
Assert.AreEqual(1, _invokeCount);
206+
}
207+
}
208+
209+
public class DoMethod : BehaviorTreeBuilderTest {
210+
[Test]
211+
public void It_should_add_an_action () {
212+
var tree = _builder
213+
.Do("action", () => {
214+
_invokeCount++;
215+
return TaskStatus.Success;
216+
})
217+
.Build();
218+
219+
var action = tree.Root.Children[0] as ActionGeneric;
220+
221+
Assert.IsNotNull(action);
222+
Assert.AreEqual(TaskStatus.Success, tree.Tick());
223+
Assert.AreEqual(1, _invokeCount);
224+
}
225+
226+
[Test]
227+
public void It_should_add_an_action_without_a_name () {
228+
var tree = _builder
229+
.Do(() => {
230+
_invokeCount++;
231+
return TaskStatus.Success;
232+
})
233+
.Build();
234+
235+
var action = tree.Root.Children[0] as ActionGeneric;
236+
237+
Assert.IsNotNull(action);
238+
Assert.AreEqual(TaskStatus.Success, tree.Tick());
239+
Assert.AreEqual(1, _invokeCount);
240+
}
241+
}
118242
}
119243
}

0 commit comments

Comments
 (0)