public EBTStatus exec(Agent pAgent) { #if !BEHAVIAC_RELEASE Debug.Check(this.m_node == null || this.m_node.IsValid(pAgent, this), string.Format("Agent In BT:{0} while the Agent used for: {1}", this.m_node.GetAgentType(), pAgent.GetClassTypeName())); #endif//#if !BEHAVIAC_RELEASE bool bEnterResult = false; if (this.m_status == EBTStatus.BT_RUNNING) { bEnterResult = true; } else { //reset it to invalid when it was success/failure this.m_status = EBTStatus.BT_INVALID; bEnterResult = this.onenter_action(pAgent); //for continue ticking task, to set it as the cached current task bool bIsContinueTicking = this.isContinueTicking(); if (bIsContinueTicking) { BranchTask pBranch = this.GetParentBranch(); if (pBranch != null && pBranch != this) { //if 'this' is a tree, don't set it into it parent's current node Debug.Check(!(this is BehaviorTreeTask)); pBranch.SetCurrentTask(this); } } } if (bEnterResult) { #if !BEHAVIAC_RELEASE if (Config.IsLoggingOrSocketing) { string btStr = BehaviorTask.GetTickInfo(pAgent, this, "update"); //empty btStr is for internal BehaviorTreeTask if (!string.IsNullOrEmpty(btStr)) { LogManager.Log(pAgent, btStr, EActionResult.EAR_none, LogMode.ELM_tick); } } #endif EBTStatus returnStatus = this.GetReturnStatus(); if (returnStatus == EBTStatus.BT_INVALID) { this.m_status = this.update(pAgent, EBTStatus.BT_RUNNING); } else { this.m_status = returnStatus; } if (this.m_status != EBTStatus.BT_RUNNING) { //clear it bool bIsContinueTicking = this.isContinueTicking(); if (bIsContinueTicking) { BranchTask pBranch = this.GetParentBranch(); if (pBranch != null && pBranch != this) { //if 'this' is a tree, don't set it into it parent's current node Debug.Check(!(this is BehaviorTreeTask)); pBranch.SetCurrentTask(null); } } this.onexit_action(pAgent, this.m_status); //this node is possibly ticked by its parent or by the topBranch who records it as currrent node //so, we can't here reset the topBranch's current node } } else { this.m_status = EBTStatus.BT_FAILURE; } EBTStatus currentStatus = this.m_status; if (this.m_status != EBTStatus.BT_RUNNING && this.NeedRestart()) { //reset it to invalid when it needs restarting //don't need to reset the sub tree this.m_status = EBTStatus.BT_INVALID; this.SetReturnStatus(EBTStatus.BT_INVALID); } return(currentStatus); }