Exemplo n.º 1
0
        /// <summary>
        /// 向状态机添加一个状态,如果当前已存在,说明需要把它提到同优先级状态的前面去,让他先执行
        /// </summary>
        /// <param name="fsmStateToInsert">目标状态</param>
        /// <param name="containsItSelf">是否包含自身</param>
        private void InsertState(AFsmStateBase fsmStateToInsert, bool containsItSelf = false)
        {
            if (!fsmStateToInsert.TryEnter(this))
            {
                //如果没有目标状态,说明是新增的状态,但是没有成功添加,需要归还给引用池
                if (!containsItSelf)
                {
                    ReferencePool.Release(fsmStateToInsert);
                }

                return;
            }

            LinkedListNode <AFsmStateBase> current = this.m_FsmStateBases.First;

            while (current != null)
            {
                if (fsmStateToInsert.Priority >= current.Value.Priority)
                {
                    break;
                }

                current = current.Next;
            }

            AFsmStateBase tempFirstState = this.GetCurrentFsmState();

            //如果包含自身,就看current是不是自己,如果是,就不对链表做改变,如果不是就提到current前面
            if (containsItSelf)
            {
                if (fsmStateToInsert.StateName == current.Value.StateName)
                {
                    return;
                }
                else
                {
                    m_FsmStateBases.Remove(fsmStateToInsert);
                    m_FsmStateBases.AddBefore(current, fsmStateToInsert);
                }
            }
            else //如果不包含自身,且current不为空,即代表非尾节点有自己的位置,就插入,否则代表所有结点优先级都大于自身,就直接插入链表最后面
            {
                if (current != null)
                {
                    this.m_FsmStateBases.AddBefore(current, fsmStateToInsert);
                }
                else
                {
                    this.m_FsmStateBases.AddLast(fsmStateToInsert);
                }
            }

            //如果这个被插入的状态成为了链表首状态,说明发生了状态变化
            if (CheckIsFirstState(fsmStateToInsert))
            {
                Log.Info($"打断了{tempFirstState?.StateName},开始{fsmStateToInsert.StateName}");
                tempFirstState?.OnExit(this);
                fsmStateToInsert.OnEnter(this);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// 从状态机移除一个状态
        /// </summary>
        /// <param name="stateName"></param>
        public void RemoveState(string stateName)
        {
            AFsmStateBase temp = GetState(stateName);

            if (temp == null)
            {
                return;
            }
            temp.OnExit(this);
            this.m_FsmStateBases.Remove(temp);
            ReferencePool.Release(temp);
        }