From c76b364ab774dbdf1a7dca0afd4ba3197cfe98ac Mon Sep 17 00:00:00 2001 From: Pedro Gomes Date: Sun, 23 Jun 2024 19:12:22 +0100 Subject: [PATCH] Monobehaviour tree --- Assets/MonoBehaviourTree.meta | 8 + Assets/MonoBehaviourTree/Source.meta | 8 + Assets/MonoBehaviourTree/Source/Editor.meta | 8 + .../Source/Editor/BehaviourTreeWindow.cs | 771 ++++++ .../Source/Editor/BehaviourTreeWindow.cs.meta | 11 + .../Source/Editor/BlackboardEditor.cs | 210 ++ .../Source/Editor/BlackboardEditor.cs.meta | 11 + .../Source/Editor/InvokeUnityEventEditor.cs | 126 + .../Editor/InvokeUnityEventEditor.cs.meta | 11 + .../Source/Editor/IsSetConditionEditor.cs | 60 + .../Editor/IsSetConditionEditor.cs.meta | 11 + .../Source/Editor/MonoBehaviourTreeEditor.cs | 87 + .../Editor/MonoBehaviourTreeEditor.cs.meta | 11 + .../Source/Editor/NodeDropdown.cs | 143 + .../Source/Editor/NodeDropdown.cs.meta | 11 + .../Source/Editor/NumberConditionEditor.cs | 66 + .../Editor/NumberConditionEditor.cs.meta | 11 + .../Qriva.MonoBehaviourTree.Editor.asmdef | 17 + ...Qriva.MonoBehaviourTree.Editor.asmdef.meta | 7 + .../Source/Editor/Resources.meta | 8 + .../Source/Editor/Resources/OFL.txt | 93 + .../Source/Editor/Resources/OFL.txt.meta | 7 + .../Source/Editor/Resources/mbt_Lato-Bold.ttf | Bin 0 -> 73316 bytes .../Editor/Resources/mbt_Lato-Bold.ttf.meta | 23 + .../Editor/Resources/mbt_Lato-Regular.ttf | Bin 0 -> 75136 bytes .../Resources/mbt_Lato-Regular.ttf.meta | 22 + .../Editor/Resources/mbt_blackboard.png | 3 + .../Editor/Resources/mbt_blackboard.png.meta | 139 + .../Editor/Resources/mbt_node_default.png | 3 + .../Resources/mbt_node_default.png.meta | 139 + .../Editor/Resources/mbt_node_failure.png | 3 + .../Resources/mbt_node_failure.png.meta | 139 + .../Editor/Resources/mbt_node_handle.png | 3 + .../Editor/Resources/mbt_node_handle.png.meta | 139 + .../Editor/Resources/mbt_node_running.png | 3 + .../Resources/mbt_node_running.png.meta | 139 + .../Editor/Resources/mbt_node_selected.png | 3 + .../Resources/mbt_node_selected.png.meta | 139 + .../Editor/Resources/mbt_node_success.png | 3 + .../Resources/mbt_node_success.png.meta | 139 + .../Editor/Resources/mbt_window_icon.png | 3 + .../Editor/Resources/mbt_window_icon.png.meta | 139 + .../Source/Editor/SetNumberEditor.cs | 66 + .../Source/Editor/SetNumberEditor.cs.meta | 11 + .../Source/Editor/SetObjectEditor.cs | 61 + .../Source/Editor/SetObjectEditor.cs.meta | 11 + .../Source/Editor/SetVectorEditor.cs | 65 + .../Source/Editor/SetVectorEditor.cs.meta | 11 + .../Source/Editor/VariableReferenceDrawer.cs | 133 + .../Editor/VariableReferenceDrawer.cs.meta | 11 + Assets/MonoBehaviourTree/Source/LICENSE | 21 + Assets/MonoBehaviourTree/Source/LICENSE.meta | 7 + Assets/MonoBehaviourTree/Source/README.md | 341 +++ .../MonoBehaviourTree/Source/README.md.meta | 7 + Assets/MonoBehaviourTree/Source/Runtime.meta | 8 + .../Source/Runtime/Blackboard.cs | 94 + .../Source/Runtime/Blackboard.cs.meta | 11 + .../Runtime/IMonoBehaviourTreeTickListener.cs | 11 + .../IMonoBehaviourTreeTickListener.cs.meta | 11 + .../Source/Runtime/MBTExecutor.cs | 33 + .../Source/Runtime/MBTExecutor.cs.meta | 11 + .../Source/Runtime/MBTNode.cs | 22 + .../Source/Runtime/MBTNode.cs.meta | 11 + .../Source/Runtime/MonoBehaviourTree.cs | 329 +++ .../Source/Runtime/MonoBehaviourTree.cs.meta | 11 + .../Source/Runtime/Nodes.meta | 8 + .../Runtime/Nodes/CalculateDistanceService.cs | 27 + .../Nodes/CalculateDistanceService.cs.meta | 11 + .../Source/Runtime/Nodes/Composite.cs | 47 + .../Source/Runtime/Nodes/Composite.cs.meta | 11 + .../Source/Runtime/Nodes/Condition.cs | 47 + .../Source/Runtime/Nodes/Condition.cs.meta | 11 + .../Source/Runtime/Nodes/Cooldown.cs | 89 + .../Source/Runtime/Nodes/Cooldown.cs.meta | 11 + .../Source/Runtime/Nodes/CoroutineService.cs | 68 + .../Runtime/Nodes/CoroutineService.cs.meta | 11 + .../Source/Runtime/Nodes/Decorator.cs | 111 + .../Source/Runtime/Nodes/Decorator.cs.meta | 11 + .../Source/Runtime/Nodes/DistanceCondition.cs | 37 + .../Runtime/Nodes/DistanceCondition.cs.meta | 11 + .../Source/Runtime/Nodes/ForceResult.cs | 33 + .../Source/Runtime/Nodes/ForceResult.cs.meta | 11 + .../Source/Runtime/Nodes/Inverter.cs | 25 + .../Source/Runtime/Nodes/Inverter.cs.meta | 11 + .../Source/Runtime/Nodes/InvokeUnityEvent.cs | 86 + .../Runtime/Nodes/InvokeUnityEvent.cs.meta | 11 + .../Source/Runtime/Nodes/IsSetCondition.cs | 102 + .../Runtime/Nodes/IsSetCondition.cs.meta | 11 + .../Source/Runtime/Nodes/Leaf.cs | 19 + .../Source/Runtime/Nodes/Leaf.cs.meta | 11 + .../Source/Runtime/Nodes/Loop.cs | 80 + .../Source/Runtime/Nodes/Loop.cs.meta | 11 + .../Source/Runtime/Nodes/Node.cs | 162 ++ .../Source/Runtime/Nodes/Node.cs.meta | 11 + .../Source/Runtime/Nodes/NumberCondition.cs | 125 + .../Runtime/Nodes/NumberCondition.cs.meta | 11 + .../Source/Runtime/Nodes/RandomChance.cs | 43 + .../Source/Runtime/Nodes/RandomChance.cs.meta | 11 + .../Source/Runtime/Nodes/RandomFloat.cs | 29 + .../Source/Runtime/Nodes/RandomFloat.cs.meta | 11 + .../Source/Runtime/Nodes/RandomInteger.cs | 29 + .../Runtime/Nodes/RandomInteger.cs.meta | 11 + .../Source/Runtime/Nodes/RepeatUntilFail.cs | 25 + .../Runtime/Nodes/RepeatUntilFail.cs.meta | 11 + .../Source/Runtime/Nodes/Repeater.cs | 40 + .../Source/Runtime/Nodes/Repeater.cs.meta | 11 + .../Source/Runtime/Nodes/Root.cs | 54 + .../Source/Runtime/Nodes/Root.cs.meta | 11 + .../Source/Runtime/Nodes/Selector.cs | 50 + .../Source/Runtime/Nodes/Selector.cs.meta | 11 + .../Source/Runtime/Nodes/Sequence.cs | 50 + .../Source/Runtime/Nodes/Sequence.cs.meta | 11 + .../Source/Runtime/Nodes/Service.cs | 63 + .../Source/Runtime/Nodes/Service.cs.meta | 11 + .../Source/Runtime/Nodes/SetBoolean.cs | 34 + .../Source/Runtime/Nodes/SetBoolean.cs.meta | 11 + .../Source/Runtime/Nodes/SetNumber.cs | 77 + .../Source/Runtime/Nodes/SetNumber.cs.meta | 11 + .../Source/Runtime/Nodes/SetObject.cs | 53 + .../Source/Runtime/Nodes/SetObject.cs.meta | 11 + .../Source/Runtime/Nodes/SetVector.cs | 48 + .../Source/Runtime/Nodes/SetVector.cs.meta | 11 + .../Source/Runtime/Nodes/SubTree.cs | 41 + .../Source/Runtime/Nodes/SubTree.cs.meta | 11 + .../Source/Runtime/Nodes/Succeeder.cs | 24 + .../Source/Runtime/Nodes/Succeeder.cs.meta | 11 + .../Source/Runtime/Nodes/TimeLimit.cs | 70 + .../Source/Runtime/Nodes/TimeLimit.cs.meta | 11 + .../Runtime/Nodes/UpdatePositionService.cs | 24 + .../Nodes/UpdatePositionService.cs.meta | 11 + .../Source/Runtime/Nodes/Wait.cs | 50 + .../Source/Runtime/Nodes/Wait.cs.meta | 11 + .../Qriva.MonoBehaviourTree.Runtime.asmdef | 3 + ...riva.MonoBehaviourTree.Runtime.asmdef.meta | 7 + .../Source/Runtime/Variables.meta | 8 + .../Runtime/Variables/BlackboardVariable.cs | 11 + .../Variables/BlackboardVariable.cs.meta | 11 + .../Source/Runtime/Variables/BoolVariable.cs | 49 + .../Runtime/Variables/BoolVariable.cs.meta | 11 + .../Source/Runtime/Variables/FloatVariable.cs | 49 + .../Runtime/Variables/FloatVariable.cs.meta | 11 + .../Runtime/Variables/GameObjectVariable.cs | 49 + .../Variables/GameObjectVariable.cs.meta | 11 + .../Source/Runtime/Variables/IntVariable.cs | 49 + .../Runtime/Variables/IntVariable.cs.meta | 11 + .../Runtime/Variables/QuaternionVariable.cs | 49 + .../Variables/QuaternionVariable.cs.meta | 11 + .../Runtime/Variables/StringVariable.cs | 49 + .../Runtime/Variables/StringVariable.cs.meta | 11 + .../Runtime/Variables/TransformVariable.cs | 48 + .../Variables/TransformVariable.cs.meta | 11 + .../Source/Runtime/Variables/Variable.cs | 138 + .../Source/Runtime/Variables/Variable.cs.meta | 11 + .../Runtime/Variables/Vector2Variable.cs | 49 + .../Runtime/Variables/Vector2Variable.cs.meta | 11 + .../Runtime/Variables/Vector3Variable.cs | 49 + .../Runtime/Variables/Vector3Variable.cs.meta | 11 + Assets/MonoBehaviourTree/Source/Samples.meta | 8 + .../Source/Samples/Demo URP.meta | 8 + .../Samples/Demo URP/Example Assets.meta | 8 + .../Example Assets/InfoBoardTemplate.prefab | 341 +++ .../InfoBoardTemplate.prefab.meta | 7 + .../Demo URP/Example Assets/Materials.meta | 8 + .../Example Assets/Materials/BotCapsule.mat | 90 + .../Materials/BotCapsule.mat.meta | 8 + .../Example Assets/Materials/Ground.mat | 90 + .../Example Assets/Materials/Ground.mat.meta | 8 + .../Example Assets/Materials/Obstacle.mat | 90 + .../Materials/Obstacle.mat.meta | 8 + .../Materials/PlayerCapsule.mat | 90 + .../Materials/PlayerCapsule.mat.meta | 8 + .../Example Assets/Materials/ViewSphere.mat | 97 + .../Materials/ViewSphere.mat.meta | 8 + .../Demo URP/Example Assets/Nodes.meta | 8 + .../Nodes/DetectEnemyService.cs | 31 + .../Nodes/DetectEnemyService.cs.meta | 11 + .../Example Assets/Nodes/MoveNavmeshAgent.cs | 67 + .../Nodes/MoveNavmeshAgent.cs.meta | 11 + .../Example Assets/Nodes/MoveTowards.cs | 39 + .../Example Assets/Nodes/MoveTowards.cs.meta | 11 + .../Example Assets/Nodes/SetPatrolPoint.cs | 39 + .../Nodes/SetPatrolPoint.cs.meta | 11 + .../Example Assets/Nodes/SetRandomPosition.cs | 26 + .../Nodes/SetRandomPosition.cs.meta | 11 + .../Demo URP/Example Assets/Scripts.meta | 8 + .../Scripts/PlayerNavmeshController.cs | 33 + .../Scripts/PlayerNavmeshController.cs.meta | 11 + .../Demo URP/Example Assets/Shaders.meta | 8 + .../Shaders/ViewZoneShader.shadergraph | 260 ++ .../Shaders/ViewZoneShader.shadergraph.meta | 10 + .../Source/Samples/Demo URP/Example1.unity | 1214 +++++++++ .../Samples/Demo URP/Example1.unity.meta | 7 + .../Source/Samples/Demo URP/Example2.meta | 8 + .../Source/Samples/Demo URP/Example2.unity | 2380 +++++++++++++++++ .../Samples/Demo URP/Example2.unity.meta | 7 + .../Samples/Demo URP/Example2/NavMesh.asset | Bin 0 -> 9632 bytes .../Demo URP/Example2/NavMesh.asset.meta | 8 + Assets/MonoBehaviourTree/Source/package.json | 29 + .../Source/package.json.meta | 7 + Assets/Scripts/AI.meta | 8 + Assets/Scripts/NPC/NPCBrainSystem/NPCBrain.cs | 4 +- 201 files changed, 12277 insertions(+), 2 deletions(-) create mode 100644 Assets/MonoBehaviourTree.meta create mode 100644 Assets/MonoBehaviourTree/Source.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/BehaviourTreeWindow.cs create mode 100644 Assets/MonoBehaviourTree/Source/Editor/BehaviourTreeWindow.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/BlackboardEditor.cs create mode 100644 Assets/MonoBehaviourTree/Source/Editor/BlackboardEditor.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/InvokeUnityEventEditor.cs create mode 100644 Assets/MonoBehaviourTree/Source/Editor/InvokeUnityEventEditor.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/IsSetConditionEditor.cs create mode 100644 Assets/MonoBehaviourTree/Source/Editor/IsSetConditionEditor.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/MonoBehaviourTreeEditor.cs create mode 100644 Assets/MonoBehaviourTree/Source/Editor/MonoBehaviourTreeEditor.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/NodeDropdown.cs create mode 100644 Assets/MonoBehaviourTree/Source/Editor/NodeDropdown.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/NumberConditionEditor.cs create mode 100644 Assets/MonoBehaviourTree/Source/Editor/NumberConditionEditor.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Qriva.MonoBehaviourTree.Editor.asmdef create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Qriva.MonoBehaviourTree.Editor.asmdef.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/OFL.txt create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/OFL.txt.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_Lato-Bold.ttf create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_Lato-Bold.ttf.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_Lato-Regular.ttf create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_Lato-Regular.ttf.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_blackboard.png create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_blackboard.png.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_node_default.png create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_node_default.png.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_node_failure.png create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_node_failure.png.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_node_handle.png create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_node_handle.png.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_node_running.png create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_node_running.png.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_node_selected.png create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_node_selected.png.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_node_success.png create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_node_success.png.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_window_icon.png create mode 100644 Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_window_icon.png.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/SetNumberEditor.cs create mode 100644 Assets/MonoBehaviourTree/Source/Editor/SetNumberEditor.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/SetObjectEditor.cs create mode 100644 Assets/MonoBehaviourTree/Source/Editor/SetObjectEditor.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/SetVectorEditor.cs create mode 100644 Assets/MonoBehaviourTree/Source/Editor/SetVectorEditor.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Editor/VariableReferenceDrawer.cs create mode 100644 Assets/MonoBehaviourTree/Source/Editor/VariableReferenceDrawer.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/LICENSE create mode 100644 Assets/MonoBehaviourTree/Source/LICENSE.meta create mode 100644 Assets/MonoBehaviourTree/Source/README.md create mode 100644 Assets/MonoBehaviourTree/Source/README.md.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Blackboard.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Blackboard.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/IMonoBehaviourTreeTickListener.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/IMonoBehaviourTreeTickListener.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/MBTExecutor.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/MBTExecutor.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/MBTNode.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/MBTNode.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/MonoBehaviourTree.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/MonoBehaviourTree.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/CalculateDistanceService.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/CalculateDistanceService.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Composite.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Composite.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Condition.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Condition.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Cooldown.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Cooldown.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/CoroutineService.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/CoroutineService.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Decorator.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Decorator.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/DistanceCondition.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/DistanceCondition.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/ForceResult.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/ForceResult.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Inverter.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Inverter.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/InvokeUnityEvent.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/InvokeUnityEvent.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/IsSetCondition.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/IsSetCondition.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Leaf.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Leaf.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Loop.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Loop.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Node.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Node.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/NumberCondition.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/NumberCondition.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomChance.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomChance.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomFloat.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomFloat.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomInteger.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomInteger.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/RepeatUntilFail.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/RepeatUntilFail.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Repeater.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Repeater.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Root.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Root.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Selector.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Selector.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Sequence.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Sequence.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Service.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Service.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetBoolean.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetBoolean.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetNumber.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetNumber.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetObject.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetObject.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetVector.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetVector.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/SubTree.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/SubTree.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Succeeder.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Succeeder.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/TimeLimit.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/TimeLimit.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/UpdatePositionService.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/UpdatePositionService.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Wait.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Nodes/Wait.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Qriva.MonoBehaviourTree.Runtime.asmdef create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Qriva.MonoBehaviourTree.Runtime.asmdef.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/BlackboardVariable.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/BlackboardVariable.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/BoolVariable.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/BoolVariable.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/FloatVariable.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/FloatVariable.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/GameObjectVariable.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/GameObjectVariable.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/IntVariable.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/IntVariable.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/QuaternionVariable.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/QuaternionVariable.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/StringVariable.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/StringVariable.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/TransformVariable.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/TransformVariable.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/Variable.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/Variable.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/Vector2Variable.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/Vector2Variable.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/Vector3Variable.cs create mode 100644 Assets/MonoBehaviourTree/Source/Runtime/Variables/Vector3Variable.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/InfoBoardTemplate.prefab create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/InfoBoardTemplate.prefab.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/BotCapsule.mat create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/BotCapsule.mat.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/Ground.mat create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/Ground.mat.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/Obstacle.mat create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/Obstacle.mat.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/PlayerCapsule.mat create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/PlayerCapsule.mat.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/ViewSphere.mat create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/ViewSphere.mat.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/DetectEnemyService.cs create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/DetectEnemyService.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/MoveNavmeshAgent.cs create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/MoveNavmeshAgent.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/MoveTowards.cs create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/MoveTowards.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/SetPatrolPoint.cs create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/SetPatrolPoint.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/SetRandomPosition.cs create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/SetRandomPosition.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Scripts.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Scripts/PlayerNavmeshController.cs create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Scripts/PlayerNavmeshController.cs.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Shaders.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Shaders/ViewZoneShader.shadergraph create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Shaders/ViewZoneShader.shadergraph.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example1.unity create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example1.unity.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example2.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example2.unity create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example2.unity.meta create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example2/NavMesh.asset create mode 100644 Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example2/NavMesh.asset.meta create mode 100644 Assets/MonoBehaviourTree/Source/package.json create mode 100644 Assets/MonoBehaviourTree/Source/package.json.meta create mode 100644 Assets/Scripts/AI.meta diff --git a/Assets/MonoBehaviourTree.meta b/Assets/MonoBehaviourTree.meta new file mode 100644 index 00000000..e1986201 --- /dev/null +++ b/Assets/MonoBehaviourTree.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 646d077994822874f8e542df122777f7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source.meta b/Assets/MonoBehaviourTree/Source.meta new file mode 100644 index 00000000..0e1a243a --- /dev/null +++ b/Assets/MonoBehaviourTree/Source.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ba1db740a296d7c47b95f11808bad3a9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Editor.meta b/Assets/MonoBehaviourTree/Source/Editor.meta new file mode 100644 index 00000000..54b3cd1e --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 59e9dc397161a6b44991bc327eb108a6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Editor/BehaviourTreeWindow.cs b/Assets/MonoBehaviourTree/Source/Editor/BehaviourTreeWindow.cs new file mode 100644 index 00000000..17ee9041 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/BehaviourTreeWindow.cs @@ -0,0 +1,771 @@ +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using UnityEditor.IMGUI.Controls; +using MBT; + +namespace MBTEditor +{ + public class BehaviourTreeWindow : EditorWindow, IHasCustomMenu + { + private MonoBehaviourTree currentMBT; + private Editor currentMBTEditor; + private Node[] currentNodes; + private Node selectedNode; + private bool nodeMoved = false; + private Vector2 workspaceOffset; + private NodeHandle currentHandle; + private NodeHandle dropdownHandleCache; + private bool snapNodesToGrid; + private bool locked = false; + + private Rect nodeFinderActivatorRect; + private NodeDropdown nodeDropdown; + private Vector2 nodeDropdownTargetPosition; + + private readonly float _handleDetectionDistance = 8f; + private readonly Color _editorBackgroundColor = new Color(0.16f, 0.19f, 0.25f, 1); + private GUIStyle _lockButtonStyle; + private GUIStyle _defaultNodeStyle; + private GUIStyle _selectedNodeStyle; + private GUIStyle _successNodeStyle; + private GUIStyle _failureNodeStyle; + private GUIStyle _runningNodeStyle; + private GUIStyle _nodeContentBoxStyle; + private GUIStyle _nodeLabelStyle; + private GUIStyle _nodeBreakpointLabelStyle; + + private void OnEnable() + { + // Read snap option + snapNodesToGrid = EditorPrefs.GetBool("snapNodesToGrid", true); + // Setup events + EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; + EditorApplication.playModeStateChanged += OnPlayModeStateChanged; + Undo.undoRedoPerformed -= UpdateSelection; + Undo.undoRedoPerformed += UpdateSelection; + // Node finder + nodeDropdown = new NodeDropdown(new AdvancedDropdownState(), AddNode); + // Standard node + _defaultNodeStyle = new GUIStyle(); + _defaultNodeStyle.border = new RectOffset(10,10,10,10); + _defaultNodeStyle.normal.background = Resources.Load("mbt_node_default", typeof(Texture2D)) as Texture2D; + // Selected node + _selectedNodeStyle = new GUIStyle(); + _selectedNodeStyle.border = new RectOffset(10,10,10,10); + _selectedNodeStyle.normal.background = Resources.Load("mbt_node_selected", typeof(Texture2D)) as Texture2D; + // Success node + _successNodeStyle = new GUIStyle(); + _successNodeStyle.border = new RectOffset(10,10,10,10); + _successNodeStyle.normal.background = Resources.Load("mbt_node_success", typeof(Texture2D)) as Texture2D; + // Failure node + _failureNodeStyle = new GUIStyle(); + _failureNodeStyle.border = new RectOffset(10,10,10,10); + _failureNodeStyle.normal.background = Resources.Load("mbt_node_failure", typeof(Texture2D)) as Texture2D; + // Running node + _runningNodeStyle = new GUIStyle(); + _runningNodeStyle.border = new RectOffset(10,10,10,10); + _runningNodeStyle.normal.background = Resources.Load("mbt_node_running", typeof(Texture2D)) as Texture2D; + // Node content box + _nodeContentBoxStyle = new GUIStyle(); + _nodeContentBoxStyle.padding = new RectOffset(0,0,15,15); + // Node label + _nodeLabelStyle = new GUIStyle(); + _nodeLabelStyle.normal.textColor = Color.white; + _nodeLabelStyle.alignment = TextAnchor.MiddleCenter; + _nodeLabelStyle.wordWrap = true; + _nodeLabelStyle.margin = new RectOffset(10,10,10,10); + _nodeLabelStyle.font = Resources.Load("mbt_Lato-Regular", typeof(Font)) as Font; + _nodeLabelStyle.fontSize = 12; + // Node label when breakpoint is set to true + _nodeBreakpointLabelStyle = new GUIStyle(_nodeLabelStyle); + _nodeBreakpointLabelStyle.normal.textColor = new Color(1f, 0.35f, 0.18f); + } + + private void OnDisable() + { + EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; + Undo.undoRedoPerformed -= UpdateSelection; + } + + [MenuItem("Window/Mono Behaviour Tree")] + public static void OpenEditor() + { + BehaviourTreeWindow window = GetWindow(); + window.titleContent = new GUIContent( + "Behaviour Tree", + Resources.Load("mbt_window_icon", typeof(Texture2D)) as Texture2D + ); + } + + void OnGUI() + { + // Draw grid in background first + PaintBackground(); + + // If there is no tree to render just skip rest + if (currentMBT == null) { + // Keep toolbar rendered + PaintWindowToolbar(); + return; + } + + PaintConnections(Event.current); + + // Repaint nodes + PaintNodes(); + + PaintWindowToolbar(); + + // Update selection and drag + ProcessEvents(Event.current); + + if (GUI.changed) Repaint(); + } + + private void PaintConnections(Event e) + { + // Paint line when dragging connection + if (currentHandle != null) { + Handles.BeginGUI(); + Vector3 p1 = new Vector3(currentHandle.position.x, currentHandle.position.y, 0f); + Vector3 p2 = new Vector3(e.mousePosition.x, e.mousePosition.y, 0f); + Handles.DrawBezier(p1, p2, p1, p2, new Color(0.3f, 0.36f, 0.5f), null, 4f); + Handles.EndGUI(); + } + // Paint all current connections + for (int i = 0; i < currentNodes.Length; i++) + { + Node n = currentNodes[i]; + Vector3 p1 = GetBottomHandlePosition(n.rect) + workspaceOffset; + for (int j = 0; j < n.children.Count; j++) + { + Handles.BeginGUI(); + Vector3 p2 = GetTopHandlePosition(n.children[j].rect) + workspaceOffset; + Handles.DrawBezier(p1, p2, p1, p2, new Color(0.3f, 0.36f, 0.5f), null, 4f); + Handles.EndGUI(); + } + } + } + + private void PaintWindowToolbar() + { + EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); + EditorGUI.BeginDisabledGroup(currentMBT == null); + if (GUILayout.Toggle(snapNodesToGrid, "Snap Nodes", EditorStyles.toolbarButton) != snapNodesToGrid) + { + snapNodesToGrid = !snapNodesToGrid; + // Store this setting + EditorPrefs.SetBool("snapNodesToGrid", snapNodesToGrid); + } + // TODO: Autolayout + // if (GUILayout.Button("Auto Layout", EditorStyles.toolbarButton)){ + // Debug.Log("Auto layout is not implemented."); + // } + EditorGUILayout.Space(); + if (GUILayout.Button("Focus Root", EditorStyles.toolbarButton)){ + FocusRoot(); + } + if (GUILayout.Button("Select In Hierarchy", EditorStyles.toolbarButton)){ + if (currentMBT != null) + { + Selection.activeGameObject = currentMBT.gameObject; + EditorGUIUtility.PingObject(currentMBT.gameObject); + } + } + if (GUILayout.Button("Add Node", EditorStyles.toolbarDropDown)){ + OpenNodeFinder(nodeFinderActivatorRect, false); + } + if (Event.current.type == EventType.Repaint) nodeFinderActivatorRect = GUILayoutUtility.GetLastRect(); + EditorGUI.EndDisabledGroup(); + GUILayout.FlexibleSpace(); + if (currentMBT != null) + { + GUILayout.Label(string.Format("{0} {1}", currentMBT.name, -workspaceOffset)); + } + EditorGUILayout.EndHorizontal(); + } + + void FocusRoot() + { + Root rootNode = null; + for (int i = 0; i < currentNodes.Length; i++) + { + if (currentNodes[i] is Root) { + rootNode = currentNodes[i] as Root; + break; + } + } + if (rootNode != null) { + workspaceOffset = -rootNode.rect.center + new Vector2(this.position.width/2, this.position.height/2); + } + } + + private void OnPlayModeStateChanged(PlayModeStateChange state) + { + // Disable lock when changing state + this.locked = false; + UpdateSelection(); + Repaint(); + } + + void OnInspectorUpdate() + { + // OPTIMIZE: This can be optimized to call repaint once per second + Repaint(); + } + + void OnSelectionChange() + { + MonoBehaviourTree previous = currentMBT; + UpdateSelection(); + // Reset workspace position only when selection changed + if (previous != currentMBT) + { + workspaceOffset = Vector2.zero; + } + Repaint(); + } + + void OnFocus() + { + UpdateSelection(); + Repaint(); + } + + void IHasCustomMenu.AddItemsToMenu(GenericMenu menu) + { + menu.AddItem(new GUIContent("Lock"), this.locked, () => { + this.locked = !this.locked; + UpdateSelection(); + }); + } + + // http://leahayes.co.uk/2013/04/30/adding-the-little-padlock-button-to-your-editorwindow.html + private void ShowButton(Rect position) + { + // Cache style + if (_lockButtonStyle == null) { + _lockButtonStyle = "IN LockButton"; + } + // Generic menu button + GUI.enabled = currentMBT != null; + this.locked = GUI.Toggle(position, this.locked, GUIContent.none, _lockButtonStyle); + GUI.enabled = true; + } + + // DeselectNode cannot be called here + // void OnLostFocus() + // { + // // DeselectNode(); + // } + + private void UpdateSelection() + { + MonoBehaviourTree prevMBT = currentMBT; + if (!this.locked && Selection.activeGameObject != null) + { + currentMBT = Selection.activeGameObject.GetComponent(); + // If new selection is null then restore previous one + if (currentMBT == null) + { + currentMBT = prevMBT; + } + } + if (currentMBT != prevMBT) + { + // Get new editor for new MBT + Editor.CreateCachedEditor(currentMBT, null, ref currentMBTEditor); + } + if (currentMBT != null) { + currentNodes = currentMBT.GetComponents(); + // Ensure there is no error when node script is missing + for (int i = 0; i < currentNodes.Length; i++) + { + currentNodes[i].children.RemoveAll(item => item == null); + } + } else { + currentNodes = new Node[0]; + // Unlock when there is nothing to display + this.locked = false; + } + } + + private void ProcessEvents(Event e) + { + switch (e.type) + { + case EventType.MouseDown: + if (e.button == 0) { + // Reset flag + nodeMoved = false; + // Frist check if any node handle was clicked + NodeHandle handle = FindHandle(e.mousePosition); + if (handle != null) + { + currentHandle = handle; + e.Use(); + break; + } + Node node = FindNode(e.mousePosition); + // Select node if contains point + if (node != null) { + DeselectNode(); + SelectNode(node); + if (e.clickCount == 2 && node is SubTree) { + SubTree subTree = node as SubTree; + if (subTree.tree != null) { + Selection.activeGameObject = subTree.tree.gameObject; + } + } + } else { + DeselectNode(); + } + e.Use(); + } else if (e.button == 1) { + Node node = FindNode(e.mousePosition); + // Open proper context menu + if (node != null) { + OpenNodeMenu(e.mousePosition, node); + } else { + DeselectNode(); + OpenNodeFinder(new Rect(e.mousePosition.x, e.mousePosition.y, 1, 1)); + } + e.Use(); + } + break; + case EventType.MouseDrag: + // Drag node, workspace or connection + if (e.button == 0) { + if (currentHandle != null) { + // Let PaintConnections draw lines + } else if (selectedNode != null) { + Undo.RecordObject(selectedNode, "Move Node"); + selectedNode.rect.position += Event.current.delta; + // Move whole branch when Ctrl is pressed + if (e.control) { + List movedNodes = selectedNode.GetAllSuccessors(); + for (int i = 0; i < movedNodes.Count; i++) + { + Undo.RecordObject(movedNodes[i], "Move Node"); + movedNodes[i].rect.position += Event.current.delta; + } + } + nodeMoved = true; + } else { + workspaceOffset += Event.current.delta; + } + GUI.changed = true; + e.Use(); + } + break; + case EventType.MouseUp: + if (currentHandle != null) { + TryConnectNodes(currentHandle, e.mousePosition); + } + // Reorder or snap nodes in case any of them was moved + if (nodeMoved && selectedNode != null) { + // Snap nodes if option is enabled + if (snapNodesToGrid) + { + Undo.RecordObject(selectedNode, "Move Node"); + selectedNode.rect.position = SnapPositionToGrid(selectedNode.rect.position); + // When control is pressed snap successors too + if (e.control) { + List movedNodes = selectedNode.GetAllSuccessors(); + for (int i = 0; i < movedNodes.Count; i++) + { + Undo.RecordObject(movedNodes[i], "Move Node"); + movedNodes[i].rect.position = SnapPositionToGrid(movedNodes[i].rect.position); + } + } + } + // Reorder siblings if selected node has parent + if (selectedNode.parent != null) + { + Undo.RecordObject(selectedNode.parent, "Move Node"); + selectedNode.parent.SortChildren(); + } + } + nodeMoved = false; + currentHandle = null; + GUI.changed = true; + break; + } + } + + Vector2 SnapPositionToGrid(Vector2 position) + { + return new Vector2( + Mathf.Round(position.x / 20f) * 20f, + Mathf.Round(position.y / 20f) * 20f + ); + } + + private void TryConnectNodes(NodeHandle handle, Vector2 mousePosition) + { + // Find hovered node and connect or open dropdown + Node targetNode = FindNode(mousePosition); + if (targetNode == null) { + OpenNodeFinder(new Rect(mousePosition.x, mousePosition.y, 1, 1), true, handle); + return; + } + // Check if they are not the same node + if (targetNode == handle.node) { + return; + } + Undo.RecordObject(targetNode, "Connect Nodes"); + Undo.RecordObject(handle.node, "Connect Nodes"); + // There is node, try to connect if this is possible + if (handle.type == HandleType.Input && targetNode is IParentNode) { + // Do not allow connecting descendants as parents + if (targetNode.IsDescendantOf(handle.node)) { + return; + } + // Then add as child to new parent + targetNode.AddChild(handle.node); + // Update order of nodes + targetNode.SortChildren(); + } else if (handle.type == HandleType.Output && targetNode is IChildrenNode) { + // Do not allow connecting descendants as parents + if (handle.node.IsDescendantOf(targetNode)) { + return; + } + // Then add as child to new parent + handle.node.AddChild(targetNode); + // Update order of nodes + handle.node.SortChildren(); + } + } + + private void SelectNode(Node node) + { + currentMBT.selectedEditorNode = node; + currentMBTEditor.Repaint(); + node.selected = true; + selectedNode = node; + GUI.changed = true; + } + + private void DeselectNode(Node node) + { + currentMBT.selectedEditorNode = null; + currentMBTEditor.Repaint(); + node.selected = false; + selectedNode = null; + GUI.changed = true; + } + + private void DeselectNode() + { + currentMBT.selectedEditorNode = null; + currentMBTEditor.Repaint(); + for (int i = 0; i < currentNodes.Length; i++) + { + currentNodes[i].selected = false; + } + selectedNode = null; + GUI.changed = true; + } + + private Node FindNode(Vector2 mousePosition) + { + for (int i = 0; i < currentNodes.Length; i++) + { + // Get correct position of node with offset + Rect target = currentNodes[i].rect; + target.position += workspaceOffset; + if (target.Contains(mousePosition)) { + return currentNodes[i]; + } + } + return null; + } + + private NodeHandle FindHandle(Vector2 mousePosition) + { + for (int i = 0; i < currentNodes.Length; i++) + { + Node node = currentNodes[i]; + // Get correct position of node with offset + Rect targetRect = node.rect; + targetRect.position += workspaceOffset; + + if (node is IChildrenNode) { + Vector2 handlePoint = GetTopHandlePosition(targetRect); + if (Vector2.Distance(handlePoint, mousePosition) < _handleDetectionDistance) { + return new NodeHandle(node, handlePoint, HandleType.Input); + } + } + if (node is IParentNode) { + Vector2 handlePoint = GetBottomHandlePosition(targetRect); + if (Vector2.Distance(handlePoint, mousePosition) < _handleDetectionDistance) { + return new NodeHandle(node, handlePoint, HandleType.Output); + } + } + } + return null; + } + + private void PaintNodes() + { + for (int i = currentNodes.Length - 1; i >= 0 ; i--) + { + Node node = currentNodes[i]; + Rect targetRect = node.rect; + targetRect.position += workspaceOffset; + // Draw node content + GUILayout.BeginArea(targetRect, GetNodeStyle(node)); + GUILayout.BeginVertical(_nodeContentBoxStyle); + if (node.breakpoint) + { + GUILayout.Label(node.title, _nodeBreakpointLabelStyle); + } + else + { + GUILayout.Label(node.title, _nodeLabelStyle); + } + GUILayout.EndVertical(); + if (Event.current.type == EventType.Repaint) + { + node.rect.height = GUILayoutUtility.GetLastRect().height; + } + GUILayout.EndArea(); + + // Paint warning icon + if (!Application.isPlaying && !node.IsValid()) + { + GUI.Label(GetWarningIconRect(targetRect), EditorGUIUtility.IconContent("CollabConflict Icon")); + } + + // Draw connection handles if needed + if (node is IChildrenNode) + { + Vector2 top = GetTopHandlePosition(targetRect); + GUI.DrawTexture( + new Rect(top.x-8, top.y-5, 16, 16), + Resources.Load("mbt_node_handle", typeof(Texture2D)) as Texture2D + ); + } + if (node is IParentNode) + { + Vector2 bottom = GetBottomHandlePosition(targetRect); + GUI.DrawTexture( + new Rect(bottom.x-8, bottom.y-11, 16, 16), + Resources.Load("mbt_node_handle", typeof(Texture2D)) as Texture2D + ); + } + } + } + + private GUIStyle GetNodeStyle(Node node) + { + if (node.selected) { + return _selectedNodeStyle; + } + switch (node.status) + { + case Status.Success: + return _successNodeStyle; + case Status.Failure: + return _failureNodeStyle; + case Status.Running: + return _runningNodeStyle; + } + return _defaultNodeStyle; + } + + private Vector2 GetTopHandlePosition(Rect rect) + { + return new Vector2(rect.x + rect.width/2, rect.y); + } + + private Vector2 GetBottomHandlePosition(Rect rect) + { + return new Vector2(rect.x + rect.width/2, rect.y + rect.height); + } + + private Rect GetWarningIconRect(Rect rect) + { + // return new Rect(rect.x - 10, rect.y + rect.height/2 - 10 , 20, 20); + return new Rect(rect.x + rect.width - 2, rect.y - 1, 20, 20); + } + + private void OpenNodeFinder(Rect rect, bool useRectPosition = true, NodeHandle handle = null) + { + // Store handle to connect later (null by default) + dropdownHandleCache = handle; + // Store real clicked position including workspace offset + if (useRectPosition) { + nodeDropdownTargetPosition = rect.position - workspaceOffset; + } else { + nodeDropdownTargetPosition = new Vector2(this.position.width/2, this.position.height/2) - workspaceOffset; + } + // Open dropdown + nodeDropdown.Show(rect); + } + + private void OpenNodeMenu(Vector2 mousePosition, Node node) + { + GenericMenu genericMenu = new GenericMenu(); + genericMenu.AddItem(new GUIContent("Breakpoint"), node.breakpoint, () => ToggleNodeBreakpoint(node)); + genericMenu.AddItem(new GUIContent("Duplicate"), false, () => DuplicateNode(node)); + genericMenu.AddItem(new GUIContent("Disconnect Children"), false, () => DisconnectNodeChildren(node)); + genericMenu.AddItem(new GUIContent("Disconnect Parent"), false, () => DisconnectNodeParent(node)); + genericMenu.AddItem(new GUIContent("Delete Node"), false, () => DeleteNode(node)); + genericMenu.ShowAsContext(); + } + + void AddNode(ClassTypeDropdownItem item) + { + // In case there is nothing to add + if (currentMBT == null || item.classType == null) { + return; + } + // Allow only one root + if (item.classType.IsAssignableFrom(typeof(Root)) && currentMBT.GetComponent() != null) { + Debug.LogWarning("You can not add more than one Root node."); + return; + } + Undo.SetCurrentGroupName("Create Node"); + Node node = (Node)Undo.AddComponent(currentMBT.gameObject, item.classType); + node.title = item.name; + node.hideFlags = HideFlags.HideInInspector; + node.rect.position = nodeDropdownTargetPosition - new Vector2(node.rect.width/2, 0); + UpdateSelection(); + if (dropdownHandleCache != null) { + // Add additonal offset (3,3) to be sure that point is inside rect + TryConnectNodes(dropdownHandleCache, nodeDropdownTargetPosition + workspaceOffset + new Vector2(3,3)); + } + } + + private void ToggleNodeBreakpoint(Node node) + { + // Toggle breakpoint flag + // Undo.RecordObject(node, "Toggle Breakpoint"); + node.breakpoint = !node.breakpoint; + } + + private void DeleteNode(Node node) + { + if (currentMBT == null) { + return; + } + DeselectNode(); + // Disconnect all children and parent + Undo.SetCurrentGroupName("Delete Node"); + DisconnectNodeChildren(node); + DisconnectNodeParent(node); + Undo.DestroyObjectImmediate(node); + // DestroyImmediate(node, true); + UpdateSelection(); + } + + private void DisconnectNodeParent(Node node) + { + if (node.parent != null) { + Undo.RecordObject(node, "Disconnect Parent"); + Undo.RecordObject(node.parent, "Disconnect Parent"); + node.parent.RemoveChild(node); + } + } + + private void DisconnectNodeChildren(Node node) + { + Undo.RecordObject(node, "Disconnect Children"); + for (int i = node.children.Count - 1; i >= 0 ; i--) + { + Undo.RecordObject(node.children[i], "Disconnect Children"); + node.RemoveChild(node.children[i]); + } + } + + private void DuplicateNode(Node contextNode) + { + // NOTE: This code is mostly copied from AddNode() + // Check if there is MBT + if (currentMBT == null) { + return; + } + System.Type classType = contextNode.GetType(); + // Allow only one root + if (classType.IsAssignableFrom(typeof(Root)) && currentMBT.GetComponent() != null) { + Debug.LogWarning("You can not add more than one Root node."); + return; + } + Undo.SetCurrentGroupName("Duplicate Node"); + Node node = (Node)Undo.AddComponent(currentMBT.gameObject, classType); + // Copy values + EditorUtility.CopySerialized(contextNode, node); + // Set flags anyway to ensure it is not visible in inspector + node.hideFlags = HideFlags.HideInInspector; + node.rect.position = contextNode.rect.position + new Vector2(20, 20); + // Remove all connections or graph gonna break + node.parent = null; + node.children.Clear(); + UpdateSelection(); + } + + /// It is quite unique, but https://stackoverflow.com/questions/2920696/how-generate-unique-integers-based-on-guids + private int GenerateId() + { + return System.Guid.NewGuid().GetHashCode(); + } + + private void PaintBackground() + { + // Background + Handles.BeginGUI(); + Handles.DrawSolidRectangleWithOutline(new Rect(0, 0, position.width, position.height), _editorBackgroundColor, Color.gray); + Handles.EndGUI(); + // Grid lines + DrawBackgroundGrid(20, 0.1f, new Color(0.3f, 0.36f, 0.5f)); + DrawBackgroundGrid(100, 0.2f, new Color(0.3f, 0.36f, 0.5f)); + } + + /// Method copied from https://gram.gs/gramlog/creating-node-based-editor-unity/ + private void DrawBackgroundGrid(float gridSpacing, float gridOpacity, Color gridColor) + { + int widthDivs = Mathf.CeilToInt(position.width / gridSpacing); + int heightDivs = Mathf.CeilToInt(position.height / gridSpacing); + + Handles.BeginGUI(); + + Handles.color = new Color(gridColor.r, gridColor.g, gridColor.b, gridOpacity); + + Vector3 newOffset = new Vector3(workspaceOffset.x % gridSpacing, workspaceOffset.y % gridSpacing, 0); + + for (int i = 0; i <= widthDivs; i++) + { + Handles.DrawLine(new Vector3(gridSpacing * i, -gridSpacing, 0) + newOffset, new Vector3(gridSpacing * i, position.height+gridSpacing, 0f) + newOffset); + } + + for (int j = 0; j <= heightDivs; j++) + { + Handles.DrawLine(new Vector3(-gridSpacing, gridSpacing * j, 0) + newOffset, new Vector3(position.width+gridSpacing, gridSpacing * j, 0f) + newOffset); + } + + Handles.color = Color.white; + Handles.EndGUI(); + } + + private class NodeHandle + { + public Node node; + public Vector2 position; + public HandleType type; + + public NodeHandle(Node node, Vector2 position, HandleType type) + { + this.node = node; + this.position = position; + this.type = type; + } + } + + private enum HandleType + { + Input, Output + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Editor/BehaviourTreeWindow.cs.meta b/Assets/MonoBehaviourTree/Source/Editor/BehaviourTreeWindow.cs.meta new file mode 100644 index 00000000..a2d4eb51 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/BehaviourTreeWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 238d35a99c7b4b14da156f1c64f9e342 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Editor/BlackboardEditor.cs b/Assets/MonoBehaviourTree/Source/Editor/BlackboardEditor.cs new file mode 100644 index 00000000..12204460 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/BlackboardEditor.cs @@ -0,0 +1,210 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using System; +using System.Linq; +using System.Reflection; +using MBT; + +namespace MBTEditor +{ + [CustomEditor(typeof(Blackboard))] + public class BlackboardEditor : Editor + { + const double CONSTANT_REPAINT_INTERVAL = 0.5d; + + readonly string[] varOptions = new string[]{"Delete"}; + SerializedProperty variables; + SerializedProperty masterBlackboardProperty; + GUIStyle popupStyle; + string newVariableKey = ""; + string[] variableTypesNames = new string[0]; + Type[] variableTypes = new Type[0]; + int selectedVariableType = 0; + Blackboard blackboard; + GameObject blackboardGameObject; + bool showVariables = true; + private double lastRepaint; + + void OnEnable() + { + // Set hide flags in case object was duplicated or turned into prefab + if (target != null) + { + Blackboard bb = (Blackboard) target; + // Sample one variable and check if its hidden. Hide all varialbes if sample is visible. + if (bb.TryGetComponent(out BlackboardVariable bv) && bv.hideFlags != HideFlags.HideInInspector) + { + BlackboardVariable[] vars = bb.GetComponents(); + for (int i = 0; i < vars.Length; i++) + { + vars[i].hideFlags = HideFlags.HideInInspector; + } + } + } + // Init + variables = serializedObject.FindProperty("variables"); + masterBlackboardProperty = serializedObject.FindProperty("masterBlackboard"); + blackboard = target as Blackboard; + blackboardGameObject = blackboard.gameObject; + SetupVariableTypes(); + } + + void OnDestroy() + { + // Remove all variables in case Blackboard was removed + if (Application.isEditor && (Blackboard)target == null && blackboardGameObject != null) + { + // Additional check to avoid errors when exiting playmode + if (Application.IsPlaying(blackboardGameObject) || blackboardGameObject.GetComponent() != null) + { + return; + } + BlackboardVariable[] blackboardVariables = blackboardGameObject.GetComponents(); + for (int i = 0; i < blackboardVariables.Length; i++) + { + Undo.DestroyObjectImmediate(blackboardVariables[i]); + } + } + } + + public override bool RequiresConstantRepaint() + { + return Application.isPlaying && EditorApplication.timeSinceStartup > lastRepaint + CONSTANT_REPAINT_INTERVAL; + } + + private void SetupVariableTypes() + { + List types = new List(); + List names = new List(); + + // Find all types + foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) + { + IEnumerable enumerable = assembly.GetTypes() + .Where(myType => myType.IsClass && !myType.IsAbstract && myType.IsSubclassOf(typeof(BlackboardVariable))); + foreach (Type type in enumerable) + { + names.Add(type.Name); + types.Add(type); + } + } + variableTypesNames = names.ToArray(); + variableTypes = types.ToArray(); + } + + public override void OnInspectorGUI() + { + // Update repaint timer + lastRepaint = EditorApplication.timeSinceStartup; + // Init styles + if (popupStyle == null) { + popupStyle = new GUIStyle(GUI.skin.GetStyle("PaneOptions")); + popupStyle.imagePosition = ImagePosition.ImageOnly; + popupStyle.margin.top += 3; + } + + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(masterBlackboardProperty); + EditorGUILayout.Space(); + if (EditorGUI.EndChangeCheck()) { + serializedObject.ApplyModifiedProperties(); + } + + // Fields used to add variables + EditorGUILayout.LabelField("Create Variable", EditorStyles.boldLabel); + EditorGUILayout.Space(); + EditorGUILayout.BeginHorizontal(); + GUILayout.Label("Key", GUILayout.MaxWidth(80)); + newVariableKey = EditorGUILayout.TextField(newVariableKey); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + GUILayout.Label("Type", GUILayout.MaxWidth(80)); + selectedVariableType = EditorGUILayout.Popup(selectedVariableType, variableTypesNames); + GUI.SetNextControlName("AddButton"); + if (GUILayout.Button("Add", EditorStyles.miniButton)) { + CreateVariableAndResetInput(); + } + EditorGUILayout.EndHorizontal(); + EditorGUILayout.Space(); + + // DrawDefaultInspector(); + // EditorGUILayout.Space(); + + // serializedObject.Update(); + // EditorGUI.BeginChangeCheck(); + showVariables = EditorGUILayout.BeginFoldoutHeaderGroup(showVariables, "Variables"); + if(showVariables){ + SerializedProperty vars = variables.Copy(); + if (vars.isArray) { + // xxx: Why this line existed? Why EventType.DragPerform is not allowed here? (maybe BeginChangeCheck) + // if (vars.isArray && Event.current.type != EventType.DragPerform) { + for (int i = 0; i < vars.arraySize; i++) + { + EditorGUI.BeginChangeCheck(); + int popupOption = -1; + SerializedProperty serializedV = vars.GetArrayElementAtIndex(i); + SerializedObject serializedVariable = new SerializedObject(serializedV.objectReferenceValue); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PrefixLabel( + new GUIContent(serializedVariable.FindProperty("key").stringValue, + serializedVariable.targetObject.GetType().Name) + ); + int v = EditorGUILayout.Popup(popupOption, varOptions, popupStyle, GUILayout.MaxWidth(20)); + EditorGUILayout.PropertyField(serializedVariable.FindProperty("val"), GUIContent.none); + EditorGUILayout.EndHorizontal(); + + if (EditorGUI.EndChangeCheck()) { + serializedVariable.ApplyModifiedProperties(); + } + // Delete on change + if (v != popupOption) { + DeleteVariabe(serializedV.objectReferenceValue as BlackboardVariable); + } + } + } + } + EditorGUILayout.EndFoldoutHeaderGroup(); + EditorGUILayout.Space(); + + // if (EditorGUI.EndChangeCheck()) { + // serializedObject.ApplyModifiedProperties(); + // } + } + + private void DeleteVariabe(BlackboardVariable blackboardVariable) + { + Undo.RecordObject(blackboard, "Delete Blackboard Variable"); + blackboard.variables.Remove(blackboardVariable); + Undo.DestroyObjectImmediate(blackboardVariable); + } + + private void CreateVariableAndResetInput() + { + // Validate field. Key "None" is not allowed. + if (string.IsNullOrEmpty(newVariableKey) || newVariableKey.Equals("None")) { + return; + } + string k = new string( newVariableKey.ToCharArray().Where(c => !Char.IsWhiteSpace(c)).ToArray() ); + // Check for key duplicates + for (int i = 0; i < blackboard.variables.Count; i++) + { + if (blackboard.variables[i].key == k) { + Debug.LogWarning("Variable '"+k+"' already exists."); + return; + } + } + // Add variable + Undo.RecordObject(blackboard, "Create Blackboard Variable"); + BlackboardVariable var = Undo.AddComponent(blackboard.gameObject, variableTypes[selectedVariableType]) as BlackboardVariable; + var.hideFlags = HideFlags.HideInInspector; + var.key = k; + blackboard.variables.Add(var); + // Reset field + newVariableKey = ""; + GUI.FocusControl("Clear"); + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Editor/BlackboardEditor.cs.meta b/Assets/MonoBehaviourTree/Source/Editor/BlackboardEditor.cs.meta new file mode 100644 index 00000000..9e23d032 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/BlackboardEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b2b8d2392660b6e46bcbb8bd44a1be30 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Editor/InvokeUnityEventEditor.cs b/Assets/MonoBehaviourTree/Source/Editor/InvokeUnityEventEditor.cs new file mode 100644 index 00000000..722c585b --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/InvokeUnityEventEditor.cs @@ -0,0 +1,126 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using MBT; +using System; + +namespace MBTEditor +{ + [CustomEditor(typeof(InvokeUnityEvent))] + public class InvokeUnityEventEditor : Editor + { + SerializedProperty titleProp; + SerializedProperty typeProp; + + private SerializedProperty transformEventProp; + private SerializedProperty gameObjectEventProp; + private SerializedProperty floatEventProp; + private SerializedProperty intEventProp; + private SerializedProperty boolEventProp; + private SerializedProperty stringEventProp; + private SerializedProperty vector3EventProp; + private SerializedProperty vector2EventProp; + + private SerializedProperty transformReferenceProp; + private SerializedProperty gameObjectReferenceProp; + private SerializedProperty floatReferenceProp; + private SerializedProperty intReferenceProp; + private SerializedProperty boolReferenceProp; + private SerializedProperty stringReferenceProp; + private SerializedProperty vector3ReferenceProp; + private SerializedProperty vector2ReferenceProp; + + void OnEnable() + { + titleProp = serializedObject.FindProperty("title"); + typeProp = serializedObject.FindProperty("type"); + + transformEventProp = serializedObject.FindProperty("transformEvent"); + gameObjectEventProp = serializedObject.FindProperty("gameObjectEvent"); + floatEventProp = serializedObject.FindProperty("floatEvent"); + intEventProp = serializedObject.FindProperty("intEvent"); + boolEventProp = serializedObject.FindProperty("boolEvent"); + stringEventProp = serializedObject.FindProperty("stringEvent"); + vector3EventProp = serializedObject.FindProperty("vector3Event"); + vector2EventProp = serializedObject.FindProperty("vector2Event"); + + transformReferenceProp = serializedObject.FindProperty("transformReference"); + gameObjectReferenceProp = serializedObject.FindProperty("gameObjectReference"); + floatReferenceProp = serializedObject.FindProperty("floatReference"); + intReferenceProp = serializedObject.FindProperty("intReference"); + boolReferenceProp = serializedObject.FindProperty("boolReference"); + stringReferenceProp = serializedObject.FindProperty("stringReference"); + vector3ReferenceProp = serializedObject.FindProperty("vector3Reference"); + vector2ReferenceProp = serializedObject.FindProperty("vector2Reference"); + } + + private static readonly GUIContent variableLabel = new GUIContent("Parameter"); + private static readonly GUIContent eventLabel = new GUIContent("Event"); + + public override void OnInspectorGUI() + { + serializedObject.Update(); + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.PropertyField(titleProp); + EditorGUILayout.PropertyField(typeProp); + EditorGUILayout.Space(); + + if (GetSerializedProperties(out SerializedProperty eventProp, out SerializedProperty variableProp)) + { + EditorGUILayout.PropertyField(variableProp, variableLabel); + EditorGUILayout.PropertyField(eventProp, eventLabel); + } + + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + } + } + + private bool GetSerializedProperties(out SerializedProperty eventProp, out SerializedProperty referenceProp) + { + InvokeUnityEvent.EventType eventType = (InvokeUnityEvent.EventType)typeProp.enumValueIndex; + switch (eventType) + { + case InvokeUnityEvent.EventType.Transform: + eventProp = transformEventProp; + referenceProp = transformReferenceProp; + return true; + case InvokeUnityEvent.EventType.Float: + eventProp = floatEventProp; + referenceProp = floatReferenceProp; + return true; + case InvokeUnityEvent.EventType.GameObject: + eventProp = gameObjectEventProp; + referenceProp = gameObjectReferenceProp; + return true; + case InvokeUnityEvent.EventType.Int: + eventProp = intEventProp; + referenceProp = intReferenceProp; + return true; + case InvokeUnityEvent.EventType.String: + eventProp = stringEventProp; + referenceProp = stringReferenceProp; + return true; + case InvokeUnityEvent.EventType.Vector3: + eventProp = vector3EventProp; + referenceProp = vector3ReferenceProp; + return true; + case InvokeUnityEvent.EventType.Vector2: + eventProp = vector2EventProp; + referenceProp = vector2ReferenceProp; + return true; + case InvokeUnityEvent.EventType.Bool: + eventProp = boolEventProp; + referenceProp = boolReferenceProp; + return true; + default: + eventProp = null; + referenceProp = null; + return false; + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Editor/InvokeUnityEventEditor.cs.meta b/Assets/MonoBehaviourTree/Source/Editor/InvokeUnityEventEditor.cs.meta new file mode 100644 index 00000000..0cc6d063 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/InvokeUnityEventEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 007923a936f7a7d4a9e8b8bc59f97592 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Editor/IsSetConditionEditor.cs b/Assets/MonoBehaviourTree/Source/Editor/IsSetConditionEditor.cs new file mode 100644 index 00000000..272c2887 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/IsSetConditionEditor.cs @@ -0,0 +1,60 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using MBT; + +namespace MBTEditor +{ + [CustomEditor(typeof(IsSetCondition))] + public class IsSetConditionEditor : Editor + { + SerializedProperty titleProp; + SerializedProperty abortProp; + SerializedProperty boolReferenceProp; + SerializedProperty objectReferenceProp; + SerializedProperty transformReferenceProp; + SerializedProperty typeProp; + SerializedProperty invertProp; + + void OnEnable() + { + titleProp = serializedObject.FindProperty("title"); + boolReferenceProp = serializedObject.FindProperty("boolReference"); + objectReferenceProp = serializedObject.FindProperty("objectReference"); + transformReferenceProp = serializedObject.FindProperty("transformReference"); + abortProp = serializedObject.FindProperty("abort"); + typeProp = serializedObject.FindProperty("type"); + invertProp = serializedObject.FindProperty("invert"); + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.PropertyField(titleProp); + EditorGUILayout.PropertyField(abortProp); + EditorGUILayout.PropertyField(invertProp); + EditorGUILayout.Space(); + EditorGUILayout.PropertyField(typeProp); + if (typeProp.enumValueIndex == (int)IsSetCondition.Type.Boolean) + { + EditorGUILayout.PropertyField(boolReferenceProp, new GUIContent("Variable")); + } + else if (typeProp.enumValueIndex == (int)IsSetCondition.Type.GameObject) + { + EditorGUILayout.PropertyField(objectReferenceProp, new GUIContent("Variable")); + } + else + { + EditorGUILayout.PropertyField(transformReferenceProp, new GUIContent("Variable")); + } + + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Editor/IsSetConditionEditor.cs.meta b/Assets/MonoBehaviourTree/Source/Editor/IsSetConditionEditor.cs.meta new file mode 100644 index 00000000..4900d489 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/IsSetConditionEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 45cfc361407c0f4448f74c8395194f6a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Editor/MonoBehaviourTreeEditor.cs b/Assets/MonoBehaviourTree/Source/Editor/MonoBehaviourTreeEditor.cs new file mode 100644 index 00000000..2a6fe5e7 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/MonoBehaviourTreeEditor.cs @@ -0,0 +1,87 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using MBT; + +namespace MBTEditor +{ + [CustomEditor(typeof(MonoBehaviourTree))] + public class MonoBehaviourTreeEditor : Editor + { + private GUIStyle boxStyle; + private GUIStyle foldStyle; + private Editor nodeEditor; + + void InitStyle() + { + if (foldStyle == null) + { + boxStyle = new GUIStyle(EditorStyles.helpBox); + foldStyle = new GUIStyle(EditorStyles.foldoutHeader); + foldStyle.onNormal = foldStyle.onFocused; + } + } + + void OnEnable() + { + // Set hide flags in case object was duplicated or turned into prefab + if (target == null) + { + return; + } + MonoBehaviourTree mbt = (MonoBehaviourTree) target; + // Sample one component and check if its hidden. Hide all nodes if sample is visible. + if (mbt.TryGetComponent(out Node n) && n.hideFlags != HideFlags.HideInInspector) + { + Node[] nodes = mbt.GetComponents(); + for (int i = 0; i < nodes.Length; i++) + { + nodes[i].hideFlags = HideFlags.HideInInspector; + } + } + } + + void OnDisable() + { + // Destroy editor if there is any + if (nodeEditor != null) + { + DestroyImmediate(nodeEditor); + } + } + + public override void OnInspectorGUI() + { + InitStyle(); + + DrawDefaultInspector(); + GUILayout.Space(5); + + if (GUILayout.Button("Open editor")) { + BehaviourTreeWindow.OpenEditor(); + } + + EditorGUILayout.Space(); + + MonoBehaviourTree mbt = ((MonoBehaviourTree) target); + bool renderNodeInspector = mbt.selectedEditorNode != null; + + EditorGUILayout.Foldout(renderNodeInspector, "Node inspector", foldStyle); + EditorGUILayout.Space(1); + if (renderNodeInspector) + { + EditorGUILayout.BeginHorizontal(boxStyle); + GUILayout.Space(3); + EditorGUILayout.BeginVertical(); + GUILayout.Space(5); + Editor.CreateCachedEditor(mbt.selectedEditorNode, null, ref nodeEditor); + nodeEditor.OnInspectorGUI(); + GUILayout.Space(5); + EditorGUILayout.EndVertical(); + EditorGUILayout.EndHorizontal(); + } + EditorGUILayout.Space(); + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Editor/MonoBehaviourTreeEditor.cs.meta b/Assets/MonoBehaviourTree/Source/Editor/MonoBehaviourTreeEditor.cs.meta new file mode 100644 index 00000000..d5fafa31 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/MonoBehaviourTreeEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f78abb7d7a304aa41a91ef451cc8cb6e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Editor/NodeDropdown.cs b/Assets/MonoBehaviourTree/Source/Editor/NodeDropdown.cs new file mode 100644 index 00000000..d81441f2 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/NodeDropdown.cs @@ -0,0 +1,143 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using System; +using System.Linq; +using System.Reflection; +using UnityEditor.IMGUI.Controls; +using MBT; + +namespace MBTEditor +{ + public class ClassTypeDropdownItem : AdvancedDropdownItem + { + public Type classType; + public int order; + public string path; + + public ClassTypeDropdownItem(string name, Type type = null, int order = 1000, string path = "") : base(name) + { + this.classType = type; + this.order = order; + this.path = path; + } + } + + public class NodeDropdown : AdvancedDropdown + { + protected Action Callback; + + public NodeDropdown(AdvancedDropdownState state, Action callback) : base(state) + { + this.Callback = callback; + minimumSize = new Vector2(230,320); + } + + protected override AdvancedDropdownItem BuildRoot() + { + var root = new ClassTypeDropdownItem("Nodes"); + + // List for all found subclasses + List results = new List(); + + // Search all assemblies + foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) + { + // Find all subclasses of Node + IEnumerable enumerable = assembly.GetTypes() + .Where(myType => myType.IsClass && !myType.IsAbstract && myType.IsSubclassOf(typeof(Node))); + results.AddRange(enumerable); + } + + // Keep track of all paths to correctly build tree later + Dictionary nodePathsDictionary = new Dictionary(); + nodePathsDictionary.Add("", root); + // Create list of items + List items = new List(); + foreach (Type type in results) + { + if(type.IsDefined(typeof(MBTNode), false)) + { + MBTNode nodeMeta = type.GetCustomAttribute(); + string itemName; + string nodePath = ""; + if (String.IsNullOrEmpty(nodeMeta.name)) + { + itemName = type.Name; + } + else + { + string[] path = nodeMeta.name.Split('/'); + itemName = path[path.Length-1]; + nodePath = BuildPathIfNotExists(path, ref nodePathsDictionary); + } + ClassTypeDropdownItem classTypeDropdownItem = new ClassTypeDropdownItem(itemName, type, nodeMeta.order, nodePath); + if (nodeMeta.icon != null) + { + classTypeDropdownItem.icon = Resources.Load(nodeMeta.icon, typeof(Texture2D)) as Texture2D; + } + items.Add(classTypeDropdownItem); + } + } + + // Sort items + items.Sort((x, y) => { + int result = x.order.CompareTo(y.order); + return result != 0 ? result : x.name.CompareTo(y.name); + }); + + // Add all nodes to menu + for (int i = 0; i < items.Count; i++) + { + nodePathsDictionary[items[i].path].AddChild(items[i]); + } + + // Remove root to avoid infinite root folder loop + nodePathsDictionary.Remove(""); + List parentNodes = nodePathsDictionary.Values.ToList(); + parentNodes.Sort((x, y) => { + return x.name.CompareTo(y.name); + }); + + // Add folders + for (int i = 0; i < parentNodes.Count(); i++) + { + root.AddChild(parentNodes[i]); + } + + return root; + } + + protected override void ItemSelected(AdvancedDropdownItem item) + { + Callback(item as ClassTypeDropdownItem); + } + + /// + /// Creates nodes if path does not exists. Supports only signle level folders. + /// + /// Path to build. Last element should be actual node name. + /// Reference to dictionary to store references to items + /// Path to provided node in path + protected string BuildPathIfNotExists(string[] path, ref Dictionary dictionary) + { + // IMPORTANT: This code supports only single level folders. Nodes can't be nested more than one level. + if (path.Length != 2) + { + return ""; + } + AdvancedDropdownItem root = dictionary[""]; + // // This code assumes the last element of path is actual name of node + // string nodePath = String.Join("/", path, 0, path.Length-1); + string nodePath = path[0]; + // Create path nodes if does not exists + if(!dictionary.ContainsKey(nodePath)) + { + ClassTypeDropdownItem node = new ClassTypeDropdownItem(nodePath); + dictionary.Add(nodePath, node); + } + return nodePath; + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Editor/NodeDropdown.cs.meta b/Assets/MonoBehaviourTree/Source/Editor/NodeDropdown.cs.meta new file mode 100644 index 00000000..0fe87640 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/NodeDropdown.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: adc3d2af9116c5b418b63f5da3dc6feb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Editor/NumberConditionEditor.cs b/Assets/MonoBehaviourTree/Source/Editor/NumberConditionEditor.cs new file mode 100644 index 00000000..9a94464f --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/NumberConditionEditor.cs @@ -0,0 +1,66 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using MBT; + +namespace MBTEditor +{ + [CustomEditor(typeof(NumberCondition))] + public class NumberConditionEditor : Editor + { + SerializedProperty titleProp; + SerializedProperty abortProp; + SerializedProperty floatReferenceProp; + SerializedProperty intReferenceProp; + SerializedProperty floatReference2Prop; + SerializedProperty intReference2Prop; + SerializedProperty typeProp; + SerializedProperty comparatorProp; + + void OnEnable() + { + titleProp = serializedObject.FindProperty("title"); + floatReferenceProp = serializedObject.FindProperty("floatReference"); + intReferenceProp = serializedObject.FindProperty("intReference"); + floatReference2Prop = serializedObject.FindProperty("floatReference2"); + intReference2Prop = serializedObject.FindProperty("intReference2"); + abortProp = serializedObject.FindProperty("abort"); + typeProp = serializedObject.FindProperty("type"); + comparatorProp = serializedObject.FindProperty("comparator"); + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.PropertyField(titleProp); + EditorGUILayout.PropertyField(abortProp); + EditorGUILayout.PropertyField(typeProp); + EditorGUILayout.Space(); + // GUILayout.Label("Condition"); + if (typeProp.enumValueIndex == (int)NumberCondition.Type.Float) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PropertyField(floatReferenceProp, GUIContent.none); + EditorGUILayout.PropertyField(comparatorProp, GUIContent.none, GUILayout.MaxWidth(60f)); + EditorGUILayout.PropertyField(floatReference2Prop, GUIContent.none); + EditorGUILayout.EndHorizontal(); + } + else + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PropertyField(intReferenceProp, GUIContent.none); + EditorGUILayout.PropertyField(comparatorProp, GUIContent.none, GUILayout.MaxWidth(60f)); + EditorGUILayout.PropertyField(intReference2Prop, GUIContent.none); + EditorGUILayout.EndHorizontal(); + } + + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Editor/NumberConditionEditor.cs.meta b/Assets/MonoBehaviourTree/Source/Editor/NumberConditionEditor.cs.meta new file mode 100644 index 00000000..90c6cad6 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/NumberConditionEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4b9e3631627d49b4f8349f9efdf7d65a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Editor/Qriva.MonoBehaviourTree.Editor.asmdef b/Assets/MonoBehaviourTree/Source/Editor/Qriva.MonoBehaviourTree.Editor.asmdef new file mode 100644 index 00000000..e5321e89 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/Qriva.MonoBehaviourTree.Editor.asmdef @@ -0,0 +1,17 @@ +{ + "name": "Qriva.MonoBehaviourTree.Editor", + "references": [ + "GUID:b94eb722e14bb88498f76d28e55be3fa" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/MonoBehaviourTree/Source/Editor/Qriva.MonoBehaviourTree.Editor.asmdef.meta b/Assets/MonoBehaviourTree/Source/Editor/Qriva.MonoBehaviourTree.Editor.asmdef.meta new file mode 100644 index 00000000..5d470f17 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/Qriva.MonoBehaviourTree.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c2da7737aab07f248add22487334a422 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Editor/Resources.meta b/Assets/MonoBehaviourTree/Source/Editor/Resources.meta new file mode 100644 index 00000000..bf7e8bcc --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: af68a1f59256fd94f95d09ca43a95485 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Editor/Resources/OFL.txt b/Assets/MonoBehaviourTree/Source/Editor/Resources/OFL.txt new file mode 100644 index 00000000..98383e3d --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/Resources/OFL.txt @@ -0,0 +1,93 @@ +Copyright (c) 2010-2014 by tyPoland Lukasz Dziedzic (team@latofonts.com) with Reserved Font Name "Lato" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/Assets/MonoBehaviourTree/Source/Editor/Resources/OFL.txt.meta b/Assets/MonoBehaviourTree/Source/Editor/Resources/OFL.txt.meta new file mode 100644 index 00000000..08d1de12 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/Resources/OFL.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 217896aaf46e40f4bb3a0d03862bac36 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_Lato-Bold.ttf b/Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_Lato-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b63a14d6aeec11bce432820914e73db28e489634 GIT binary patch literal 73316 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 M$8RP7dXDOU1KQ%3=>Px# literal 0 HcmV?d00001 diff --git a/Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_Lato-Bold.ttf.meta b/Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_Lato-Bold.ttf.meta new file mode 100644 index 00000000..b3a04d52 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_Lato-Bold.ttf.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 4230cef5e36d34240987d46954f779ad +TrueTypeFontImporter: + externalObjects: {} + serializedVersion: 4 + fontSize: 16 + forceTextureCase: -2 + characterSpacing: 0 + characterPadding: 1 + includeFontData: 1 + fontName: Lato + fontNames: + - Lato + fallbackFontReferences: + - {fileID: 12800000, guid: 7dbc24fe8e0f7e34ebaaf3637032d72e, type: 3} + customCharacters: + fontRenderingMode: 0 + ascentCalculationMode: 1 + useLegacyBoundsCalculation: 0 + shouldRoundAdvanceValue: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_Lato-Regular.ttf b/Assets/MonoBehaviourTree/Source/Editor/Resources/mbt_Lato-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..33eba8b192384487f04951539f13bf1f8dd9f9cb GIT binary patch literal 75136 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 ojk(g9PAtLVP?*9aY%s*7(); + Blackboard blackboard = GetBlackboardInParent(inspectedComponent); + if (blackboard != null) + { + // Draw mode toggle if not disabled + if (property.FindPropertyRelative("mode").enumValueIndex == 0) + { + Rect togglePosition = position; + togglePosition.width = 8; + togglePosition.height = 16; + useConstProperty.boolValue = EditorGUI.Toggle(togglePosition, useConstProperty.boolValue, constVarGUIStyle); + position.xMin += 10; + } + + // Draw constant or dropdown + if (useConstProperty.boolValue) + { + // Use constant variable + EditorGUI.PropertyField(position, property.FindPropertyRelative("constantValue"), label); + } + else + { + System.Type desiredVariableType = fieldInfo.FieldType.BaseType.GetGenericArguments()[0]; + BlackboardVariable[] variables = blackboard.GetAllVariables(); + List keys = new List(); + keys.Add("None"); + for (int i = 0; i < variables.Length; i++) + { + BlackboardVariable bv = variables[i]; + if (bv.GetType() == desiredVariableType) { + keys.Add(bv.key); + } + } + // Setup dropdown + // INFO: "None" can not be used as key + int selected = keys.IndexOf(keyProperty.stringValue); + if (selected < 0) { + selected = 0; + // If key is not empty it means variable was deleted and missing + if (!System.String.IsNullOrEmpty(keyProperty.stringValue)) + { + keys[0] = "Missing"; + } + } + int result = EditorGUI.Popup(position, label.text, selected, keys.ToArray()); + if (result > 0) { + keyProperty.stringValue = keys[result]; + blackboardProperty.objectReferenceValue = blackboard; + } else { + keyProperty.stringValue = ""; + blackboardProperty.objectReferenceValue = null; + } + } + } + else + { + EditorGUI.LabelField(position, property.displayName); + int indent = EditorGUI.indentLevel; + EditorGUI.indentLevel = 1; + position.y += EditorGUI.GetPropertyHeight(keyProperty);// + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(position, keyProperty); + position.y += EditorGUI.GetPropertyHeight(blackboardProperty);// + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(position, blackboardProperty); + EditorGUI.indentLevel = indent; + } + } + + + if (EditorGUI.EndChangeCheck()) { + property.serializedObject.ApplyModifiedProperties(); + } + + EditorGUI.EndProperty(); + } + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + MonoBehaviour monoBehaviour = property.serializedObject.targetObject as MonoBehaviour; + if (monoBehaviour != null && GetBlackboardInParent(monoBehaviour) == null) { + return 3 * (EditorGUIUtility.standardVerticalSpacing + 16); + } + return 16 + EditorGUIUtility.standardVerticalSpacing; + } + + /// + /// Find Blackboard in parent including inactive game objects + /// + /// Component to search + /// Blackboard if found, otherwise null + protected Blackboard GetBlackboardInParent(Component component) + { + Transform current = component.transform; + Blackboard result = null; + while (current != null && result == null) + { + if (current.TryGetComponent(out Blackboard b)) + { + result = b; + } + current = current.parent; + } + return result; + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Editor/VariableReferenceDrawer.cs.meta b/Assets/MonoBehaviourTree/Source/Editor/VariableReferenceDrawer.cs.meta new file mode 100644 index 00000000..d320a416 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Editor/VariableReferenceDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ab4047381b703f94a844906084b35480 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/LICENSE b/Assets/MonoBehaviourTree/Source/LICENSE new file mode 100644 index 00000000..34b20fb6 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Qriva + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Assets/MonoBehaviourTree/Source/LICENSE.meta b/Assets/MonoBehaviourTree/Source/LICENSE.meta new file mode 100644 index 00000000..136700b9 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/LICENSE.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 253fb677ccf902d4c83f13ae18604c9f +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/README.md b/Assets/MonoBehaviourTree/Source/README.md new file mode 100644 index 00000000..671e1997 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/README.md @@ -0,0 +1,341 @@ +# MonoBehaviourTree — Simple behaviour tree for Unity + +This project is simple event driven behaviour tree based on Unity engine component system. This asset comes with minimal node library and tree visual editor. [Online version of this readme](https://github.com/Qriva/MonoBehaviourTree/blob/master/README.md) + +**Important:** This is not fully fledged visual scripting tool. Package has its own visual editor, however requires you to implement your own nodes. + +## Contribute +Contribution in any form is very welcome. Bugs, feature requests or feedback can be reported in form of Issues. + +## Getting started +The latest version can be installed via [package manager](https://docs.unity3d.com/Manual/upm-ui-giturl.html) using following git URL:
```https://github.com/Qriva/MonoBehaviourTree.git#upm``` +
Alternatively you can copy the `Assets/MonoBehaviourTree` folder to your project or download from [Unity Asset Store](https://assetstore.unity.com/packages/slug/213452). + +Examples of usage are available in package manager or in folder **Samples** containing demo scenes. If you copy assets manually you might want to delete `Samples` directory to get rid of redundant files. + +This documentation assumes you have basic knowledge about behaviour trees. If you don't have it, you should check some online resources like this +[Game Developer article](https://www.gamedeveloper.com/programming/behavior-trees-for-ai-how-they-work) +or [Unreal Engine documentation](https://docs.unrealengine.com/en-US/Engine/ArtificialIntelligence/BehaviorTrees/BehaviorTreesOverview/index.html). + +## Event Driven Behaviour Tree Overview +Standard behaviour tree design assumes three types of nodes: composites, decorators and leafs. Composites are used to define the flow in the tree, decorators can modify node results and leafs perform tasks or check conditions. This design has one major flaw - tree must be traversed from the beginning every single tick, otherwise it will not be possible to react to changes in state or data. Event driven tree is the fix to that problem. When tree gets update it continues from the last executed running node. Normally it would mean, that executed higher priority nodes will not be reevaluated immediately, but event driven BT introduces **abort system** to give possibility to reset tree to previous state, when certain event occur. Implementation used in this project is very similar to the one used in Unreal engine - leaf nodes are not used as conditions, instead they are in form of decorators. Additionally it is possible to create Service nodes which can perform task periodically. + +### Node Abort +When the tree is updated, the first evaluated thing are aborting nodes. If there is any aborting node, the tree will be reset to that position and execution will be continued from this node. +In case there are multiple aborting nodes, the one closest to root will be selected. +There are four abort types: +- **None** - don't do anything when change occurs +- **Self** - abort children running below +- **Lower Priority** - abort running nodes with lower priority (nodes to the right) +- **Both** - abort self and lower priority nodes + +>Execution order (priority) of nodes with common ancestor is defined by position on X axis, nodes to the left has higher priority. + +Aborts can be performed only by ```Decorator``` nodes. See example abort implementation in [Decorator](#custom-decorator--condition) section. + +## Basic Usage +The main core of behaviour tree is **MonoBehaviourTree** component. It contains most of tree state during runtime. It is important to note, that tree does not run automatically and must be updated by other script. This design gives you possibility to tick the tree in Update, FixedUpdate or custom interval. However, most of the time Update event will be used, so you can use component **MBT Executor** to do that. + +In most of cases you will need some place to store shared data for nodes. You could implement your own component to do that, but instead it's better to use built in **Blackboard** component. Blackboard allows you to create observable variables of predefined types that are compatible with default nodes. + +## Node editor +To open tree editor window click "Open editor" button of MonoBehaviourTree component or click Unity menu: Window / Mono Behaviour Tree. In visual editor you can create, connect, delete and setup nodes. + +Every behaviour tree needs an entry point called **Root**. To add it right click on empty canvas to open node popup, then select Root. Execution of BT starts here and goes from top to down, left to right. + +> **Implementation note:** All nodes and variables are in fact components, but they are invisible in inspector window. +> It is recommended to use separate empty game object to build the tree - this make it easier to create prefabs and avoid unnecessary unknown problems. + +Most of nodes has additional properties that you can change. To do this select the node and list of options will show up in **MonoBehaviourTree component inspector** section (standard component inspector). When node setup is not valid, error icon will be shown next to the node. By default error is displayed if one of variable references is set to "None". You can create custom validation rules in your own nodes, see [Node API section](#node-api). + +### Editor Window Features +Right click on empty space to create new node. To connect nodes click on in/out handler (black dot on top and bottom of node), then drag and drop it above another node. In case node cannot have more than one child (decorator) the connection will be overridden by the new one. +To delete, duplicate or disconnect nodes right click on node to open context menu and select the appropriate option. +Use left mouse button to drag workspace or nodes. You can drag whole branch of nodes when CTRL key is pressed. + +## Component Reference + +### MonoBehaviourTree component +Main component used as hub of behaviour tree. + +**Properties** +- **Description** - optional user description. +- **Repeat OnFinish** - whether the tree should be executed again when finished. +- **Max Executions Per Tick** - how many nodes should be executed during single update. +- **Parent** - parent reference if this tree is subtree. Read more in [Subtree node section](#subtree). + +**Node Inspector** - Inspector of node selected in Behaviour Tree editor window. + +### Blackboard component +Component used to provide and manage observable variables. +To add variable fill the **Key** text field, select it's type and press "Add" button. Key is used as identifier to get or set variable value, this can be done by VariableReference or blackboard method: ```public T GetVariable(string key)```. +Blackboard component displays all available variables in list and allows to set initial value for each of them. +> **Implementation note:** Changing blackboard variables during playmode triggers change listeners, however old and new value will be the same in this event, because it's called from `OnValidate`. Displayed values are refreshed every half second. + +**Built In variable types:** Bool, Float, Int, Object, Quaternion, String, Transform, Vector2, Vector3. If you need to add your own custom type read [Custom Variable section](#custom-variable). + +**Master Blackboard** option allows to make synchronisation effect between variables. When set, blackboard will replace variables during initialization, but only when their keys match. Replacement is not hierarhical and only variables from given parent blackboard are matched. It is recommended to create one master blackboard on top of the tree and keep all other subtrees blackboards synchronized with the top one. + +## Variables and Events +In most of situations nodes need to share some state data between each other, it can be done by Blackboard, Variable and VariableReference system. Variables are observale data containers, that can be accesed via Blackboard. To get variable you need to know its key, but inputting key manually to every node is not handy and very error prone. + +To avoid this you can use helper class VariableReference. +This class allows you to automaticaly get and cache reference to blackboard variable. +VariableReference has also constant value mode in case you don't need to retrive values from blackboard. You can toggle VarRef mode in editor by clicking small button to the left. Keys displayed in dropdown will be loaded from blackboard on the same object or if there is none it will look upwards the hierarchy to find one. +```csharp +// Get variable from blackboard by key +FloatVariable floatVar = blackboard.GetVariable("myKey"); + +// Attach listener to variable +floatVar.AddListener(MyVariableChangeListener); + +// Create float reference property with default constant value +public FloatReference floatRef = new FloatReference(1f); + +// Create int reference, but do not allow constant values +public IntReference intRef = new IntReference(VarRefMode.DisableConstant); + +// Check if its in constant or reference mode +bool constant = floatRef.isConstant; + +// Attach listener to variable reference +if (!constant) +{ + // GetVariable will return null if floatRef is constant + floatRef.GetVariable().AddListener(MyVariableChangeListener); +} + +// Get or set value of variable reference +floatRef.Value = 1.5f; +float value = floatRef.Value; +``` +> **Important:** TransformVariable change listener will be called only when reference to object changes. Position or rotation changes do not trigger change listener. + +### Custom Variable +If built in variables are not enough, you can create your own. +To create new Variable and VariableReference you must extend Variable class and VariableReference class. Variable inheriths MonoBehaviour, so to work properly it must by placed in file of the same name as your custom type. VariableReference is normal serializable class and can be placed in the same file. Add ```[AddComponentMenu("")]``` attribute to disallow adding variable component manually. + +Any variable must implement ValueEquals method which is used to detect change of value. This mechanism allows to correctly compare Unity objects in generic class, avoid boxing, plus gives the way to implement your own change detection logic when needed. +```csharp +[AddComponentMenu("")] +public class CustomVariable : Variable +{ + protected override bool ValueEquals(CustomType val1, CustomType val2) + { + return val1 == val2; + } +} + +[System.Serializable] +public class CustomReference : VariableReference +{ + // You can create additional constructors and Value getter/setter + // See FloatVariable.cs as example + + // If your variable is reference type you might want constant validation + // protected override bool isConstantValid + // { + // get { return constantValue != null; } + // } +} +``` + +## Node Reference + +### Root +Entry node of behaviour tree. +### Sequence +Executes children from left to right as long as each subsequent child returns success. Returns success when all children succeeded. Failure if one of them failed. When Random option is enabled, then execution goes in random order. +### Selector +Executes children from left to right until one of them return failure. Returns success if any children succeed. Failure if all of them failed. When Random option is enabled, then execution goes in random order. +### Is Set Condition +Checks if blackboard variable is set. Node supports Bollean, Object and Transform variables. Selecting Invert option will produce "If not set" effect. +### Number Condition +Checks if blackboard number variable meets requirement. Node supports Float and Int variables. +### Distance Condition +Checks distance between two transforms and returns success when given distance condition is met. +### Cooldown +Blocks execition until the specified amount of time has elapsed. +Time starts counting after branch is exited. If abort is enabled, the execution will be moved back to this node after time has elapsed. +### Force Result +Forces success or failure. +### Inverter +Inverts node result. Failure becomes Success and vice versa. +### Invoke Unity Event +Triggers Unity Event with one parameter of selected type +### Random Chance +There is fixed chance that node will be executed. Returns Failure if roll is not favorable. +### Random Float +Generates random float in provided range. +### Random Integer +Generates random integer in provided range. +### Repeat Until Fail +Repeats branch as long as Success is returned from the child. Use Loop node to create a more advanced flow. +### Repeater +Repeats branch specified amount of times or infinitely. Use Loop node to create a more advanced flow. +### Loop +Repeats branch specified amount of times, infinitely or until selected result is returned. Results and flow can be fully customized. +### Set Boolean +Sets blackboard bool variable +### Set Number +Sets blackboard int or float variable +### Set Object +Sets blackboard Transform or GameObject variable +### Set Vector +Sets blackboard Vector3 or Vector2 variable +### Succeeder +Always returns Success. +### Time Limit +Determines how long branch can be executed. After given time elapses branch is aborted and Failure is returned. +### Calculate Distance Service +Calculates distance between two transforms and updates blackboard float variable with the result. +### Update Position Service +Updates blackboard Vector3 variable with position of given source transform. +### Set Number +Sets blackboard Float or Int variable. +### Wait +Waits specific amount of time, then returns Success. +### Subtree +Subtree node allows connection of other behaviour tree as child, this gives you possibility to create reusable blocks of nodes. Such a tree must be created in separate game object and attached as children. Child tree is updated by its parent. **Parent of subtree must be specified in MonoBehaviourTree component to work properly.** + +## Creating custom nodes +It is possible to create custom nodes by extending one of base classes provided by library. Each node **must** be in separate file with the name corresponding to class name. MBTNode attribute is required to register node in editor finder, it accepts two parameters: name and order. Name allows use of up to one folder, so "Custom Node" and "Example/Custom Node" is valid, but "Fruits/Bananas/Custom Node" is not. +Order parameter is used to position node higher in finder. Nodes are sorted first by order and then by name. Default order is 1000 and lower values get higher priority. For example Selector, Sequence, Root and SubTree nodes have following values: 100, 150, 200, 250. + +### Node API +There are several event methods that can be implemented to control Node execution flow, but the only required one is ```Execute``` used to return state when node is running. +```OnEnter``` and ```OnExit``` primary function is to setup before or cleanup after execution. +```OnAllowInterrupt``` and ```OnDisallowInterrupt``` can be used to detect when its allowed to abort or listen to some events. +Additionally there is ```IsValid``` method used in editor window to determine if Node setup is correct. By default it uses reflection to find variable references with empty keys and in most of cases there is no need to override this method, unless you want to include other fields during validation or custom setup requires it. + +### Execution Flow +During runtime node can be in one of following states: +- **Ready** - Default state +- **Running** - Node is currently executed or one of its successors +- **Success** - Node finished execution and returned success +- **Failure** - Node finished execution and returned failure + +When node is ready and parent decide to "enter" the node, then ```OnAllowInterrupt``` and ```OnEnter``` is called. After that ```Execute``` method is called which always must return some state. +If running state is returned, then execution will be paused and resumed in next tick, but if running with children node is returned, then execution is "passed down" and continued in that node. +When success or failure is returned, then this result is passed to the parent and ```OnExit``` is called. ```OnDisallowInterrupt``` is not called until the cycle ends or tree is aborted to higher priority node. + +### Custom Leaf +Leaf nodes are used to do designated task. It can be something simple as setting variable or very complex like enemy navigation along the path. +```csharp +using UnityEngine; +using MBT; + +// Empty Menu attribute prevents Node to show up in "Add Component" menu. +[AddComponentMenu("")] +// Register node in visual editor node finder +[MBTNode(name = "Example/Custom Task")] +public class CustomTask : Leaf +{ + public BoolReference somePropertyRef = new BoolReference(); + + // These two methods are optional, override only when needed + // public override void OnAllowInterrupt() {} + // public override void OnEnter() {} + + // This is called every tick as long as node is executed + public override NodeResult Execute() + { + if (somePropertyRef.Value == true) + { + return NodeResult.success; + } + return NodeResult.failure; + } + + // These two methods are optional, override only when needed + // public override void OnExit() {} + // public override void OnDisallowInterrupt() {} + + // Usually there is no needed to override this method + public override bool IsValid() + { + // You can do some custom validation here + return !somePropertyRef.isInvalid; + } +} +``` +### Custom Decorator / Condition +Decorator nodes are mainy used to change flow of the tree. It has single child and must always return either success or failure. You can implement your own subclass by implementing ```Decorator``` class, however in most of cases you might want to create condition - in such a case use ```Condition``` subclass. Implement condition evaluation in ```Check()``` method and node will return success if condition is met. + +If you need to implement abort system in your condition node, then below you can find a simple example. +```csharp +[AddComponentMenu("")] +[MBTNode(name = "Example/Custom Condition")] +public class CustomCondition : Condition +{ + public Abort abort; + public BoolReference somePropertyRef = new BoolReference(VarRefMode.DisableConstant); + + public override bool Check() + { + // Evaluate your custom condition + return somePropertyRef.Value == true; + } + + public override void OnAllowInterrupt() + { + // Do not listen any changes if abort is disabled + if (abort != Abort.None) + { + // This method cache current tree state used later by abort system + ObtainTreeSnapshot(); + // If somePropertyRef is constant, then null exception will be thrown. + // Use somePropertyRef.isConstant in case you need constant enabled. + // Constant variable is disabled here, so it is safe to do this. + somePropertyRef.GetVariable().AddListener(OnVariableChange); + } + } + + public override void OnDisallowInterrupt() + { + if (abort != Abort.None) + { + // Remove listener + somePropertyRef.GetVariable().RemoveListener(OnVariableChange); + } + } + + private void OnVariableChange(bool oldValue, bool newValue) + { + // Reevaluate Check() and abort tree when needed + EvaluateConditionAndTryAbort(abort); + } +} +``` +### Custom Service +Service is a special decorator that performs the task as long as its branch is executed. This way you can periodically execute some task needed only by the ancestors. Additionally you can fully encapsulate your system into single behaviour tree without need of external scripts running on other game objects. + +```csharp +[AddComponentMenu("")] +[MBTNode("Example/Custom Service")] +public class CustomService : Service +{ + public Vector3Reference position = new Vector3Reference(VarRefMode.DisableConstant); + + public override void Task() + { + // Reset variable to zero every X amount of time + position.Value = Vector3.zero; + } +} +``` + +## Debugging +During playmode you can preview tree execution flow in editor window. Nodes are marked with the appropriate color corresponding to their state: +- Ready - none (default) +- Success - green +- Failure - orange +- Running - purple + +When the node is invalid, an error icon will be displayed in the upper right corner. You should not run the tree when there are any errors in connected nodes. + +Except that, you can set breakpoints on multiple nodes. Breakpoint will stop execution and pause play mode after node is entered, but before it get executed. Nodes with breakpoint enabled will have red node names. + +## Known Issues +- All nodes should be removed before deleting their script. When the missing script is restored and children of this node were connected to other parent, it will break the tree. Additionaly nodes with missing script remain hidden in the inspector and it is hard to remove them. +- When tree is turned into prefab, all their instances should not change connections between nodes. Sometimes connections are desynchronized and the tree does not work properly. \ No newline at end of file diff --git a/Assets/MonoBehaviourTree/Source/README.md.meta b/Assets/MonoBehaviourTree/Source/README.md.meta new file mode 100644 index 00000000..eaaed610 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 77ea71eb8c4c7e644b3dbe712459545b +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime.meta b/Assets/MonoBehaviourTree/Source/Runtime.meta new file mode 100644 index 00000000..cef7591e --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0265dd17d4c1acd4d899831242a13242 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Blackboard.cs b/Assets/MonoBehaviourTree/Source/Runtime/Blackboard.cs new file mode 100644 index 00000000..f36e234f --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Blackboard.cs @@ -0,0 +1,94 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [DisallowMultipleComponent] + [DefaultExecutionOrder(-1000)] + public class Blackboard : MonoBehaviour + { + public List variables = new List(); + private Dictionary dictionary = new Dictionary(); + [Tooltip("When set, this blackboard will replace variables with matching names from target parent")] + public Blackboard masterBlackboard; + + // IMPROVEMENT: https://docs.unity3d.com/ScriptReference/ISerializationCallbackReceiver.html + void Awake() + { + // Initialize variables by keys + dictionary.Clear(); + for (int i = 0; i < variables.Count; i++) + { + BlackboardVariable var = variables[i]; + dictionary.Add(var.key, var); + } + // Replace variables from master blackboard + if (masterBlackboard != null) + { + List parentVars = masterBlackboard.variables; + for (int i = 0; i < parentVars.Count; i++) + { + // Find if there is variable with the same key + BlackboardVariable parentVar = parentVars[i]; + if (dictionary.TryGetValue(parentVar.key, out BlackboardVariable currentVar)) + { + // Ensure that both of them are the same type + if (currentVar.GetType().IsAssignableFrom(parentVar.GetType())) + { + // There are matching variables, replace current one with master blackboard var + dictionary[parentVar.key] = parentVar; + } + else + { + Debug.LogErrorFormat(this, + "Blackboard variable key '{0}' cannot be replaced. " + + "Master blackboard variable of type {1} cannot be assigned to {2}.", + currentVar.key, + parentVar.GetType().Name, + currentVar.GetType().Name + ); + } + } + } + } + } + + public BlackboardVariable[] GetAllVariables() + { + return variables.ToArray(); + } + + public T GetVariable(string key) where T : BlackboardVariable + { + return (dictionary.TryGetValue(key, out BlackboardVariable val)) ? (T)val : null; + } + + #if UNITY_EDITOR + [ContextMenu("Delete all variables", false)] + protected void DeleteAllVariables() + { + for (int i = 0; i < variables.Count; i++) + { + UnityEditor.Undo.DestroyObjectImmediate(variables[i]); + } + variables.Clear(); + } + + [ContextMenu("Delete all variables", true)] + protected bool HasVariables() + { + return variables.Count > 0; + } + + void OnValidate() + { + if (masterBlackboard == this) + { + Debug.LogWarning("Master blackboard cannot be the same instance."); + masterBlackboard = null; + } + } + #endif + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Blackboard.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Blackboard.cs.meta new file mode 100644 index 00000000..c0c4bd7a --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Blackboard.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6b2217e4d35c0c94ea02cf2166c17e4b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: cf1e8cb5def7ab848bce542b344bd1aa, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/IMonoBehaviourTreeTickListener.cs b/Assets/MonoBehaviourTree/Source/Runtime/IMonoBehaviourTreeTickListener.cs new file mode 100644 index 00000000..b10a0d1e --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/IMonoBehaviourTreeTickListener.cs @@ -0,0 +1,11 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + public interface IMonoBehaviourTreeTickListener + { + void OnBehaviourTreeTick(); + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/IMonoBehaviourTreeTickListener.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/IMonoBehaviourTreeTickListener.cs.meta new file mode 100644 index 00000000..e7d8a043 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/IMonoBehaviourTreeTickListener.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a72cb8ac73fa6f342b5a07b27abefd66 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/MBTExecutor.cs b/Assets/MonoBehaviourTree/Source/Runtime/MBTExecutor.cs new file mode 100644 index 00000000..4f71eae0 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/MBTExecutor.cs @@ -0,0 +1,33 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [DisallowMultipleComponent] + [RequireComponent(typeof(MonoBehaviourTree))] + public class MBTExecutor : MonoBehaviour + { + public MonoBehaviourTree monoBehaviourTree; + + void Reset() + { + monoBehaviourTree = GetComponent(); + OnValidate(); + } + + void Update() + { + monoBehaviourTree.Tick(); + } + + void OnValidate() + { + if (monoBehaviourTree != null && monoBehaviourTree.parent != null) + { + monoBehaviourTree = null; + Debug.LogWarning("Subtree should not be target of update. Select parent tree instead.", this.gameObject); + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/MBTExecutor.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/MBTExecutor.cs.meta new file mode 100644 index 00000000..29ef5bbc --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/MBTExecutor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4e5f392bbea2fa2499665ed8b604ff86 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/MBTNode.cs b/Assets/MonoBehaviourTree/Source/Runtime/MBTNode.cs new file mode 100644 index 00000000..7e4b3ba9 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/MBTNode.cs @@ -0,0 +1,22 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using System; + +namespace MBT +{ + [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] + public class MBTNode : Attribute + { + public string name; + public int order; + public string icon; + + public MBTNode(string name = null, int order = 1000, string icon = null) + { + this.name = name; + this.order = order; + this.icon = icon; + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/MBTNode.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/MBTNode.cs.meta new file mode 100644 index 00000000..e7f9522c --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/MBTNode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a03e885e14e321347ad1555636efa6f5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/MonoBehaviourTree.cs b/Assets/MonoBehaviourTree/Source/Runtime/MonoBehaviourTree.cs new file mode 100644 index 00000000..465302c0 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/MonoBehaviourTree.cs @@ -0,0 +1,329 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Events; +using Unity.Profiling; + +namespace MBT +{ + [DisallowMultipleComponent] + // [RequireComponent(typeof(Blackboard))] + public class MonoBehaviourTree : MonoBehaviour + { + private static readonly ProfilerMarker _TickMarker = new ProfilerMarker("MonoBehaviourTree.Tick"); + + [HideInInspector] + public Node selectedEditorNode; + public bool repeatOnFinish = false; + public int maxExecutionsPerTick = 1000; + public MonoBehaviourTree parent; + + /// + /// Event triggered when tree is about to be updated + /// + public event UnityAction onTick; + private List tickListeners = new List(); + private Root rootNode; + private List executionStack; + private List executionLog; + private List interruptingNodes = new List(); + public float LastTick { get; internal set; } + + void Awake() + { + rootNode = GetComponent(); + if (rootNode == null) { + Debug.LogWarning("Missing Root node in behaviour tree.", this); + } + + // Find master parent tree and all nodes + MonoBehaviourTree masterTree = this.GetMasterTree(); + Node[] nodes = GetComponents(); + if(masterTree == this) + { + // Create lists with capicity + executionStack = new List(8); + executionLog = new List(nodes.Length); + // Set start node when tree is created first time + executionStack.Add(rootNode); + executionLog.Add(rootNode); + } + // Initialize nodes of tree/subtree + for (int i = 0; i < nodes.Length; i++) + { + Node n = nodes[i]; + n.behaviourTree = masterTree; + n.runningNodeResult = new NodeResult(Status.Running, n); + } + } + + private void EvaluateInterruptions() + { + if (interruptingNodes.Count == 0) { + return; + } + + // Find node with highest priority - closest to the root (the smallest number) + Decorator abortingNode = interruptingNodes[0]; + for (int i = 1; i < interruptingNodes.Count; i++) + { + Decorator d = interruptingNodes[i]; + if (d.runtimePriority < abortingNode.runtimePriority) { + abortingNode = d; + } + } + + // Revert stack + executionStack.Clear(); + executionStack.AddRange(abortingNode.GetStoredTreeSnapshot()); + // Restore flow of events in nodes after abort + for (int i = 0; i < executionStack.Count; i++) + { + Node node = executionStack[i]; + if (node.status == Status.Running) + { + // This node is still running and might need to restore the state + node.OnBehaviourTreeAbort(); + } + else if (node.status == Status.Success || node.status == Status.Failure) + { + // This node returned failure or success, so reenter it and call OnEnter + node.OnEnter(); + } + // All nodes in execution stack should be in running state + node.status = Status.Running; + } + + int nodeIndex = abortingNode.runtimePriority - 1; + // Sanity check + if (abortingNode != executionLog[nodeIndex]) { + Debug.LogWarning("Priority of node does not match with exectuion log"); + } + // Abort nodes in log + ResetNodesTo(abortingNode, true); + // Reset aborting node + abortingNode.status = Status.Ready; + // Reset list and wait for new interruptions + interruptingNodes.Clear(); + } + + /// + /// Update tree state. + /// + public void Tick() + { + _TickMarker.Begin(); + // Fire Tick event and notify listeners + onTick?.Invoke(); + for (int i = 0; i < tickListeners.Count; i++) + { + tickListeners[i].OnBehaviourTreeTick(); + } + + // Check if there are any interrupting nodes + EvaluateInterruptions(); + + // Max number of traversed nodes + int executionLimit = maxExecutionsPerTick; + // Traverse tree + while (executionStack.Count > 0) + { + if (executionLimit == 0) { + LastTick = Time.time; + _TickMarker.End(); + return; + } + executionLimit -= 1; + + // Execute last element in stack + Node currentNode = executionStack[executionStack.Count - 1]; + NodeResult nodeResult = currentNode.Execute(); + // Set new status + currentNode.status = nodeResult.status; + if (nodeResult.status == Status.Running) { + // If node is running, then stop execution or continue children + Node child = nodeResult.child; + if (child == null) { + // Stop execution and continue next tick + LastTick = Time.time; + _TickMarker.End(); + return; + } else { + // Add child to execution stack and execute it in next loop + executionStack.Add(child); + executionLog.Add(child); + // IMPORTANT: Priority must be > 0 and assigned in this order + child.runtimePriority = executionLog.Count; + child.OnAllowInterrupt(); + child.OnEnter(); + #if UNITY_EDITOR + // Stop execution if breakpoint is set on this node + if (child.breakpoint) + { + Debug.Break(); + UnityEditor.Selection.activeGameObject = this.gameObject; + Debug.Log("MBT Breakpoint: " + child.title, this); + LastTick = Time.time; + _TickMarker.End(); + return; + } + #endif + continue; + } + } else { + // Remove last node from stack and move up (closer to root) + currentNode.OnExit(); + executionStack.RemoveAt(executionStack.Count - 1); + } + } + + // Run this when execution stack is empty and BT should repeat + if (repeatOnFinish) { + Restart(); + } + + LastTick = Time.time; + _TickMarker.End(); + } + + public void AddTickListener(IMonoBehaviourTreeTickListener listener) + { +#if UNITY_EDITOR + if (tickListeners.Contains(listener)) + { + Debug.LogErrorFormat(this, "Tick listener {0} has been already added.", listener); + } +#endif + tickListeners.Add(listener); + } + + public void RemoveTickListener(IMonoBehaviourTreeTickListener listener) + { + tickListeners.Remove(listener); + } + + /// + /// This method should be called to abort tree to given node + /// + /// Abort and revert tree to this node + internal void Interrupt(Decorator node) + { + if (!interruptingNodes.Contains(node)) { + interruptingNodes.Add(node); + } + } + + internal void ResetNodesTo(Node node, bool aborted = false) + { + int i = executionLog.Count - 1; + // Reset status and get index of node + while (i >= 0) + { + Node n = executionLog[i]; + if (n == node) { + break; + } + // If node is running (on exec stack) then call exit + if (n.status == Status.Running) { + n.OnExit(); + // IMPROVEMENT: Abort event can be added or abort param onExit + } + n.status = Status.Ready; + n.OnDisallowInterrupt(); + i -= 1; + } + // Reset log + i += 1; + if (i >= executionLog.Count) { + return; + } + executionLog.RemoveRange(i, executionLog.Count - i); + } + + private void ResetNodes() + { + for (int i = 0; i < executionLog.Count; i++) + { + Node node = executionLog[i]; + if (node.status == Status.Running) + { + node.OnExit(); + } + node.OnDisallowInterrupt(); + node.status = Status.Ready; + } + executionLog.Clear(); + executionStack.Clear(); + } + + /// + /// Resets state to root node + /// + public void Restart() + { + ResetNodes(); + executionStack.Add(rootNode); + executionLog.Add(rootNode); + } + + internal void GetStack(ref Node[] stack) + { + // Resize array when size is too small + if (executionStack.Count > stack.Length) + { + // Node should not change priority and position during runtime + // It means the array will be resized once during first call of this method + Array.Resize(ref stack, executionStack.Count); + } +#if UNITY_EDITOR + // Additional sanity check in case nodes are reordered or changed in editor + if (stack.Length > executionStack.Count) + { + Debug.LogError("Changing order of MBT nodes during runtime might cause errors or unpredictable results."); + } +#endif + // Copy elements to provided array + executionStack.CopyTo(stack); + } + + public Node GetRoot() + { + return rootNode; + } + + public MonoBehaviourTree GetMasterTree() + { + if (parent == null) + { + return this; + } + return parent.GetMasterTree(); + } + +#if UNITY_EDITOR + void OnValidate() + { + if (maxExecutionsPerTick <= 0) + { + maxExecutionsPerTick = 1; + } + + if (parent != null) + { + if (parent == this) + { + parent = null; + Debug.LogWarning("This tree cannot be its own parent."); + return; + } + if (transform.parent == null || parent.gameObject != transform.parent.gameObject) + { + // parent = null; + Debug.LogWarning("Parent tree should be also parent of this gameobject.", this.gameObject); + } + } + } +#endif + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/MonoBehaviourTree.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/MonoBehaviourTree.cs.meta new file mode 100644 index 00000000..d4306e70 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/MonoBehaviourTree.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b25af8627659c6949b60949c3aa8d91d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 8e319fb1e46299e4bb368bf700097d39, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes.meta new file mode 100644 index 00000000..6ca22be3 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ab968361104bced4eb5870774bffc1d4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/CalculateDistanceService.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/CalculateDistanceService.cs new file mode 100644 index 00000000..6a3bec81 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/CalculateDistanceService.cs @@ -0,0 +1,27 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode("Services/Calculate Distance Service")] + public class CalculateDistanceService : Service + { + [Space] + public TransformReference transform1; + public TransformReference transform2; + public FloatReference variable = new FloatReference(VarRefMode.DisableConstant); + + public override void Task() + { + Transform t1 = transform1.Value; + Transform t2 = transform2.Value; + if (t1 == null || t2 == null) + { + return; + } + variable.Value = Vector3.Distance(t1.position, t2.position); + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/CalculateDistanceService.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/CalculateDistanceService.cs.meta new file mode 100644 index 00000000..c2c71612 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/CalculateDistanceService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dc2659d9740e09744b583d40f78bde8a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Composite.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Composite.cs new file mode 100644 index 00000000..ce27801a --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Composite.cs @@ -0,0 +1,47 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + public abstract class Composite : Node, IParentNode, IChildrenNode + { + private static readonly System.Random rng = new System.Random(); + + public bool random = false; + + public override void AddChild(Node node) + { + if (!children.Contains(node)) + { + // Remove parent in case there is one already + if (node.parent != null) { + node.parent.RemoveChild(node); + } + children.Add(node); + node.parent = this; + } + } + + public override void RemoveChild(Node node) + { + if (children.Contains(node)) + { + children.Remove(node); + node.parent = null; + } + } + + protected static void ShuffleList(List list) + { + int n = list.Count; + while (n > 1) { + n--; + int k = rng.Next(n + 1); + T value = list[k]; + list[k] = list[n]; + list[n] = value; + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Composite.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Composite.cs.meta new file mode 100644 index 00000000..b732be02 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Composite.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e91b1b2e9c2fc234e83cb440a812b4fe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Condition.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Condition.cs new file mode 100644 index 00000000..0a0c0402 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Condition.cs @@ -0,0 +1,47 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + public abstract class Condition : Decorator + { + protected bool lastConditionCheckResult = false; + + public override NodeResult Execute() + { + if (!TryGetChild(out Node node)) + { + return NodeResult.failure; + } + if (node.status == Status.Success || node.status == Status.Failure) { + return NodeResult.From(node.status); + } + lastConditionCheckResult = Check(); + if (lastConditionCheckResult == false) { + return NodeResult.failure; + } + return node.runningNodeResult; + } + + /// + /// Reevaluate condition and try to abort the tree if required + /// + /// Abort type + protected void EvaluateConditionAndTryAbort(Abort abortType) + { + bool c = Check(); + if (c != lastConditionCheckResult) + { + lastConditionCheckResult = c; + TryAbort(abortType); + } + } + + /// + /// Method called to check condition + /// + /// Condition result + public abstract bool Check(); + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Condition.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Condition.cs.meta new file mode 100644 index 00000000..4e087073 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Condition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: caf17e0e40d8198449b5a547beb02515 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Cooldown.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Cooldown.cs new file mode 100644 index 00000000..b2fd7ac0 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Cooldown.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode(name = "Decorators/Cooldown")] + public class Cooldown : Decorator, IMonoBehaviourTreeTickListener + { + public AbortTypes abort = AbortTypes.None; + [Space] + public FloatReference time = new FloatReference(1f); + [Tooltip("When set to true, there will be no cooldown when child node returns failure")] + public bool resetOnChildFailure = false; + private float cooldownTime = 0f; + private bool entered = false; + private bool childFailed = false; + + public enum AbortTypes + { + None, LowerPriority + } + + public override void OnAllowInterrupt() + { + if (abort == AbortTypes.LowerPriority) + { + ObtainTreeSnapshot(); + } + } + + public override NodeResult Execute() + { + if (!TryGetChild(out Node node)) + { + return NodeResult.failure; + } + if (node.status == Status.Success) { + return NodeResult.success; + } + if (node.status == Status.Failure) { + // If reset option is enabled flag will be raised and set true + childFailed = resetOnChildFailure; + return NodeResult.failure; + } + if (cooldownTime <= Time.time) { + entered = true; + return node.runningNodeResult; + } else { + return NodeResult.failure; + } + } + + public override void OnExit() + { + // Setup cooldown and event when child was entered + // Check reset option too + if (entered && !childFailed) + { + cooldownTime = Time.time + time.Value; + // For LowerPriority try to abort after given time + if (abort == AbortTypes.LowerPriority) + { + behaviourTree.AddTickListener(this); + } + } + // Reset flags + entered = false; + childFailed = false; + } + + public override void OnDisallowInterrupt() + { + behaviourTree.RemoveTickListener(this); + } + + void IMonoBehaviourTreeTickListener.OnBehaviourTreeTick() + { + if (cooldownTime <= Time.time) + { + // Task should be aborted, so there is no need to listen anymore + behaviourTree.RemoveTickListener(this); + TryAbort(Abort.LowerPriority); + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Cooldown.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Cooldown.cs.meta new file mode 100644 index 00000000..7e10b168 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Cooldown.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2370820ab6f42c8449d09456ac02d66d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/CoroutineService.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/CoroutineService.cs new file mode 100644 index 00000000..55dadb49 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/CoroutineService.cs @@ -0,0 +1,68 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + public abstract class CoroutineService : Decorator + { + public float interval = 1f; + public bool callOnEnter = true; + protected Coroutine coroutine; + private WaitForSeconds waitForSeconds; + + public override void OnEnter() + { + // IMPROVEMENT: WaitForSeconds could be initialized in some special node init callback + if (waitForSeconds == null) + { + // Create new WaitForSeconds + OnValidate(); + } + coroutine = StartCoroutine(ScheduleTask()); + if (callOnEnter) + { + Task(); + } + } + + public override NodeResult Execute() + { + Node node = GetChild(); + if (node == null) { + return NodeResult.failure; + } + if (node.status == Status.Success || node.status == Status.Failure) { + return NodeResult.From(node.status); + } + return node.runningNodeResult; + } + + public abstract void Task(); + + public override void OnExit() + { + if (coroutine == null) + { + return; + } + StopCoroutine(coroutine); + coroutine = null; + } + + private IEnumerator ScheduleTask() + { + while(true) + { + yield return waitForSeconds; + Task(); + } + } + + protected virtual void OnValidate() + { + interval = Mathf.Max(0f, interval); + waitForSeconds = new WaitForSeconds(interval); + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/CoroutineService.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/CoroutineService.cs.meta new file mode 100644 index 00000000..33220a8d --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/CoroutineService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9cf48bbd74f869449a0045ef1e4de316 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Decorator.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Decorator.cs new file mode 100644 index 00000000..a165de2e --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Decorator.cs @@ -0,0 +1,111 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + public abstract class Decorator : Node, IParentNode, IChildrenNode + { + private Node[] stackState = new Node[0]; + + public override void AddChild(Node node) + { + // Allow only one children + if (this.children.Count > 0) + { + Node child = this.children[0]; + if (child == node) { + return; + } + child.parent.RemoveChild(child); + this.children.Clear(); + } + // Remove parent in case there is one already + if (node.parent != null) { + node.parent.RemoveChild(node); + } + this.children.Add(node); + node.parent = this; + } + + protected Node GetChild() + { + if (children.Count > 0) { + return children[0]; + } + return null; + } + + protected bool TryGetChild(out Node node) + { + if (children.Count > 0) + { + node = children[0]; + return true; + } + node = null; + return false; + } + + protected bool HasChild() + { + return children.Count > 0; + } + + public override void RemoveChild(Node node) + { + if (children.Contains(node)) + { + children.Remove(node); + node.parent = null; + } + } + + /// + /// Copy and store current state of execution stack if it was not saved before. + /// + protected void ObtainTreeSnapshot() + { + // Copy stack only when this method is called for the first time + if (stackState.Length == 0) + { + behaviourTree.GetStack(ref stackState); + } + } + + [System.Obsolete] + protected void DisposeBTState() + { + stackState = new Node[0]; + } + + internal Node[] GetStoredTreeSnapshot() + { + return stackState; + } + + /// + /// Helper method used to abort nodes in valid case + /// + /// Abort type + protected void TryAbort(Abort abort) + { + switch (abort) + { + case Abort.Self: + if (status == Status.Running) { + behaviourTree.Interrupt(this); + } + break; + case Abort.LowerPriority: + if (status == Status.Success || status == Status.Failure) { + behaviourTree.Interrupt(this); + } + break; + case Abort.Both: + behaviourTree.Interrupt(this); + break; + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Decorator.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Decorator.cs.meta new file mode 100644 index 00000000..635dc0e6 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Decorator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 76bba4b4f778fa9409a634bedf9d1aa1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/DistanceCondition.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/DistanceCondition.cs new file mode 100644 index 00000000..aa2b9c22 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/DistanceCondition.cs @@ -0,0 +1,37 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode(name = "Conditions/Distance Condition")] + public class DistanceCondition : Condition + { + public Comparator comparator = Comparator.GreaterThan; + public FloatReference distance = new FloatReference(10f); + [Space] + public TransformReference transform1; + public TransformReference transform2; + + public override bool Check() + { + // Squared magnitude is enough to compare distances + float sqrMagnitude = (transform1.Value.position - transform2.Value.position).sqrMagnitude; + float dist = distance.Value; + if (comparator == Comparator.GreaterThan) + { + return sqrMagnitude > dist * dist; + } + else + { + return sqrMagnitude < dist * dist; + } + } + + public enum Comparator + { + GreaterThan, LessThan + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/DistanceCondition.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/DistanceCondition.cs.meta new file mode 100644 index 00000000..2e485a69 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/DistanceCondition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eb0b7cfe3e9cfba47a378c725cf5d0b4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/ForceResult.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/ForceResult.cs new file mode 100644 index 00000000..a8d4f996 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/ForceResult.cs @@ -0,0 +1,33 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode("Decorators/Force Result")] + public class ForceResult : Decorator + { + [SerializeField] private ForcedResult result = ForcedResult.Success; + + public override NodeResult Execute() + { + if (!TryGetChild(out Node node)) + { + return NodeResult.failure; + } + + if (node.status == Status.Success || node.status == Status.Failure) + { + return result == ForcedResult.Success ? NodeResult.success : NodeResult.failure; + } + + return node.runningNodeResult; + } + + private enum ForcedResult + { + Success, Failure + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/ForceResult.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/ForceResult.cs.meta new file mode 100644 index 00000000..d98e522d --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/ForceResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 163d3a55bffbacb42b57e10e4d9f3d13 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Inverter.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Inverter.cs new file mode 100644 index 00000000..54a983c7 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Inverter.cs @@ -0,0 +1,25 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode("Decorators/Inverter")] + public class Inverter : Decorator + { + public override NodeResult Execute() + { + if (!TryGetChild(out Node node)) + { + return NodeResult.failure; + } + if (node.status == Status.Success) { + return NodeResult.failure; + } else if (node.status == Status.Failure) { + return NodeResult.success; + } + return node.runningNodeResult; + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Inverter.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Inverter.cs.meta new file mode 100644 index 00000000..8f5385f9 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Inverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: df7dcd3c2da37eb4ba49162d0ca654c9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/InvokeUnityEvent.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/InvokeUnityEvent.cs new file mode 100644 index 00000000..982de186 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/InvokeUnityEvent.cs @@ -0,0 +1,86 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Events; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode(name = "Tasks/Invoke Unity Event")] + public class InvokeUnityEvent : Leaf + { + public EventType type; + + public TransformReference transformReference = new TransformReference(); + public GameObjectReference gameObjectReference = new GameObjectReference(); + public FloatReference floatReference = new FloatReference(); + public IntReference intReference = new IntReference(); + public BoolReference boolReference = new BoolReference(); + public StringReference stringReference = new StringReference(); + public Vector3Reference vector3Reference = new Vector3Reference(); + public Vector2Reference vector2Reference = new Vector2Reference(); + + public TransformEvent transformEvent; + public GameObjectEvent gameObjectEvent; + public FloatEvent floatEvent; + public IntEvent intEvent; + public BoolEvent boolEvent; + public StringEvent stringEvent; + public Vector3Event vector3Event; + public Vector2Event vector2Event; + + public override NodeResult Execute() + { + switch (type) + { + case EventType.Transform: transformEvent.Invoke(transformReference.Value); + break; + case EventType.Float: floatEvent.Invoke(floatReference.Value); + break; + case EventType.Bool: boolEvent.Invoke(boolReference.Value); + break; + case EventType.String: stringEvent.Invoke(stringReference.Value); + break; + case EventType.Vector3: vector3Event.Invoke(vector3Reference.Value); + break; + case EventType.Vector2: vector2Event.Invoke(vector2Reference.Value); + break; + case EventType.Int: intEvent.Invoke(intReference.Value); + break; + case EventType.GameObject: gameObjectEvent.Invoke(gameObjectReference.Value); + break; + } + return NodeResult.success; + } + + public override bool IsValid() + { + switch (type) + { + case EventType.Transform: return !transformReference.isInvalid; + case EventType.Float: return !floatReference.isInvalid; + case EventType.Bool: return !boolReference.isInvalid; + case EventType.String: return !stringReference.isInvalid; + case EventType.Vector3: return !vector3Reference.isInvalid; + case EventType.Vector2: return !vector2Reference.isInvalid; + case EventType.Int: return !intReference.isInvalid; + case EventType.GameObject: return !gameObjectReference.isInvalid; + default: return true; + } + } + + public enum EventType + { + Transform, GameObject, Float, Int, Bool, String, Vector3, Vector2 + } + + [System.Serializable] public class TransformEvent : UnityEvent{} + [System.Serializable] public class GameObjectEvent : UnityEvent{} + [System.Serializable] public class FloatEvent : UnityEvent{} + [System.Serializable] public class IntEvent : UnityEvent{} + [System.Serializable] public class BoolEvent : UnityEvent{} + [System.Serializable] public class StringEvent : UnityEvent{} + [System.Serializable] public class Vector3Event : UnityEvent{} + [System.Serializable] public class Vector2Event : UnityEvent{} + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/InvokeUnityEvent.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/InvokeUnityEvent.cs.meta new file mode 100644 index 00000000..47200abb --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/InvokeUnityEvent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d47807df5b5587e44bfd9aface30c12f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/IsSetCondition.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/IsSetCondition.cs new file mode 100644 index 00000000..d0d04007 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/IsSetCondition.cs @@ -0,0 +1,102 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode(name = "Conditions/Is Set Condition")] + public class IsSetCondition : Condition + { + public Abort abort; + public bool invert = false; + public Type type = Type.Boolean; + public BoolReference boolReference = new BoolReference(VarRefMode.DisableConstant); + public GameObjectReference objectReference = new GameObjectReference(VarRefMode.DisableConstant); + public TransformReference transformReference = new TransformReference(VarRefMode.DisableConstant); + + public override bool Check() + { + switch (type) + { + case Type.Boolean: + return (boolReference.Value == true) ^ invert; + case Type.GameObject: + return (objectReference.Value != null) ^ invert; + case Type.Transform: + return (transformReference.Value != null) ^ invert; + } + return invert; + } + + public override void OnAllowInterrupt() + { + if (abort != Abort.None) + { + ObtainTreeSnapshot(); + switch (type) + { + case Type.Boolean: + boolReference.GetVariable().AddListener(OnVariableChange); + break; + case Type.GameObject: + objectReference.GetVariable().AddListener(OnVariableChange); + break; + case Type.Transform: + transformReference.GetVariable().AddListener(OnVariableChange); + break; + } + } + } + + public override void OnDisallowInterrupt() + { + if (abort != Abort.None) + { + switch (type) + { + case Type.Boolean: + boolReference.GetVariable().RemoveListener(OnVariableChange); + break; + case Type.GameObject: + objectReference.GetVariable().RemoveListener(OnVariableChange); + break; + case Type.Transform: + transformReference.GetVariable().RemoveListener(OnVariableChange); + break; + } + } + } + + private void OnVariableChange(bool oldValue, bool newValue) + { + EvaluateConditionAndTryAbort(abort); + } + + private void OnVariableChange(GameObject oldValue, GameObject newValue) + { + EvaluateConditionAndTryAbort(abort); + } + + private void OnVariableChange(Transform oldValue, Transform newValue) + { + EvaluateConditionAndTryAbort(abort); + } + + public override bool IsValid() + { + switch (type) + { + case Type.Boolean: return !boolReference.isInvalid; + case Type.GameObject: return !objectReference.isInvalid; + case Type.Transform: return !transformReference.isInvalid; + default: return true; + } + } + + public enum Type + { + Boolean, GameObject, Transform + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/IsSetCondition.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/IsSetCondition.cs.meta new file mode 100644 index 00000000..2d0ac738 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/IsSetCondition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 534e3ec7de6cd444e984c2e7f68e42e2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Leaf.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Leaf.cs new file mode 100644 index 00000000..d4134daf --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Leaf.cs @@ -0,0 +1,19 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + public abstract class Leaf : Node, IChildrenNode + { + public sealed override void AddChild(Node node) + { + return; + } + + public sealed override void RemoveChild(Node node) + { + return; + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Leaf.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Leaf.cs.meta new file mode 100644 index 00000000..6424cbf2 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Leaf.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2cb4093606af8044fbf4aa9fac6dca97 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Loop.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Loop.cs new file mode 100644 index 00000000..31029e61 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Loop.cs @@ -0,0 +1,80 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode(name = "Decorators/Loop")] + public class Loop : Decorator + { + public IntReference loops = new IntReference(3); + public BoolReference infinite = new BoolReference(false); + [Tooltip("Break loop when selected result is returned by child.")] + public BreakMode breakOnStatus = BreakMode.Disabled; + [Space] + [Tooltip("Result returned by this node after the loop ends.")] + public ResultRemapMode resultOnFinish = ResultRemapMode.Success; + [Tooltip("The result returned by this node when loop is broken.")] + public ResultRemapMode resultOnBreak = ResultRemapMode.Failure; + private int count; + + public enum ResultRemapMode + { + Success = 0, + Failure = 1, + Inherit = 2, + InheritInverted = 3, + } + + /// + /// Enum mapped to Status enum. Disabled is casted to 'running' as this state is never returned by child. + /// + public enum BreakMode + { + Disabled = 2, + Success = 0, + Failure = 1, + } + + public override void OnEnter() + { + count = loops.Value; + } + + public override NodeResult Execute() + { + if (!TryGetChild(out Node node)) + { + return NodeResult.failure; + } + + if (node.status == (Status)breakOnStatus) + { + return RemapResult(resultOnBreak, node.status); + } + + if (count > 0 || infinite.Value) + { + // Repeat children + behaviourTree.ResetNodesTo(this); + count -= 1; + return node.runningNodeResult; + } + + return RemapResult(resultOnFinish, node.status); + } + + private NodeResult RemapResult(ResultRemapMode mode, Status childStatus) + { + switch (mode) + { + case ResultRemapMode.Success: return NodeResult.success; + case ResultRemapMode.Failure: return NodeResult.failure; + case ResultRemapMode.Inherit: return childStatus == Status.Success ? NodeResult.success : NodeResult.failure; + case ResultRemapMode.InheritInverted: return childStatus == Status.Success ? NodeResult.failure : NodeResult.success; + default: Debug.LogError("Unexpected behaviour", this); return NodeResult.failure; + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Loop.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Loop.cs.meta new file mode 100644 index 00000000..d73b53c3 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Loop.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a8595d37ac5b0f340b7f64ca227f8860 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Node.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Node.cs new file mode 100644 index 00000000..dc38a37b --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Node.cs @@ -0,0 +1,162 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [RequireComponent(typeof(MonoBehaviourTree))] + public abstract class Node : MonoBehaviour + { + public const float NODE_DEFAULT_WIDTH = 160f; + + public string title; + [HideInInspector] + public Rect rect = new Rect(0, 0, NODE_DEFAULT_WIDTH, 50); + [HideInInspector] + public Node parent; + [HideInInspector] + public List children = new List(); + [System.NonSerialized] + public Status status = Status.Ready; + [HideInInspector] + public MonoBehaviourTree behaviourTree; + // [HideInInspector] + public NodeResult runningNodeResult { get; internal set;} + [HideInInspector] + public int runtimePriority = 0; + [HideInInspector] + public bool breakpoint = false; + private bool _selected = false; + public bool selected + { + get { return _selected; } + set { _selected = value; } + } + + /// + /// Time of last tick retrieved from Time.time + /// + public float LastTick => behaviourTree.LastTick; + /// + /// The interval in seconds from the last tick of behaviour tree. + /// + public float DeltaTime => Time.time - behaviourTree.LastTick; + + public virtual void OnAllowInterrupt() {} + public virtual void OnEnter() {} + public abstract NodeResult Execute(); + public virtual void OnExit() {} + public virtual void OnDisallowInterrupt() {} + + public virtual void OnBehaviourTreeAbort() {} + + public abstract void AddChild(Node node); + public abstract void RemoveChild(Node node); + + public virtual Node GetParent() + { + return parent; + } + + public virtual List GetChildren() + { + return children; + } + + public bool IsDescendantOf(Node node) + { + if (this.parent == null) { + return false; + } else if (this.parent == node) { + return true; + } + return this.parent.IsDescendantOf(node); + } + + public List GetAllSuccessors() + { + List result = new List(); + for (int i = 0; i < children.Count; i++) + { + result.Add(children[i]); + result.AddRange(children[i].GetAllSuccessors()); + } + return result; + } + + public void SortChildren() + { + this.children.Sort((c, d) => c.rect.x.CompareTo(d.rect.x)); + } + + /// + /// Check if node setup is valid + /// + /// Returns true if node is configured correctly + public virtual bool IsValid() + { + #if UNITY_EDITOR + System.Reflection.FieldInfo[] propertyInfos = this.GetType().GetFields(); + for (int i = 0; i < propertyInfos.Length; i++) + { + if (propertyInfos[i].FieldType.IsSubclassOf(typeof(BaseVariableReference))) + { + BaseVariableReference varReference = propertyInfos[i].GetValue(this) as BaseVariableReference; + if (varReference != null && varReference.isInvalid) + { + return false; + } + } + } + #endif + return true; + } + } + + public enum Status + { + Success = 0, + Failure = 1, + Running = 2, + Ready = 3 + } + + public enum Abort + { + None, Self, LowerPriority, Both + } + + public class NodeResult + { + public Status status {get; private set;} + public Node child {get; private set;} + + public NodeResult(Status status, Node child = null) + { + this.status = status; + this.child = child; + } + + public static NodeResult From(Status s) + { + switch (s) + { + case Status.Success: return success; + case Status.Failure: return failure; + default: return running; + } + } + + public static readonly NodeResult success = new NodeResult(Status.Success); + public static readonly NodeResult failure = new NodeResult(Status.Failure); + public static readonly NodeResult running = new NodeResult(Status.Running); + } + + public interface IChildrenNode{ + // void SetParent(Node node); + } + + public interface IParentNode{ + // void AddChild(Node node); + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Node.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Node.cs.meta new file mode 100644 index 00000000..47ac510d --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Node.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6d96d8d07ac425543b9f24ad5120b51d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/NumberCondition.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/NumberCondition.cs new file mode 100644 index 00000000..054089ea --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/NumberCondition.cs @@ -0,0 +1,125 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode(name = "Conditions/Number Condition")] + public class NumberCondition : Condition + { + public Abort abort; + public Type type = Type.Float; + public FloatReference floatReference = new FloatReference(VarRefMode.DisableConstant); + public IntReference intReference = new IntReference(VarRefMode.DisableConstant); + public Comparator comparator = Comparator.Equal; + public FloatReference floatReference2 = new FloatReference(0f); + public IntReference intReference2 = new IntReference(0); + + // IMPROVEMENT: This class could be split into to different nodes + public override bool Check() + { + if (type == Type.Float) + { + switch (comparator) + { + case Comparator.Equal: + return floatReference.Value == floatReference2.Value; + case Comparator.GreaterThan: + return floatReference.Value > floatReference2.Value; + case Comparator.LessThan: + return floatReference.Value < floatReference2.Value; + } + } + else + { + switch (comparator) + { + case Comparator.Equal: + return intReference.Value == intReference2.Value; + case Comparator.GreaterThan: + return intReference.Value > intReference2.Value; + case Comparator.LessThan: + return intReference.Value < intReference2.Value; + } + } + return false; + } + + public override void OnAllowInterrupt() + { + if (abort != Abort.None) + { + ObtainTreeSnapshot(); + if (type == Type.Float) { + floatReference.GetVariable().AddListener(OnVariableChange); + if (!floatReference2.isConstant) + { + floatReference2.GetVariable().AddListener(OnVariableChange); + } + } else { + intReference.GetVariable().AddListener(OnVariableChange); + if (!intReference2.isConstant) + { + intReference2.GetVariable().AddListener(OnVariableChange); + } + } + } + } + + public override void OnDisallowInterrupt() + { + if (abort != Abort.None) + { + if (type == Type.Float) { + floatReference.GetVariable().RemoveListener(OnVariableChange); + if (!floatReference2.isConstant) + { + floatReference2.GetVariable().RemoveListener(OnVariableChange); + } + } else { + intReference.GetVariable().RemoveListener(OnVariableChange); + if (!intReference2.isConstant) + { + intReference2.GetVariable().RemoveListener(OnVariableChange); + } + } + } + } + + private void OnVariableChange(float newVal, float oldVal) + { + EvaluateConditionAndTryAbort(abort); + } + + private void OnVariableChange(int newVal, int oldVal) + { + EvaluateConditionAndTryAbort(abort); + } + + public override bool IsValid() + { + switch (type) + { + case Type.Float: return !(floatReference.isInvalid || floatReference2.isInvalid); + case Type.Int: return !(intReference.isInvalid || intReference2.isInvalid); + default: return true; + } + } + + public enum Type + { + Float, Int + } + + public enum Comparator + { + [InspectorName("==")] + Equal, + [InspectorName(">")] + GreaterThan, + [InspectorName("<")] + LessThan + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/NumberCondition.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/NumberCondition.cs.meta new file mode 100644 index 00000000..6a5aa178 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/NumberCondition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d0b95a918be8d9a4f9085201010bdec1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomChance.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomChance.cs new file mode 100644 index 00000000..d15e9c2f --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomChance.cs @@ -0,0 +1,43 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode("Decorators/Random Chance")] + public class RandomChance : Decorator + { + [Tooltip("Probability should be between 0 and 1")] + public FloatReference probability = new FloatReference(0.5f); + private float roll; + + public override void OnAllowInterrupt() + { + roll = Random.Range(0f, 1f); + } + + public override NodeResult Execute() + { + Node node = GetChild(); + if (node == null) { + return NodeResult.failure; + } + if (node.status == Status.Success || node.status == Status.Failure) { + return NodeResult.From(node.status); + } + if (roll > probability.Value) { + return NodeResult.failure; + } + return node.runningNodeResult; + } + + void OnValidate() + { + if (probability.isConstant) + { + probability.Value = Mathf.Clamp(probability.GetConstant(), 0f, 1f); + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomChance.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomChance.cs.meta new file mode 100644 index 00000000..213054b9 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomChance.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f9f8fc43d8d667e46a433232d46363ad +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomFloat.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomFloat.cs new file mode 100644 index 00000000..7cc1537f --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomFloat.cs @@ -0,0 +1,29 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode(name = "Tasks/Random Float")] + public class RandomFloat : Leaf + { + public FloatReference min = new FloatReference(0f); + public FloatReference max = new FloatReference(1f); + public FloatReference output = new FloatReference(VarRefMode.DisableConstant); + + public override NodeResult Execute() + { + output.Value = Random.Range(min.Value, max.Value); + return NodeResult.success; + } + + void OnValidate() + { + if (min.isConstant && max.isConstant) + { + min.Value = Mathf.Min(min.GetConstant(), max.GetConstant()); + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomFloat.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomFloat.cs.meta new file mode 100644 index 00000000..b330ff15 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomFloat.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2c4b91b5cfd9ae042ba2496eb83eeb0c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomInteger.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomInteger.cs new file mode 100644 index 00000000..f2ac7cd4 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomInteger.cs @@ -0,0 +1,29 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode(name = "Tasks/Random Integer")] + public class RandomInteger : Leaf + { + public IntReference min = new IntReference(0); + public IntReference max = new IntReference(10); + public IntReference output = new IntReference(VarRefMode.DisableConstant); + + public override NodeResult Execute() + { + output.Value = Random.Range(min.Value, max.Value); + return NodeResult.success; + } + + void OnValidate() + { + if (min.isConstant && max.isConstant) + { + min.Value = Mathf.Min(min.GetConstant(), max.GetConstant()); + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomInteger.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomInteger.cs.meta new file mode 100644 index 00000000..df9e45ee --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RandomInteger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1490dbef6b51161428fcea74c8dbf399 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RepeatUntilFail.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RepeatUntilFail.cs new file mode 100644 index 00000000..b371d5b7 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RepeatUntilFail.cs @@ -0,0 +1,25 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode("Decorators/Repeat Until Fail")] + public class RepeatUntilFail : Decorator + { + public override NodeResult Execute() + { + if (!TryGetChild(out Node node)) + { + return NodeResult.failure; + } + if (node.status == Status.Failure) { + return NodeResult.success; + } + // Repeat children + behaviourTree.ResetNodesTo(this); + return node.runningNodeResult; + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RepeatUntilFail.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RepeatUntilFail.cs.meta new file mode 100644 index 00000000..bc54423c --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/RepeatUntilFail.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3922b31ecb96d2742abf4dc3f98c70af +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Repeater.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Repeater.cs new file mode 100644 index 00000000..f12f0723 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Repeater.cs @@ -0,0 +1,40 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode(name = "Decorators/Repeater")] + public class Repeater : Decorator + { + public int loops = 1; + public bool infinite = false; + public bool breakOnFailure = false; + private int count; + + public override void OnEnter() + { + count = loops; + } + + public override NodeResult Execute() + { + if (!TryGetChild(out Node node)) + { + return NodeResult.failure; + } + if (breakOnFailure && node.status == Status.Failure) + { + return NodeResult.failure; + } + if (infinite || count > 0) { + // Repeat children + behaviourTree.ResetNodesTo(this); + count -= 1; + return node.runningNodeResult; + } + return NodeResult.success; + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Repeater.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Repeater.cs.meta new file mode 100644 index 00000000..9e5d2835 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Repeater.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 056841afaed742d4e909e76361b5173f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Root.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Root.cs new file mode 100644 index 00000000..32c2f4aa --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Root.cs @@ -0,0 +1,54 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode(name = "Root", order = 200)] + public class Root : Node, IParentNode + { + public override void AddChild(Node node) + { + // Allow only one children + if (this.children.Count > 0) + { + Node child = this.children[0]; + if (child == node) { + return; + } + child.parent.RemoveChild(child); + this.children.Clear(); + } + // Remove parent in case there is one already + if (node.parent != null) { + node.parent.RemoveChild(node); + } + this.children.Add(node); + node.parent = this; + } + + public override NodeResult Execute() + { + if (children.Count == 1) { + Node child = children[0]; + if (child.status == Status.Success || child.status == Status.Failure) { + return NodeResult.From(child.status); + } + // Set last tick to current time because execution just started (this reduces first deltaTime to 0) + behaviourTree.LastTick = Time.time; + return child.runningNodeResult; + } + return NodeResult.failure; + } + + public override void RemoveChild(Node node) + { + if (children.Contains(node)) + { + children.Remove(node); + node.parent = null; + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Root.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Root.cs.meta new file mode 100644 index 00000000..6b61dba7 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Root.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 538645f2f9090fd43bc6154b2e89e2d3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Selector.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Selector.cs new file mode 100644 index 00000000..fa58eeb2 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Selector.cs @@ -0,0 +1,50 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode(name = "Selector", order = 100)] + public class Selector : Composite + { + private int index; + + public override void OnAllowInterrupt() + { + if (random) + { + ShuffleList(children); + } + } + + public override void OnEnter() + { + index = 0; + } + + public override void OnBehaviourTreeAbort() + { + // Do not continue from last index + index = 0; + } + + public override NodeResult Execute() + { + while (index < children.Count) + { + Node child = children[index]; + switch (child.status) + { + case Status.Success: + return NodeResult.success; + case Status.Failure: + index += 1; + continue; + } + return child.runningNodeResult; + } + return NodeResult.failure; + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Selector.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Selector.cs.meta new file mode 100644 index 00000000..4c04a784 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Selector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 08540605df275034fafc8e05c6704214 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Sequence.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Sequence.cs new file mode 100644 index 00000000..7740ca34 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Sequence.cs @@ -0,0 +1,50 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode(name = "Sequence", order = 150)] + public class Sequence : Composite + { + private int index; + + public override void OnAllowInterrupt() + { + if (random) + { + ShuffleList(children); + } + } + + public override void OnEnter() + { + index = 0; + } + + public override void OnBehaviourTreeAbort() + { + // Do not continue from last index + index = 0; + } + + public override NodeResult Execute() + { + while (index < children.Count) + { + Node child = children[index]; + switch (child.status) + { + case Status.Success: + index += 1; + continue; + case Status.Failure: + return NodeResult.failure; + } + return child.runningNodeResult; + } + return NodeResult.success; + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Sequence.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Sequence.cs.meta new file mode 100644 index 00000000..b6f5b005 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Sequence.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4c78c7da6b00e1b46bad07949050f82f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Service.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Service.cs new file mode 100644 index 00000000..47c9b74b --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Service.cs @@ -0,0 +1,63 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + public abstract class Service : Decorator, IMonoBehaviourTreeTickListener + { + public float interval = 1f; + public float randomDeviation = 0f; + public bool callOnEnter = true; + /// + /// Time of the next update of the task + /// + protected float nextScheduledTime; + + public override void OnEnter() + { + // Set time of the next update + nextScheduledTime = Time.time + interval + Random.Range(-randomDeviation, randomDeviation); + behaviourTree.AddTickListener(this); + if (callOnEnter) + { + Task(); + } + } + + public override NodeResult Execute() + { + Node node = GetChild(); + if (node == null) { + return NodeResult.failure; + } + if (node.status == Status.Success || node.status == Status.Failure) { + return NodeResult.From(node.status); + } + return node.runningNodeResult; + } + + public abstract void Task(); + + public override void OnExit() + { + behaviourTree.RemoveTickListener(this); + } + + void IMonoBehaviourTreeTickListener.OnBehaviourTreeTick() + { + if (nextScheduledTime <= Time.time) + { + // Set time of the next update and run the task + nextScheduledTime = Time.time + interval + Random.Range(-randomDeviation, randomDeviation); + Task(); + } + } + + protected virtual void OnValidate() + { + interval = Mathf.Max(0f, interval); + randomDeviation = Mathf.Clamp(randomDeviation, 0f, interval); + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Service.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Service.cs.meta new file mode 100644 index 00000000..f0eb29f0 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Service.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3f744115ca930124983b938b0d3f9c72 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetBoolean.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetBoolean.cs new file mode 100644 index 00000000..822611cf --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetBoolean.cs @@ -0,0 +1,34 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode(name = "Tasks/Set Boolean")] + public class SetBoolean : Leaf + { + public BoolReference source = new BoolReference(true); + // [SerializeField] + // private Operation operation = Operation.Set; + public BoolReference destination = new BoolReference(VarRefMode.DisableConstant); + + public override NodeResult Execute() + { + destination.Value = source.Value; + return NodeResult.success; + } + + // private enum Operation + // { + // [InspectorName("=")] + // Set, + // [InspectorName("|=")] + // Or, + // [InspectorName("^=")] + // Xor, + // [InspectorName("&=")] + // And + // } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetBoolean.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetBoolean.cs.meta new file mode 100644 index 00000000..2eb8d010 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetBoolean.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a491dc0bc41ade74e85756aea423797c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetNumber.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetNumber.cs new file mode 100644 index 00000000..a5165ca0 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetNumber.cs @@ -0,0 +1,77 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode(name = "Tasks/Set Number")] + public class SetNumber : Leaf + { + [SerializeField] + private Type type = Type.Float; + public Operation operation = Operation.Set; + + public FloatReference sourceFloat = new FloatReference(0f); + public IntReference sourceInt = new IntReference(0); + + public FloatReference destinationFloat = new FloatReference(VarRefMode.DisableConstant); + public IntReference destinationInt = new IntReference(VarRefMode.DisableConstant); + + public override NodeResult Execute() + { + if (type == Type.Float) + { + // Set float + switch (operation) + { + case Operation.Set: destinationFloat.Value = sourceFloat.Value; + break; + case Operation.Add: destinationFloat.Value += sourceFloat.Value; + break; + case Operation.Multiply: destinationFloat.Value *= sourceFloat.Value; + break; + } + } + else + { + // Set int + switch (operation) + { + case Operation.Set: destinationInt.Value = sourceInt.Value; + break; + case Operation.Add: destinationInt.Value += sourceInt.Value; + break; + case Operation.Multiply: destinationInt.Value *= sourceInt.Value; + break; + } + } + return NodeResult.success; + } + + public override bool IsValid() + { + switch (type) + { + case Type.Float: return !(sourceFloat.isInvalid || destinationFloat.isInvalid); + case Type.Int: return !(sourceInt.isInvalid || destinationInt.isInvalid); + default: return true; + } + } + + private enum Type + { + Float, Int + } + + public enum Operation + { + [InspectorName("=")] + Set, + [InspectorName("+=")] + Add, + [InspectorName("*=")] + Multiply + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetNumber.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetNumber.cs.meta new file mode 100644 index 00000000..b0828a53 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetNumber.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b98470d7a96ed124985c539edd964068 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetObject.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetObject.cs new file mode 100644 index 00000000..fe04587b --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetObject.cs @@ -0,0 +1,53 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode(name = "Tasks/Set Object")] + public class SetObject : Leaf + { + [SerializeField] + private Type type = Type.Transform; + public TransformReference sourceTransform; + public GameObjectReference sourceGameObject; + public TransformReference destinationTransform = new TransformReference(VarRefMode.DisableConstant); + public GameObjectReference destinationGameObject = new GameObjectReference(VarRefMode.DisableConstant); + + public override NodeResult Execute() + { + if (type == Type.Transform) + { + destinationTransform.Value = sourceTransform.Value; + } + else + { + destinationGameObject.Value = sourceGameObject.Value; + } + return NodeResult.success; + } + + public override bool IsValid() + { + // Custom validation to allow nulls in source objects + switch (type) + { + case Type.Transform: return !( sourceTransform == null || IsInvalid(sourceTransform) || destinationTransform.isInvalid); + case Type.GameObject: return !( sourceGameObject == null || IsInvalid(sourceGameObject) || destinationGameObject.isInvalid); + default: return true; + } + } + + private static bool IsInvalid(BaseVariableReference variable) + { + // Custom validation to allow null objects without warnings + return (variable.isConstant)? false : variable.blackboard == null || string.IsNullOrEmpty(variable.key); + } + + private enum Type + { + Transform, GameObject + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetObject.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetObject.cs.meta new file mode 100644 index 00000000..1546ed0e --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetObject.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 116da7b1dd539b042837b7acc2c9cfa6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetVector.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetVector.cs new file mode 100644 index 00000000..ed232b2b --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetVector.cs @@ -0,0 +1,48 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode(name = "Tasks/Set Vector")] + public class SetVector : Leaf + { + [SerializeField] + private Type type = Type.Vector3; + + public Vector2Reference sourceVector2 = new Vector2Reference(); + public Vector3Reference sourceVector3 = new Vector3Reference(); + + public Vector2Reference destinationVector2 = new Vector2Reference(VarRefMode.DisableConstant); + public Vector3Reference destinationVector3 = new Vector3Reference(VarRefMode.DisableConstant); + + public override NodeResult Execute() + { + if (type == Type.Vector3) + { + destinationVector3.Value = sourceVector3.Value; + } + else + { + destinationVector2.Value = sourceVector2.Value; + } + return NodeResult.success; + } + + public override bool IsValid() + { + switch (type) + { + case Type.Vector3: return !(sourceVector3.isInvalid || destinationVector3.isInvalid); + case Type.Vector2: return !(sourceVector2.isInvalid || destinationVector2.isInvalid); + default: return true; + } + } + + private enum Type + { + Vector2, Vector3 + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetVector.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetVector.cs.meta new file mode 100644 index 00000000..78a51659 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SetVector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2adcd84dee6b83c46824425d80fb482c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SubTree.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SubTree.cs new file mode 100644 index 00000000..a7d0bcdc --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SubTree.cs @@ -0,0 +1,41 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode(name = "SubTree", order = 250)] + public class SubTree : Node, IChildrenNode + { + public MonoBehaviourTree tree; + + public override void AddChild(Node node) + { + return; + } + + public override NodeResult Execute() + { + // Return fialure when subtree is not defined + if (tree == null) { + return NodeResult.failure; + } + Node root = tree.GetRoot(); + if (root.status == Status.Success || root.status == Status.Failure) { + return NodeResult.From(root.status); + } + return root.runningNodeResult; + } + + public override void RemoveChild(Node node) + { + return; + } + + public override bool IsValid() + { + return tree != null; + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SubTree.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SubTree.cs.meta new file mode 100644 index 00000000..55ba5da4 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/SubTree.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: efee2c6abc08f1d42acf5b1a33db992c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Succeeder.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Succeeder.cs new file mode 100644 index 00000000..30a6a05a --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Succeeder.cs @@ -0,0 +1,24 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode("Decorators/Succeeder")] + public class Succeeder : Decorator + { + public override NodeResult Execute() + { + if (!TryGetChild(out Node node)) + { + return NodeResult.failure; + } + if (node.status == Status.Success || node.status == Status.Failure) + { + return NodeResult.success; + } + return node.runningNodeResult; + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Succeeder.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Succeeder.cs.meta new file mode 100644 index 00000000..de83b78e --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Succeeder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c0f4a10bc17bb324baf5a459be7bb24c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/TimeLimit.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/TimeLimit.cs new file mode 100644 index 00000000..6f174fe5 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/TimeLimit.cs @@ -0,0 +1,70 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode("Decorators/Time Limit")] + public class TimeLimit : Decorator, IMonoBehaviourTreeTickListener + { + public FloatReference time = new FloatReference(5f); + public float randomDeviation = 0f; + private bool limitReached; + private float timeout; + + public override void OnAllowInterrupt() + { + ObtainTreeSnapshot(); + } + + public override void OnEnter() + { + // Reset block flag + limitReached = false; + timeout = Time.time + time.Value + ((randomDeviation == 0f)? 0f : Random.Range(-randomDeviation, randomDeviation)); + behaviourTree.AddTickListener(this); + } + + public override NodeResult Execute() + { + Node node = GetChild(); + if (node == null || limitReached) { + return NodeResult.failure; + } + if (node.status == Status.Success || node.status == Status.Failure) { + return NodeResult.From(node.status); + } + return node.runningNodeResult; + } + + public override void OnExit() + { + behaviourTree.RemoveTickListener(this); + } + + void IMonoBehaviourTreeTickListener.OnBehaviourTreeTick() + { + if (timeout <= Time.time) + { + timeout = float.MaxValue; + limitReached = true; + TryAbort(Abort.Self); + } + } + + void OnValidate() + { + if (time.isConstant) + { + // this is safe to use only when reference is constant + time.Value = Mathf.Max(0f, time.GetConstant()); + randomDeviation = Mathf.Clamp(randomDeviation, 0f, time.GetConstant()); + } + else + { + randomDeviation = Mathf.Clamp(randomDeviation, 0f, 600f); + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/TimeLimit.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/TimeLimit.cs.meta new file mode 100644 index 00000000..1a49baa7 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/TimeLimit.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4cab6356732c8c443a6fa2d180a5697b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/UpdatePositionService.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/UpdatePositionService.cs new file mode 100644 index 00000000..0479d90b --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/UpdatePositionService.cs @@ -0,0 +1,24 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode("Services/Update Position Service")] + public class UpdatePositionService : Service + { + public TransformReference sourceTransform; + public Vector3Reference position = new Vector3Reference(VarRefMode.DisableConstant); + + public override void Task() + { + Transform t = sourceTransform.Value; + if (t == null) + { + return; + } + position.Value = t.position; + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/UpdatePositionService.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/UpdatePositionService.cs.meta new file mode 100644 index 00000000..9543c1b5 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/UpdatePositionService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cd8ecc8e5f7108044a8bbe27cc68610f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Wait.cs b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Wait.cs new file mode 100644 index 00000000..d1a0c8f1 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Wait.cs @@ -0,0 +1,50 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + [MBTNode(name = "Tasks/Wait")] + public class Wait : Leaf + { + [Tooltip("Wait time in seconds")] + public FloatReference time = new FloatReference(1f); + public float randomDeviation = 0f; + public bool continueOnRestart = false; + private float timer; + + public override void OnEnter() + { + if (!continueOnRestart) { + timer = (randomDeviation == 0f)? 0f : Random.Range(-randomDeviation, randomDeviation); + } + } + + public override NodeResult Execute() + { + if (timer >= time.Value) { + // Reset timer in case continueOnRestart option is active + if (continueOnRestart) + { + timer = (randomDeviation == 0f)? 0f : Random.Range(-randomDeviation, randomDeviation); + } + return NodeResult.success; + } + timer += this.DeltaTime; + return NodeResult.running; + } + + void OnValidate() + { + if (time.isConstant) + { + randomDeviation = Mathf.Clamp(randomDeviation, 0f, time.GetConstant()); + } + else + { + randomDeviation = Mathf.Clamp(randomDeviation, 0f, 600f); + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Wait.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Wait.cs.meta new file mode 100644 index 00000000..fb47cdac --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Nodes/Wait.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 58fe7bc6a9b18e148b82820c7c1c0a90 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Qriva.MonoBehaviourTree.Runtime.asmdef b/Assets/MonoBehaviourTree/Source/Runtime/Qriva.MonoBehaviourTree.Runtime.asmdef new file mode 100644 index 00000000..65cdd1d1 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Qriva.MonoBehaviourTree.Runtime.asmdef @@ -0,0 +1,3 @@ +{ + "name": "Qriva.MonoBehaviourTree.Runtime" +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Qriva.MonoBehaviourTree.Runtime.asmdef.meta b/Assets/MonoBehaviourTree/Source/Runtime/Qriva.MonoBehaviourTree.Runtime.asmdef.meta new file mode 100644 index 00000000..7b1b5e6d --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Qriva.MonoBehaviourTree.Runtime.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b94eb722e14bb88498f76d28e55be3fa +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables.meta b/Assets/MonoBehaviourTree/Source/Runtime/Variables.meta new file mode 100644 index 00000000..0599399f --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a2e98b1669bd08e4b96286722a7c4f27 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/BlackboardVariable.cs b/Assets/MonoBehaviourTree/Source/Runtime/Variables/BlackboardVariable.cs new file mode 100644 index 00000000..7d4f4f89 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/BlackboardVariable.cs @@ -0,0 +1,11 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + public abstract class BlackboardVariable : MonoBehaviour + { + public string key; + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/BlackboardVariable.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Variables/BlackboardVariable.cs.meta new file mode 100644 index 00000000..6ede5ed1 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/BlackboardVariable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a1b1d2be931fc704b8dfb902c4b33155 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/BoolVariable.cs b/Assets/MonoBehaviourTree/Source/Runtime/Variables/BoolVariable.cs new file mode 100644 index 00000000..22466639 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/BoolVariable.cs @@ -0,0 +1,49 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + public class BoolVariable : Variable + { + protected override bool ValueEquals(bool val1, bool val2) + { + return val1 == val2; + } + } + + [System.Serializable] + public class BoolReference : VariableReference + { + public BoolReference(VarRefMode mode = VarRefMode.EnableConstant) + { + SetMode(mode); + } + + public BoolReference(bool defaultConstant) + { + useConstant = true; + constantValue = defaultConstant; + } + + public bool Value + { + get + { + return (useConstant)? constantValue : this.GetVariable().Value; + } + set + { + if (useConstant) + { + constantValue = value; + } + else + { + this.GetVariable().Value = value; + } + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/BoolVariable.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Variables/BoolVariable.cs.meta new file mode 100644 index 00000000..63ba07f3 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/BoolVariable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5ae15c5e6bcb1714080f2e8296c3d17a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/FloatVariable.cs b/Assets/MonoBehaviourTree/Source/Runtime/Variables/FloatVariable.cs new file mode 100644 index 00000000..f6f8e605 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/FloatVariable.cs @@ -0,0 +1,49 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + public class FloatVariable : Variable + { + protected override bool ValueEquals(float val1, float val2) + { + return val1 == val2; + } + } + + [System.Serializable] + public class FloatReference : VariableReference + { + public FloatReference(VarRefMode mode = VarRefMode.EnableConstant) + { + SetMode(mode); + } + + public FloatReference(float defaultConstant) + { + useConstant = true; + constantValue = defaultConstant; + } + + public float Value + { + get + { + return (useConstant)? constantValue : this.GetVariable().Value; + } + set + { + if (useConstant) + { + constantValue = value; + } + else + { + this.GetVariable().Value = value; + } + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/FloatVariable.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Variables/FloatVariable.cs.meta new file mode 100644 index 00000000..22f40684 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/FloatVariable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f4e5f4db414f0ab4c82c187a7653e99d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/GameObjectVariable.cs b/Assets/MonoBehaviourTree/Source/Runtime/Variables/GameObjectVariable.cs new file mode 100644 index 00000000..96926d63 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/GameObjectVariable.cs @@ -0,0 +1,49 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + // TODO: This should be GameObject + [AddComponentMenu("")] + public class GameObjectVariable : Variable + { + protected override bool ValueEquals(GameObject val1, GameObject val2) + { + return val1 == val2; + } + } + + [System.Serializable] + public class GameObjectReference : VariableReference + { + public GameObjectReference(VarRefMode mode = VarRefMode.EnableConstant) + { + SetMode(mode); + } + + protected override bool isConstantValid + { + get { return constantValue != null; } + } + + public GameObject Value + { + get + { + return (useConstant)? constantValue : this.GetVariable().Value; + } + set + { + if (useConstant) + { + constantValue = value; + } + else + { + this.GetVariable().Value = value; + } + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/GameObjectVariable.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Variables/GameObjectVariable.cs.meta new file mode 100644 index 00000000..bf048e6d --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/GameObjectVariable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3cdb61a66fcb1c549a844f093811f6c1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/IntVariable.cs b/Assets/MonoBehaviourTree/Source/Runtime/Variables/IntVariable.cs new file mode 100644 index 00000000..896a943d --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/IntVariable.cs @@ -0,0 +1,49 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + public class IntVariable : Variable + { + protected override bool ValueEquals(int val1, int val2) + { + return val1 == val2; + } + } + + [System.Serializable] + public class IntReference : VariableReference + { + public IntReference(VarRefMode mode = VarRefMode.EnableConstant) + { + SetMode(mode); + } + + public IntReference(int defaultConstant) + { + useConstant = true; + constantValue = defaultConstant; + } + + public int Value + { + get + { + return (useConstant)? constantValue : this.GetVariable().Value; + } + set + { + if (useConstant) + { + constantValue = value; + } + else + { + this.GetVariable().Value = value; + } + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/IntVariable.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Variables/IntVariable.cs.meta new file mode 100644 index 00000000..a43a1b51 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/IntVariable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4be6860a83fe93e4bbd689336d96bdc7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/QuaternionVariable.cs b/Assets/MonoBehaviourTree/Source/Runtime/Variables/QuaternionVariable.cs new file mode 100644 index 00000000..41924ec3 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/QuaternionVariable.cs @@ -0,0 +1,49 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + public class QuaternionVariable : Variable + { + protected override bool ValueEquals(Quaternion val1, Quaternion val2) + { + return val1 == val2; + } + } + + [System.Serializable] + public class QuaternionReference : VariableReference + { + public QuaternionReference(VarRefMode mode = VarRefMode.EnableConstant) + { + SetMode(mode); + } + + public QuaternionReference(Quaternion defaultConstant) + { + useConstant = true; + constantValue = defaultConstant; + } + + public Quaternion Value + { + get + { + return (useConstant)? constantValue : this.GetVariable().Value; + } + set + { + if (useConstant) + { + constantValue = value; + } + else + { + this.GetVariable().Value = value; + } + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/QuaternionVariable.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Variables/QuaternionVariable.cs.meta new file mode 100644 index 00000000..ecbc896b --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/QuaternionVariable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9a9d015f5018262488de2135c734188f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/StringVariable.cs b/Assets/MonoBehaviourTree/Source/Runtime/Variables/StringVariable.cs new file mode 100644 index 00000000..a8a51206 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/StringVariable.cs @@ -0,0 +1,49 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + public class StringVariable : Variable + { + protected override bool ValueEquals(string val1, string val2) + { + return val1 == val2; + } + } + + [System.Serializable] + public class StringReference : VariableReference + { + public StringReference(VarRefMode mode = VarRefMode.EnableConstant) + { + SetMode(mode); + } + + public StringReference(string defaultConstant) + { + useConstant = true; + constantValue = defaultConstant; + } + + public string Value + { + get + { + return (useConstant)? constantValue : this.GetVariable().Value; + } + set + { + if (useConstant) + { + constantValue = value; + } + else + { + this.GetVariable().Value = value; + } + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/StringVariable.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Variables/StringVariable.cs.meta new file mode 100644 index 00000000..16e1d394 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/StringVariable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ca0da855a1d65c24286c40d81a5cd707 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/TransformVariable.cs b/Assets/MonoBehaviourTree/Source/Runtime/Variables/TransformVariable.cs new file mode 100644 index 00000000..179ba511 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/TransformVariable.cs @@ -0,0 +1,48 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + public class TransformVariable : Variable + { + protected override bool ValueEquals(Transform val1, Transform val2) + { + return val1 == val2; + } + } + + [System.Serializable] + public class TransformReference : VariableReference + { + public TransformReference(VarRefMode mode = VarRefMode.EnableConstant) + { + SetMode(mode); + } + + protected override bool isConstantValid + { + get { return constantValue != null; } + } + + public Transform Value + { + get + { + return (useConstant)? constantValue : this.GetVariable().Value; + } + set + { + if (useConstant) + { + constantValue = value; + } + else + { + this.GetVariable().Value = value; + } + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/TransformVariable.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Variables/TransformVariable.cs.meta new file mode 100644 index 00000000..9ed480ff --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/TransformVariable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dbc98ff6538275b4c9a8383882546ee9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/Variable.cs b/Assets/MonoBehaviourTree/Source/Runtime/Variables/Variable.cs new file mode 100644 index 00000000..a3f93012 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/Variable.cs @@ -0,0 +1,138 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + // [RequireComponent(typeof(Blackboard))] + public abstract class Variable : BlackboardVariable, Observable + { + // [HideInInspector] + [SerializeField] + protected T val = default(T); + protected event ChangeListener listeners = delegate {}; + + // This is required to correctly compare Unity Objects as generic fields + protected abstract bool ValueEquals(T val1, T val2); + + public void AddListener(ChangeListener listener) + { + listeners += listener; + } + + public void RemoveListener(ChangeListener listener) + { + listeners -= listener; + } + + public T Value + { + get + { + return val; + } + set + { + if (!ValueEquals(val, value)) { + T oldValue = val; + val = value; + listeners.Invoke(oldValue, value); + } + } + } + + protected virtual void OnValidate() + { + // Special case: Invoke listeners when there was change in inspector + listeners.Invoke(val, val); + } + } + + public delegate void ChangeListener(T oldValue, T newValue); + + public interface Observable + { + void AddListener(ChangeListener listener); + void RemoveListener(ChangeListener listener); + } + + [System.Serializable] + public class VariableReference : BaseVariableReference where T : BlackboardVariable + { + // Cache + protected T value = null; + [SerializeField] + protected U constantValue = default(U); + + /// + /// Returns observable Variable or null if it doesn't exists on blackboard. + /// + public T GetVariable() + { + if (value != null) { + return value; + } + if (blackboard == null || string.IsNullOrEmpty(key)) { + return null; + } + value = blackboard.GetVariable(key); + #if UNITY_EDITOR + if (value == null) + { + Debug.LogWarningFormat(blackboard, "Variable '{0}' does not exists on blackboard.", key); + } + #endif + return value; + } + + public U GetConstant() + { + return constantValue; + } + } + + public enum VarRefMode { EnableConstant, DisableConstant } + + [System.Serializable] + public abstract class BaseVariableReference + { + [SerializeField] + protected bool useConstant = false; + // Additional editor feature to lock switch + [SerializeField] + protected VarRefMode mode = VarRefMode.EnableConstant; + public Blackboard blackboard; + public string key; + + public virtual bool isConstant + { + get { return useConstant; } + } + + /// + /// Returns true when constant value is valid + /// + /// + protected virtual bool isConstantValid + { + get + { + return true; + } + } + + /// + /// Returns true when variable setup is invalid + /// + public bool isInvalid + { + get { return (isConstant)? !isConstantValid : blackboard == null || string.IsNullOrEmpty(key); } + } + + protected void SetMode(VarRefMode mode) + { + this.mode = mode; + useConstant = (mode == VarRefMode.DisableConstant)? false : useConstant; + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/Variable.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Variables/Variable.cs.meta new file mode 100644 index 00000000..46c5aff5 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/Variable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 94c46f12ee653c645a829764622b997c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/Vector2Variable.cs b/Assets/MonoBehaviourTree/Source/Runtime/Variables/Vector2Variable.cs new file mode 100644 index 00000000..20449541 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/Vector2Variable.cs @@ -0,0 +1,49 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + public class Vector2Variable : Variable + { + protected override bool ValueEquals(Vector2 val1, Vector2 val2) + { + return val1 == val2; + } + } + + [System.Serializable] + public class Vector2Reference : VariableReference + { + public Vector2Reference(VarRefMode mode = VarRefMode.EnableConstant) + { + SetMode(mode); + } + + public Vector2Reference(Vector2 defaultConstant) + { + useConstant = true; + constantValue = defaultConstant; + } + + public Vector2 Value + { + get + { + return (useConstant)? constantValue : this.GetVariable().Value; + } + set + { + if (useConstant) + { + constantValue = value; + } + else + { + this.GetVariable().Value = value; + } + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/Vector2Variable.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Variables/Vector2Variable.cs.meta new file mode 100644 index 00000000..f4f70611 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/Vector2Variable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eaa62ce5e63cc9d45ae0efc52561ace7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/Vector3Variable.cs b/Assets/MonoBehaviourTree/Source/Runtime/Variables/Vector3Variable.cs new file mode 100644 index 00000000..541087f7 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/Vector3Variable.cs @@ -0,0 +1,49 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MBT +{ + [AddComponentMenu("")] + public class Vector3Variable : Variable + { + protected override bool ValueEquals(Vector3 val1, Vector3 val2) + { + return val1 == val2; + } + } + + [System.Serializable] + public class Vector3Reference : VariableReference + { + public Vector3Reference(VarRefMode mode = VarRefMode.EnableConstant) + { + SetMode(mode); + } + + public Vector3Reference(Vector3 defaultConstant) + { + useConstant = true; + constantValue = defaultConstant; + } + + public Vector3 Value + { + get + { + return (useConstant)? constantValue : this.GetVariable().Value; + } + set + { + if (useConstant) + { + constantValue = value; + } + else + { + this.GetVariable().Value = value; + } + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Runtime/Variables/Vector3Variable.cs.meta b/Assets/MonoBehaviourTree/Source/Runtime/Variables/Vector3Variable.cs.meta new file mode 100644 index 00000000..3a8028fd --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Runtime/Variables/Vector3Variable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 51272808e3662eb4286c82f38f91fae9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples.meta b/Assets/MonoBehaviourTree/Source/Samples.meta new file mode 100644 index 00000000..53c2bedc --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 43ebf6708a37e234683784f58a60f714 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP.meta new file mode 100644 index 00000000..c99967f8 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: de947a238a5c0094b880e08934db678a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets.meta new file mode 100644 index 00000000..105a1a6d --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6ac9dd2aca088894bb45317cda2f458e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/InfoBoardTemplate.prefab b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/InfoBoardTemplate.prefab new file mode 100644 index 00000000..83eb954e --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/InfoBoardTemplate.prefab @@ -0,0 +1,341 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &393064622293429828 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 393064622293429832} + - component: {fileID: 393064622293429833} + - component: {fileID: 393064622293429830} + - component: {fileID: 393064622293429831} + m_Layer: 5 + m_Name: InfoBoardTemplate + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &393064622293429832 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393064622293429828} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.01, y: 0.01, z: 0.01} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 393064623251646979} + - {fileID: 393064623583151032} + - {fileID: 393064623482343628} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 800, y: 600} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!223 &393064622293429833 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393064622293429828} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!114 &393064622293429830 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393064622293429828} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 1 +--- !u!114 &393064622293429831 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393064622293429828} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!1 &393064623251646976 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 393064623251646979} + - component: {fileID: 393064623251646981} + - component: {fileID: 393064623251646978} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &393064623251646979 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393064623251646976} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 393064622293429832} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 800, y: 600} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &393064623251646981 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393064623251646976} + m_CullTransparentMesh: 0 +--- !u!114 &393064623251646978 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393064623251646976} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.2264151, g: 0.2264151, b: 0.2264151, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &393064623482343629 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 393064623482343628} + - component: {fileID: 393064623482343630} + - component: {fileID: 393064623482343631} + m_Layer: 5 + m_Name: Text 2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &393064623482343628 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393064623482343629} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 393064622293429832} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -85.3} + m_SizeDelta: {x: 700, y: 400} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &393064623482343630 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393064623482343629} + m_CullTransparentMesh: 0 +--- !u!114 &393064623482343631 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393064623482343629} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 300 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Description +--- !u!1 &393064623583151033 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 393064623583151032} + - component: {fileID: 393064623583151034} + - component: {fileID: 393064623583151035} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &393064623583151032 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393064623583151033} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 393064622293429832} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 700, y: 550} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &393064623583151034 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393064623583151033} + m_CullTransparentMesh: 0 +--- !u!114 &393064623583151035 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393064623583151033} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 300 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Example diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/InfoBoardTemplate.prefab.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/InfoBoardTemplate.prefab.meta new file mode 100644 index 00000000..8fddbf8c --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/InfoBoardTemplate.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 15175a89b7c18334bbb6894ce2068ee3 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials.meta new file mode 100644 index 00000000..a206e5dd --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 37624cc6b8ad6464091171b47e3d9851 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/BotCapsule.mat b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/BotCapsule.mat new file mode 100644 index 00000000..56aa856d --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/BotCapsule.mat @@ -0,0 +1,90 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-4364459351690099828 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 1 +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: BotCapsule + m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2050 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 10305, guid: 0000000000000000f000000000000000, type: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 10305, guid: 0000000000000000f000000000000000, type: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AlphaClip: 0 + - _Blend: 0 + - _BumpScale: 1 + - _Cull: 2 + - _Cutoff: 0.5 + - _DstBlend: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 0.7924528, g: 0.15325737, b: 0.15325737, a: 1} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/BotCapsule.mat.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/BotCapsule.mat.meta new file mode 100644 index 00000000..d0a0e5c4 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/BotCapsule.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d2cafc828a569f549a97c37ad90f0881 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/Ground.mat b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/Ground.mat new file mode 100644 index 00000000..ed5d38a3 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/Ground.mat @@ -0,0 +1,90 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Ground + m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2050 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 10309, guid: 0000000000000000f000000000000000, type: 0} + m_Scale: {x: 5, y: 5} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 10309, guid: 0000000000000000f000000000000000, type: 0} + m_Scale: {x: 5, y: 5} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AlphaClip: 0 + - _Blend: 0 + - _BumpScale: 1 + - _Cull: 2 + - _Cutoff: 0.5 + - _DstBlend: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} +--- !u!114 &5646239606909741766 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 1 diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/Ground.mat.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/Ground.mat.meta new file mode 100644 index 00000000..f919af64 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/Ground.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d7c7b1cc4f0a8154ba6baac04eaffd3e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/Obstacle.mat b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/Obstacle.mat new file mode 100644 index 00000000..b56fb847 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/Obstacle.mat @@ -0,0 +1,90 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-7005712164398551334 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 1 +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Obstacle + m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2050 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 10309, guid: 0000000000000000f000000000000000, type: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 10309, guid: 0000000000000000f000000000000000, type: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AlphaClip: 0 + - _Blend: 0 + - _BumpScale: 1 + - _Cull: 2 + - _Cutoff: 0.5 + - _DstBlend: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 0.9339623, g: 0.8551719, b: 0.7973923, a: 1} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/Obstacle.mat.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/Obstacle.mat.meta new file mode 100644 index 00000000..c4abb6ce --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/Obstacle.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2f8cea68151f729488dc3f60f89fbfc8 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/PlayerCapsule.mat b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/PlayerCapsule.mat new file mode 100644 index 00000000..5943fb9d --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/PlayerCapsule.mat @@ -0,0 +1,90 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-1029608418028485828 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 1 +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PlayerCapsule + m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2050 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 10305, guid: 0000000000000000f000000000000000, type: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 10305, guid: 0000000000000000f000000000000000, type: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AlphaClip: 0 + - _Blend: 0 + - _BumpScale: 1 + - _Cull: 2 + - _Cutoff: 0.5 + - _DstBlend: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 0.13705944, g: 0.8301887, b: 0.56706506, a: 1} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/PlayerCapsule.mat.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/PlayerCapsule.mat.meta new file mode 100644 index 00000000..11e3b892 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/PlayerCapsule.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 889830630d8ddd84db8c615c3a8b1031 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/ViewSphere.mat b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/ViewSphere.mat new file mode 100644 index 00000000..5bf98fdd --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/ViewSphere.mat @@ -0,0 +1,97 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: ViewSphere + m_Shader: {fileID: -6465566751694194690, guid: 920e50b2d155e9646bc68b0b0e444306, + type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: + - SHADOWCASTER + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - Texture2D_6EC18C9B: + m_Texture: {fileID: 10305, guid: 0000000000000000f000000000000000, type: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BaseMap: + m_Texture: {fileID: 10305, guid: 0000000000000000f000000000000000, type: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 10305, guid: 0000000000000000f000000000000000, type: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AlphaClip: 0 + - _Blend: 0 + - _BumpScale: 1 + - _Cull: 2 + - _Cutoff: 0.482 + - _DstBlend: 10 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _SampleGI: 0 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 5 + - _Surface: 1 + - _WorkflowMode: 1 + - _ZWrite: 0 + m_Colors: + - Color_40D192D9: {r: 1, g: 0.47604877, b: 0, a: 0.078431375} + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} +--- !u!114 &6087235041978063889 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 1 diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/ViewSphere.mat.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/ViewSphere.mat.meta new file mode 100644 index 00000000..985f029e --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Materials/ViewSphere.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3b3945d28de0349448558be478ee20b8 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes.meta new file mode 100644 index 00000000..17084eef --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b0a2f2a7669db7a46a2c26b19318978a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/DetectEnemyService.cs b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/DetectEnemyService.cs new file mode 100644 index 00000000..f2b1c5c2 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/DetectEnemyService.cs @@ -0,0 +1,31 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using MBT; + +namespace MBTExample +{ + [AddComponentMenu("")] + [MBTNode("Example/Detect Enemy Service")] + public class DetectEnemyService : Service + { + public LayerMask mask = -1; + [Tooltip("Sphere radius")] + public float range = 15; + public TransformReference variableToSet = new TransformReference(VarRefMode.DisableConstant); + + public override void Task() + { + // Find target in radius and feed blackboard variable with results + Collider[] colliders = Physics.OverlapSphere(transform.position, range, mask, QueryTriggerInteraction.Ignore); + if (colliders.Length > 0) + { + variableToSet.Value = colliders[0].transform; + } + else + { + variableToSet.Value = null; + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/DetectEnemyService.cs.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/DetectEnemyService.cs.meta new file mode 100644 index 00000000..fb98b60b --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/DetectEnemyService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b2b0d715ba3c3a646a4fdb6d2bcc62d7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/MoveNavmeshAgent.cs b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/MoveNavmeshAgent.cs new file mode 100644 index 00000000..c72f7a6c --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/MoveNavmeshAgent.cs @@ -0,0 +1,67 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.AI; +using MBT; + +namespace MBTExample +{ + [AddComponentMenu("")] + [MBTNode("Example/Move Navmesh Agent")] + public class MoveNavmeshAgent : Leaf + { + public TransformReference destination; + public NavMeshAgent agent; + public float stopDistance = 2f; + [Tooltip("How often target position should be updated")] + public float updateInterval = 1f; + private float time = 0; + + public override void OnEnter() + { + time = 0; + agent.isStopped = false; + agent.SetDestination(destination.Value.position); + } + + public override NodeResult Execute() + { + time += Time.deltaTime; + // Update destination every given interval + if (time > updateInterval) + { + // Reset time and update destination + time = 0; + agent.SetDestination(destination.Value.position); + } + // Check if path is ready + if (agent.pathPending) + { + return NodeResult.running; + } + // Check if agent is very close to destination + if (agent.remainingDistance < stopDistance) + { + return NodeResult.success; + } + // Check if there is any path (if not pending, it should be set) + if (agent.hasPath) + { + return NodeResult.running; + } + // By default return failure + return NodeResult.failure; + } + + public override void OnExit() + { + agent.isStopped = true; + // agent.ResetPath(); + } + + public override bool IsValid() + { + return !(destination.isInvalid || agent == null); + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/MoveNavmeshAgent.cs.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/MoveNavmeshAgent.cs.meta new file mode 100644 index 00000000..7bbd18a4 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/MoveNavmeshAgent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7ec611930975eda44b3c82fc2e9133a8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/MoveTowards.cs b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/MoveTowards.cs new file mode 100644 index 00000000..ec2e08a8 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/MoveTowards.cs @@ -0,0 +1,39 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using MBT; + +namespace MBTExample +{ + [MBTNode("Example/Move Towards")] + [AddComponentMenu("")] + public class MoveTowards : Leaf + { + public Vector3Reference targetPosition; + public TransformReference transformToMove; + public float speed = 0.1f; + public float minDistance = 0f; + + public override NodeResult Execute() + { + Vector3 target = targetPosition.Value; + Transform obj = transformToMove.Value; + // Move as long as distance is greater than min. distance + float dist = Vector3.Distance(target, obj.position); + if (dist > minDistance) + { + // Move towards target + obj.position = Vector3.MoveTowards( + obj.position, + target, + (speed > dist)? dist : speed + ); + return NodeResult.running; + } + else + { + return NodeResult.success; + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/MoveTowards.cs.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/MoveTowards.cs.meta new file mode 100644 index 00000000..04fa2dae --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/MoveTowards.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ea825aa2e7214af419a5aa40843b9dbd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/SetPatrolPoint.cs b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/SetPatrolPoint.cs new file mode 100644 index 00000000..bd086181 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/SetPatrolPoint.cs @@ -0,0 +1,39 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using MBT; + +namespace MBTExample +{ + [MBTNode("Example/Set Patrol Point")] + [AddComponentMenu("")] + public class SetPatrolPoint : Leaf + { + public TransformReference variableToSet = new TransformReference(VarRefMode.DisableConstant); + public Transform[] waypoints; + private int index = 0; + private int direction = 1; + + public override NodeResult Execute() + { + if (waypoints.Length == 0) + { + return NodeResult.failure; + } + // Ping-pong between waypoints + if (direction == 1 && index == waypoints.Length-1) + { + direction = -1; + } + else if (direction == -1 && index == 0) + { + direction = 1; + } + index += direction; + + // Set blackboard variable with need waypoint (position) + variableToSet.Value = waypoints[index]; + return NodeResult.success; + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/SetPatrolPoint.cs.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/SetPatrolPoint.cs.meta new file mode 100644 index 00000000..327d09b5 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/SetPatrolPoint.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 842a054cfbe33f944b646e8de04bd575 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/SetRandomPosition.cs b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/SetRandomPosition.cs new file mode 100644 index 00000000..db437fe1 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/SetRandomPosition.cs @@ -0,0 +1,26 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using MBT; + +namespace MBTExample +{ + [AddComponentMenu("")] + [MBTNode("Example/Set Random Position", 500)] + public class SetRandomPosition : Leaf + { + public Bounds bounds; + public Vector3Reference blackboardVariable = new Vector3Reference(VarRefMode.DisableConstant); + + public override NodeResult Execute() + { + // Random values per component inside bounds + blackboardVariable.Value = new Vector3( + Random.Range(bounds.min.x, bounds.max.x), + Random.Range(bounds.min.y, bounds.max.y), + Random.Range(bounds.min.z, bounds.max.z) + ); + return NodeResult.success; + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/SetRandomPosition.cs.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/SetRandomPosition.cs.meta new file mode 100644 index 00000000..1850c81f --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Nodes/SetRandomPosition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b07ede05ff4add24e87726f88a88df1e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Scripts.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Scripts.meta new file mode 100644 index 00000000..20f82029 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 23d8520f29f549e43a46bfc8357a04ae +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Scripts/PlayerNavmeshController.cs b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Scripts/PlayerNavmeshController.cs new file mode 100644 index 00000000..f2052f0f --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Scripts/PlayerNavmeshController.cs @@ -0,0 +1,33 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.AI; + +namespace MBTExample +{ + public class PlayerNavmeshController : MonoBehaviour + { + public Camera cam; + public NavMeshAgent agent; + + void Reset() + { + cam = Camera.main; + agent = GetComponent(); + } + + // Update is called once per frame + void Update() + { + if (Input.GetMouseButtonDown(0)) + { + Ray ray = cam.ScreenPointToRay(Input.mousePosition); + + if (Physics.Raycast(ray, out RaycastHit hit)) + { + agent.SetDestination(hit.point); + } + } + } + } +} diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Scripts/PlayerNavmeshController.cs.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Scripts/PlayerNavmeshController.cs.meta new file mode 100644 index 00000000..cb429864 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Scripts/PlayerNavmeshController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d6f042bf63e59ff4b8b18485cc3d11b4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Shaders.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Shaders.meta new file mode 100644 index 00000000..f77b62ed --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Shaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e1fc1f5b8f6774b43bea5c2ebf9e93d1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Shaders/ViewZoneShader.shadergraph b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Shaders/ViewZoneShader.shadergraph new file mode 100644 index 00000000..5ce07cf0 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Shaders/ViewZoneShader.shadergraph @@ -0,0 +1,260 @@ +{ + "m_SerializedProperties": [ + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty" + }, + "JSONnodeData": "{\n \"m_Guid\": {\n \"m_GuidSerialized\": \"22a87a7d-40ce-45de-be51-b5f535476b7a\"\n },\n \"m_Name\": \"Texture\",\n \"m_DefaultReferenceName\": \"Texture2D_6EC18C9B\",\n \"m_OverrideReferenceName\": \"\",\n \"m_GeneratePropertyBlock\": true,\n \"m_Precision\": 0,\n \"m_GPUInstanced\": false,\n \"m_Hidden\": false,\n \"m_Value\": {\n \"m_SerializedTexture\": \"{\\\"texture\\\":{\\\"instanceID\\\":0}}\",\n \"m_Guid\": \"\"\n },\n \"m_Modifiable\": true,\n \"m_DefaultType\": 0\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty" + }, + "JSONnodeData": "{\n \"m_Guid\": {\n \"m_GuidSerialized\": \"4cb193ee-7f09-4900-b246-2420ea7cf294\"\n },\n \"m_Name\": \"Tint\",\n \"m_DefaultReferenceName\": \"Color_40D192D9\",\n \"m_OverrideReferenceName\": \"\",\n \"m_GeneratePropertyBlock\": true,\n \"m_Precision\": 0,\n \"m_GPUInstanced\": false,\n \"m_Hidden\": false,\n \"m_Value\": {\n \"r\": 1.0,\n \"g\": 1.0,\n \"b\": 1.0,\n \"a\": 1.0\n },\n \"m_ColorMode\": 0\n}" + } + ], + "m_SerializedKeywords": [], + "m_SerializableNodes": [ + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.UnlitMasterNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"8e5cfa86-2fd3-4ca1-8f92-453700d8212f\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"Unlit Master\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": false,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": 798.0,\n \"y\": 387.0,\n \"width\": 200.0,\n \"height\": 101.0\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.PositionMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 9,\\n \\\"m_DisplayName\\\": \\\"Vertex Position\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Vertex Position\\\",\\n \\\"m_StageCapability\\\": 1,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0\\n },\\n \\\"m_Labels\\\": [\\n \\\"X\\\",\\n \\\"Y\\\",\\n \\\"Z\\\"\\n ],\\n \\\"m_Space\\\": 0\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.NormalMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 10,\\n \\\"m_DisplayName\\\": \\\"Vertex Normal\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Vertex Normal\\\",\\n \\\"m_StageCapability\\\": 1,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0\\n },\\n \\\"m_Labels\\\": [\\n \\\"X\\\",\\n \\\"Y\\\",\\n \\\"Z\\\"\\n ],\\n \\\"m_Space\\\": 0\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.TangentMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 11,\\n \\\"m_DisplayName\\\": \\\"Vertex Tangent\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Vertex Tangent\\\",\\n \\\"m_StageCapability\\\": 1,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0\\n },\\n \\\"m_Labels\\\": [\\n \\\"X\\\",\\n \\\"Y\\\",\\n \\\"Z\\\"\\n ],\\n \\\"m_Space\\\": 0\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.ColorRGBMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"Color\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Color\\\",\\n \\\"m_StageCapability\\\": 2,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.7353569269180298,\\n \\\"y\\\": 0.7353569269180298,\\n \\\"z\\\": 0.7353569269180298\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0\\n },\\n \\\"m_Labels\\\": [\\n \\\"X\\\",\\n \\\"Y\\\",\\n \\\"Z\\\"\\n ],\\n \\\"m_ColorMode\\\": 0\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector1MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 7,\\n \\\"m_DisplayName\\\": \\\"Alpha\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Alpha\\\",\\n \\\"m_StageCapability\\\": 2,\\n \\\"m_Value\\\": 1.0,\\n \\\"m_DefaultValue\\\": 1.0,\\n \\\"m_Labels\\\": [\\n \\\"X\\\"\\n ]\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector1MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 8,\\n \\\"m_DisplayName\\\": \\\"AlphaClipThreshold\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"AlphaClipThreshold\\\",\\n \\\"m_StageCapability\\\": 2,\\n \\\"m_Value\\\": 0.0,\\n \\\"m_DefaultValue\\\": 0.0,\\n \\\"m_Labels\\\": [\\n \\\"X\\\"\\n ]\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": true,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n },\n \"m_DOTSInstancing\": false,\n \"m_SerializableSubShaders\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.Rendering.Universal.UniversalUnlitSubShader\"\n },\n \"JSONnodeData\": \"{}\"\n }\n ],\n \"m_SurfaceType\": 1,\n \"m_AlphaMode\": 0,\n \"m_TwoSided\": true,\n \"m_AddPrecomputedVelocity\": false\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.PropertyNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"7d8bc1f2-73f3-4a8e-9a02-e817417cf6eb\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"Property\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": true,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": -415.0,\n \"y\": -34.00000762939453,\n \"width\": 127.0,\n \"height\": 34.0\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Texture2DMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"Texture\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Out\\\",\\n \\\"m_StageCapability\\\": 3\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": true,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n },\n \"m_PropertyGuidSerialized\": \"22a87a7d-40ce-45de-be51-b5f535476b7a\"\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.SampleTexture2DNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"cf683fb4-32b2-47a2-b689-91a5ea26b6eb\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"Sample Texture 2D\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": true,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": -239.9999542236328,\n \"y\": -36.000022888183597,\n \"width\": 208.0,\n \"height\": 433.0\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector4MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"RGBA\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"RGBA\\\",\\n \\\"m_StageCapability\\\": 2,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector1MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 4,\\n \\\"m_DisplayName\\\": \\\"R\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"R\\\",\\n \\\"m_StageCapability\\\": 2,\\n \\\"m_Value\\\": 0.0,\\n \\\"m_DefaultValue\\\": 0.0,\\n \\\"m_Labels\\\": [\\n \\\"X\\\"\\n ]\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector1MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 5,\\n \\\"m_DisplayName\\\": \\\"G\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"G\\\",\\n \\\"m_StageCapability\\\": 2,\\n \\\"m_Value\\\": 0.0,\\n \\\"m_DefaultValue\\\": 0.0,\\n \\\"m_Labels\\\": [\\n \\\"X\\\"\\n ]\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector1MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 6,\\n \\\"m_DisplayName\\\": \\\"B\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"B\\\",\\n \\\"m_StageCapability\\\": 2,\\n \\\"m_Value\\\": 0.0,\\n \\\"m_DefaultValue\\\": 0.0,\\n \\\"m_Labels\\\": [\\n \\\"X\\\"\\n ]\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector1MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 7,\\n \\\"m_DisplayName\\\": \\\"A\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"A\\\",\\n \\\"m_StageCapability\\\": 2,\\n \\\"m_Value\\\": 0.0,\\n \\\"m_DefaultValue\\\": 0.0,\\n \\\"m_Labels\\\": [\\n \\\"X\\\"\\n ]\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Texture2DInputMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 1,\\n \\\"m_DisplayName\\\": \\\"Texture\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Texture\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Texture\\\": {\\n \\\"m_SerializedTexture\\\": \\\"{\\\\\\\"texture\\\\\\\":{\\\\\\\"instanceID\\\\\\\":0}}\\\",\\n \\\"m_Guid\\\": \\\"\\\"\\n },\\n \\\"m_DefaultType\\\": 0\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.UVMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 2,\\n \\\"m_DisplayName\\\": \\\"UV\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"UV\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0\\n },\\n \\\"m_Labels\\\": [\\n \\\"X\\\",\\n \\\"Y\\\"\\n ],\\n \\\"m_Channel\\\": 0\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.SamplerStateMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 3,\\n \\\"m_DisplayName\\\": \\\"Sampler\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Sampler\\\",\\n \\\"m_StageCapability\\\": 3\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": true,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n },\n \"m_TextureType\": 0,\n \"m_NormalMapSpace\": 0\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.PropertyNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"4d4f1bbf-f43f-4208-9d37-1f2e0c1dca2a\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"Property\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": true,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": -151.99996948242188,\n \"y\": -135.00001525878907,\n \"width\": 98.99999237060547,\n \"height\": 34.0\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector4MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"Tint\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Out\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": true,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n },\n \"m_PropertyGuidSerialized\": \"4cb193ee-7f09-4900-b246-2420ea7cf294\"\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.MultiplyNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"226236f1-1a7e-4152-9dd8-2d138e2e9280\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"Multiply\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": true,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": 6.000032901763916,\n \"y\": -79.00000762939453,\n \"width\": 208.0,\n \"height\": 302.0\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicValueMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"A\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"A\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"e00\\\": 0.0,\\n \\\"e01\\\": 0.0,\\n \\\"e02\\\": 0.0,\\n \\\"e03\\\": 0.0,\\n \\\"e10\\\": 0.0,\\n \\\"e11\\\": 0.0,\\n \\\"e12\\\": 0.0,\\n \\\"e13\\\": 0.0,\\n \\\"e20\\\": 0.0,\\n \\\"e21\\\": 0.0,\\n \\\"e22\\\": 0.0,\\n \\\"e23\\\": 0.0,\\n \\\"e30\\\": 0.0,\\n \\\"e31\\\": 0.0,\\n \\\"e32\\\": 0.0,\\n \\\"e33\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"e00\\\": 1.0,\\n \\\"e01\\\": 0.0,\\n \\\"e02\\\": 0.0,\\n \\\"e03\\\": 0.0,\\n \\\"e10\\\": 0.0,\\n \\\"e11\\\": 1.0,\\n \\\"e12\\\": 0.0,\\n \\\"e13\\\": 0.0,\\n \\\"e20\\\": 0.0,\\n \\\"e21\\\": 0.0,\\n \\\"e22\\\": 1.0,\\n \\\"e23\\\": 0.0,\\n \\\"e30\\\": 0.0,\\n \\\"e31\\\": 0.0,\\n \\\"e32\\\": 0.0,\\n \\\"e33\\\": 1.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicValueMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 1,\\n \\\"m_DisplayName\\\": \\\"B\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"B\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"e00\\\": 2.0,\\n \\\"e01\\\": 2.0,\\n \\\"e02\\\": 2.0,\\n \\\"e03\\\": 2.0,\\n \\\"e10\\\": 2.0,\\n \\\"e11\\\": 2.0,\\n \\\"e12\\\": 2.0,\\n \\\"e13\\\": 2.0,\\n \\\"e20\\\": 2.0,\\n \\\"e21\\\": 2.0,\\n \\\"e22\\\": 2.0,\\n \\\"e23\\\": 2.0,\\n \\\"e30\\\": 2.0,\\n \\\"e31\\\": 2.0,\\n \\\"e32\\\": 2.0,\\n \\\"e33\\\": 2.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"e00\\\": 1.0,\\n \\\"e01\\\": 0.0,\\n \\\"e02\\\": 0.0,\\n \\\"e03\\\": 0.0,\\n \\\"e10\\\": 0.0,\\n \\\"e11\\\": 1.0,\\n \\\"e12\\\": 0.0,\\n \\\"e13\\\": 0.0,\\n \\\"e20\\\": 0.0,\\n \\\"e21\\\": 0.0,\\n \\\"e22\\\": 1.0,\\n \\\"e23\\\": 0.0,\\n \\\"e30\\\": 0.0,\\n \\\"e31\\\": 0.0,\\n \\\"e32\\\": 0.0,\\n \\\"e33\\\": 1.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicValueMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 2,\\n \\\"m_DisplayName\\\": \\\"Out\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Out\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"e00\\\": 0.0,\\n \\\"e01\\\": 0.0,\\n \\\"e02\\\": 0.0,\\n \\\"e03\\\": 0.0,\\n \\\"e10\\\": 0.0,\\n \\\"e11\\\": 0.0,\\n \\\"e12\\\": 0.0,\\n \\\"e13\\\": 0.0,\\n \\\"e20\\\": 0.0,\\n \\\"e21\\\": 0.0,\\n \\\"e22\\\": 0.0,\\n \\\"e23\\\": 0.0,\\n \\\"e30\\\": 0.0,\\n \\\"e31\\\": 0.0,\\n \\\"e32\\\": 0.0,\\n \\\"e33\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"e00\\\": 1.0,\\n \\\"e01\\\": 0.0,\\n \\\"e02\\\": 0.0,\\n \\\"e03\\\": 0.0,\\n \\\"e10\\\": 0.0,\\n \\\"e11\\\": 1.0,\\n \\\"e12\\\": 0.0,\\n \\\"e13\\\": 0.0,\\n \\\"e20\\\": 0.0,\\n \\\"e21\\\": 0.0,\\n \\\"e22\\\": 1.0,\\n \\\"e23\\\": 0.0,\\n \\\"e30\\\": 0.0,\\n \\\"e31\\\": 0.0,\\n \\\"e32\\\": 0.0,\\n \\\"e33\\\": 1.0\\n }\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": true,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.SplitNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"d7a165e0-2122-4338-9a13-82e41724eceb\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"Split\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": true,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": 261.0000305175781,\n \"y\": 340.0,\n \"width\": 128.0,\n \"height\": 149.0\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"In\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"In\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector1MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 1,\\n \\\"m_DisplayName\\\": \\\"R\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"R\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": 0.0,\\n \\\"m_DefaultValue\\\": 0.0,\\n \\\"m_Labels\\\": [\\n \\\"X\\\"\\n ]\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector1MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 2,\\n \\\"m_DisplayName\\\": \\\"G\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"G\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": 0.0,\\n \\\"m_DefaultValue\\\": 0.0,\\n \\\"m_Labels\\\": [\\n \\\"X\\\"\\n ]\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector1MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 3,\\n \\\"m_DisplayName\\\": \\\"B\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"B\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": 0.0,\\n \\\"m_DefaultValue\\\": 0.0,\\n \\\"m_Labels\\\": [\\n \\\"X\\\"\\n ]\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector1MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 4,\\n \\\"m_DisplayName\\\": \\\"A\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"A\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": 0.0,\\n \\\"m_DefaultValue\\\": 0.0,\\n \\\"m_Labels\\\": [\\n \\\"X\\\"\\n ]\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": true,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.FresnelNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"40b62719-6c54-4934-91f6-03c099188467\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"Fresnel Effect\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": true,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": 364.0000305175781,\n \"y\": -2.9999988079071047,\n \"width\": 208.0,\n \"height\": 326.0\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.NormalMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"Normal\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Normal\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0\\n },\\n \\\"m_Labels\\\": [\\n \\\"X\\\",\\n \\\"Y\\\",\\n \\\"Z\\\"\\n ],\\n \\\"m_Space\\\": 2\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.ViewDirectionMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 1,\\n \\\"m_DisplayName\\\": \\\"View Dir\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"ViewDir\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0\\n },\\n \\\"m_Labels\\\": [\\n \\\"X\\\",\\n \\\"Y\\\",\\n \\\"Z\\\"\\n ],\\n \\\"m_Space\\\": 2\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector1MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 2,\\n \\\"m_DisplayName\\\": \\\"Power\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Power\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": 3.0,\\n \\\"m_DefaultValue\\\": 1.0,\\n \\\"m_Labels\\\": [\\n \\\"X\\\"\\n ]\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector1MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 3,\\n \\\"m_DisplayName\\\": \\\"Out\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Out\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": 0.0,\\n \\\"m_DefaultValue\\\": 0.0,\\n \\\"m_Labels\\\": [\\n \\\"X\\\"\\n ]\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": true,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.AddNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"69d73e49-e70b-480a-adbd-2e0e9419b3c7\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"Add\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": true,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": 626.0,\n \"y\": -81.00003051757813,\n \"width\": 137.0,\n \"height\": 117.99999237060547\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"A\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"A\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 1,\\n \\\"m_DisplayName\\\": \\\"B\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"B\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 2,\\n \\\"m_DisplayName\\\": \\\"Out\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Out\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": false,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.SceneDepthNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"5a7601bb-aa42-4ff1-8060-2aa2d31d4674\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"Scene Depth\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": true,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": -929.0,\n \"y\": 520.0,\n \"width\": 145.0,\n \"height\": 112.00000762939453\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.ScreenPositionMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"UV\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"UV\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_ScreenSpaceType\\\": 0\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector1MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 1,\\n \\\"m_DisplayName\\\": \\\"Out\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Out\\\",\\n \\\"m_StageCapability\\\": 2,\\n \\\"m_Value\\\": 0.0,\\n \\\"m_DefaultValue\\\": 0.0,\\n \\\"m_Labels\\\": [\\n \\\"X\\\"\\n ]\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": true,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n },\n \"m_DepthSamplingMode\": 2\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.ScreenPositionNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"ac27eb87-29a8-4b39-9842-1b64b55d0ba4\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"Screen Position\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": true,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": -1097.0,\n \"y\": 656.0,\n \"width\": 153.0,\n \"height\": 129.0\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector4MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"Out\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Out\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": false,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n },\n \"m_ScreenSpaceType\": 1\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.SubtractNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"ea8c3961-bc41-4e40-bd04-dcdb88111a31\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"Subtract\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": true,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": -751.0,\n \"y\": 562.0,\n \"width\": 135.00001525878907,\n \"height\": 118.0\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"A\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"A\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 1.0,\\n \\\"y\\\": 1.0,\\n \\\"z\\\": 1.0,\\n \\\"w\\\": 1.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 1,\\n \\\"m_DisplayName\\\": \\\"B\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"B\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 1.0,\\n \\\"y\\\": 1.0,\\n \\\"z\\\": 1.0,\\n \\\"w\\\": 1.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 2,\\n \\\"m_DisplayName\\\": \\\"Out\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Out\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": false,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.DivideNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"b27f9903-97d4-4375-9f19-731f70b50bcb\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"Divide\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": true,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": -581.9999389648438,\n \"y\": 628.0,\n \"width\": 135.00001525878907,\n \"height\": 118.0\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"A\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"A\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 1,\\n \\\"m_DisplayName\\\": \\\"B\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"B\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 1.0,\\n \\\"y\\\": 2.0,\\n \\\"z\\\": 2.0,\\n \\\"w\\\": 2.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 2,\\n \\\"m_DisplayName\\\": \\\"Out\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Out\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": false,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.SplitNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"f9f2fbd8-08b0-4727-8e34-f99cc5488123\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"Split\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": true,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": -914.0,\n \"y\": 634.0,\n \"width\": 127.00000762939453,\n \"height\": 149.00001525878907\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"In\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"In\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector1MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 1,\\n \\\"m_DisplayName\\\": \\\"R\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"R\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": 0.0,\\n \\\"m_DefaultValue\\\": 0.0,\\n \\\"m_Labels\\\": [\\n \\\"X\\\"\\n ]\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector1MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 2,\\n \\\"m_DisplayName\\\": \\\"G\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"G\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": 0.0,\\n \\\"m_DefaultValue\\\": 0.0,\\n \\\"m_Labels\\\": [\\n \\\"X\\\"\\n ]\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector1MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 3,\\n \\\"m_DisplayName\\\": \\\"B\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"B\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": 0.0,\\n \\\"m_DefaultValue\\\": 0.0,\\n \\\"m_Labels\\\": [\\n \\\"X\\\"\\n ]\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.Vector1MaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 4,\\n \\\"m_DisplayName\\\": \\\"A\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"A\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": 0.0,\\n \\\"m_DefaultValue\\\": 0.0,\\n \\\"m_Labels\\\": [\\n \\\"X\\\"\\n ]\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": true,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.SmoothstepNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"7a95854f-bc33-4d63-89c7-ac0a0ba26aae\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"Smoothstep\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": true,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": -252.9998779296875,\n \"y\": 527.0000610351563,\n \"width\": 162.0,\n \"height\": 142.0\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"Edge1\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Edge1\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 1,\\n \\\"m_DisplayName\\\": \\\"Edge2\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Edge2\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 1.0,\\n \\\"y\\\": 1.0,\\n \\\"z\\\": 1.0,\\n \\\"w\\\": 1.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 2,\\n \\\"m_DisplayName\\\": \\\"In\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"In\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 3,\\n \\\"m_DisplayName\\\": \\\"Out\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Out\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": false,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.OneMinusNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"d710bd3d-0d6f-4bba-adca-de1f097e90ac\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"One Minus\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": true,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": -426.0000305175781,\n \"y\": 628.0,\n \"width\": 139.0,\n \"height\": 94.0\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"In\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"In\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 1.0,\\n \\\"y\\\": 1.0,\\n \\\"z\\\": 1.0,\\n \\\"w\\\": 1.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 1,\\n \\\"m_DisplayName\\\": \\\"Out\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Out\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": false,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.MultiplyNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"ab7a3315-f450-402c-bd3e-971f5db7e265\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"Multiply\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": true,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": 14.000120162963868,\n \"y\": 525.0,\n \"width\": 135.00001525878907,\n \"height\": 118.0\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicValueMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"A\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"A\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"e00\\\": 0.0,\\n \\\"e01\\\": 0.0,\\n \\\"e02\\\": 0.0,\\n \\\"e03\\\": 0.0,\\n \\\"e10\\\": 0.0,\\n \\\"e11\\\": 0.0,\\n \\\"e12\\\": 0.0,\\n \\\"e13\\\": 0.0,\\n \\\"e20\\\": 0.0,\\n \\\"e21\\\": 0.0,\\n \\\"e22\\\": 0.0,\\n \\\"e23\\\": 0.0,\\n \\\"e30\\\": 0.0,\\n \\\"e31\\\": 0.0,\\n \\\"e32\\\": 0.0,\\n \\\"e33\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"e00\\\": 1.0,\\n \\\"e01\\\": 0.0,\\n \\\"e02\\\": 0.0,\\n \\\"e03\\\": 0.0,\\n \\\"e10\\\": 0.0,\\n \\\"e11\\\": 1.0,\\n \\\"e12\\\": 0.0,\\n \\\"e13\\\": 0.0,\\n \\\"e20\\\": 0.0,\\n \\\"e21\\\": 0.0,\\n \\\"e22\\\": 1.0,\\n \\\"e23\\\": 0.0,\\n \\\"e30\\\": 0.0,\\n \\\"e31\\\": 0.0,\\n \\\"e32\\\": 0.0,\\n \\\"e33\\\": 1.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicValueMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 1,\\n \\\"m_DisplayName\\\": \\\"B\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"B\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"e00\\\": 0.10000000149011612,\\n \\\"e01\\\": 2.0,\\n \\\"e02\\\": 2.0,\\n \\\"e03\\\": 2.0,\\n \\\"e10\\\": 2.0,\\n \\\"e11\\\": 2.0,\\n \\\"e12\\\": 2.0,\\n \\\"e13\\\": 2.0,\\n \\\"e20\\\": 2.0,\\n \\\"e21\\\": 2.0,\\n \\\"e22\\\": 2.0,\\n \\\"e23\\\": 2.0,\\n \\\"e30\\\": 2.0,\\n \\\"e31\\\": 2.0,\\n \\\"e32\\\": 2.0,\\n \\\"e33\\\": 2.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"e00\\\": 1.0,\\n \\\"e01\\\": 0.0,\\n \\\"e02\\\": 0.0,\\n \\\"e03\\\": 0.0,\\n \\\"e10\\\": 0.0,\\n \\\"e11\\\": 1.0,\\n \\\"e12\\\": 0.0,\\n \\\"e13\\\": 0.0,\\n \\\"e20\\\": 0.0,\\n \\\"e21\\\": 0.0,\\n \\\"e22\\\": 1.0,\\n \\\"e23\\\": 0.0,\\n \\\"e30\\\": 0.0,\\n \\\"e31\\\": 0.0,\\n \\\"e32\\\": 0.0,\\n \\\"e33\\\": 1.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicValueMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 2,\\n \\\"m_DisplayName\\\": \\\"Out\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Out\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"e00\\\": 0.0,\\n \\\"e01\\\": 0.0,\\n \\\"e02\\\": 0.0,\\n \\\"e03\\\": 0.0,\\n \\\"e10\\\": 0.0,\\n \\\"e11\\\": 0.0,\\n \\\"e12\\\": 0.0,\\n \\\"e13\\\": 0.0,\\n \\\"e20\\\": 0.0,\\n \\\"e21\\\": 0.0,\\n \\\"e22\\\": 0.0,\\n \\\"e23\\\": 0.0,\\n \\\"e30\\\": 0.0,\\n \\\"e31\\\": 0.0,\\n \\\"e32\\\": 0.0,\\n \\\"e33\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"e00\\\": 1.0,\\n \\\"e01\\\": 0.0,\\n \\\"e02\\\": 0.0,\\n \\\"e03\\\": 0.0,\\n \\\"e10\\\": 0.0,\\n \\\"e11\\\": 1.0,\\n \\\"e12\\\": 0.0,\\n \\\"e13\\\": 0.0,\\n \\\"e20\\\": 0.0,\\n \\\"e21\\\": 0.0,\\n \\\"e22\\\": 1.0,\\n \\\"e23\\\": 0.0,\\n \\\"e30\\\": 0.0,\\n \\\"e31\\\": 0.0,\\n \\\"e32\\\": 0.0,\\n \\\"e33\\\": 1.0\\n }\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": false,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.IsFrontFaceNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"2956bc04-030a-4ff7-a640-aa957afebc49\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"Is Front Face\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": true,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": 396.0,\n \"y\": 351.0,\n \"width\": 140.0,\n \"height\": 77.0\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.BooleanMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"Out\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Out\\\",\\n \\\"m_StageCapability\\\": 2,\\n \\\"m_Value\\\": true,\\n \\\"m_DefaultValue\\\": true\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": true,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.BranchNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"c81fb099-964e-4763-a154-26fba6bd953f\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"Branch\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": true,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": 581.0,\n \"y\": 432.0,\n \"width\": 181.0,\n \"height\": 142.0\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.BooleanMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"Predicate\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Predicate\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": false,\\n \\\"m_DefaultValue\\\": false\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 1,\\n \\\"m_DisplayName\\\": \\\"True\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"True\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 1.0,\\n \\\"y\\\": 1.0,\\n \\\"z\\\": 1.0,\\n \\\"w\\\": 1.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 2,\\n \\\"m_DisplayName\\\": \\\"False\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"False\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicVectorMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 3,\\n \\\"m_DisplayName\\\": \\\"Out\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Out\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"x\\\": 0.0,\\n \\\"y\\\": 0.0,\\n \\\"z\\\": 0.0,\\n \\\"w\\\": 0.0\\n }\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": false,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.ShaderGraph.MultiplyNode" + }, + "JSONnodeData": "{\n \"m_GuidSerialized\": \"5562859e-9569-433b-b152-b49956fd5d79\",\n \"m_GroupGuidSerialized\": \"00000000-0000-0000-0000-000000000000\",\n \"m_Name\": \"Multiply\",\n \"m_NodeVersion\": 0,\n \"m_DrawState\": {\n \"m_Expanded\": true,\n \"m_Position\": {\n \"serializedVersion\": \"2\",\n \"x\": 419.0,\n \"y\": 541.0,\n \"width\": 135.0,\n \"height\": 118.0\n }\n },\n \"m_SerializableSlots\": [\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicValueMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 0,\\n \\\"m_DisplayName\\\": \\\"A\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"A\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"e00\\\": 0.0,\\n \\\"e01\\\": 0.0,\\n \\\"e02\\\": 0.0,\\n \\\"e03\\\": 0.0,\\n \\\"e10\\\": 0.0,\\n \\\"e11\\\": 0.0,\\n \\\"e12\\\": 0.0,\\n \\\"e13\\\": 0.0,\\n \\\"e20\\\": 0.0,\\n \\\"e21\\\": 0.0,\\n \\\"e22\\\": 0.0,\\n \\\"e23\\\": 0.0,\\n \\\"e30\\\": 0.0,\\n \\\"e31\\\": 0.0,\\n \\\"e32\\\": 0.0,\\n \\\"e33\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"e00\\\": 1.0,\\n \\\"e01\\\": 0.0,\\n \\\"e02\\\": 0.0,\\n \\\"e03\\\": 0.0,\\n \\\"e10\\\": 0.0,\\n \\\"e11\\\": 1.0,\\n \\\"e12\\\": 0.0,\\n \\\"e13\\\": 0.0,\\n \\\"e20\\\": 0.0,\\n \\\"e21\\\": 0.0,\\n \\\"e22\\\": 1.0,\\n \\\"e23\\\": 0.0,\\n \\\"e30\\\": 0.0,\\n \\\"e31\\\": 0.0,\\n \\\"e32\\\": 0.0,\\n \\\"e33\\\": 1.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicValueMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 1,\\n \\\"m_DisplayName\\\": \\\"B\\\",\\n \\\"m_SlotType\\\": 0,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"B\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"e00\\\": 0.30000001192092898,\\n \\\"e01\\\": 2.0,\\n \\\"e02\\\": 2.0,\\n \\\"e03\\\": 2.0,\\n \\\"e10\\\": 2.0,\\n \\\"e11\\\": 2.0,\\n \\\"e12\\\": 2.0,\\n \\\"e13\\\": 2.0,\\n \\\"e20\\\": 2.0,\\n \\\"e21\\\": 2.0,\\n \\\"e22\\\": 2.0,\\n \\\"e23\\\": 2.0,\\n \\\"e30\\\": 2.0,\\n \\\"e31\\\": 2.0,\\n \\\"e32\\\": 2.0,\\n \\\"e33\\\": 2.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"e00\\\": 1.0,\\n \\\"e01\\\": 0.0,\\n \\\"e02\\\": 0.0,\\n \\\"e03\\\": 0.0,\\n \\\"e10\\\": 0.0,\\n \\\"e11\\\": 1.0,\\n \\\"e12\\\": 0.0,\\n \\\"e13\\\": 0.0,\\n \\\"e20\\\": 0.0,\\n \\\"e21\\\": 0.0,\\n \\\"e22\\\": 1.0,\\n \\\"e23\\\": 0.0,\\n \\\"e30\\\": 0.0,\\n \\\"e31\\\": 0.0,\\n \\\"e32\\\": 0.0,\\n \\\"e33\\\": 1.0\\n }\\n}\"\n },\n {\n \"typeInfo\": {\n \"fullName\": \"UnityEditor.ShaderGraph.DynamicValueMaterialSlot\"\n },\n \"JSONnodeData\": \"{\\n \\\"m_Id\\\": 2,\\n \\\"m_DisplayName\\\": \\\"Out\\\",\\n \\\"m_SlotType\\\": 1,\\n \\\"m_Priority\\\": 2147483647,\\n \\\"m_Hidden\\\": false,\\n \\\"m_ShaderOutputName\\\": \\\"Out\\\",\\n \\\"m_StageCapability\\\": 3,\\n \\\"m_Value\\\": {\\n \\\"e00\\\": 0.0,\\n \\\"e01\\\": 0.0,\\n \\\"e02\\\": 0.0,\\n \\\"e03\\\": 0.0,\\n \\\"e10\\\": 0.0,\\n \\\"e11\\\": 0.0,\\n \\\"e12\\\": 0.0,\\n \\\"e13\\\": 0.0,\\n \\\"e20\\\": 0.0,\\n \\\"e21\\\": 0.0,\\n \\\"e22\\\": 0.0,\\n \\\"e23\\\": 0.0,\\n \\\"e30\\\": 0.0,\\n \\\"e31\\\": 0.0,\\n \\\"e32\\\": 0.0,\\n \\\"e33\\\": 0.0\\n },\\n \\\"m_DefaultValue\\\": {\\n \\\"e00\\\": 1.0,\\n \\\"e01\\\": 0.0,\\n \\\"e02\\\": 0.0,\\n \\\"e03\\\": 0.0,\\n \\\"e10\\\": 0.0,\\n \\\"e11\\\": 1.0,\\n \\\"e12\\\": 0.0,\\n \\\"e13\\\": 0.0,\\n \\\"e20\\\": 0.0,\\n \\\"e21\\\": 0.0,\\n \\\"e22\\\": 1.0,\\n \\\"e23\\\": 0.0,\\n \\\"e30\\\": 0.0,\\n \\\"e31\\\": 0.0,\\n \\\"e32\\\": 0.0,\\n \\\"e33\\\": 1.0\\n }\\n}\"\n }\n ],\n \"m_Precision\": 0,\n \"m_PreviewExpanded\": false,\n \"m_CustomColors\": {\n \"m_SerializableColors\": []\n }\n}" + } + ], + "m_Groups": [], + "m_StickyNotes": [], + "m_SerializableEdges": [ + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 0,\n \"m_NodeGUIDSerialized\": \"7d8bc1f2-73f3-4a8e-9a02-e817417cf6eb\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 1,\n \"m_NodeGUIDSerialized\": \"cf683fb4-32b2-47a2-b689-91a5ea26b6eb\"\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 0,\n \"m_NodeGUIDSerialized\": \"4d4f1bbf-f43f-4208-9d37-1f2e0c1dca2a\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 0,\n \"m_NodeGUIDSerialized\": \"226236f1-1a7e-4152-9dd8-2d138e2e9280\"\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 0,\n \"m_NodeGUIDSerialized\": \"cf683fb4-32b2-47a2-b689-91a5ea26b6eb\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 1,\n \"m_NodeGUIDSerialized\": \"226236f1-1a7e-4152-9dd8-2d138e2e9280\"\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 2,\n \"m_NodeGUIDSerialized\": \"226236f1-1a7e-4152-9dd8-2d138e2e9280\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 0,\n \"m_NodeGUIDSerialized\": \"d7a165e0-2122-4338-9a13-82e41724eceb\"\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 2,\n \"m_NodeGUIDSerialized\": \"226236f1-1a7e-4152-9dd8-2d138e2e9280\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 0,\n \"m_NodeGUIDSerialized\": \"69d73e49-e70b-480a-adbd-2e0e9419b3c7\"\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 3,\n \"m_NodeGUIDSerialized\": \"40b62719-6c54-4934-91f6-03c099188467\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 1,\n \"m_NodeGUIDSerialized\": \"69d73e49-e70b-480a-adbd-2e0e9419b3c7\"\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 1,\n \"m_NodeGUIDSerialized\": \"5a7601bb-aa42-4ff1-8060-2aa2d31d4674\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 0,\n \"m_NodeGUIDSerialized\": \"ea8c3961-bc41-4e40-bd04-dcdb88111a31\"\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 2,\n \"m_NodeGUIDSerialized\": \"ea8c3961-bc41-4e40-bd04-dcdb88111a31\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 0,\n \"m_NodeGUIDSerialized\": \"b27f9903-97d4-4375-9f19-731f70b50bcb\"\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 0,\n \"m_NodeGUIDSerialized\": \"ac27eb87-29a8-4b39-9842-1b64b55d0ba4\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 0,\n \"m_NodeGUIDSerialized\": \"f9f2fbd8-08b0-4727-8e34-f99cc5488123\"\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 4,\n \"m_NodeGUIDSerialized\": \"f9f2fbd8-08b0-4727-8e34-f99cc5488123\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 1,\n \"m_NodeGUIDSerialized\": \"ea8c3961-bc41-4e40-bd04-dcdb88111a31\"\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 2,\n \"m_NodeGUIDSerialized\": \"69d73e49-e70b-480a-adbd-2e0e9419b3c7\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 0,\n \"m_NodeGUIDSerialized\": \"8e5cfa86-2fd3-4ca1-8f92-453700d8212f\"\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 2,\n \"m_NodeGUIDSerialized\": \"b27f9903-97d4-4375-9f19-731f70b50bcb\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 0,\n \"m_NodeGUIDSerialized\": \"d710bd3d-0d6f-4bba-adca-de1f097e90ac\"\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 1,\n \"m_NodeGUIDSerialized\": \"d710bd3d-0d6f-4bba-adca-de1f097e90ac\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 2,\n \"m_NodeGUIDSerialized\": \"7a95854f-bc33-4d63-89c7-ac0a0ba26aae\"\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 3,\n \"m_NodeGUIDSerialized\": \"7a95854f-bc33-4d63-89c7-ac0a0ba26aae\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 0,\n \"m_NodeGUIDSerialized\": \"ab7a3315-f450-402c-bd3e-971f5db7e265\"\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 0,\n \"m_NodeGUIDSerialized\": \"2956bc04-030a-4ff7-a640-aa957afebc49\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 0,\n \"m_NodeGUIDSerialized\": \"c81fb099-964e-4763-a154-26fba6bd953f\"\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 4,\n \"m_NodeGUIDSerialized\": \"d7a165e0-2122-4338-9a13-82e41724eceb\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 1,\n \"m_NodeGUIDSerialized\": \"c81fb099-964e-4763-a154-26fba6bd953f\"\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 3,\n \"m_NodeGUIDSerialized\": \"c81fb099-964e-4763-a154-26fba6bd953f\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 7,\n \"m_NodeGUIDSerialized\": \"8e5cfa86-2fd3-4ca1-8f92-453700d8212f\"\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 4,\n \"m_NodeGUIDSerialized\": \"d7a165e0-2122-4338-9a13-82e41724eceb\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 0,\n \"m_NodeGUIDSerialized\": \"5562859e-9569-433b-b152-b49956fd5d79\"\n }\n}" + }, + { + "typeInfo": { + "fullName": "UnityEditor.Graphing.Edge" + }, + "JSONnodeData": "{\n \"m_OutputSlot\": {\n \"m_SlotId\": 2,\n \"m_NodeGUIDSerialized\": \"5562859e-9569-433b-b152-b49956fd5d79\"\n },\n \"m_InputSlot\": {\n \"m_SlotId\": 2,\n \"m_NodeGUIDSerialized\": \"c81fb099-964e-4763-a154-26fba6bd953f\"\n }\n}" + } + ], + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + } + }, + "m_Path": "Shader Graphs", + "m_ConcretePrecision": 0, + "m_ActiveOutputNodeGuidSerialized": "8e5cfa86-2fd3-4ca1-8f92-453700d8212f" +} \ No newline at end of file diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Shaders/ViewZoneShader.shadergraph.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Shaders/ViewZoneShader.shadergraph.meta new file mode 100644 index 00000000..172f5b9c --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example Assets/Shaders/ViewZoneShader.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 920e50b2d155e9646bc68b0b0e444306 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example1.unity b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example1.unity new file mode 100644 index 00000000..975d2edf --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example1.unity @@ -0,0 +1,1214 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 0 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &12751528 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 12751529} + - component: {fileID: 12751531} + - component: {fileID: 12751530} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &12751529 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 12751528} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1327660889} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 700, y: 550} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &12751530 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 12751528} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 300 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Example 1 + + Simple behaviour tree' +--- !u!222 &12751531 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 12751528} + m_CullTransparentMesh: 0 +--- !u!1 &113295836 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 113295837} + - component: {fileID: 113295839} + - component: {fileID: 113295838} + m_Layer: 5 + m_Name: Text 2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &113295837 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 113295836} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1327660889} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -85.3} + m_SizeDelta: {x: 700, y: 400} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &113295838 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 113295836} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 300 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Capsule moves to 5 random positions on the plane surface. +--- !u!222 &113295839 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 113295836} + m_CullTransparentMesh: 0 +--- !u!1 &244707725 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 244707729} + - component: {fileID: 244707728} + - component: {fileID: 244707727} + - component: {fileID: 244707726} + m_Layer: 0 + m_Name: MBT Bot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!136 &244707726 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 244707725} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &244707727 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 244707725} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d2cafc828a569f549a97c37ad90f0881, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &244707728 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 244707725} + m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &244707729 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 244707725} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 1, z: 3} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1669777363} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &423791475 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 423791477} + - component: {fileID: 423791476} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &423791476 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 423791475} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &423791477 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 423791475} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1053154363 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1053154367} + - component: {fileID: 1053154366} + - component: {fileID: 1053154365} + - component: {fileID: 1053154364} + m_Layer: 0 + m_Name: Ground + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!64 &1053154364 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1053154363} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1053154365 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1053154363} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d7c7b1cc4f0a8154ba6baac04eaffd3e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1053154366 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1053154363} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1053154367 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1053154363} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1327660885 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1327660889} + - component: {fileID: 1327660888} + - component: {fileID: 1327660887} + - component: {fileID: 1327660886} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1327660886 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1327660885} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1327660887 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1327660885} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &1327660888 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1327660885} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 1830810166} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1327660889 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1327660885} + m_LocalRotation: {x: 0.18301274, y: -0.6830127, z: 0.18301274, w: 0.6830127} + m_LocalPosition: {x: 0, y: 0, z: 0.42} + m_LocalScale: {x: 0.01, y: 0.01, z: 0.01} + m_Children: + - {fileID: 1948203794} + - {fileID: 12751529} + - {fileID: 113295837} + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 30, y: -90, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: -6.65, y: 0.16} + m_SizeDelta: {x: 800, y: 600} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1669777352 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1669777363} + - component: {fileID: 1669777362} + - component: {fileID: 1669777361} + - component: {fileID: 1669777360} + - component: {fileID: 1669777359} + - component: {fileID: 1669777358} + - component: {fileID: 1669777357} + - component: {fileID: 1669777356} + - component: {fileID: 1669777355} + - component: {fileID: 1669777354} + - component: {fileID: 1669777353} + - component: {fileID: 1669777364} + m_Layer: 0 + m_Name: Behaviour Tree + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1669777353 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1669777352} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b07ede05ff4add24e87726f88a88df1e, type: 3} + m_Name: + m_EditorClassIdentifier: + title: Set Random Position + rect: + serializedVersion: 2 + x: 20 + y: 420 + width: 200 + height: 45 + parent: {fileID: 1669777357} + children: [] + behaviourTree: {fileID: 0} + runtimePriority: 0 + breakpoint: 0 + bounds: + m_Center: {x: 0, y: 1, z: 0} + m_Extent: {x: 5, y: 0, z: 5} + blackboardVariable: + useConstant: 0 + mode: 1 + blackboard: {fileID: 1669777361} + key: target + constantValue: {x: 0, y: 0, z: 0} +--- !u!114 &1669777354 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1669777352} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 51272808e3662eb4286c82f38f91fae9, type: 3} + m_Name: + m_EditorClassIdentifier: + key: target + val: {x: 0, y: 0, z: 0} +--- !u!114 &1669777355 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1669777352} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 58fe7bc6a9b18e148b82820c7c1c0a90, type: 3} + m_Name: + m_EditorClassIdentifier: + title: Wait + rect: + serializedVersion: 2 + x: 460 + y: 420 + width: 200 + height: 45 + parent: {fileID: 1669777357} + children: [] + behaviourTree: {fileID: 0} + runtimePriority: 0 + breakpoint: 0 + time: + useConstant: 1 + mode: 0 + blackboard: {fileID: 0} + key: + constantValue: 1 + randomDeviation: 0 + continueOnRestart: 0 +--- !u!114 &1669777356 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1669777352} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ea825aa2e7214af419a5aa40843b9dbd, type: 3} + m_Name: + m_EditorClassIdentifier: + title: Move Towards + rect: + serializedVersion: 2 + x: 240 + y: 420 + width: 200 + height: 45 + parent: {fileID: 1669777357} + children: [] + behaviourTree: {fileID: 0} + runtimePriority: 0 + breakpoint: 0 + targetPosition: + useConstant: 0 + mode: 0 + blackboard: {fileID: 1669777361} + key: target + constantValue: {x: 0, y: 0, z: 0} + transformToMove: + useConstant: 0 + mode: 0 + blackboard: {fileID: 1669777361} + key: object + constantValue: {fileID: 0} + speed: 0.1 +--- !u!114 &1669777357 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1669777352} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4c78c7da6b00e1b46bad07949050f82f, type: 3} + m_Name: + m_EditorClassIdentifier: + title: Sequence + rect: + serializedVersion: 2 + x: 240 + y: 320 + width: 200 + height: 45 + parent: {fileID: 1669777358} + children: + - {fileID: 1669777353} + - {fileID: 1669777356} + - {fileID: 1669777355} + behaviourTree: {fileID: 0} + runtimePriority: 0 + breakpoint: 0 + random: 0 +--- !u!114 &1669777358 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1669777352} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 056841afaed742d4e909e76361b5173f, type: 3} + m_Name: + m_EditorClassIdentifier: + title: Repeater + rect: + serializedVersion: 2 + x: 240 + y: 220 + width: 200 + height: 45 + parent: {fileID: 1669777359} + children: + - {fileID: 1669777357} + behaviourTree: {fileID: 0} + runtimePriority: 0 + breakpoint: 0 + loops: 5 + infinite: 0 +--- !u!114 &1669777359 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1669777352} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 538645f2f9090fd43bc6154b2e89e2d3, type: 3} + m_Name: + m_EditorClassIdentifier: + title: Root + rect: + serializedVersion: 2 + x: 240 + y: 120 + width: 200 + height: 45 + parent: {fileID: 0} + children: + - {fileID: 1669777358} + behaviourTree: {fileID: 0} + runtimePriority: 0 + breakpoint: 0 +--- !u!114 &1669777360 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1669777352} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b25af8627659c6949b60949c3aa8d91d, type: 3} + m_Name: + m_EditorClassIdentifier: + selectedEditorNode: {fileID: 0} + repeatOnFinish: 0 + maxExecutionsPerTick: 1000 + parent: {fileID: 0} +--- !u!114 &1669777361 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1669777352} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6b2217e4d35c0c94ea02cf2166c17e4b, type: 3} + m_Name: + m_EditorClassIdentifier: + variables: + - {fileID: 1669777354} + - {fileID: 1669777364} + masterBlackboard: {fileID: 0} +--- !u!114 &1669777362 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1669777352} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e5f392bbea2fa2499665ed8b604ff86, type: 3} + m_Name: + m_EditorClassIdentifier: + monoBehaviourTree: {fileID: 1669777360} +--- !u!4 &1669777363 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1669777352} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 244707729} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1669777364 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1669777352} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dbc98ff6538275b4c9a8383882546ee9, type: 3} + m_Name: + m_EditorClassIdentifier: + key: object + val: {fileID: 244707729} +--- !u!1 &1780152509 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1780152512} + - component: {fileID: 1780152511} + - component: {fileID: 1780152510} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1780152510 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1780152509} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1780152511 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1780152509} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1780152512 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1780152509} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1830810164 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1830810167} + - component: {fileID: 1830810166} + - component: {fileID: 1830810165} + - component: {fileID: 1830810168} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1830810165 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1830810164} + m_Enabled: 1 +--- !u!20 &1830810166 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1830810164} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1830810167 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1830810164} + m_LocalRotation: {x: 0.21201877, y: -0.74506694, z: 0.27816758, w: 0.5679315} + m_LocalPosition: {x: 9.645733, y: 9.60513, z: 2.7619586} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1830810168 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1830810164} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_RenderPostProcessing: 0 + m_Antialiasing: 2 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_Version: 2 +--- !u!1 &1948203793 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1948203794} + - component: {fileID: 1948203796} + - component: {fileID: 1948203795} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1948203794 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1948203793} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1327660889} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 800, y: 600} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1948203795 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1948203793} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.2264151, g: 0.2264151, b: 0.2264151, a: 1} + m_RaycastTarget: 0 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1948203796 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1948203793} + m_CullTransparentMesh: 0 diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example1.unity.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example1.unity.meta new file mode 100644 index 00000000..60100cee --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example1.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 46481dc693aedb84dbedbac3d40c8eb1 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example2.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example2.meta new file mode 100644 index 00000000..705a77f6 --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example2.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fedd7d23e6644b44e88a08460eb381e6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example2.unity b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example2.unity new file mode 100644 index 00000000..4c3cd5ad --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example2.unity @@ -0,0 +1,2380 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.19811319, g: 0.22012578, b: 0.26415092, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 50 + agentClimb: 0.6 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 23800000, guid: 6009b9c4d85bb4d42941d1bf7d1547ef, type: 2} +--- !u!1 &205082237 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 205082241} + - component: {fileID: 205082240} + - component: {fileID: 205082239} + - component: {fileID: 205082238} + m_Layer: 0 + m_Name: GroundCube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 4294967295 + m_IsActive: 1 +--- !u!65 &205082238 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 205082237} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &205082239 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 205082237} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d7c7b1cc4f0a8154ba6baac04eaffd3e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &205082240 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 205082237} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &205082241 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 205082237} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -14, y: -15, z: 24} + m_LocalScale: {x: 20, y: 20, z: 20} + m_Children: [] + m_Father: {fileID: 646624728} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &444315591 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 444315595} + - component: {fileID: 444315594} + - component: {fileID: 444315593} + - component: {fileID: 444315592} + m_Layer: 0 + m_Name: GroundPlane + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 4294967295 + m_IsActive: 1 +--- !u!64 &444315592 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 444315591} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &444315593 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 444315591} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d7c7b1cc4f0a8154ba6baac04eaffd3e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &444315594 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 444315591} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &444315595 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 444315591} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -14, y: -5.5, z: 4} + m_LocalScale: {x: 2, y: 2, z: 2} + m_Children: + - {fileID: 1426764291} + m_Father: {fileID: 646624728} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &632508372 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 632508373} + - component: {fileID: 632508379} + - component: {fileID: 632508378} + - component: {fileID: 632508377} + - component: {fileID: 632508376} + - component: {fileID: 632508375} + - component: {fileID: 632508374} + - component: {fileID: 632508382} + - component: {fileID: 632508380} + - component: {fileID: 632508387} + - component: {fileID: 632508384} + - component: {fileID: 632508383} + - component: {fileID: 632508388} + - component: {fileID: 632508381} + - component: {fileID: 632508392} + - component: {fileID: 632508391} + - component: {fileID: 632508390} + - component: {fileID: 632508389} + - component: {fileID: 632508393} + - component: {fileID: 632508385} + m_Layer: 0 + m_Name: BehaviourTree + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &632508373 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1004612867} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &632508374 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7ec611930975eda44b3c82fc2e9133a8, type: 3} + m_Name: + m_EditorClassIdentifier: + title: Move Navmesh Agent + rect: + serializedVersion: 2 + x: 100 + y: 560 + width: 200 + height: 45 + parent: {fileID: 632508383} + children: [] + behaviourTree: {fileID: 0} + runtimePriority: 0 + breakpoint: 0 + destination: + useConstant: 0 + mode: 0 + blackboard: {fileID: 632508378} + key: target + constantValue: {fileID: 0} + agent: {fileID: 1004612863} + stopDistance: 2 + updateInterval: 0.5 +--- !u!114 &632508375 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 538645f2f9090fd43bc6154b2e89e2d3, type: 3} + m_Name: + m_EditorClassIdentifier: + title: Root + rect: + serializedVersion: 2 + x: 300 + y: 0 + width: 200 + height: 45 + parent: {fileID: 0} + children: + - {fileID: 632508393} + behaviourTree: {fileID: 0} + runtimePriority: 0 + breakpoint: 0 +--- !u!114 &632508376 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dbc98ff6538275b4c9a8383882546ee9, type: 3} + m_Name: + m_EditorClassIdentifier: + key: target + val: {fileID: 0} +--- !u!114 &632508377 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b25af8627659c6949b60949c3aa8d91d, type: 3} + m_Name: + m_EditorClassIdentifier: + selectedEditorNode: {fileID: 632508374} + repeatOnFinish: 1 + maxExecutionsPerTick: 1000 + parent: {fileID: 0} +--- !u!114 &632508378 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6b2217e4d35c0c94ea02cf2166c17e4b, type: 3} + m_Name: + m_EditorClassIdentifier: + variables: + - {fileID: 632508376} + - {fileID: 632508387} + - {fileID: 632508384} + - {fileID: 632508391} + masterBlackboard: {fileID: 0} +--- !u!114 &632508379 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e5f392bbea2fa2499665ed8b604ff86, type: 3} + m_Name: + m_EditorClassIdentifier: + monoBehaviourTree: {fileID: 632508377} +--- !u!114 &632508380 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 056841afaed742d4e909e76361b5173f, type: 3} + m_Name: + m_EditorClassIdentifier: + title: Repeater + rect: + serializedVersion: 2 + x: 100 + y: 320 + width: 200 + height: 45 + parent: {fileID: 632508382} + children: + - {fileID: 632508385} + behaviourTree: {fileID: 0} + runtimePriority: 0 + breakpoint: 0 + loops: 1 + infinite: 1 +--- !u!114 &632508381 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4c78c7da6b00e1b46bad07949050f82f, type: 3} + m_Name: + m_EditorClassIdentifier: + title: Sequence + rect: + serializedVersion: 2 + x: 540 + y: 240 + width: 200 + height: 45 + parent: {fileID: 632508388} + children: + - {fileID: 632508390} + - {fileID: 632508389} + - {fileID: 632508392} + behaviourTree: {fileID: 0} + runtimePriority: 0 + breakpoint: 0 + random: 0 +--- !u!114 &632508382 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 534e3ec7de6cd444e984c2e7f68e42e2, type: 3} + m_Name: + m_EditorClassIdentifier: + title: Is Set Condition + rect: + serializedVersion: 2 + x: 100 + y: 240 + width: 200 + height: 45 + parent: {fileID: 632508388} + children: + - {fileID: 632508380} + behaviourTree: {fileID: 0} + runtimePriority: 0 + breakpoint: 0 + abort: 3 + invert: 0 + type: 2 + boolReference: + useConstant: 0 + mode: 1 + blackboard: {fileID: 0} + key: + constantValue: 0 + objectReference: + useConstant: 0 + mode: 1 + blackboard: {fileID: 0} + key: + constantValue: {fileID: 0} + transformReference: + useConstant: 0 + mode: 1 + blackboard: {fileID: 632508378} + key: target + constantValue: {fileID: 0} +--- !u!114 &632508383 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0b95a918be8d9a4f9085201010bdec1, type: 3} + m_Name: + m_EditorClassIdentifier: + title: Number Condition + rect: + serializedVersion: 2 + x: 100 + y: 480 + width: 200 + height: 45 + parent: {fileID: 632508385} + children: + - {fileID: 632508374} + behaviourTree: {fileID: 0} + runtimePriority: 0 + breakpoint: 0 + abort: 0 + type: 0 + floatReference: + useConstant: 0 + mode: 1 + blackboard: {fileID: 632508378} + key: distanceToTarget + constantValue: 0 + intReference: + useConstant: 0 + mode: 1 + blackboard: {fileID: 0} + key: + constantValue: 0 + comparator: 1 + floatReference2: + useConstant: 1 + mode: 0 + blackboard: {fileID: 0} + key: + constantValue: 2 + intReference2: + useConstant: 1 + mode: 0 + blackboard: {fileID: 0} + key: + constantValue: 0 +--- !u!114 &632508384 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dbc98ff6538275b4c9a8383882546ee9, type: 3} + m_Name: + m_EditorClassIdentifier: + key: self + val: {fileID: 1004612867} +--- !u!114 &632508385 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc2659d9740e09744b583d40f78bde8a, type: 3} + m_Name: + m_EditorClassIdentifier: + title: Calculate Distance Service + rect: + serializedVersion: 2 + x: 100 + y: 400 + width: 200 + height: 45 + parent: {fileID: 632508380} + children: + - {fileID: 632508383} + behaviourTree: {fileID: 0} + runtimePriority: 0 + breakpoint: 0 + interval: 1 + randomDeviation: 0 + callOnEnter: 1 + transform1: + useConstant: 0 + mode: 0 + blackboard: {fileID: 632508378} + key: target + constantValue: {fileID: 0} + transform2: + useConstant: 0 + mode: 0 + blackboard: {fileID: 632508378} + key: self + constantValue: {fileID: 0} + variable: + useConstant: 0 + mode: 1 + blackboard: {fileID: 632508378} + key: distanceToTarget + constantValue: 0 +--- !u!114 &632508387 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4e5f4db414f0ab4c82c187a7653e99d, type: 3} + m_Name: + m_EditorClassIdentifier: + key: distanceToTarget + val: 0 +--- !u!114 &632508388 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 08540605df275034fafc8e05c6704214, type: 3} + m_Name: + m_EditorClassIdentifier: + title: Selector + rect: + serializedVersion: 2 + x: 300 + y: 160 + width: 200 + height: 45 + parent: {fileID: 632508393} + children: + - {fileID: 632508382} + - {fileID: 632508381} + behaviourTree: {fileID: 0} + runtimePriority: 0 + breakpoint: 0 + random: 0 +--- !u!114 &632508389 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 58fe7bc6a9b18e148b82820c7c1c0a90, type: 3} + m_Name: + m_EditorClassIdentifier: + title: Wait + rect: + serializedVersion: 2 + x: 540 + y: 320 + width: 200 + height: 45 + parent: {fileID: 632508381} + children: [] + behaviourTree: {fileID: 0} + runtimePriority: 0 + breakpoint: 0 + time: + useConstant: 1 + mode: 0 + blackboard: {fileID: 0} + key: + constantValue: 1 + randomDeviation: 0 + continueOnRestart: 0 +--- !u!114 &632508390 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 842a054cfbe33f944b646e8de04bd575, type: 3} + m_Name: + m_EditorClassIdentifier: + title: Set Patrol Point + rect: + serializedVersion: 2 + x: 320 + y: 320 + width: 200 + height: 45 + parent: {fileID: 632508381} + children: [] + behaviourTree: {fileID: 0} + runtimePriority: 0 + breakpoint: 0 + variableToSet: + useConstant: 0 + mode: 0 + blackboard: {fileID: 632508378} + key: patrolTarget + constantValue: {fileID: 0} + waypoints: + - {fileID: 1725448484} + - {fileID: 1895652040} + - {fileID: 720193035} +--- !u!114 &632508391 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dbc98ff6538275b4c9a8383882546ee9, type: 3} + m_Name: + m_EditorClassIdentifier: + key: patrolTarget + val: {fileID: 0} +--- !u!114 &632508392 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7ec611930975eda44b3c82fc2e9133a8, type: 3} + m_Name: + m_EditorClassIdentifier: + title: Move Navmesh Agent + rect: + serializedVersion: 2 + x: 760 + y: 320 + width: 200 + height: 45 + parent: {fileID: 632508381} + children: [] + behaviourTree: {fileID: 0} + runtimePriority: 0 + breakpoint: 0 + destination: + useConstant: 0 + mode: 0 + blackboard: {fileID: 632508378} + key: patrolTarget + constantValue: {fileID: 0} + agent: {fileID: 1004612863} + stopDistance: 1 + updateInterval: 1 +--- !u!114 &632508393 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 632508372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b2b0d715ba3c3a646a4fdb6d2bcc62d7, type: 3} + m_Name: + m_EditorClassIdentifier: + title: Detect Enemy Service + rect: + serializedVersion: 2 + x: 300 + y: 80 + width: 200 + height: 45 + parent: {fileID: 632508375} + children: + - {fileID: 632508388} + behaviourTree: {fileID: 0} + runtimePriority: 0 + breakpoint: 0 + interval: 1 + randomDeviation: 0 + callOnEnter: 1 + mask: + serializedVersion: 2 + m_Bits: 16 + range: 10 + variableToSet: + useConstant: 0 + mode: 0 + blackboard: {fileID: 632508378} + key: target + constantValue: {fileID: 0} +--- !u!1 &646624727 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 646624728} + m_Layer: 0 + m_Name: Ground + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 4294967295 + m_IsActive: 1 +--- !u!4 &646624728 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 646624727} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 205082241} + - {fileID: 444315595} + - {fileID: 1306119543} + - {fileID: 1717424839} + - {fileID: 1164601890} + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &668885458 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 668885463} + - component: {fileID: 668885462} + - component: {fileID: 668885461} + - component: {fileID: 668885460} + - component: {fileID: 668885459} + - component: {fileID: 668885464} + m_Layer: 4 + m_Name: Player + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!195 &668885459 +NavMeshAgent: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 668885458} + m_Enabled: 1 + m_AgentTypeID: 0 + m_Radius: 0.5 + m_Speed: 8 + m_Acceleration: 12 + avoidancePriority: 50 + m_AngularSpeed: 180 + m_StoppingDistance: 0 + m_AutoTraverseOffMeshLink: 1 + m_AutoBraking: 1 + m_AutoRepath: 1 + m_Height: 2 + m_BaseOffset: 1 + m_WalkableMask: 4294967295 + m_ObstacleAvoidanceType: 4 +--- !u!136 &668885460 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 668885458} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &668885461 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 668885458} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 889830630d8ddd84db8c615c3a8b1031, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &668885462 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 668885458} + m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &668885463 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 668885458} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -14, y: -4.5, z: -3.21} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &668885464 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 668885458} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d6f042bf63e59ff4b8b18485cc3d11b4, type: 3} + m_Name: + m_EditorClassIdentifier: + cam: {fileID: 1447517902} + agent: {fileID: 668885459} +--- !u!1 &720193034 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 720193035} + m_Layer: 0 + m_Name: Waypoint3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &720193035 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 720193034} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 8, y: 0, z: 2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1334863852} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1004612862 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1004612867} + - component: {fileID: 1004612866} + - component: {fileID: 1004612865} + - component: {fileID: 1004612864} + - component: {fileID: 1004612863} + m_Layer: 0 + m_Name: PatrolBot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!195 &1004612863 +NavMeshAgent: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1004612862} + m_Enabled: 1 + m_AgentTypeID: 0 + m_Radius: 0.5 + m_Speed: 5 + m_Acceleration: 10 + avoidancePriority: 50 + m_AngularSpeed: 120 + m_StoppingDistance: 0 + m_AutoTraverseOffMeshLink: 1 + m_AutoBraking: 1 + m_AutoRepath: 1 + m_Height: 2 + m_BaseOffset: 1 + m_WalkableMask: 4294967295 + m_ObstacleAvoidanceType: 4 +--- !u!136 &1004612864 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1004612862} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1004612865 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1004612862} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d2cafc828a569f549a97c37ad90f0881, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1004612866 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1004612862} + m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1004612867 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1004612862} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3.35, y: -4, z: 17.04} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1936257595} + - {fileID: 632508373} + m_Father: {fileID: 0} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1164601889 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1164601890} + - component: {fileID: 1164601893} + - component: {fileID: 1164601892} + - component: {fileID: 1164601891} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 4294967295 + m_IsActive: 1 +--- !u!4 &1164601890 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1164601889} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: -4, z: 7} + m_LocalScale: {x: 2, y: 2, z: 6} + m_Children: [] + m_Father: {fileID: 646624728} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1164601891 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1164601889} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1164601892 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1164601889} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 2f8cea68151f729488dc3f60f89fbfc8, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1164601893 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1164601889} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1306119539 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1306119543} + - component: {fileID: 1306119542} + - component: {fileID: 1306119541} + - component: {fileID: 1306119540} + m_Layer: 0 + m_Name: GroundCube (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 4294967295 + m_IsActive: 1 +--- !u!65 &1306119540 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1306119539} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1306119541 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1306119539} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d7c7b1cc4f0a8154ba6baac04eaffd3e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1306119542 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1306119539} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1306119543 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1306119539} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 6, y: -15, z: 24} + m_LocalScale: {x: 20, y: 20, z: 20} + m_Children: [] + m_Father: {fileID: 646624728} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1334863851 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1334863852} + m_Layer: 0 + m_Name: Patrol Waypoints + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1334863852 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1334863851} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -5, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1725448484} + - {fileID: 1895652040} + - {fileID: 720193035} + m_Father: {fileID: 0} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1426764290 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1426764291} + - component: {fileID: 1426764294} + - component: {fileID: 1426764293} + - component: {fileID: 1426764292} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 4294967295 + m_IsActive: 1 +--- !u!4 &1426764291 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1426764290} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -1, z: 0} + m_LocalScale: {x: 4, y: 4, z: 4} + m_Children: [] + m_Father: {fileID: 444315595} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1426764292 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1426764290} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1426764293 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1426764290} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 2f8cea68151f729488dc3f60f89fbfc8, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1426764294 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1426764290} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1447517900 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1447517903} + - component: {fileID: 1447517902} + - component: {fileID: 1447517901} + - component: {fileID: 1447517904} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1447517901 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1447517900} + m_Enabled: 1 +--- !u!20 &1447517902 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1447517900} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1447517903 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1447517900} + m_LocalRotation: {x: 0.41760316, y: 0.1898069, z: -0.089677006, w: 0.884047} + m_LocalPosition: {x: -14.421518, y: 24.743156, z: -13.697594} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1447517904 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1447517900} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_Version: 2 +--- !u!1 &1638264379 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1638264381} + - component: {fileID: 1638264380} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1638264380 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1638264379} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 0.5 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 0.64 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1638264381 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1638264379} + m_LocalRotation: {x: 0.3975083, y: 0.30774483, z: -0.14350376, w: 0.8524594} + m_LocalPosition: {x: 0, y: 7.66, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: 39.7, z: 0} +--- !u!1 &1717424835 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1717424839} + - component: {fileID: 1717424838} + - component: {fileID: 1717424837} + - component: {fileID: 1717424836} + m_Layer: 0 + m_Name: GroundCube (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 4294967295 + m_IsActive: 1 +--- !u!65 &1717424836 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1717424835} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1717424837 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1717424835} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d7c7b1cc4f0a8154ba6baac04eaffd3e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1717424838 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1717424835} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1717424839 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1717424835} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 6, y: -15, z: 4} + m_LocalScale: {x: 20, y: 20, z: 20} + m_Children: [] + m_Father: {fileID: 646624728} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1718199494 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1718199496} + - component: {fileID: 1718199495} + m_Layer: 0 + m_Name: Point Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1718199495 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1718199494} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 2 + m_Shape: 0 + m_Color: {r: 0.090196095, g: 0.4168589, b: 0.8392157, a: 1} + m_Intensity: 40 + m_Range: 50 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 0 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1718199496 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1718199494} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.76, y: 2.96, z: 14.56} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1725448483 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1725448484} + m_Layer: 0 + m_Name: Waypoint1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1725448484 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1725448483} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -18, y: 0, z: 24} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1334863852} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1895652039 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1895652040} + m_Layer: 0 + m_Name: Waypoint2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1895652040 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1895652039} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 8, y: 0, z: 24} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1334863852} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1936257594 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1936257595} + - component: {fileID: 1936257598} + - component: {fileID: 1936257597} + m_Layer: 0 + m_Name: View + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1936257595 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1936257594} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -1, z: 0} + m_LocalScale: {x: 20, y: 20, z: 20} + m_Children: [] + m_Father: {fileID: 1004612867} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1936257597 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1936257594} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 3b3945d28de0349448558be478ee20b8, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1936257598 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1936257594} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!114 &4284888949414305216 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4284888949414305218} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.2264151, g: 0.2264151, b: 0.2264151, a: 1} + m_RaycastTarget: 0 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!224 &4284888949414305217 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4284888949414305218} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4284888949768018314} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 800, y: 600} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &4284888949414305218 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4284888949414305217} + - component: {fileID: 4284888949414305223} + - component: {fileID: 4284888949414305216} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!222 &4284888949414305223 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4284888949414305218} + m_CullTransparentMesh: 0 +--- !u!114 &4284888949768018308 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4284888949768018310} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!114 &4284888949768018309 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4284888949768018310} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!1 &4284888949768018310 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4284888949768018314} + - component: {fileID: 4284888949768018315} + - component: {fileID: 4284888949768018308} + - component: {fileID: 4284888949768018309} + m_Layer: 5 + m_Name: InfoBoardTemplate + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4284888949768018314 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4284888949768018310} + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 4} + m_LocalScale: {x: 0.01, y: 0.01, z: 0.01} + m_Children: + - {fileID: 4284888949414305217} + - {fileID: 4284888950810326138} + - {fileID: 4284888950709544718} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: -14, y: -3.4} + m_SizeDelta: {x: 800, y: 600} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!223 &4284888949768018315 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4284888949768018310} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 1447517902} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!222 &4284888950709544716 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4284888950709544719} + m_CullTransparentMesh: 0 +--- !u!114 &4284888950709544717 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4284888950709544719} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 300 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'The enemy is patrolling designated zone. When player moves into his line + of sight, the enemy will chase him. + + If the player escapes its range, the + bot will resume patrolling. ' +--- !u!224 &4284888950709544718 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4284888950709544719} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4284888949768018314} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -85.3} + m_SizeDelta: {x: 700, y: 400} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &4284888950709544719 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4284888950709544718} + - component: {fileID: 4284888950709544716} + - component: {fileID: 4284888950709544717} + m_Layer: 5 + m_Name: Text 2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!222 &4284888950810326136 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4284888950810326139} + m_CullTransparentMesh: 0 +--- !u!114 &4284888950810326137 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4284888950810326139} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 300 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Example 2 + + Patrolling Enemy' +--- !u!224 &4284888950810326138 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4284888950810326139} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4284888949768018314} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 700, y: 550} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &4284888950810326139 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4284888950810326138} + - component: {fileID: 4284888950810326136} + - component: {fileID: 4284888950810326137} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example2.unity.meta b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example2.unity.meta new file mode 100644 index 00000000..bd1acbcb --- /dev/null +++ b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example2.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6b89410c953e6f040ad4e4cf9f03f07b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example2/NavMesh.asset b/Assets/MonoBehaviourTree/Source/Samples/Demo URP/Example2/NavMesh.asset new file mode 100644 index 0000000000000000000000000000000000000000..46022a8412ef784b047bb4dd3d38afe5d58ce149 GIT binary patch literal 9632 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