Beispiel #1
0
        // PUBLIC METHODS: ------------------------------------------------------------------------

        protected override Return UpdateNode(GameObject invoker, Behavior behavior)
        {
            int instanceID = this.GetInstanceID();

            if (this.CheckConditions(invoker, behavior))
            {
                if (!this.useActionsList || this.prefabActionsList == null)
                {
                    return(Return.Success);
                }

                Actions actions = behavior.GetActions(instanceID);

                if (behavior.GetActions(instanceID) == null)
                {
                    if (behavior.GetState(instanceID) == Return.Running ||
                        behavior.GetState(instanceID) == Return.Success)
                    {
                        return(Return.Success);
                    }

                    GameObject instance = Instantiate(
                        this.prefabActionsList.gameObject,
                        invoker.transform.position,
                        invoker.transform.rotation
                        );

                    instance.hideFlags = instance.hideFlags | HideFlags.HideInHierarchy;
                    actions            = instance.GetComponent <Actions>();
                    behavior.SetActions(instanceID, actions);

                    CoroutinesManager.Instance.StartCoroutine(
                        this.DeferStartActions(invoker, behavior)
                        );
                }

                return(Return.Running);
            }

            // TODO add check here if conditions allow to skip conditions when Task is running, then
            // don't abort and return running, like if condition was true

            if (behavior.GetState(instanceID) == Return.Running)
            {
                this.AbortNode(invoker, behavior);
            }

            return(Return.Fail);
        }
Beispiel #2
0
        public override void AbortNode(GameObject invoker, Behavior behavior)
        {
            int instanceID = this.GetInstanceID();

            if (behavior.GetState(instanceID) == Return.None)
            {
                return;
            }

            behavior.StopActions(instanceID);
            behavior.SetState(instanceID, Return.None);
        }
Beispiel #3
0
        public override void AbortNode(GameObject invoker, Behavior behavior)
        {
            if (this.behaviorGraph == null)
            {
                return;
            }
            if (behavior.GetState(this.GetInstanceID()) == Return.None)
            {
                return;
            }

            this.behaviorGraph.Abort(invoker, behavior);
        }
Beispiel #4
0
        private IEnumerator DeferStartActions(GameObject invoker, Behavior behavior)
        {
            yield return(null);

            int instanceID = this.GetInstanceID();

            if (behavior.GetState(instanceID) == Return.Running)
            {
                Actions actions = behavior.GetActions(instanceID);
                if (actions != null)
                {
                    actions.Execute(invoker);
                }
            }
        }
Beispiel #5
0
        public override void AbortNode(GameObject invoker, Behavior behavior)
        {
            int instanceID = this.GetInstanceID();

            if (behavior.GetState(instanceID) == Return.None)
            {
                return;
            }

            behavior.SetState(instanceID, Return.None);

            for (int i = 0; i < this.outputs.Count; ++i)
            {
                this.outputs[i].AbortNode(invoker, behavior);
            }
        }
Beispiel #6
0
        // PROTECTED METHODS: ---------------------------------------------------------------------

        protected bool CheckConditions(GameObject invoker, Behavior behavior)
        {
            if (!this.useConditionsList)
            {
                return(true);
            }
            int instanceID = this.GetInstanceID();

            if (this.mode == ConditionMode.AllowToComplete &&
                behavior.GetState(instanceID) == Return.Running)
            {
                return(true);
            }

            return(this.prefabConditionsList.Check(invoker));
        }
Beispiel #7
0
        // PUBLIC METHODS: ------------------------------------------------------------------------

        protected override Return UpdateNode(GameObject invoker, Behavior behavior)
        {
            if (this.behaviorGraph == null)
            {
                return(Return.Fail);
            }

            if (this.CheckConditions(invoker, behavior))
            {
                return(this.behaviorGraph.Execute(invoker, behavior));
            }

            // TODO add check here if conditions allow to skip conditions when BT is running, then
            // don't abort:

            if (behavior.GetState(this.GetInstanceID()) == Return.Running)
            {
                this.AbortNode(invoker, behavior);
            }

            return(Return.Fail);
        }
        // VIRTUAL METHODS: -----------------------------------------------------------------------

        public override Node.Return Execute(Node node, GameObject invoker, Behavior behavior)
        {
            int instanceID = node.GetInstanceID();

            int passCount = behavior.GetPassCount(instanceID);

            if (passCount > 0)
            {
                return(behavior.GetState(instanceID));
            }

            Node.Return result = base.Execute(node, invoker, behavior);

            switch (result)
            {
            case Node.Return.Fail:
            case Node.Return.Success:
                behavior.SetPassCount(instanceID, passCount + 1);
                return(result);
            }

            return(Node.Return.Running);
        }
        // VIRTUAL METHODS: -----------------------------------------------------------------------

        public override Node.Return Execute(Node node, GameObject invoker, Behavior behavior)
        {
            int instanceID = node.GetInstanceID();

            Node.Return state = behavior.GetState(instanceID);
            if (state == Node.Return.Fail)
            {
                return(Node.Return.Fail);
            }

            Node.Return result = base.Execute(node, invoker, behavior);

            switch (result)
            {
            case Node.Return.Fail:
                return(Node.Return.Fail);

            case Node.Return.Success:
                node.ResetOutputStates(invoker, behavior, true);
                break;
            }

            return(Node.Return.Running);
        }