/// <summary>
        /// 搜寻攻击范围
        /// </summary>
        /// <param name="howToFind"></param>
        /// <param name="start"></param>
        /// <param name="minRange"></param>
        /// <param name="maxRange"></param>
        /// <param name="useEndCell"></param>
        /// <returns></returns>
        public bool SearchAttackRange(IHowToFind howToFind, CellData start, int minRange, int maxRange, bool useEndCell = false)
        {
            if (howToFind == null || start == null || minRange < 1 || maxRange < minRange)
            {
                return(false);
            }

            Reset();

            m_HowToFind = howToFind;
            m_Range     = new Vector2(minRange, maxRange);

            if (useEndCell)
            {
                m_EndCell   = start;
                m_EndCell.g = 0f;
                m_EndCell.h = 0f;
                m_Reachable.Add(m_EndCell);
            }
            else
            {
                m_StartCell   = start;
                m_StartCell.g = 0f;
                m_StartCell.h = 0f;
                m_Reachable.Add(m_StartCell);
            }

            return(SearchRangeInternal());
        }
Exemple #2
0
        /// <summary>
        /// 寻找攻击范围
        /// </summary>
        /// <returns><c>true</c>, if attack range was searched, <c>false</c> otherwise.</returns>
        /// <param name="howToFind">How to find.</param>
        /// <param name="start">Start.</param>
        /// <param name="minRange">Minimum range.</param>
        /// <param name="maxRange">Max range.</param>
        /// <param name="useEndCell">If set to <c>true</c> use end cell.</param>
        public bool SearchAttackRange(IHowToFind howToFind, CellData start, int minRange, int maxRange, bool useEndCell = false)
        {
            if (howToFind == null || start == null || minRange < 1 || maxRange < minRange)
            {
                return(false);
            }

            Reset();

            this.howToFind = howToFind;
            range          = new Vector2(minRange, maxRange);

            // 在重置时, 不重置父亲节点
            // 其一: 没有用到
            // 其二: 二次查找时不破坏路径, 否则路径将被破坏
            if (useEndCell)
            {
                endCell   = start;
                endCell.G = 0f;
                reachable.Add(endCell);
            }
            else
            {
                startCell   = start;
                startCell.G = 0f;
                reachable.Add(startCell);
            }

            return(SearchRangeInternal());
        }
        /// <summary>
        /// 重置
        /// </summary>
        public void Reset()
        {
            m_Reachable.Clear();
            m_Explored.Clear();
            m_Result.Clear();

            m_Range           = Vector2.zero;
            m_StartCell       = null;
            m_EndCell         = null;
            m_CurrentCell     = null;
            m_Finished        = false;
            m_HowToFind       = null;
            m_MoveConsumption = null;

            m_SearchCount = 0;
        }
Exemple #4
0
        /// <summary>
        /// 重置
        /// </summary>
        public void Reset()
        {
            reachable.Clear();
            explored.Clear();
            result.Clear();

            range           = Vector2.zero;
            startCell       = null;
            endCell         = null;
            currentCell     = null;
            finished        = false;
            howToFind       = null;
            moveConsumption = null;

            searchCount = 0;
        }
        /// <summary>
        /// 寻找移动范围
        /// </summary>
        /// <param name="howToFind"></param>
        /// <param name="start"></param>
        /// <param name="movePoint"></param>
        /// <param name="consumption"></param>
        /// <returns></returns>
        public bool SearchMoveRange(IHowToFind howToFind, CellData start, float movePoint, MoveConsumption consumption)
        {
            if (howToFind == null || start == null || movePoint < 0)
            {
                return(false);
            }

            Reset();

            m_HowToFind       = howToFind;
            m_MoveConsumption = consumption;

            m_StartCell = start;
            m_StartCell.ResetAStar();
            m_Range.y = movePoint;

            m_Reachable.Add(m_StartCell);

            return(SearchRangeInternal());
        }
Exemple #6
0
        public bool SearchPath(IHowToFind howToFind, CellData start, CellData end, MoveConsumption consumption)
        {
            if (howToFind == null || start == null || end == null)
            {
                return(false);
            }

            Reset();

            this.howToFind  = howToFind;
            moveConsumption = consumption;
            startCell       = start;
            startCell.ResetAStar();
            endCell = end;
            endCell.ResetAStar();

            reachable.Add(startCell);

            startCell.H = this.howToFind.CalcH(this, startCell);

            return(SearchRangeInternal());
        }
        /// <summary>
        /// 搜寻路径
        /// </summary>
        /// <param name="howToFind"></param>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <param name="consumption"></param>
        /// <returns></returns>
        public bool SearchPath(IHowToFind howToFind, CellData start, CellData end, MoveConsumption consumption = null)
        {
            if (howToFind == null || start == null || end == null)
            {
                return(false);
            }

            Reset();

            m_HowToFind       = howToFind;
            m_MoveConsumption = consumption;

            m_StartCell = start;
            m_StartCell.ResetAStar();
            m_EndCell = end;
            m_EndCell.ResetAStar();

            m_Reachable.Add(m_StartCell);

            m_StartCell.h = m_HowToFind.CalcH(this, m_StartCell);

            return(SearchRangeInternal());
        }