Search Unity

Behavior Designer - Behavior Trees for Everyone

Discussion in 'Assets and Asset Store' started by opsive, Feb 10, 2014.

  1. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    Ah, so you're not talking about saving off the tree as a ScriptableObject, rather some data.

    Yes, you'd be able to access them in a similar way as regular MonoBehavior components within the task. You could either reference the ScriptableObject within the task and then access the values through that object, or you could use Resources.Load to load the path dynamically.

    Does that answer the question better?
     
  2. Duffer123

    Duffer123

    Joined:
    May 24, 2015
    Posts:
    1,216
    Yes, i think that answers it.
     
    opsive likes this.
  3. Hormic

    Hormic

    Joined:
    Aug 12, 2014
    Posts:
    251
    I wonder if it is possible to control the AI of flying creatures with BD, like the flying eyes in the original doom game.
     
  4. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    Yes, though because no true 3D pathfinding asset exists you'll have to fake it (pathfinding in 3D space is extremely computationally and memory intensive). You can fake it by doing one of the following:

    - Adding an offset to the NavMeshAgent and baking the navmesh on the floor. This would work really well in the case of the flying eyes since it is low to the ground anyway.
    - Adding an invisible plane at an offset which the navmesh is then baked to. This will prevent you from needing to add the offset to the agent because the navmesh is immediately below the character. If you want to adjust the height of the agent you'll need to manually adjust the y position.
    - Don't use any pathfinding at all and instead just use basic streering behaviors with object avoidance. This would take the most amount of work but you could get really good results with this method (for an agent that is close to the ground and not a "true" flying object like a spaceship this method would be overkill. For a space game though it would work really well).
     
    Hormic likes this.
  5. Weblox

    Weblox

    Joined:
    Apr 11, 2016
    Posts:
    277
    Hi Opsive,

    I am still new to Unity and recently bought Behavior Designer. I am trying to integrate it with RFPS and have been getting the integration files from the Samples Page. Trying to follow the instructions I have been running into some Problems, as the Webpage seems to mis-display the Code. @TonyLi from the RFPS Forum was kind enough to guide me through the Integration Process > here < . With this instructions I was able to get the integration done properly. Maybe you can update the SamplesPage, so other Users won't run into the same Problem.

    Having BD with no Errors in my Project I do have some Issues with the RobotNPCColliders from the RFPS Demo Scene that comes with the Sample Files. Screenshot below:

    BD_RFPSP_Behavior Tree Errors.PNG

    Also I did get the newest Samples from the Page and tried to reimport them, but that did not fix the Problem. Any help is much appreciated.
     
    Last edited: Feb 5, 2017
  6. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    Hey @Weblox,

    Do you have the Movement Pack? The RPFS sample project uses tasks from that pack which it doesn't look like you have imported.
     
    Weblox likes this.
  7. Weblox

    Weblox

    Joined:
    Apr 11, 2016
    Posts:
    277
    Hi Opsive,
    thanks for the reply. Indeed I do not have the Movement Pack yet. I just got Behavior Designer from Sale lately and I completely forgot about the other Packages. I will report back when I had the chance to grab them. ;)
     
  8. Nadan

    Nadan

    Joined:
    Jan 20, 2013
    Posts:
    341
    Hi, I have purchased Behaviour Designer (+Movement and Tactical Pack). I'm just starting to learn this so I have very basic questions.

    I need a character to follow player. So I simpy put the Follow Node (from Movement Pack) and it works. AI with NavMeshAgent now follows my player. My problem is that when AI is close enough to the player it stops and I don't know how to send info to the animator to change the animation to idle? There is only option "Stop On Task End" that stops the NavMeshAgent.

    So how can I send for example SetTrigger("isStandingStill") to my AI's Animator when the AI is standing still? And start the walk animation again when moving?
     
  9. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    Hello,

    In general I recommend that you do not manage the animations within the behavior tree. Take a look at this page:

    http://www.opsive.com/assets/BehaviorDesigner/documentation.php?id=135
     
  10. Fera_KM

    Fera_KM

    Joined:
    Nov 7, 2013
    Posts:
    307
    Hi,
    Quick question, did you ever add support for any car physics system?
     
  11. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    Unfortunately not - I haven't received too many requests for an integration with a vehicle asset. Which one are you thinking of?
     
  12. Fera_KM

    Fera_KM

    Joined:
    Nov 7, 2013
    Posts:
    307
    ah, well, not a big thing.
    Thought I'd do a quick prototype with interactive traffic, not quite sure how to do it yet.
    Own iRDS, but wouldn't have a problem picking up Edy's or iTS (or anything else) if needed.
     
  13. TechnicalArtist

    TechnicalArtist

    Joined:
    Jul 9, 2012
    Posts:
    736
    Hi,

    How to store game-object with "can see object"?

    Now in "can see object" store only transform.
     
  14. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    You can use the "Shared Transform to GameObject" task to convert the stored Transform to a GameObject. However, are you using the latest version of the Movement Pack? The variable returnedObject within Can See Object is a SharedGameObject so you shouldn't have to do any conversion.
     
  15. TechnicalArtist

    TechnicalArtist

    Joined:
    Jul 9, 2012
    Posts:
    736
    thanks for reply
     
  16. cruzsoma

    cruzsoma

    Joined:
    Apr 22, 2015
    Posts:
    1
    I bought the Behavior Designer And 3 Packs.
    I have some questions about my Game AI.
    How to Make a Flight AI With BD?
    Could the Formation Pack And The Movement Pack Support the Flight AI?
    Could you give me some advises about making a Flight AI with BD.
    Sorry,maybe my English is strange.
    Please reply me if you have time.Thank you very much.
     
    Last edited: Feb 9, 2017
  17. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    Moving in 3D space is tricky because no pathfinding assets support it due to the amount of computation/memory required. Take a look at this post for some ideas on how you can fake it:

    https://forum.unity3d.com/threads/b...rees-for-everyone.227497/page-45#post-2938655
     
  18. Nadan

    Nadan

    Joined:
    Jan 20, 2013
    Posts:
    341
    opsive likes this.
  19. TechnicalArtist

    TechnicalArtist

    Joined:
    Jul 9, 2012
    Posts:
    736
    Hi,

    As per attachment image "within distance " find null object and seek action take this object.

    what I want is when "within distance" find null object not pass to seek action.
     

    Attached Files:

    • 01.JPG
      01.JPG
      File size:
      89.1 KB
      Views:
      939
    • 02.JPG
      02.JPG
      File size:
      100 KB
      Views:
      1,029
  20. Nadan

    Nadan

    Joined:
    Jan 20, 2013
    Posts:
    341
    My learning and using the Behavior Designer continues with new challenges.

    So in my game the player has a friendly AI. The friendly AI follows player in the game.

    There are however monsters in the game. If the friendly AI sees a monster it should stop following player and attack the monster to protect the player. When the monster has been killed (by friendly AI and/or player) the friendly AI should go back following the player again.

    I watched your video 'Behavior Designer Overview' from YouTube and this is what I came up with.



    So far it seems to work. The friendly AI follows player and when monster comes around the friendly AI starts to seek it. But instead of the 'Seek' I need to do following things.

    > Stop the friendly AI from moving
    > Make the friendly AI do attack animation
    > Make friendly AI face the monster (like in PlayMaker's Smooth Look At)
    > Assign target gameobject for Final IK's Look At (for head movement)
    > Attack by instantiating magic spell projectiles to the monster (target: monsters transform position)
    > Wait and repeat the attack until the monster is dead
    > Go back following the player when the monster is gone

    How should I approach this?

    Should I write my own script to do this? So far I have only written C# scripts and all this is new for me. How could I transfer variables from Behavior Designer to my script? I have PlayMaker too that I have used a little. Can I pass gameobject's and variables to PlayMaker or can I only fire events in PlayMaker FSM?

    I'm a little lost here. Any tips how to move forward and what to learn next?
     
    Last edited: Feb 10, 2017
  21. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    You can use an Inverter to flip the Success/Failure status of the child task. In your case this will flip it so the Seek executes only when Can See Object returns failure. If you haven't see it yet, take a look at this page for an overview on a pretty extensive behavior tree - I go through each task step by step explaining why it is where it is.
     
    Last edited: Feb 10, 2017
  22. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    At the high level your tree can be setup similar to this tree. If you go through this guide it should give you some ideas on how to structure a large behavior tree. Of course, I can also help if you have any specific questions.

    For some of those tasks you will need to but for others it is built in. If you've written scripts for Unity components before you are most of way there, Behavior Designer tasks are structured similarly:

    http://www.opsive.com/assets/BehaviorDesigner/documentation.php?id=5
    http://www.opsive.com/assets/BehaviorDesigner/documentation.php?id=10

    This page gives an overview:

    http://www.opsive.com/assets/BehaviorDesigner/documentation.php?id=54

    Yes, you can share variable values between Playmaker and Behavior Designer. You'll want to enable "Synchronize Variables" on the Playmaker task.
     
    Last edited: Feb 10, 2017
    Nadan likes this.
  23. TechnicalArtist

    TechnicalArtist

    Joined:
    Jul 9, 2012
    Posts:
    736
    Hi,
    I Want Seek executes only when Can See Object returns Success.(find target object) otherwise return fail & not execute seek.
     
  24. Nadan

    Nadan

    Joined:
    Jan 20, 2013
    Posts:
    341
    There is so much to learn. This is interesting.

    So the Behaviour Tree follows player and when monster is detected the "Can See Object" node returns "Target" GameObject variable. I need to pass this GameObject to my script. I will use this GameObject to shoot projectiles at it, make the Friendly AI look at it with RootMotion etc.

    So now I tried to this:
    Code (csharp):
    1. using UnityEngine;
    2. using BehaviorDesigner.Runtime;
    3.  
    4. public class FriendlyAI : MonoBehaviour
    5. {
    6.  
    7.    public BehaviorTree behaviorTree;
    8.  
    9.    void Update()
    10.    {
    11.      var monsterGameObject = (SharedGameObject)behaviorTree.GetVariable("Target");
    12.      Debug.Log(monsterGameObject);
    13.    }
    14.  
    15. }
    Debug.Log shows:
    Code (csharp):
    1. (null)
    2. UnityEngine.Debug:Log(Object)
    and when monster comes around..
    Code (csharp):
    1. Monster (UnityEngine.GameObject)
    2. UnityEngine.Debug:Log(Object)
    Now if I for example try to make the FriendlyAI look at the monster I would do it like this:
    Code (csharp):
    1. void Update()
    2. {
    3.     var monsterGameObject = (SharedGameObject)behaviorTree.GetVariable("Target");
    4.     if (monsterGameObject != null)
    5.     {
    6.         LookAtTheMonster(monsterGameObject.transform);
    7.     }
    8. }
    9.  
    10. void LookAtTheMonster(Transform TargetTransform)
    11. {
    12.     AI.solver.target = TargetTransform;
    13. }
    I get error:

    Type `BehaviorDesigner.Runtime.SharedGameObject' does not contain a definition for `transform' and no extension method `transform' of type `BehaviorDesigner.Runtime.SharedGameObject' could be found. Are you missing an assembly reference?

    It understood that the SharedGameObject is not the UnityEngine.GameObject. So I can't directly pass GameObject that has been detected in Behaviour Designer to my script this way? Could this be done this way?
     
  25. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    That looks to be what you have in your screenshot. Can See Object has a checkbox by it so it returned success, then the Sequence task acts like an AND so it'll start the next task (in this case Seek). What you have is really similar to this small example:

    http://opsive.com/forum/index.php/topic,671.0.html

    Is the problem that the findObject value is null? Can See Object will only fill in that value if it returns success so is there something else that could be causing that value to go null?
     
  26. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    In order to get the actual GameObject from a SharedGameObject you'll need to use the Value property:

    Code (csharp):
    1.  
    2.         LookAtTheMonster(monsterGameObject.Value.transform);
    3.  
     
    Nadan likes this.
  27. Nadan

    Nadan

    Joined:
    Jan 20, 2013
    Posts:
    341
    Is it possible to Restart Behavior Tree from script?
     
  28. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
  29. Nadan

    Nadan

    Joined:
    Jan 20, 2013
    Posts:
    341
    I got the tree to the point where the Friendly AI kills the monster. Now for the last part I need to restart the behaviour tree so it would again start following player. But when I do this:

    behaviorTree.DisableBehavior();
    behaviorTree.EnableBehavior();

    The Target (that had the monster gameobject) is now null (like it should be since the monster is gone) I get this error.

    NullReferenceException: Object reference not set to an instance of an object
    BehaviorDesigner.Runtime.Tasks.Movement.MovementUtility.WithinSight


    I made the Target null with this line:

    var ClearTarget = (SharedGameObject)behaviorTree.GetVariable("Target");
    ClearTarget.Value = null;

    But if I comment it out it still gives the same error.

    So even thought the "Can See Object" should return false and the tree go back to "Follow". I think that it's not starting the tree from "Entry" and clean slate. I changed the monsters tag, layer and removed it's collider so the Friendly AI should not see it anymore with "Can See Object" node and continue like nothing happened.
     
    Last edited: Feb 12, 2017
  30. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    What is the full stack trace of that error?
     
  31. Nadan

    Nadan

    Joined:
    Jan 20, 2013
    Posts:
    341
    It's..

    Code (csharp):
    1. NullReferenceException: Object reference not set to an instance of an object
    2. BehaviorDesigner.Runtime.Tasks.Movement.MovementUtility.WithinSight (UnityEngine.Transform transform, Vector3 positionOffset, Single fieldOfViewAngle, Single viewDistance, UnityEngine.GameObject targetObject, Vector3 targetOffset, Boolean usePhysics2D, Single angleOffset2D, System.Single& angle, Int32 ignoreLayerMask) (at Assets/Behavior Designer Movement/Scripts/MovementUtility.cs:78)
    3. BehaviorDesigner.Runtime.Tasks.Movement.MovementUtility.WithinSight (UnityEngine.Transform transform, Vector3 positionOffset, Single fieldOfViewAngle, Single viewDistance, UnityEngine.GameObject targetObject, Vector3 targetOffset, LayerMask ignoreLayerMask) (at Assets/Behavior Designer Movement/Scripts/MovementUtility.cs:63)
    4. BehaviorDesigner.Runtime.Tasks.Movement.CanSeeObject.OnUpdate () (at Assets/Behavior Designer Movement/Scripts/Tasks/CanSeeObject.cs:47)
    5. BehaviorDesigner.Runtime.BehaviorManager.RunTask (BehaviorDesigner.Runtime.BehaviorTree behaviorTree, Int32 taskIndex, Int32 stackIndex, TaskStatus previousStatus)
    6. BehaviorDesigner.Runtime.BehaviorManager.Tick (BehaviorDesigner.Runtime.BehaviorTree behaviorTree)
    7. BehaviorDesigner.Runtime.BehaviorManager.Tick ()
    8. BehaviorDesigner.Runtime.BehaviorManager.Update ()
    I also tried another solution for the problem. This is what the monsters behavior tree looks like:



    I made a variable for the state of the monster. 1 = Attack, 2 = dead and other values go to Wander.

    So when the Friendly AI kills the monster I changed the value of the state to 2.

    Code (csharp):
    1. var myIntVariable = (SharedInt)behaviorTree.GetVariable("monsterState");
    2. myIntVariable.Value = 2;
    I can see from the Variables screen in the Behavior Designer that the value does change to 2. But the selector is not changing the tree to the one in the middle that has "Compare Shared Int: Compare To 2" and after that I added the "Restart Behavior Tree" and linked the Friendly AI so it would start it over when the monster dies. The screenshot above shows where it stays.

    I quess this problem has something to do with the Abort type that I don't fully understand yet.

    ps. I just wrote little review of the asset to the Asset Store.. :)
     
    Last edited: Feb 12, 2017
  32. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    Are you using the tag field of the Can See Object? I think that error is related to this fix.

    Based on that screenshot it looks like the first branch completed successfully so the top selector ended the behavior tree because there are no more tasks to run. Do you have "Restart When Complete" selected within that screenshot? If so it will then start back up again, compare the int, and either run the first branch or move onto the second/third branch.

    Also, I don't think this has anything to do with it, but in general you don't need the Restart Behavior Tree task within the actual behavior tree that you are restarting. You should be able to design your tree so it'll just end when there is nothing left to do. In my mind I compare that task to a "goto" in programming which generally isn't used.
    Thank you - I really appreciate it :)
     
    Nadan likes this.
  33. Nadan

    Nadan

    Joined:
    Jan 20, 2013
    Posts:
    341
    It works now! It was the tag field.
     
  34. Dorgam

    Dorgam

    Joined:
    Oct 7, 2015
    Posts:
    1
    Hello,

    I currently use Behaivor Designer in our game and I would like to create unit tests for the AI.

    We need a way to know that all tasks in a tree have been executed at least once. (Coverage Test)

    However, I can't find a way to access the tasks of a referenced tree (all tasks, and their status).

    Any idea how can I do so?

    Thanks.
     
  35. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    You can get all of the tasks with BehaviorTree.FindTasks<Task>(); You can get the execution status from Task.NodeData.ExecutionStatus.
     
  36. TechnicalArtist

    TechnicalArtist

    Joined:
    Jul 9, 2012
    Posts:
    736

    Hi,
    I check my project but same problem is coming.Any suggestion?
     
  37. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    Have you tried the sample tree from that thread? Did that work for you? If so, can you modify that tree to show the same problem? Alternatively if you send me a PM with a link to a repro project I can also take a look at what is going wrong (please don't post the link publicly if it includes Behavior Designer).
     
  38. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    Updates to the Movement Pack, Tactical Pack, and Formations Pack have been submitted and will be on the store soon. These updates add support for Unity 5.6 and drop support for Unity 5.0. The Formations Pack also adds integration with the Movement Pack so you can use the Movement Pack tasks as the Formations Pack leader:

    movement.gif

    Here are links to the full release notes:

    Movement Pack
    Tactical Pack
    Formations Pack
     
  39. Chrisad

    Chrisad

    Joined:
    Mar 12, 2013
    Posts:
    55
    hello Opsive.

    In my game, I instantiate many objects with Behavior component attached and get a serious freeze from the method
    Behavior.Start()

    upload_2017-2-26_22-40-32.png

    using the Deep profile, it seems that the method BinaryDeserialization.Load() take a lot of times.

    upload_2017-2-26_22-47-53.png

    In this case, I only instantiate 25 gameobjects. But I need to instantiate much more. How to solve this problem?
     
  40. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    Make sure you are using binary serialization instead of JSON as it is a lot quicker and generates less garbage. How large is your tree? 2 seconds to deserialize 25 trees seems like a long time for binary or JSON though.

    Beyond that, the best bet is to instantiate while the scene is loading and then use a pool to enable/disable the objects. This will prevent you from needing to deserialize in the middle of the game.
     
  41. Chrisad

    Chrisad

    Joined:
    Mar 12, 2013
    Posts:
    55
    I am already using binary serialization

    Here my tree. It is compose of 5 external behaviors loaded by the "master" behavior.
    BehaviorScreenshot.png

    My game generate procedurally the world. I dont load any scenes after the debut of the game.

    I try to call the behavior.SetVariableValue() method (it made the frezze) in another thread but it calls internally the method isPlaying :

    upload_2017-2-26_23-31-29.png

    .
    is there a way to make the call of this method in another thread?
     
  42. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    Can you deserialize all of the trees that you would need at the very start of the game? And then use pooling so it doesn't have to deserialize anymore.

    SetVariableValue will deserialize the tree if it hasn't already been deserialized. Deserialization must be called on the main Unity thread as it may call a Unity function which can only operate on the main thread.
     
  43. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    Behavior Designer 1.5.9 has been sent to opsive.com purchases and released on the Asset Store. You can see the full release notes on this page. There was one callback change so if you are subscribed to Behavior.OnBehaviorStart/OnBehaviorRestart/OnBehaviorEnd then you'll need to update your subscription. For example,

    Code (csharp):
    1.  
    2. myBehaviorTree.OnBehaviorStart += BehaviorStart;
    3. ...
    4. private void BehaviorStart()
    5. {
    6.  
    Becomes

    Code (csharp):
    1.  
    2. myBehaviorTree.OnBehaviorStart += BehaviorStart;
    3. ...
    4. private void BehaviorStart(Behavior behavior)
    5. {
    6.  
     
  44. S_Darkwell

    S_Darkwell

    Joined:
    Oct 20, 2013
    Posts:
    320
    @opsive, I believe there may be an issue with Behavior Designer's forum.

    When I attempt to visit it, my connection is refused. I receive the following message:
    "/forum/index.php/board,1.0.html?PHPSESSID=olcn417i9fu3i0apr8grtad7i2 is forbidden on opsive.com.
    Error Code: 403"

    This began happening around the time that you released the prior version of the asset.

    I've tried it from multiple browsers, computers, and even IP addresses to no avail.

    Hope this information is helpful. Let me know if there is anything I can do to help.

    Be well!
    - S.
     
  45. Chrisad

    Chrisad

    Joined:
    Mar 12, 2013
    Posts:
    55
    I can try to pool my trees. But in the future, the "master" tree will become more complicate over the time and the numbers of instances needed will increase too.
    If I need like 200 instances, this will create a huge loading time at the start of the game.
    And another problem that I haven't precise is sometimes the game freeze and CRASH during the loading (I am not sure at 100%, but I think it causes by Behavior Designer). So even if I pool the trees, the possibility of crashing at the beginning of the game can become a real problem.

    In my game, I have only two "master" trees: one for the enemies, one for the NPC. The problem here is that the deserialization process is done for every instance even if it is the same exact tree deserialized. Is there a way two deserialize one time the tree then copy the structure for the others instances?


    (Sorry for my bad english)
     
  46. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    Thanks for the heads up - I'm not entirely with this forum software and sometimes it decides to through that error. When we merge the Opsive forum with the UFPS forum later this year I'll be switching forums software which should indeterminately fix this. Have you tried signing out of the forum and then back in? I've noticed that this sometimes helps.
     
  47. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    I haven't gotten any crashing reports so if you can reproduce it in a small repro scene and the issue points to Behavior Designer I can take a look. Make sure you're using the latest version that was just released.

    Unfortunately due to variables being able to be overridden this isn't possible. If you aren't using this feature though (which it doesn't sound like you are) you may have an alternative. All off the tree data is stored in the BehaviorSource data structure. If you import the runtime source you could change it so when you assign the tree to the object it would use a pooled version of this deserialized BehaviorSource object. This will prevent you from having to deserialize the tree with every assignment and could work for your use case.
     
  48. Chrisad

    Chrisad

    Joined:
    Mar 12, 2013
    Posts:
    55
    I will investigate more on this and contact you after

    What do you mean by "variables being able to be overridden"? Is it about the sharedVariables? If it is the case, I overrride some sharedVariables from External behavior.
     
  49. opsive

    opsive

    Joined:
    Mar 15, 2010
    Posts:
    5,127
    Yes - in that case the SharedVariable value is persisted when the tree is deserialized. I will look at making this a separate process so you can have the BehaviorSource as an independent pooled object.
     
  50. Zephus

    Zephus

    Joined:
    May 25, 2015
    Posts:
    356
    Just a general question since I'm thinking of purchasing Behavior Designer.
    I'm currently working on a top-down 2D game in the style of the 2D Zelda games and I've been looking for an easy to use AI solution.

    Behavior Designer works just as well for 2D as it does for 3D, right? I'm making 2D games only, so I'd like to know if this is the right one for me. Also are the additional packs good for 2D? I've read in the reviews that they are using Unity's Navmesh system and that doesn't work for 2D, does it?
    Thanks!