示例#1
0
        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;
            }
        }
示例#2
0
        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);
        }
示例#3
0
        /// <summary>
        /// 停止整个图,所有运行中的节点停掉并调用OnExit()
        /// </summary>
        public void StopGraph()
        {
            for (int i = 0; i < runningSequenceList.Count; i++)
            {
                NodeSequence nodeSequence = runningSequenceList[i];

                nodeSequence.StopAllRunningNodes();
            }
        }
示例#4
0
        /// <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);
            }
        }
示例#5
0
        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();
            }
        }
示例#6
0
        /// <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>();
        }
示例#7
0
 public void SetNodeSequence(NodeSequence nodeSequence)
 {
     this.nodeSequence = nodeSequence;
 }
示例#8
0
        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);
                }
            }
        }
示例#9
0
        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);
                    }
                }
            }
        }