Example #1
0
        private void OnPlayModeStateChanged(PlayModeStateChange state)
        {
            switch (state)
            {
            case PlayModeStateChange.ExitingEditMode:
                BehaviorTreeManager btManager = FindObjectOfType <BehaviorTreeManager>();

                if (btManager != null && btManager.references != null && !btManager.references.ContainsKey(guid))
                {
                    btManager.references[guid] = gameObjectVariable;
                }

                break;

            case PlayModeStateChange.EnteredPlayMode:
                var manager = FindObjectOfType <BehaviorTreeManager>();

                if (manager != null && manager.references != null && manager.references.ContainsKey(guid))
                {
                    gameObjectVariable = manager.references[guid];
                }
                break;

            case PlayModeStateChange.EnteredEditMode:
                break;
            }
        }
    public override NodeState Evaluate()
    {
        i = 0;

        while (i < nodes.Count)
        {
            if (nodes[i].isPhysicsBased & !BehaviorTreeManager.IsFixedTime())
            {
                return(SetState(NodeState.RUNNING));
            }

            NodeState status = nodes[i].Evaluate();

            if (status.Equals(NodeState.SUCCESS))
            {
                // The current node was a success, lets continue to the next.
                i++;
            }
            else// if(status.Equals(NodeState.FAILURE) || status.Equals(NodeState.RUNNING))
            {
                // Keep current index and stop the loop with the current status.
                return(SetState(status));
            }
        }

        // If this code path is reached, then all nodes where a success.
        return(SetState(NodeState.SUCCESS));
    }
Example #3
0
        public void TestInvalidVariable()
        {
            var treeManagerOwner = new BehaviorTreeManagerOwner();
            var treeManager      = new BehaviorTreeManager(treeManagerOwner);
            var treeOwner        = new BehaviorTreeOwner();
            var tree             = treeManager.CreateTree(treeOwner, "ConditionEvaluator1", null);

            while (tree.RootTask.LastResult == TaskResult.Running)
            {
                tree.Update();
                treeOwner.Tick(100);
            }
        }
Example #4
0
        private void OnEnable()
        {
            EditorApplication.playModeStateChanged += OnPlayModeStateChanged;

            BehaviorTreeManager manager = FindObjectOfType <BehaviorTreeManager>();

            if (manager != null && manager.references != null && guid != null)
            {
                if (manager.references.ContainsKey(guid))
                {
                    gameObjectVariable = manager.references[this.guid];
                }
            }
        }
        public static void RunBehaviorTree(string path)
        {
            var treeManagerOwner = new BehaviorTreeManagerOwner();
            var treeManager      = new BehaviorTreeManager(treeManagerOwner);
            var treeOwner        = new BehaviorTreeOwner();
            var tree             = treeManager.CreateTree(treeOwner, path, null);

            while (tree.RootTask.LastResult == TaskResult.Running)
            {
                tree.Update();

                treeOwner.Tick(100);
            }
        }
Example #6
0
        private void Awake()
        {
            BehaviorTreeSerializer.Initialize(new FlatBuffersSerializer());

            treeManager = new BehaviorTreeManager(this);

            if (asset == null)
            {
                return;
            }

            var treeDesc = BehaviorTreeSerializer.DeserializeDesc(asset.bytes);

            tree = treeManager.CreateTree(this, treeDesc);
        }
Example #7
0
        public void TestRestore()
        {
            BehaviorTreeSerializer.Initialize(new FlatBuffersSerializer());

            var treeManagerOwner = new BehaviorTreeManagerOwner();
            var treeManager      = new BehaviorTreeManager(treeManagerOwner);
            var treeOwner        = new BehaviorTreeOwner();
            var tree1            = treeManager.CreateTree(treeOwner, "WaitTimer", null);

            Console.WriteLine("============ Tree1 ============");

            for (int i = 0; i < 20; i++)
            {
                tree1.Update();
                treeOwner.Tick(100);
            }

            var snapshot1 = tree1.CreateSnapshot();

            var data1     = BehaviorTreeSerializer.SerializeProps(snapshot1);
            var snapshot2 = BehaviorTreeSerializer.DeserializeProps(data1);

            Console.WriteLine("============ Tree2 ============");

            var tree2 = treeManager.CreateTree(treeOwner, "WaitTimer", null);

            for (int i = 0; i < 30; i++)
            {
                tree2.Update();
                treeOwner.Tick(100);
            }

            Console.WriteLine("============ Tree2 Restore ============");

            tree2.RestoreSnapshot(snapshot2);

            for (int i = 0; i < 1000 && tree2.RootTask.LastResult == TaskResult.Running; i++)
            {
                tree2.Update();

                treeOwner.Tick(100);
            }
        }
        public override IEnumerator Tick(WaitForSeconds delayStart = null)
        {
            base.Tick();

            ++numTicks;
            if (UpdatePlayersTickInterval % numTicks == 0 || numTicks == 0)
            {
                players = GameObject.FindGameObjectsWithTag("Player");
            }
            if (UpdateSelfPositionTickInterval % numTicks == 0 || numTicks == 0)
            {
                myPos = BehaviorTreeManager.GetComponentInParent <Transform>();
            }

            if (players != null && players.Length > 0)
            {
                var closestPlayer = GetClosestEnemy(players);
                yield return(MoveTowardsPosition(closestPlayer.position));
            }

            CurrentState = BehaviorState.Fail;
            yield return(null);
        }
    void GenerateBehaviors()
    {
        Animator a = GetAnimator();

        ////////////////////////////////// Movement //////////////////////////////////

        EvadeNode     evade     = new EvadeNode(this.rB, speed, 0.4f, 25);
        IsBlockedNode isBlocked = new IsBlockedNode(transform, evade, 1, 1);
        MoveNode      move      = new MoveNode(rB, target, speed, atkRange);

        SequenceNode evading = new SequenceNode(new List <Node>()
        {
            isBlocked, evade
        });
        SelectorNode movement = new SelectorNode(new List <Node>()
        {
            evading, move
        });

        ////////////////////////////////// Death //////////////////////////////////

        HealthCheckNode         isDead              = new HealthCheckNode(this, 0, true);
        ClampSuccessNode        isDeadClamped       = new ClampSuccessNode(isDead);
        AnimationNode           deathAnim           = new AnimationNode(a, "Die");
        OnAnimationCompleteNode onDeathAnimComplete = new OnAnimationCompleteNode(a, "Die");
        DestroyNode             destroy             = new DestroyNode(this.gameObject);

        SequenceNode death = new SequenceNode(new List <Node> {
            isDeadClamped, deathAnim, onDeathAnimComplete, destroy
        });

        ////////////////////////////////// Cover //////////////////////////////////

        HealthCheckNode   isLow         = new HealthCheckNode(this, consideredLowHP, true);
        SoundNode         hurtSFX       = new SoundNode(Sound.SeaMonsterHurt);
        RandomNode        chanceHurtSFX = new RandomNode(hurtSFX, 0.4f);
        ColorFlashNode    hurtFlash     = new ColorFlashNode(GetMaterial(), Color.red, 3, 1);
        RecoverHealthNode hpRecover     = new RecoverHealthNode(this, hpRecoveryMultiplier);
        FindCover         findCover     = new FindCover(this, target, 10);

        SequenceNode hurting = new SequenceNode(new List <Node>()
        {
            chanceHurtSFX, hurtFlash
        });
        SequenceNode recovering = new SequenceNode(new List <Node>()
        {
            hpRecover, hurting
        });
        SequenceNode covering = new SequenceNode(new List <Node>()
        {
            findCover, movement
        });
        ParallelNode recoveringAndCovering = new ParallelNode(new List <Node>()
        {
            recovering, covering
        }, 2);

        SequenceNode cover = new SequenceNode(new List <Node>()
        {
            isLow, recoveringAndCovering
        });

        ////////////////////////////////// Attack //////////////////////////////////

        // Condition To Start Attack Sequence
        IsInRangeNode isInATKRange = new IsInRangeNode(atkRange, transform, target);

        // Attack Sequence
        AnimationNode readyUpAnim = new AnimationNode(a, "Aim");
        LookNode      aim         = new LookNode(rB, target, 1, 12, 7);
        AnimationNode strikeAnim  = new AnimationNode(a, "Fire");
        TimerNode     atkTimer    = new TimerNode(1);

        // Wrapping Nodes
        SequenceNode attackPattern = new SequenceNode(new List <Node>()
        {
            readyUpAnim, aim, strikeAnim, atkTimer
        });
        ResetOnStateNode resetATK  = new ResetOnStateNode(attackPattern, NodeState.SUCCESS);
        SequenceNode     attacking = new SequenceNode(new List <Node>()
        {
            isInATKRange, resetATK
        });
        SelectorNode attack = new SelectorNode(new List <Node>()
        {
            attacking, movement
        });


        ////////////////////////////////// Patrol //////////////////////////////////

        PatrolNode   patrolMove     = new PatrolNode(rB, Mathf.RoundToInt(speed * 0.7f), 0.5f, 6, 20, 1.5f, 4);
        SelectorNode evadeAndPatrol = new SelectorNode(new List <Node>()
        {
            evading, patrolMove
        });

        SpotTargetNode spotTarget = new SpotTargetNode(transform, 40, 80, LayerMask.NameToLayer("Target"), LayerMask.NameToLayer("Enemy"));

        FlagNode      flag          = new FlagNode(NodeState.SUCCESS, NodeState.FAILURE);
        FlagActivator flagActivator = new FlagActivator(flag);

        SequenceNode spotAndStop = new SequenceNode(new List <Node>()
        {
            spotTarget, flagActivator
        });

        SelectorNode patroling = new SelectorNode(new List <Node>()
        {
            spotAndStop, evadeAndPatrol
        });
        SequenceNode patrol = new SequenceNode(new List <Node>()
        {
            flag, patroling
        });

        ////////////////////////////////// Top Node //////////////////////////////////

        topNode = new Tree(new SelectorNode(new List <Node>()
        {
            death, cover, patrol, attack
        }));

        BehaviorTreeManager.AddTree(topNode);
    }