private AssetBinder(AssetBinder parent) { mRunner = parent.mRunner; mAssetDeep = parent.mAssetDeep + 1; mLooper = new BehaviourLooper(mRunner); mSubAssets = new List <AssetBinder>(); }
private AssetBinder(BehaviourTreeRunner runner) { mRunner = runner; mAssetDeep = 1; mLooper = new BehaviourLooper(runner); mSubAssets = new List <AssetBinder>(); }
public override void OnInitData(BehaviourTreeRunner btree, string jsonData) { JObject obj = JsonConvert.DeserializeObject <JObject>(jsonData); mBlackboardVar = obj.Value <string>("property"); mBlackboardId = btree.Blackboard.GetPropertyId(mBlackboardVar); }
protected override void OnAbort(BehaviourTreeRunner btree) { if (mTask != null) { mTask.OnAbort(btree); } }
public void Visit(BehaviourTreeRunner btree) { #if UNITY_EDITOR if (BreakToggle) { btree.NotifyBreakCallback(this); } #endif mStartTime = Time.time; if (IsRunnable(btree)) { for (int i = 0; i < ServiceLength; i++) { BTServiceBase serv = mServices[i]; if (serv != null) { btree.StartService(serv); } } mVisited = true; OnVisit(btree); } else { State = EBTTaskState.faild; } }
// 返回 running 状态的节点 void VisitChildren(BehaviourTreeRunner runner, BTNodeBase root) { BTNodeBase tmp = root; BTNodeBase child; BTNodeBase parent; while (tmp != null) { child = tmp.ChildForVisit; if (child == null) { if (tmp.State == EBTTaskState.running) { RuntimeNode = tmp; return; } tmp.Cleanup(runner); parent = tmp == mRoot ? null : tmp.ParentNode; if (parent != null) { RuntimeNode = parent; parent.ReturnWithState(runner, tmp.State); } tmp = parent; } else { RuntimeNode = child; child.Visit(runner); tmp = child; } } RuntimeNode = null; }
protected override void OnTick(BehaviourTreeRunner behaviourTree, float deltaTime) { if (mTask != null) { State = mTask.OnTaskTick(behaviourTree, deltaTime); } }
public void Update(BehaviourTreeRunner runner, float deltaTime) { if (mRoot == null) { IsComplate = true; return; } if (RuntimeNode == null) { IsComplate = false; #if UNITY_EDITOR runner.NotifyBehaviourTreeBegin(); #endif RuntimeNode = mRoot; RuntimeNode.Visit(runner); } else { RuntimeNode.Tick(runner, Time.deltaTime); } VisitChildren(runner, RuntimeNode); State = mRoot.State; if (RuntimeNode == null) { IsComplate = true; } #if UNITY_EDITOR runner.NotifyBehaviourTreeFrame(); if (IsComplate) { runner.NotifyBehaviourTreeEnd(); } #endif }
public void Dispose() { Abort(); Parent = null; mRoot = null; Runner = null; }
public override void OnAbort(BehaviourTreeRunner btree) { if (mLooper != null && mLooper.RuntimeNode != null) { mLooper.RuntimeNode.Abort(btree); } }
public override void OnInitData(BehaviourTreeRunner btree, string jsonData) { JObject obj = JsonConvert.DeserializeObject <JObject>(jsonData); mWaitTime = obj.Value <float>("timeForWait"); mAlwaysSucces = obj.Value <bool>("alwaysSuccess"); }
public override void InitData(BehaviourTreeRunner btree, string jsonData) { if (mTask != null) { mTask.OnInitData(btree, jsonData); } }
public override EBTTaskState OnTaskTick(BehaviourTreeRunner btree, float deltaTime) { if (mAbort) { return(mAlwaysSucces ? EBTTaskState.success : EBTTaskState.faild); } return(btree.TaskTime >= mWaitTime ? EBTTaskState.success : EBTTaskState.running); }
protected override void OnVisit(BehaviourTreeRunner behaviourTree) { if (mTask != null) { State = mTask.OnTaskStart(behaviourTree); } else { State = EBTTaskState.faild; } }
protected override void OnAbort(BehaviourTreeRunner btree) { for (int i = 0; i < mLoopers.Length; i++) { if (mLoopers[i] == null || mLoopers[i].IsComplate) { continue; } mLoopers[i].Abort(btree); } }
public override EBTTaskState OnTaskStart(BehaviourTreeRunner btree) { if (mLooper == null) { return(EBTTaskState.faild); } else { mLooper.Reset(); return(EBTTaskState.running); } }
public void Tick(BehaviourTreeRunner btree, float deltaTime) { if (!IsOnCondition(btree)) { Abort(btree); } OnTick(btree, deltaTime); if (State != EBTTaskState.running) { mEndTime = Time.time; } }
public static AssetBinder GetBinder(BehaviourTreeRunner runner) { if (runner == null) { return(null); } if (runner.mAssetBinder == null || !runner.mAssetBinder.IsAvailable) { var asset = new AssetBinder(runner); runner.mAssetBinder = asset; } return(runner.mAssetBinder); }
//public void ResetTreeState() //{ // ResetTreeStateRecursive(mRoot); // IsComplate = mRoot == null; //} //void ResetTreeStateRecursive(BTNodeBase root) //{ // if (root == null) // return; // root.Reset(); // for(int i = 0; i < root.ChildLength; i++) // { // ResetTreeStateRecursive(root.ChildAt(i)); // } //} public void Abort(BehaviourTreeRunner btree) { BTNodeBase node = RuntimeNode; while (node != null) { node.Abort(btree); if (node == mRoot) { break; } node = node.ParentNode; } }
protected override void OnReturnWithState(BehaviourTreeRunner btree, EBTTaskState state) { if (state == EBTTaskState.faild || !IsOnCondition(btree)) { this.State = EBTTaskState.faild; } else { mVisitIndex++; if (mVisitIndex >= ChildLength) { this.State = EBTTaskState.success; } } }
protected override void OnVisit(BehaviourTreeRunner behaviourTree) { State = ChildLength > 0 ? EBTTaskState.running : EBTTaskState.success; for (int i = 0; i < mLoopers.Length; i++) { if (mLoopers[i] != null) { mLoopers[i].Reset(); } } if (mMainTaskIndex < mLoopers.Length && mMainTaskIndex >= 0) { mMainLooper = mLoopers[mMainTaskIndex]; } }
protected override void OnTick(BehaviourTreeRunner behaviourTree, float deltaTime) { if (mAbort) { State = EBTTaskState.faild; } else { mVisitIndex++; if (mVisitIndex >= ChildLength) { this.State = EBTTaskState.success; } } }
public BTNodeBase Instantiate(BehaviourTreeRunner btree, BehaviourTreeAsset asset) { BTNodeBase node = null; if (m_Type == EBTNodeType.task) { node = new BTTask(m_Id, BehaviourLibrary.NewTask(m_Name, m_Id)); } else if (m_Type == EBTNodeType.controller) { node = BehaviourLibrary.NewController(m_Name, m_Id); } if (node != null) { node.InitData(btree, m_JsonData); node.InitDecoratorSize(m_Conditions == null ? 0 : m_Conditions.Length, m_Children == null ? 0 : m_Children.Length, m_Services == null ? 0 : m_Services.Length); for (int i = 0; i < node.ConditionLength; i++) { BTData data = asset.GetDataById(m_Conditions[i]); if (data == null) { continue; } node.SetNotFlag(i, data.m_NotFlag); BTConditionBase cond = BehaviourLibrary.NewCondition(data.m_Name, data.m_Id); if (cond != null) { cond.OnInitData(btree, data.m_JsonData); node.SetCondition(i, cond); } } for (int i = 0; i < node.ServiceLength; i++) { BTData data = asset.GetDataById(m_Services[i]); if (data == null) { continue; } BTServiceBase serv = BehaviourLibrary.NewService(data.m_Name, data.m_Id); if (serv != null) { serv.OnInitData(btree, data.m_JsonData); node.SetService(i, serv); } } } return(node); }
public void Cleanup(BehaviourTreeRunner btree) { if (mVisited) { mVisited = false; mEndTime = Time.time; for (int i = ServiceLength - 1; i >= 0; i--) { BTServiceBase serv = mServices[i]; if (serv != null) { btree.StopService(serv); } } OnCleanup(btree); } }
public override void OnInitData(BehaviourTreeRunner btree, string jsonData) { JObject obj = JsonConvert.DeserializeObject <JObject>(jsonData); mAssetPath = obj.Value <string>("asset"); BehaviourTreeAsset asset = Resources.Load <BehaviourTreeAsset>(mAssetPath); if (!asset) { Debug.LogError("Can't load behaviour asset: " + mAssetPath); return; } BTNodeBase tree = asset.CreateBehaviourTree(btree); mLooper = new BehaviourLooper(tree); }
BTNodeBase InstBTNode(BehaviourTreeRunner btree, BTData info) { BTNodeBase node = info.Instantiate(btree, this); if (node != null) { for (int i = 0; i < info.m_Children.Length; i++) { BTData child = GetDataById(info.m_Children[i]); if (child != null) { BTNodeBase cnode = InstBTNode(btree, child); node.SetChild(i, cnode); } } } return(node); }
/// <summary> /// 构造行为树 /// </summary> /// <param name="runner"></param> /// <returns></returns> public BTNodeBase CreateBehaviourTree(BehaviourTreeRunner runner) { BTData root = GetDataById(m_RootNodeId); if (root == null) { return(null); } try { BTNodeBase rootNode = InstBTNode(runner, root); return(rootNode); } catch (System.Exception e) { Debug.LogError(e, this); return(null); } }
public override EBTTaskState OnTaskTick(BehaviourTreeRunner btree, float deltaTime) { if (mLooper != null) { mLooper.Update(btree, deltaTime); if (mLooper.IsComplate) { return(mLooper.State); } else { return(EBTTaskState.running); } } else { return(EBTTaskState.faild); } }
public void Dispose() { Cleanup(); var tmp = mSubAssets; mSubAssets = null; for (int i = 0; i < tmp.Count; i++) { tmp[i].mParent = null; } if (mParent != null && mParent.mSubAssets != null) { mParent.mSubAssets.Remove(this); mParent = null; } if (mLooper != null) { mLooper.Dispose(); } mLooper = null; mRunner = null; }
protected override void OnTick(BehaviourTreeRunner behaviourTree, float deltaTime) { int num = 0; for (int i = 0; i < mLoopers.Length; i++) { if (mLoopers[i] == null || mLoopers[i].IsComplate) { continue; } mLoopers[i].Update(behaviourTree, deltaTime); num++; } if (mMainLooper != null) { State = mMainLooper.State; } else { State = (num == 0) ? EBTTaskState.success : EBTTaskState.running; } }