Skip to content

Commit 11534c7

Browse files
committed
feat(behavior-tree): runtime trees can now be visually printed
1 parent 6367990 commit 11534c7

18 files changed

+194
-2
lines changed

Assets/FluidBehaviorTree/Editor.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/FluidBehaviorTree/Editor/BehaviorTree.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using UnityEditor;
2+
using UnityEngine;
3+
4+
namespace CleverCrow.Fluid.BTs.Trees.Editors {
5+
[CustomPropertyDrawer(typeof(BehaviorTree))]
6+
public class BehaviorTreeDrawer : PropertyDrawer {
7+
public override void OnGUI (Rect position, SerializedProperty property, GUIContent label) {
8+
EditorGUI.BeginProperty(position, label, property);
9+
10+
position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);
11+
GUI.enabled = Application.isPlaying;
12+
if (GUI.Button(position, "View Tree")) {
13+
var tree = fieldInfo.GetValue(property.serializedObject.targetObject) as IBehaviorTree;
14+
BehaviorTreeWindow.ShowTree(tree, property.displayName);
15+
}
16+
GUI.enabled = true;
17+
18+
EditorGUI.EndProperty();
19+
}
20+
}
21+
}

Assets/FluidBehaviorTree/Editor/BehaviorTree/BehaviorTreeDrawer.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using UnityEditor;
2+
using UnityEngine;
3+
4+
namespace CleverCrow.Fluid.BTs.Trees.Editors {
5+
public class BehaviorTreeWindow : EditorWindow {
6+
private BehaviorTreePrinter _printer;
7+
private string _name;
8+
9+
public static void ShowTree (IBehaviorTree tree, string name) {
10+
var window = GetWindow(typeof(BehaviorTreeWindow)) as BehaviorTreeWindow;
11+
window.SetTree(tree, name);
12+
}
13+
14+
private void SetTree (IBehaviorTree tree, string name) {
15+
_printer = new BehaviorTreePrinter(tree);
16+
_name = name;
17+
}
18+
19+
private void OnGUI () {
20+
GUILayout.Label($"Behavior Tree: {_name}", EditorStyles.boldLabel);
21+
_printer?.Print();
22+
}
23+
}
24+
}

Assets/FluidBehaviorTree/Editor/BehaviorTree/BehaviorTreeWindow.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/FluidBehaviorTree/Editor/BehaviorTree/Printer.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
namespace CleverCrow.Fluid.BTs.Trees.Editors {
2+
public class BehaviorTreePrinter {
3+
private readonly PrintNode _root;
4+
5+
public BehaviorTreePrinter (IBehaviorTree tree) {
6+
_root = new PrintNode(tree.Root);
7+
}
8+
9+
public void Print () {
10+
_root.Print();
11+
}
12+
}
13+
}

Assets/FluidBehaviorTree/Editor/BehaviorTree/Printer/BehaviorTreePrinter.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using System.Collections.Generic;
2+
using CleverCrow.Fluid.BTs.TaskParents;
3+
using CleverCrow.Fluid.BTs.Tasks;
4+
using UnityEngine;
5+
using EditorGUILayout = UnityEditor.EditorGUILayout;
6+
7+
namespace CleverCrow.Fluid.BTs.Trees.Editors {
8+
public class PrintNode {
9+
private readonly ITask _task;
10+
private readonly List<PrintNode> _children = new List<PrintNode>();
11+
12+
public PrintNode (ITask task) {
13+
_task = task;
14+
15+
var parent = task as ITaskParent;
16+
if (parent == null) return;
17+
foreach (var child in parent.Children) {
18+
_children.Add(new PrintNode(child));
19+
}
20+
}
21+
22+
public void Print () {
23+
EditorGUILayout.BeginVertical();
24+
25+
var centeredStyle = GUI.skin.GetStyle("Label");
26+
centeredStyle.alignment = TextAnchor.MiddleCenter;
27+
EditorGUILayout.LabelField(_task.Name, centeredStyle);
28+
29+
EditorGUILayout.BeginHorizontal();
30+
foreach (var child in _children) {
31+
child.Print();
32+
}
33+
EditorGUILayout.EndHorizontal();
34+
35+
EditorGUILayout.EndVertical();
36+
37+
}
38+
}
39+
}

Assets/FluidBehaviorTree/Editor/BehaviorTree/Printer/PrintNode.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"name": "Fluid.BehaviorTree.Editor",
3+
"references": [
4+
"Fluid.BehaviorTree"
5+
],
6+
"optionalUnityReferences": [],
7+
"includePlatforms": [
8+
"Editor"
9+
],
10+
"excludePlatforms": [],
11+
"allowUnsafeCode": false
12+
}

Assets/FluidBehaviorTree/Editor/Fluid.BehaviorTree.Editor.asmdef.meta

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/FluidBehaviorTree/Runtime/BehaviorTree/BehaviorTree.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@
33
using UnityEngine;
44

55
namespace CleverCrow.Fluid.BTs.Trees {
6-
public class BehaviorTree {
6+
public interface IBehaviorTree {
7+
TaskRoot Root { get; }
8+
}
9+
10+
[System.Serializable]
11+
public class BehaviorTree : IBehaviorTree {
712
private readonly GameObject _owner;
813

914
public int TickCount { get; private set; }
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using CleverCrow.Fluid.BTs.Tasks;
2+
using CleverCrow.Fluid.BTs.Trees;
3+
using UnityEngine;
4+
5+
namespace FluidBehaviorTree.Runtime {
6+
public class BehaviorTreeSerializationTestDeleteMe : MonoBehaviour {
7+
[SerializeField]
8+
private BehaviorTree _tree;
9+
10+
private void Awake () {
11+
_tree = new BehaviorTreeBuilder(gameObject)
12+
.Sequence()
13+
.Condition("Custom Condition", () => true)
14+
.Do("Custom Action", () => TaskStatus.Success)
15+
.Sequence("Nested Sequence")
16+
.Condition("Custom Condition", () => true)
17+
.Do("Custom Action", () => TaskStatus.Success)
18+
.End()
19+
.End()
20+
.Build();
21+
}
22+
23+
private void Update () {
24+
// Update our tree every frame
25+
_tree.Tick();
26+
}
27+
}
28+
}

Assets/FluidBehaviorTree/Runtime/BehaviorTreeSerializationTestDeleteMe.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/FluidBehaviorTree/Runtime/TaskParents/TaskParentBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public abstract class TaskParentBase : ITaskParent {
88
public BehaviorTree ParentTree { get; set; }
99
public TaskStatus LastStatus { get; private set; }
1010

11-
public string Name { get; set; }
11+
public virtual string Name { get; set; }
1212
public bool Enabled { get; set; } = true;
1313

1414
public List<ITask> Children { get; } = new List<ITask>();

Assets/FluidBehaviorTree/Runtime/TaskParents/TaskRoot.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace CleverCrow.Fluid.BTs.TaskParents {
44
public class TaskRoot : TaskParentBase {
5+
public override string Name { get; set; } = "Root";
56
protected override int MaxChildren { get; } = 1;
67

78
protected override TaskStatus OnUpdate () {

0 commit comments

Comments
 (0)