Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

AI: Behaviour trees in Unity: Behave 1.1 released

Discussion in 'Assets and Asset Store' started by AngryAnt, Sep 29, 2010.

  1. olivier_henley

    olivier_henley

    Joined:
    Aug 14, 2012
    Posts:
    7
    In this case, forget about the tick rate and give control of the tick to the update method.

    Code (csharp):
    1.  
    2. void Update(){
    3.     yourInstantiatedTree.Tick();
    4. }
    5.  
     
  2. MitchStan

    MitchStan

    Joined:
    Feb 26, 2007
    Posts:
    568
    I can't seem to figure out the proper syntax to do that. Ill keep trying though. Can you point me to a link in the docs that explains this or perhaps provide a sample line of code that illustrates setting/checking the current tree context?

    Thanks, Emil, for all your efforts.

    Mitch
     
  3. olivier_henley

    olivier_henley

    Joined:
    Aug 14, 2012
    Posts:
    7
    1. In the Behave editor, select your priority selector box. Put a name in the Context field, let say Root.
    2. Build the lib. Let say your lib is called RailRunnerBehaveLib.
    3. In the code, instantiate your tree, let say in the variable named m_tree.
    4. Now you can check for the proper context this way:
    Code (csharp):
    1. if(m_tree.ActiveContext == BLRailRunnerBehaveLib.ContextType.Root) ...
    Hope it helps.
     
  4. MitchStan

    MitchStan

    Joined:
    Feb 26, 2007
    Posts:
    568
    Let me try it out. Thanks for the step by step. This helps me understand the workings of Behave a little more better!
     
  5. lzt120

    lzt120

    Joined:
    Apr 13, 2010
    Posts:
    93
    By using Unity4 and Behave 1.4, Behave Debug Editor does not work for me. It tells me that can not find the skin.
     
  6. VikoAlucard

    VikoAlucard

    Joined:
    Jan 18, 2013
    Posts:
    1
    Hi !

    I'm not sure this is a bug : to a Selector, a Decorator's failure is not equivalent to a child failure

    When you have a selector and the first child is a decorator, if it returns "false", then the selector doesn't tick the next action, it continues ticking that same decorator.

    In my case, I use decorators to "interrupt" running children and go into "survival" mode.
    Should we only use decorators's false state for complete "reset", or can they be used as simple filters (and should they return "false" in the case the filter blocks ?)

    Anyway, Thanks for this great component Emil !
    I've also asked this here : https://github.com/AngryAnt/Behave-release/issues/54

    Regards
    Viko
     
  7. AngryAnt

    AngryAnt

    Keyboard Operator

    Joined:
    Oct 25, 2005
    Posts:
    3,045
    This is the silliness of the 1.x decorators. They can never return failure to the parent. If a decorator implementation returns running, its child will be repeated, if it returns failure, it will interrupt the child tick, but return success to the parent. A return value of success from the decorator handler will pass through the tick as if the decorator wasn't there.

    In 2.x, the decorator component is replaced with two separate components - a repeater and an interrupter - giving you the full range of return values. I made great headway on 2.0 over the christmas break, but unfortunately my schedule is pretty packed right off the start line this year, so no promises on release dates.
     
  8. AngryAnt

    AngryAnt

    Keyboard Operator

    Joined:
    Oct 25, 2005
    Posts:
    3,045
    Does this completely break the debugger or can you still operate it?
     
  9. skalev

    skalev

    Joined:
    Feb 16, 2012
    Posts:
    264
    I'm also experiencing problems with the debugger under Unity 4. It does load and display the tree, but there are no debug information coming through, the tree just stays completely static.
     
  10. AngryAnt

    AngryAnt

    Keyboard Operator

    Joined:
    Oct 25, 2005
    Posts:
    3,045
    Thanks. I'll take a look at it over the weekend and see if I can come up with a quick patch.
     
  11. Robota

    Robota

    Joined:
    Feb 7, 2012
    Posts:
    82
    Hi AngryAnt,
    Are you still planning to release a Behave 2.0?
     
  12. TailsPerHour

    TailsPerHour

    Joined:
    Feb 15, 2013
    Posts:
    4
    First of all, thank you for making such great tool Emil :)

    I have 3 trees, called , EventDrivenTree, RestTree, MoveToDestinationTree.
    EventDrivenTree
    $MainTree.png
    RestTree
    $RestTree.png
    MoveToDestinationTree
    $MoveToDesTree.png

    Each tree has corresponding IAgent for handling actual actions.
    RestTree
    $RestClass.png
    MoveToDestinationTree
    $MoveToDesClass.png

    What I want to achieve is, one tree could exist for just one purpose like,
    moving to desired destination = MoveToDestinationTree
    and this tree will do just one thing. Moving unit.
    and this tree would need variables like transform to move such unit.

    So I purposely made it to one class.
    Same goes to Rest tree, and RestClass.

    And EventDrivenTree which is MainTree, references RestTree and MoveToDestinationTree.
    But it seems if I Instantiate EventDrivenTree and designate one IAgent class called EventDrivenTreeAgent,
    all the action from RestTree and MoveToDestinationTree is called inside EventDrivenTreeAgent.

    I know when if MainTree is instantiated, all the subtree will also be instantiated as well and will be included inside the mainTree.

    My question is this.
    How can i designate subtree(RestTree,MoveToDestination) to call action function to my other RestClass,MoveToDesClass?

    Picture might be not enough to explain my situation so...
    I'll put addition video here.
    http://www.youtube.com/watch?v=CPjiSW82b3U&feature=youtu.be
     
  13. aleiby

    aleiby

    Joined:
    Mar 14, 2012
    Posts:
    13
    Is it possible to step through the generated code in the debugger? Building the tree in debug mode just generates an assembly, but the source files don't get serialized out to disk as far as I noticed?
     
    Last edited: Feb 21, 2013
  14. aleiby

    aleiby

    Joined:
    Mar 14, 2012
    Posts:
    13
    One of the things that would help the most for learning Behave is a few more examples. So in an effort to give back, here's a simple tree I started working on. As a bonus, I'd love to hear any feedback about ways maybe I should set things up differently.

    Tree:
    $Screen Shot 2013-02-21 at 2.19.08 PM.png
    (not sure why the attached image isn't showing up here now)

    Code (csharp):
    1.  
    2. using UnityEngine;
    3. using System.Collections;
    4. using System.Collections.Generic;
    5. using Behave.Runtime;
    6. using Tree = Behave.Runtime.Tree;
    7.  
    8. public class TestAgent : MonoBehaviour, IAgent
    9. {
    10.     public enum Mode
    11.     {
    12.         Offensive,
    13.         Defensive
    14.     }
    15.  
    16.     public Mode guardMode;
    17.  
    18.     [System.Serializable]
    19.     public class OffensiveGuard
    20.     {
    21.         public bool requireLockIn = false;
    22.         public float holdTime = 3.0f;
    23.  
    24.         [HideInInspector]
    25.         public float holdTimer;
    26.     }
    27.     public OffensiveGuard offensiveGuard;
    28.  
    29.     public BehaveResult OffensiveDecorator
    30.     {
    31.         get { return (guardMode == Mode.Offensive) ? BehaveResult.Success : BehaveResult.Failure; }
    32.     }
    33.  
    34.     public BehaveResult DefensiveDecorator
    35.     {
    36.         get { return (guardMode == Mode.Defensive) ? BehaveResult.Success : BehaveResult.Failure; }
    37.     }
    38.  
    39.     public BehaveResult TargetSwitchingGuardsAction
    40.     {
    41.         get { return (targetMase != null  targetMase.PlayingTransition()) ? BehaveResult.Success : BehaveResult.Failure; }
    42.     }
    43.  
    44.     public BehaveResult TargetAttackingAction
    45.     {
    46.         get { return (targetMase != null  targetMase.PlayingAttack()) ? BehaveResult.Success : BehaveResult.Failure; }
    47.     }
    48.  
    49.     public BehaveResult WhileIdleDecorator
    50.     {
    51.         get { return IsIdle() ? BehaveResult.Running : BehaveResult.Failure; }
    52.     }
    53.  
    54.     public BehaveResult RepeatDecorator
    55.     {
    56.         get { return BehaveResult.Running; }
    57.     }
    58.  
    59.     Mase mase, targetMase;
    60.     Locomotion locomotion;
    61.  
    62.     Tree tree;
    63.  
    64.     IEnumerator Start()
    65.     {
    66.         mase = GetComponent<Mase>();
    67.         locomotion = GetComponent<Locomotion>();
    68.         targetMase = locomotion.target.GetComponent<Mase>();
    69.  
    70.         tree = BLTestBehaveLibrary.InstantiateTree(BLTestBehaveLibrary.TreeType.AI_Default, this);
    71.  
    72.         while (Application.isPlaying  tree != null)
    73.         {
    74.             AIUpdate();
    75.             yield return new WaitForSeconds(1.0f / tree.Frequency);
    76.         }
    77.     }
    78.  
    79.     void AIUpdate()
    80.     {
    81.         tree.Tick(); // != BehaveResult.Running) tree.Reset();
    82.     }
    83.  
    84.     public BehaveResult Tick(Tree sender, bool init)
    85.     {
    86.         if (BLTestBehaveLibrary.IsAction(sender.ActiveID))
    87.         {
    88.             Debug.Log("Ticking unhandled action: " + (BLTestBehaveLibrary.ActionType)sender.ActiveID);
    89.         }
    90.         else if (BLTestBehaveLibrary.IsDecorator(sender.ActiveID))
    91.         {
    92.             Debug.Log("Ticking unhandled decorator: " + (BLTestBehaveLibrary.DecoratorType)sender.ActiveID);
    93.         }
    94.            
    95.         return BehaveResult.Success;
    96.     }
    97.  
    98.     public void Reset(Tree sender)
    99.     {
    100.     }
    101.  
    102.     public int SelectTopPriority(Tree sender, params int[] IDs)
    103.     {
    104.         return IDs[0];
    105.     }
    106.  
    107.     //
    108.     // Guard selection
    109.     //
    110.  
    111.     public BehaveResult TickSelectOffensiveGuardAction(Tree sender)
    112.     {
    113.         var targetState = targetMase.state;
    114.  
    115.         // wait until target is using a recommended guard against our current stance (and locked in)
    116.         if ((!offensiveGuard.requireLockIn || targetMase.lockedIn)
    117.             mase.data.states[mase.state].IsDefense(targetState))
    118.         {
    119.             offensiveGuard.holdTimer += Time.deltaTime;
    120.             if (offensiveGuard.holdTimer < offensiveGuard.holdTime)
    121.                 return BehaveResult.Running;
    122.         }
    123.         else if (mase.state > 0) // never hold in rest state
    124.         {
    125.             offensiveGuard.holdTimer = 0.0f;
    126.             return BehaveResult.Running;
    127.         }
    128.  
    129.         // collect the set of guards that the target's current stance is not a good defense for
    130.         var guards = new List<int>();
    131.         for (int i = 2; i < mase.data.states.Count; i++) // never pick rest or initial state
    132.         {
    133.             bool isDefense = mase.data.states[i].IsDefense(targetState);
    134.             if (!isDefense)
    135.             {
    136.                 guards.Add(i);
    137.             }
    138.         }
    139.  
    140.         var count = guards.Count;
    141.         if (count == 0)
    142.             return BehaveResult.Failure;
    143.  
    144.         var index = Random.Range(0, count);
    145.         mase.SetState(guards[index]);
    146.         return BehaveResult.Running;
    147.     }
    148.  
    149.     public BehaveResult TickSelectDefensiveGuardAction(Tree sender)
    150.     {
    151.         var targetState = targetMase.state;
    152.  
    153.         // pick a stance based on target stance
    154.         var defenses = mase.data.states[targetState].defenses;
    155.         if (defenses == null)
    156.             return BehaveResult.Failure;
    157.  
    158.         var count = defenses.Count;
    159.         if (count == 0)
    160.             return BehaveResult.Failure;
    161.  
    162.         // prefer current state if a good defense
    163.         foreach (int defense in defenses)
    164.         {
    165.             if (mase.state == defense)
    166.                 return BehaveResult.Running;
    167.         }
    168.  
    169.         // otherwise, pick one at random
    170.         var index = Random.Range(0, count);
    171.         mase.SetState(defenses[index]);
    172.         return BehaveResult.Running;
    173.     }
    174.  
    175.     //
    176.     // Attacking
    177.     //
    178.  
    179.     public BehaveResult InitAttackAction(Tree sender)
    180.     {
    181.         if (!mase.StartAttack())
    182.         {
    183.             return BehaveResult.Failure;
    184.         }
    185.  
    186.         return BehaveResult.Running;
    187.     }
    188.  
    189.     public BehaveResult TickAttackAction(Tree sender)
    190.     {
    191.         // TODO[aleiby: 2013.02.20] Wait for full recovery (instead of just apexTime)?
    192.         if (mase.PlayingAttack())
    193.         {
    194.             return BehaveResult.Running;
    195.         }
    196.  
    197.         return BehaveResult.Success;
    198.     }
    199.  
    200.     public bool IsIdle()
    201.     {
    202.         if (mase != null)
    203.         {
    204.             if (mase.PlayingAttack())
    205.                 return false;
    206.  
    207.             if (mase.PlayingTransition())
    208.                 return false;
    209.         }
    210.  
    211.         return true;
    212.     }
    213.  
    214.     //
    215.     // Movement
    216.     //
    217.  
    218.     public Vector2 desiredDistance;
    219.     public Vector2 walkRange; // ramp walk speed in this range beyond desired distance
    220.     public Vector2 walkSpeed = new Vector2(0.5f, 1.0f);
    221.     private float moveForward;
    222.  
    223.     public BehaveResult TickNotInRangeDecorator(Tree sender)
    224.     {
    225.         if (locomotion.target != null  desiredDistance.y > desiredDistance.x)
    226.         {
    227.             var delta = (transform.position - locomotion.target.position);
    228.             var dist = delta.magnitude;
    229.             if (dist > desiredDistance.y)
    230.             {
    231.                 var t = (walkRange.y > walkRange.x) ?
    232.                     Mathf.InverseLerp(walkRange.x, walkRange.y, dist - desiredDistance.y) : 1.0f;
    233.                 moveForward = Mathf.Lerp(walkSpeed.x, walkSpeed.y, Mathf.Clamp01(t));
    234.                 return BehaveResult.Success;
    235.             }
    236.             else if (dist < desiredDistance.x)
    237.             {
    238.                 var t = (walkRange.y > walkRange.x) ?
    239.                     Mathf.InverseLerp(walkRange.x, walkRange.y, desiredDistance.x - dist) : 1.0f;
    240.                 moveForward = -Mathf.Lerp(walkSpeed.x, walkSpeed.y, Mathf.Clamp01(t));
    241.                 return BehaveResult.Success;
    242.             }
    243.         }
    244.  
    245.         return BehaveResult.Failure;
    246.     }
    247.  
    248.     public BehaveResult TickMoveInRangeAction(Tree sender)
    249.     {
    250.         locomotion.v = moveForward;
    251.         return BehaveResult.Running;
    252.     }
    253.  
    254.     public void ResetMoveInRangeAction(Tree sender)
    255.     {
    256.         locomotion.v = 0.0f;
    257.     }
    258.  
    259.     //
    260.     // Dodging
    261.     //
    262.  
    263.     public Vector2 dodgeDirection;
    264.  
    265.     public BehaveResult InitDodgeAction(Tree sender)
    266.     {
    267.         // force an update to idle
    268.         locomotion.h = 0.0f;
    269.         locomotion.v = 0.0f;
    270.         locomotion.UpdateAnimation();
    271.  
    272.         // then try to initiate a dodge
    273.         locomotion.h = dodgeDirection.x;
    274.         locomotion.v = dodgeDirection.y;
    275.         locomotion.UpdateAnimation();
    276.  
    277.         return BehaveResult.Running;
    278.     }
    279.  
    280.     public BehaveResult TickDodgeAction(Tree sender)
    281.     {
    282.         if (locomotion.isDodging)
    283.         {
    284.             return BehaveResult.Running;
    285.         }
    286.  
    287.         return BehaveResult.Success;
    288.     }
    289.  
    290.     public void ResetDodgeAction(Tree sender)
    291.     {
    292.         locomotion.h = 0.0f;
    293.         locomotion.v = 0.0f;
    294.     }
    295. }
    296.  
     
    Last edited: Feb 25, 2013
  15. Dollarslice

    Dollarslice

    Joined:
    Mar 10, 2013
    Posts:
    4
    I'm just learning how to use behave so I apologise if this question shows a huge misunderstanding!

    Simply - is there a way of ticking two (or more children) each frame and NOT returning to the same child if 'running' is returned?

    Each frame I want to check if the user has touched the screen, if they have I want the agent to move there, if not I want the agent to do some other behaviour. My problem I suppose is that I am trying to code an interrupt of sorts. I want the 'user touch logic' to be prioritised over the rest of the tree. The feedback must be instant and not wait until anything else has finished.

    In basic code this would simply be an if statement. If (userhastocuhed) - do some stuff Else - run normal behaviour.

    How do people do this?
     
  16. Dollarslice

    Dollarslice

    Joined:
    Mar 10, 2013
    Posts:
    4
    In a way you sort of want a sequence to have a checkbox that makes it treat a running signal from a child node as 'success', that way it would evaluate all of its sub-trees in order but still resume them in the same place. I achieved the desired result in the end by having two decorators, one is the one I already had - registeredUserTouch but then I also put a didNotRegisterTouch decorator over the second sub-tree. It's that last sub-tree that's the problem - the 'else' if you will, often the idle loop I suppose. Currently you have to write a decorator that is the combined negative of all the others. Unless there's a better way?
     
  17. TailsPerHour

    TailsPerHour

    Joined:
    Feb 15, 2013
    Posts:
    4
    There is a nice tutorial about implementing event driven in Behavior tree.
    http://aigamedev.com/open/tutorial/asynchronous-event-driven-conditions/

    And this is what I do to achieve like in your situation.
    $SomeImg.png

    Condition_DidSomebodyHitMe and
    Condition_SetFalseWhenSomebodyHitsMe checks for boolean variable is true or false.
    If somebody hits me, and event occurs, boolean variable will be set. If Condition_DidSomebodyHitMe catches boolean is set true, then Action_HitBack will be executed. If the tree was doing other work such as "WalkAroundSomewhere", there is a Condition_SetFalseWhenSomebodyHitsMe that returns Failure when boolean is set true, while boolean is set false it will return Running. It is attached to Parallel Context, so if condition fails then current Action "WalkAroundSomewhere" will be canceled eventually, and will reach Condition_DidSomebodyHitMe and will execute Action_HitBack.

    I hope this helps you.
     
  18. TailsPerHour

    TailsPerHour

    Joined:
    Feb 15, 2013
    Posts:
    4
    $FC.png

    Cant get that thing out. Is there a way to pull node which stuck in left side of the screen?
    I had to make whole new Tree because of this.
     

    Attached Files:

    • $FC.png
      $FC.png
      File size:
      41.8 KB
      Views:
      1,259
  19. Tochas

    Tochas

    Joined:
    Nov 24, 2012
    Posts:
    17
    Hi,
    How does frecuency on subtrees is handled?

    lets say if I have a main tree with a frecuency of 60 and that invokes a subtree that has a frecuency of 5. The sub tree is going to be ticked 60 times a second? or only 5 times?
     
  20. AngryAnt

    AngryAnt

    Keyboard Operator

    Joined:
    Oct 25, 2005
    Posts:
    3,045
    Hey there. Sorry about the very late reply. Have been quite busy lately.

    http://angryant.com/2013/05/21/Talks-and-progress/

    With regards to having actions handled by a different class than the agent instantiating the root tree, sure that is possible - by using action handler forwards. See the documentation for Set***Forward.
     
  21. AngryAnt

    AngryAnt

    Keyboard Operator

    Joined:
    Oct 25, 2005
    Posts:
    3,045
    Crazy late reply disclaimer, reference: http://angryant.com/2013/05/21/Talks-and-progress/

    Part of Behave 2 is proper covering documentation - and down the road examples. Right now, however my focus is on getting 2.0 out the door.

    Regarding your implementation, that looks quite nice. Are you looking for specific feedback?

    With regards to debug builds, the idea is not to facilitate .net debugging of the generated code (that would be not very helpful), but rather enabling use of the Behave visual debugger. Which in 2.0 also has been greatly expanded.
     
  22. AngryAnt

    AngryAnt

    Keyboard Operator

    Joined:
    Oct 25, 2005
    Posts:
    3,045
    Each node has a "negate" flag. Tick it to achieve the result you describe at the end of your post.
     
  23. AngryAnt

    AngryAnt

    Keyboard Operator

    Joined:
    Oct 25, 2005
    Posts:
    3,045
    Regarding event driven trees: Thanks, I'll look into it and compare it to what I had in mind down the road :)

    The lost node problem is indeed known and unfortunate. Luckily it does not affect your end result as the compiler will simply ignore free floating nodes. In Behave 2 I have rectified the problem.
     
  24. AngryAnt

    AngryAnt

    Keyboard Operator

    Joined:
    Oct 25, 2005
    Posts:
    3,045
    The frequency has no direct impact on tree execution. It is merely a container variable you yourself could use to dictate how often a tree is ticked. That being said, the frequency of ticking of a subtree is dictated by when its parent tree is ticked and when the specific reference node within that tree is ticked.
     
  25. AngryAnt

    AngryAnt

    Keyboard Operator

    Joined:
    Oct 25, 2005
    Posts:
    3,045
    Yes. I am right now fixing an iOS issue and doing some last minute polish before I'm ready to push this to the asset store. Teaser screenshot contained here:

    http://angryant.com/2013/05/21/Talks-and-progress/
     
  26. virror

    virror

    Joined:
    Feb 3, 2012
    Posts:
    2,963
    Will 2.0 be backwards compatible with this?
    Thinking about picking it up but maybe i should wait for next version or is it still a long way down the road?
     
  27. AngryAnt

    AngryAnt

    Keyboard Operator

    Joined:
    Oct 25, 2005
    Posts:
    3,045
    Behave 2.0 will indeed auto-upgrade 1.3 assets.
     
  28. virror

    virror

    Joined:
    Feb 3, 2012
    Posts:
    2,963
    Great!
    Any idea when it will be done?
     
  29. AngryAnt

    AngryAnt

    Keyboard Operator

    Joined:
    Oct 25, 2005
    Posts:
    3,045
    As mentioned I have very little work to do on it, but I am also currently quite busy. So "very soon" - can't be more precise than that :)
     
  30. virror

    virror

    Joined:
    Feb 3, 2012
    Posts:
    2,963
    Can someone give me an example on how i check what Priority Selector thats currently running?
    As i understand it they are not used the same way as actions and decorators that have names and separate functions.
    Do i only have one function even if i have multiple Priority Selectors in one tree?

    Already love this editor btw : D

    Edit: What are Blueprints and how do i use them?
    There is nothing about Blueprints at all in the videos and cant find any docs about it?
     
    Last edited: Jun 3, 2013
  31. samim23

    samim23

    Joined:
    Sep 11, 2012
    Posts:
    60
    @AngryAnt just read your post on the upcoming behave 2.0.
    Looks great, well done! Here some comments and wishes:

    - I do find the choice of icons a bit confusing on first sight, but maybe that's just me being very used to the old ones.
    - Will there be copy/past ? Or some kind of library containing all detected/used blocks.
    - Is updating 100% not going to break trees made with behave 1.x ?

    Anyways, really nice to see a new version on the horizon!
    We´re big behave fans here at 2Beats studio, all characters in our upcoming music game MokMok (http://www.mokmok.com) are driven by it.
     
  32. virror

    virror

    Joined:
    Feb 3, 2012
    Posts:
    2,963
    Got the priority selector working now with the use of Context, very simple : )
    Amazing system.
     
  33. pneill

    pneill

    Joined:
    Jan 21, 2007
    Posts:
    207
    Yes, is there any update on Behave 2? It sounded like you were nearly done a month ago. Have you had the opportunity to do that final polish?
     
  34. AngryAnt

    AngryAnt

    Keyboard Operator

    Joined:
    Oct 25, 2005
    Posts:
    3,045
    @pneill:

    That was indeed the case, but in the mean time I had to sink a lot of time into an apartment move as well as handling my exit from Unity and start up of freelance. I am currently working with the author of a new serialisation solution I'm using in a bit to solve an issue I am facing which prevents debug builds on iOS.

    I am hopeful we can get this sorted very soon - allowing me to ship shortly after, but I am not 100% in control of the timing here, given I am dependent on his availability for the time being.

    While I could release right now, with a plan to patch the iOS problem later, I would rather not risk needing to fork the serialisation format and mess around with an asset auto-update in the iOS patch as well.

    I can say that I know the problem very well now and once I have what I need from the 3rd party, I should be able to effectuate a fix relatively quickly - leaving the publishing process as the last remaining task.
     
  35. pneill

    pneill

    Joined:
    Jan 21, 2007
    Posts:
    207
    @AngryAnt

    Thanks for the update. Please do wait to ship the iOS version. As an iOS developer, it's important to me!
     
  36. dreamerflyer

    dreamerflyer

    Joined:
    Jun 11, 2011
    Posts:
    927
    Any body,
    Can this plugin run in android? I change to .NET 2.0, do not work too.
     
  37. AngryAnt

    AngryAnt

    Keyboard Operator

    Joined:
    Oct 25, 2005
    Posts:
    3,045
    I know people have released on Android with Behave. When do you get that error message? What is your setup? I need more context if I am to help you here.
     
  38. dreamerflyer

    dreamerflyer

    Joined:
    Jun 11, 2011
    Posts:
    927
    Hi angryant!
    I run the behaviorTrees2 example in UNITY 4.0,It's ok running on pc,but want to build the apk,can not work.android sdk is ok,because,I can build other project to apk,

     
    Last edited: Jul 13, 2013
  39. dreamerflyer

    dreamerflyer

    Joined:
    Jun 11, 2011
    Posts:
    927
    anyBody had succeed with export to android using this behavior tree??
     
  40. AngryAnt

    AngryAnt

    Keyboard Operator

    Joined:
    Oct 25, 2005
    Posts:
    3,045
    I'm not entirely sure which example you're referring to. And which errors are you getting when trying to build to android?
     
  41. dreamerflyer

    dreamerflyer

    Joined:
    Jun 11, 2011
    Posts:
    927
    Hi angryant,
    Pls test the attatchment ,when I build the APK,then,got the error.
     

    Attached Files:

  42. AngryAnt

    AngryAnt

    Keyboard Operator

    Joined:
    Oct 25, 2005
    Posts:
    3,045
    Whoa! That's a genuine Behave 0.3b pre-release build from 2008 - the very one I used to present the project at the Unite 08 open-mic session.

    This version became unsupported soon after - that is now five years ago. I am impressed that it still builds anything. Where did you find this? :)

    Please download the latest version from the asset store.
     
  43. AngryAnt

    AngryAnt

    Keyboard Operator

    Joined:
    Oct 25, 2005
    Posts:
    3,045
  44. aigam

    aigam

    Joined:
    Dec 31, 2005
    Posts:
    170
  45. I am da bawss

    I am da bawss

    Joined:
    Jun 2, 2011
    Posts:
    2,574
    I think it would be better if you create a seperate forum thread for v2.0 release since it is payware.

    Also a proper link to Asset Store like this would be nice ;)

    https://www.assetstore.unity3d.com/#/content/10912


    And is it going to support Unity 3.5.7? I know a lot of us are still stucked at 3.5x right now and it would be good if you would still support 3.5x.

    EDIT : I see it says "Requires Unity 4.2.0 or higher." No mention of 3.5x compatibility.

    Also another suggestion - might be good if you post more screenshots on the user interface. Also what advantage it offers... etc etc.
     
    Last edited: Aug 25, 2013
  46. aigam

    aigam

    Joined:
    Dec 31, 2005
    Posts:
    170
    Hi!
    Where is the angryant community? I registered but... there is no access link, I tried http://eej.dk/community/ but it moves me to the register screen :)
     
  47. AngryAnt

    AngryAnt

    Keyboard Operator

    Joined:
    Oct 25, 2005
    Posts:
    3,045
    @aigam:
    Thanks! As described on the welcome page, unfortunately the forums are not completely ready yet. I will have them up very soon though. Note that the URL might also change, so please use the Unity help menu item to access the latest updates.

    @I am da bawss:
    The intend is indeed to have 2.x comms happen in a separate community. The asset store link should be in the announcement post though? Unfortunately Behave 2 does depend on Unity 4.2 API. Finally, the announcement post has been updated with an introductory video.
     
  48. chin

    chin

    Joined:
    Feb 15, 2011
    Posts:
    7
    Can give us the source of the behavior tree demoed at the introductory video? Awesome system btw. Thanks.
     
  49. AngryAnt

    AngryAnt

    Keyboard Operator

    Joined:
    Oct 25, 2005
    Posts:
    3,045
    Glad you like it :) The idea is indeed to make some demos available - starting with the first of the three shown in the video. It's in the queue to go out soonish :)
     
  50. BuildABurgerBurg

    BuildABurgerBurg

    Joined:
    Nov 5, 2012
    Posts:
    566
    It's good to see you've redirected your energy into this project AngryAnt.

    Color coding icons would be a nice little touch.

    I too will buy this when I see some examples + video tutorials

    Nice work :)