private void Start()
    {
        target       = ( VariableGameObject )ScriptableObject.CreateInstance("VariableGameObject");
        target.Value = GameObject.FindGameObjectWithTag("Player");

        // Follow Player
        Node_IsEnemyActive node_IsEnemyActive         = new Node_IsEnemyActive(50, enemyLayermask, transform);
        Invertor           node_IsEnemyActiveInvertor = new Invertor(node_IsEnemyActive);
        Node_Chase         node_Chase = new Node_Chase(2, 100, target, agent, false);

        Sequence sequence_FollowPlayer = new Sequence(new List <BTBaseNode> {
            node_IsEnemyActiveInvertor, node_Chase
        }, "Ninja Sequence: Follow Player");

        // Throw smoke at Guard
        Node_MoveToTransform node_MoveToTransform = new Node_MoveToTransform(GameObject.FindGameObjectWithTag("Cover").transform, agent, 1f);
        Node_ThrowSmoke      node_ThrowSmoke      = new Node_ThrowSmoke(enemyLayermask, 5f, transform, 10f);

        Sequence sequence_ThrowSmoke = new Sequence(new List <BTBaseNode> {
            node_IsEnemyActive, node_MoveToTransform, node_ThrowSmoke
        }, "Throw Smoke");


        tree = new Selector(new List <BTBaseNode> {
            sequence_ThrowSmoke, sequence_FollowPlayer
        });

        if (Application.isEditor)
        {
            gameObject.AddComponent <ShowNodeTreeStatus>().AddConstructor(transform, tree);
        }
    }
    private void Start()
    {
        target          = ( VariableGameObject )ScriptableObject.CreateInstance("VariableGameObject");
        weaponAvailable = ( VariableBool )ScriptableObject.CreateInstance("VariableBool");

        weaponAvailable.Value = false;

        // Patrol Behaviour
        Node_Patrol node_Patrol = new Node_Patrol(waypointsManager, agent);

        Node_TargetVisible node_TargetVisible         = new Node_TargetVisible(agent.transform, target, fov);
        Invertor           node_TargetVisibleInvertor = new Invertor(node_TargetVisible);

        Node_TargetAvailable node_TargetAvailable         = new Node_TargetAvailable(target, active);
        Invertor             node_TargetAvailableInvertor = new Invertor(node_TargetAvailable);

        Sequence sequence_Patrol = new Sequence(new List <BTBaseNode> {
            node_TargetAvailableInvertor, node_Patrol, node_TargetVisibleInvertor
        }, "Guard Sequence: Patrol");

        // Chase & Attack Behaviour
        Node_Bool            node_WeaponAvailable = new Node_Bool(weaponAvailable);
        Node_MoveToTransform node_MoveToTransform = new Node_MoveToTransform(GameObject.FindGameObjectWithTag("Weapon").transform, agent, 2f);             // Again... Not optimal, but it works!
        Node_AcquireWeapon   node_AcquireWeapon   = new Node_AcquireWeapon(GameObject.FindGameObjectWithTag("Weapon").transform, agent, 2f, weaponAvailable);
        Node_Chase           node_Chase           = new Node_Chase(1, 15f, target, agent, true);
        Node_Attack          node_Attack          = new Node_Attack(attackRange.Value, agent, target);

        Sequence sequence_AcquireWeapon = new Sequence(new List <BTBaseNode> {
            node_MoveToTransform, node_AcquireWeapon
        }, "Guard Sequence: Acquire Weapon");
        Selector selector_HasWeapon = new Selector(new List <BTBaseNode> {
            node_WeaponAvailable, sequence_AcquireWeapon
        });
        Sequence sequence_Chase = new Sequence(new List <BTBaseNode> {
            node_TargetAvailable, selector_HasWeapon, node_Chase, node_Attack
        }, "Guard Sequence: Chasing");


        tree = new Selector(new List <BTBaseNode> {
            sequence_Patrol, sequence_Chase
        });

        if (Application.isEditor)
        {
            gameObject.AddComponent <ShowNodeTreeStatus>().AddConstructor(transform, tree);
        }
    }