public void OnJoyStickDrag(Vector2 joyStickInput) { if (onJoyStickDragNode == null) { return; } if (onJoyStickDragSequence == null) { onJoyStickDragSequence = new NodeSequence(onJoyStickDragNode, onJoyStickDragNode.rightSideNodeIds, this, null); allEntranceSequenceList.Add(onJoyStickDragSequence); } if (onJoyStickDragSequence.IsFinish) { runningSequenceList.Add(onJoyStickDragSequence); onJoyStickDragNode.joyStickInput = joyStickInput; onJoyStickDragSequence.Start(); } else { //只更新 onJoyStickDragNode.joyStickInput = joyStickInput; } }
public NodeBase GetNodeAlongThisAndParentSequeces(int nodeId) { NodeBase targetNode = null; //优先查找技能序列树中的节点 NodeSequence sequence = this; while (sequence != null) { targetNode = sequence.GetNode(nodeId); if (targetNode != null) { return(targetNode); } sequence = sequence.parentSequence; } //查找公共节点 targetNode = GraphBehaviour.GetCommonNode(nodeId); if (targetNode == null) { Debug.LogErrorFormat("整个技能中找不到id为 {0} 的节点", nodeId); } return(targetNode); }
/// <summary> /// 停止整个图,所有运行中的节点停掉并调用OnExit() /// </summary> public void StopGraph() { for (int i = 0; i < runningSequenceList.Count; i++) { NodeSequence nodeSequence = runningSequenceList[i]; nodeSequence.StopAllRunningNodes(); } }
/// <summary> /// 停止整个图当中,对应id的节点运行,并调用OnExit() /// </summary> /// <param name="nodeIdList"></param> public void StopNodes(List <int> nodeIdList) { if (nodeIdList == null || nodeIdList.Count == 0) { return; } for (int i = 0; i < runningSequenceList.Count; i++) { NodeSequence nodeSequence = runningSequenceList[i]; nodeSequence.StopNodes(nodeIdList); } }
public void OnClick() { if (onClickNode == null) { return; } if (onClickSequence == null) { onClickSequence = new NodeSequence(onClickNode, onClickNode.rightSideNodeIds, this, null); allEntranceSequenceList.Add(onClickSequence); } if (onClickSequence.IsFinish) { runningSequenceList.Add(onClickSequence); onClickSequence.Start(); } }
/// <summary> /// 创建NodeSequence,会共用传入的rootNode /// </summary> /// <param name="rootNode"></param> /// <param name="sequenceNodeIds"></param> /// <param name="graphBehaviour"></param> /// <param name="parentSequence"></param> public NodeSequence(NodeBase rootNode, int[] sequenceNodeIds, GraphBehaviour graphBehaviour, NodeSequence parentSequence) { GraphBehaviour = graphBehaviour; RootNode = rootNode; this.parentSequence = parentSequence; RootNode.SetGraphBehaviour(graphBehaviour); RootNode.SetNodeSequence(this); sequenceNodeDictionary = new Dictionary <int, NodeBase>(); sequenceNodeDictionary.Add(RootNode.nodeId, RootNode); for (int i = 0; i < sequenceNodeIds.Length; i++) { NodeBase sequenceNode = graphBehaviour.DeserializeNode(sequenceNodeIds[i]); sequenceNode.SetNodeSequence(this); sequenceNode.SetGraphBehaviour(graphBehaviour); sequenceNodeDictionary.Add(sequenceNodeIds[i], sequenceNode); } runningNodeList = new List <NodeBase>(); executeFinishNodeList = new List <NodeBase>(); runningChildSequenceList = new List <NodeSequence>(); }
public void SetNodeSequence(NodeSequence nodeSequence) { this.nodeSequence = nodeSequence; }
public void FlowToNode(int nodeId) { //流向下一个节点,下一个节点必须在这个技能序列内 NodeBase targetNode = GetNode(nodeId); if (targetNode == null) { return; } #if UNITY_EDITOR if (runningNodeList.Contains(targetNode)) { Debug.LogErrorFormat("节点{0}已经在运行了,属于重复运行。多实例运行要使用CreateSequence节点", nodeId); } #endif //进入创建序列流程 if (targetNode.isCreateSequenceNode) { if (childSequencePool == null) { childSequencePool = new Dictionary <int, Queue <NodeSequence> >(); } bool needCreateNewSequence = true; //尝试从池中取 if (childSequencePool.ContainsKey(nodeId)) { Queue <NodeSequence> poolSequence = childSequencePool[nodeId]; if (poolSequence != null && poolSequence.Count > 0) { // Debug.Log("cache hit"); NodeSequence nodeSequence = poolSequence.Dequeue(); nodeSequence.Reset(); runningChildSequenceList.Add(nodeSequence); nodeSequence.Start(); needCreateNewSequence = false; } } if (needCreateNewSequence) { CreateSequenceNode createSequenceNode = targetNode as CreateSequenceNode; NodeSequence newNodeSequence = new NodeSequence(nodeId, createSequenceNode.rightSideNodeIds, GraphBehaviour, this); runningChildSequenceList.Add(newNodeSequence); newNodeSequence.Start(); } } else { targetNode.OnEnter(); //该节点直接在OnEnter就结束了,不用加入runningNodeList if (targetNode.isFinish) { return; } if (!runningNodeList.Contains(targetNode)) { runningNodeList.Add(targetNode); } } }
public void Update(float deltaTime) { if (executeFinishNodeList.Count > 0) { for (int i = 0; i < executeFinishNodeList.Count; i++) { NodeBase executeFinishNode = executeFinishNodeList[i]; executeFinishNode.OnExit(); if (runningNodeList.Contains(executeFinishNode)) { runningNodeList.Remove(executeFinishNode); } } executeFinishNodeList.Clear(); } for (int i = 0; i < runningNodeList.Count; i++) { runningNodeList[i].OnUpdate(deltaTime); } if (runningChildSequenceList != null && runningChildSequenceList.Count > 0) { for (int i = runningChildSequenceList.Count - 1; i >= 0; i--) { NodeSequence nodeSequence = runningChildSequenceList[i]; nodeSequence.Update(deltaTime); if (nodeSequence.IsFinish) { nodeSequence.Reset(); if (childSequencePool == null) { childSequencePool = new Dictionary <int, Queue <NodeSequence> >(); } //放回池中 if (childSequencePool.ContainsKey(nodeSequence.RootNode.nodeId)) { Queue <NodeSequence> poolQueue = childSequencePool[nodeSequence.RootNode.nodeId]; if (poolQueue == null) { poolQueue = new Queue <NodeSequence>(); } poolQueue.Enqueue(nodeSequence); } else { Queue <NodeSequence> poolQueue = new Queue <NodeSequence>(); poolQueue.Enqueue(nodeSequence); childSequencePool.Add(nodeSequence.RootNode.nodeId, poolQueue); } runningChildSequenceList.RemoveAt(i); } } } }