// 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); }
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); }
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); }
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); } } }
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); } }
// 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)); }
// 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); }