private bool _DetachAllSubNodesAsync() { bool ret = false; for (int i = 0; i < mSubNodes.Count; i++) { GLogicNodeWrapper wrapper = mSubNodes[i]; wrapper.mLogicNode.NodeStatus = AttachableStatus.Detaching; } //置脏,导致这棵子树需要进入更新流程// IsLogicTreeNeedsUpdate = true; IGLogicNode parent = ParentNode; while (parent != null && !parent.IsLogicTreeNeedsUpdate) { parent.IsLogicTreeNeedsUpdate = true; parent = parent.ParentNode; } LogicNodeUpdateOperation updateOp = new LogicNodeUpdateOperation(); updateOp.mIsRemoveAll = true; updateOp.mIsAddOrRemove = false; mAsyncNodeOps.Add(updateOp); return(ret); }
private bool _AttachNodeAsync(IGLogicNode inLogicNode) { bool ret = false; if (inLogicNode == null) { Log.LMN.LogUtil.Error("MBLogicNode._AttachNodeAsync: inLogicNode is null"); return(ret); } //置脏,导致这棵子树需要进入更新流程// IsLogicTreeNeedsUpdate = true; IGLogicNode parent = ParentNode; while (parent != null && !parent.IsLogicTreeNeedsUpdate) { parent.IsLogicTreeNeedsUpdate = true; parent = parent.ParentNode; } LogicNodeUpdateOperation updateOp = new LogicNodeUpdateOperation(); updateOp.mIsAddOrRemove = true; updateOp.mLogicNode = inLogicNode; mAsyncNodeOps.Add(updateOp); ret = true; return(ret); }
/// <summary> /// 更新Logic节点树 /// 导致 IsNodeTreeLocked 为真 /// </summary> public void UpdateLogicTree() { if (!IsNodeActive) { return; } //对树结构上锁, 注意这里不是递归进,因为这个方法本身在递归进// mIsNodeTreeLocked = true; if (IsLogicTreeNeedsUpdate) { IsLogicTreeNeedsUpdate = false; //注意,这个Update是深度优先的,防止子节点的异步操作被跳过// for (int i = 0; i < mSubNodes.Count; i++) { mSubNodes[i].mLogicNode.UpdateLogicTree(); } for (int i = 0; i < mAsyncNodeOps.Count; i++) { LogicNodeUpdateOperation op = mAsyncNodeOps[i]; if (op.mIsAddOrRemove) { _AttachNodeSync(op.mLogicNode); } else { if (op.mIsRemoveAll) { _DetachAllSubNodesSync(); } else { _DetachNodeSync(op.mLogicNode); } } } mAsyncNodeOps.Clear(); } //对树结构解锁, 注意这里不是递归进,因为这个方法本身在递归进// mIsNodeTreeLocked = false; }
private bool _DetachNodeAsync(IGLogicNode inLogicNode) { bool ret = false; if (inLogicNode == null) { //请替换成你的log函数// Log.LMN.LogUtil.Error("ObjLogicNode._DetachNodeAsync: inLogicNode is null"); return(ret); } //快速找出节点位置// int index = PrioritySortUtil.GetDecSeqRefArrayFirstIndex <GLogicNodeWrapper>(inLogicNode.LogicNodePriority, mSubNodes); for (int i = index; i < mSubNodes.Count && mSubNodes[i].PriorityVal == inLogicNode.LogicNodePriority; i++) { GLogicNodeWrapper wrapper = mSubNodes[i]; if (wrapper.mLogicNode == inLogicNode) { wrapper.mLogicNode.NodeStatus = AttachableStatus.Detaching; break; } } //置脏,导致这棵子树需要进入更新流程// IsLogicTreeNeedsUpdate = true; IGLogicNode parent = ParentNode; while (parent != null && !parent.IsLogicTreeNeedsUpdate) { parent.IsLogicTreeNeedsUpdate = true; parent = parent.ParentNode; } LogicNodeUpdateOperation updateOp = new LogicNodeUpdateOperation(); updateOp.mIsAddOrRemove = false; updateOp.mLogicNode = inLogicNode; mAsyncNodeOps.Add(updateOp); ret = true; return(ret); }