Custom Task
Instruction to create custom user task
Last updated
Instruction to create custom user task
Last updated
In the AI Tree you can easily create your own task by using scripting API. In this page we will show how you can do it.
Let's create task to move platforms between two point.
This is a very simple example, we have specially chosen a simple example to make it easier to learn this material.
First of all you need to create new script. The easiest way is to use templates. Open context menu in Project window (right mouse click) and go to following path.
Create -> Renowned Games -> AI Tree -> Script Templates -> Task
We'll call it MovePlatformTask, after creation open it script in you scripts editor tool.
Task script template already contains all required code blocks, you just need to add task logic.
We want to create following logic: A task is considered successful if the platform reaches one of the points after which it go to another task.
We will remove methods that are not necessary for this task so as not to overload the code.
Let's focus on each line to understand what they are for.
The label in node content attribute may differ from the name of the class, for example, you can add spaces, symbols, numbers, etc. there.
We renamed the automatically generated MovePlatformTask label to Move Platform, just for nice display in tree graph.
These are not the only virtual methods available for overloading. Each method is overloaded in a similar way and has a detailed description.
In this example, we have described only those methods that are needed for this task, you can learn more about all the methods in this page.
For moving platform we will use Unity transform component. Every gameobject in the scene has this component, so let's store it to easy access in every tick update.
Note that we used the OnInitialize()
method to retrieve the Transform component, rather than OnEntry()
. Although these methods may seem similar, in this case, it's preferable to use OnInitialize()
because the Transform component remains unchanged throughout the game. There's no need to fetch it every time the node is entered through the OnEntry()
method. Instead, we store the Transform reference once and use it throughout the entire lifecycle of the tree, improving efficiency.
In next step we need to define two point, speed and one vector for destination, for this time let's make them fixed.
Here we implemented OnEntry()
to determine the next destination point for moving before each node running. Because trasform position will change and we need to swap destination point every time before running.
Now let's implement the logic of moving between points.
Note that we return two different states Success and Running depending on the condition.
Success means that the node has successfully completed its task. This is the final state that tells the system that this operation has been completed successfully and need to proceed to the next node.
Running means that the node is in the process of completing its task. This status indicates that the action is ongoing and has not yet been completed. The node that returns Running will continue execution the next time the Behavior Tree is updated.
Until the platform reaches its destination, we tell the tree to update the position. After reaching the destination, we tell the tree that the next node can be started.
In this example, we have described only those states that are needed for this task, you can learn more about all the states in this page.
Done. Now we can add our task on behaviour tree window and setup simple tree.
What happed in this tree:
Sequencer running task from left to right (built-in node).
Move Platform task moving self to destination point.
Wait task waiting for a 1 second (built-in node).
Repeat.
First, we move the platform to point B (since it’s already at point A), then wait for one second. On the next entry to the MovePlatform task, we change the destination to point A (since the platform is now at point B) and repeat this process infinitely.
Result