1
+ using System ;
2
+ using System . Collections . Generic ;
3
+ using Adnc . FluidBT . Decorators ;
4
+ using Adnc . FluidBT . TaskParents ;
5
+ using Adnc . FluidBT . TaskParents . Composites ;
6
+ using Adnc . FluidBT . Tasks ;
7
+ using Adnc . FluidBT . Tasks . Actions ;
8
+ using UnityEngine ;
9
+
10
+ namespace Adnc . FluidBT . Trees {
11
+ public class BehaviorTreeBuilder {
12
+ private readonly BehaviorTree _tree ;
13
+ private readonly List < ITaskParent > _pointer = new List < ITaskParent > ( ) ;
14
+
15
+ private ITaskParent Pointer {
16
+ get {
17
+ if ( _pointer . Count == 0 ) return null ;
18
+ return _pointer [ _pointer . Count - 1 ] ;
19
+ }
20
+ }
21
+
22
+ public BehaviorTreeBuilder ( GameObject owner ) {
23
+ _tree = new BehaviorTree ( owner ) ;
24
+ _pointer . Add ( _tree . Root ) ;
25
+ }
26
+
27
+ private BehaviorTreeBuilder ParentTask < T > ( string name ) where T : ITaskParent , new ( ) {
28
+ var parent = new T { Name = name } ;
29
+ _tree . AddNode ( Pointer , parent ) ;
30
+ _pointer . Add ( parent ) ;
31
+
32
+ return this ;
33
+ }
34
+
35
+ public BehaviorTreeBuilder Decorator ( string name , Func < ITask , TaskStatus > logic ) {
36
+ var decorator = new DecoratorGeneric {
37
+ updateLogic = logic ,
38
+ Name = name
39
+ } ;
40
+
41
+ _tree . AddNode ( Pointer , decorator ) ;
42
+ _pointer . Add ( decorator ) ;
43
+
44
+ return this ;
45
+ }
46
+
47
+ public BehaviorTreeBuilder Decorator ( Func < ITask , TaskStatus > logic ) {
48
+ return Decorator ( "decorator" , logic ) ;
49
+ }
50
+
51
+ public BehaviorTreeBuilder Inverter ( string name = "inverter" ) {
52
+ return ParentTask < Inverter > ( name ) ;
53
+ }
54
+
55
+ public BehaviorTreeBuilder ReturnSuccess ( string name = "return success" ) {
56
+ return ParentTask < ReturnSuccess > ( name ) ;
57
+ }
58
+
59
+ public BehaviorTreeBuilder ReturnFailure ( string name = "return failure" ) {
60
+ return ParentTask < ReturnFailure > ( name ) ;
61
+ }
62
+
63
+ public BehaviorTreeBuilder Sequence ( string name = "sequence" ) {
64
+ return ParentTask < Sequence > ( name ) ;
65
+ }
66
+
67
+ public BehaviorTreeBuilder Selector ( string name = "selector" ) {
68
+ return ParentTask < Selector > ( name ) ;
69
+ }
70
+
71
+ public BehaviorTreeBuilder Parallel ( string name = "parallel" ) {
72
+ return ParentTask < Parallel > ( name ) ;
73
+ }
74
+
75
+ public BehaviorTreeBuilder Do ( string name , Func < TaskStatus > action ) {
76
+ _tree . AddNode ( Pointer , new ActionGeneric {
77
+ Name = name ,
78
+ updateLogic = action
79
+ } ) ;
80
+
81
+ return this ;
82
+ }
83
+
84
+ public BehaviorTreeBuilder Do ( Func < TaskStatus > action ) {
85
+ return Do ( "action" , action ) ;
86
+ }
87
+
88
+ public BehaviorTreeBuilder Condition ( string name , Func < bool > action ) {
89
+ _tree . AddNode ( Pointer , new ConditionGeneric {
90
+ Name = name ,
91
+ updateLogic = action
92
+ } ) ;
93
+
94
+ return this ;
95
+ }
96
+
97
+ public BehaviorTreeBuilder Condition ( Func < bool > action ) {
98
+ return Condition ( "condition" , action ) ;
99
+ }
100
+
101
+ public BehaviorTreeBuilder End ( ) {
102
+ _pointer . RemoveAt ( _pointer . Count - 1 ) ;
103
+
104
+ return this ;
105
+ }
106
+
107
+ public BehaviorTree Build ( ) {
108
+ return _tree ;
109
+ }
110
+ }
111
+ }
0 commit comments