/// <summary>
        /// 유닛을 실제로 이동 시키고 각종 초기화를 수행한다.
        /// </summary>
        /// <param name="_path"></param>
        /// <returns></returns>
        IEnumerator MoveCoroutine(HashSet <Vector3Int> _path, Vector3Int _targetPosition)
        {
            SquareTile item = Map.instance.m_TilemapHighlight.m_Tilemap.GetTile <SquareTile>(m_Position);

            item.m_State = null;
            item.m_State = new TileStateNormal(m_Position);
            SquareTile normalTile = SquareTileFactory.CreateNormal(m_Position);

            Map.instance.m_TilemapHighlight.m_Tilemap.SetTile(normalTile.m_Position, normalTile);

            foreach (Vector3Int point in _path)
            {
                Vector3 pos = m_SetCenterPosition.GetWorldPosition(point);
                transform.DOMove(pos, 1f);
                yield return(new WaitForSeconds(1f));

                if (point == _targetPosition)
                {
                    break;
                }
            }

            // 초기화
            SetToIdle();

            SetPosition(_targetPosition, true);

            InitTiles();
        }
Example #2
0
        /// <summary>
        /// 해당 위치에 타일을 삭제한다.
        /// </summary>
        /// <param name="_position"></param>
        public void DeleteTile(Vector3Int _position)
        {
            SquareTile tile = m_Tilemap.GetTile <SquareTile>(_position);

            if (tile == null)
            {
                return;
            }

            // 이동 가능한 타일 / 유닛이 위치한 타일 / 이동 경로 타일 일 때는 삭제할 필요가 없다.
            if (tile.m_State.m_State == eTileType.Movable)
            {
                return;
            }


            // 그 외의 타일일 경우에는 일반 타일로 교체한다.
            tile.m_State = null;
            tile.m_State = new TileStateNormal(tile.m_Position);
            SquareTile normalTile = SquareTileFactory.CreateNormal(tile.m_Position);

            m_Tilemap.SetTile(normalTile.m_Position, normalTile);

            m_TilemapPathFind.m_Grid.UpdateTile(_position, 0f);
        }
        /// <summary>
        /// 이동 가능한 영역의 타일들을 모두 삭제한다.
        /// </summary>
        public void ClearMovableTiles()
        {
            if (m_MovableTiles == null)
            {
                return;
            }

            if (m_MovableTiles.Count == 0)
            {
                return;
            }

            Dictionary <Vector3Int, float> costs = new Dictionary <Vector3Int, float>();

            foreach (var item in m_MovableTiles)
            {
                if (item.m_State.m_State != eTileType.Movable)
                {
                    continue;
                }

                item.m_State = null;
                item.m_State = new TileStateNormal(item.m_Position);
                SquareTile normalTile = SquareTileFactory.CreateNormal(item.m_Position);

                m_Tilemap.SetTile(normalTile.m_Position, normalTile);

                costs.Add(item.m_Position, 0f);
            }

            m_Grid.UpdateGrid(costs);
        }
        private void InitTiles()
        {
            SquareTile tile = ScriptableObject.CreateInstance <SquareTile>();

            tile.m_Position = m_Position;
            tile.m_State    = new TileStateNormal(tile.m_Position);
            m_CurrentTile   = SquareTileFactory.CreateNormal(tile.m_Position);
            Map.instance.m_TilemapHighlight.m_Tilemap.SetTile(m_Position, m_CurrentTile);

            Map.instance.m_TilemapController.ResetAllTiles();
            Map.instance.m_TilemapController.SetAllUnitPlacedTiles();
        }
Example #5
0
        /// <summary>
        /// 유닛이 위치한 타일을 제외하고 모든 타일들을 모두 지운다.
        /// </summary>
        public void ResetAllTiles()
        {
            Dictionary <Vector3Int, float> costs = new Dictionary <Vector3Int, float>();

            for (int x = m_Bounds.xMin; x < m_Bounds.xMax; x++)
            {
                for (int y = m_Bounds.yMin; y < m_Bounds.yMax; y++)
                {
                    Vector3Int pos = new Vector3Int(x, y, 0);

                    SquareTile tile = m_Tilemap.GetTile <SquareTile>(pos);

                    // 유닛이 위치한 타일은 초기화 할 필요 없다.
                    //if ( tile.m_State.m_State == eTileType.UnitPlaced )
                    //{
                    //    //tile.m_Cost = 0;
                    //    //tile.m_Distance = 0;
                    //    //m_Tilemap.SetTile( tile.m_Position, tile );
                    //    continue;
                    //}
                    // 타일 위에 유닛이 없으면 일반 타일로 초기화시킨다.
                    //else
                    {
                        tile.m_State = null;
                        tile.m_State = new TileStateNormal(tile.m_Position);
                        SquareTile normalTile = SquareTileFactory.CreateNormal(tile.m_Position);

                        m_Tilemap.SetTile(normalTile.m_Position, normalTile);

                        costs.Add(tile.m_Position, 0f);
                    }
                }
            }
            // 테스트 코드
            //for ( int x = m_Bounds.xMin; x < m_Bounds.xMax; x++ )
            //{
            //    for ( int y = m_Bounds.yMin; y < m_Bounds.yMax; y++ )
            //    {
            //        Vector3Int pos = new Vector3Int( x, y, 0 );

            //        SquareTile tile = m_Tilemap.GetTile<SquareTile>( pos );
            //        if ( tile.m_Distance != 0 )
            //        {
            //            Debug.Log( pos );
            //        }
            //    }
            //}

            m_TilemapPathFind.m_Grid.UpdateGrid(costs);
        }
Example #6
0
        /// <summary>
        /// Tilemap에 SquareTile들로 설정한다.
        /// </summary>
        private void CreateTilesToNormal()
        {
            // Tilemap 크기에 맞추어 SquareTile들을 생성한다.
            for (int x = m_Bounds.xMin; x < m_Bounds.xMax; x++)
            {
                for (int y = m_Bounds.yMin; y < m_Bounds.yMax; y++)
                {
                    Vector3Int current = new Vector3Int(x, y, 0);

                    SquareTile normal = ScriptableObject.CreateInstance <SquareTile>();
                    normal.m_Position = new Vector3Int(x, y, 0);
                    normal.m_Cost     = 1f;
                    normal.m_State    = new TileStateNormal(normal.m_Position);
                    SquareTile tile = SquareTileFactory.CreateNormal(normal.m_Position);

                    m_Tilemap.SetTile(current, tile);
                }
            }
        }
Example #7
0
        public void ResetAllExceptMoveTiles()
        {
            Dictionary <Vector3Int, float> costs = new Dictionary <Vector3Int, float>();

            for (int x = m_Bounds.xMin; x < m_Bounds.xMax; x++)
            {
                for (int y = m_Bounds.yMin; y < m_Bounds.yMax; y++)
                {
                    Vector3Int pos = new Vector3Int(x, y, 0);

                    SquareTile tile = m_Tilemap.GetTile <SquareTile>(pos);

                    //if ( tile.m_State.m_State == eTileType.UnitPlaced )
                    //{
                    //    continue;
                    //}
                    /*else */ if (tile.m_State.m_State == eTileType.Movable)
                    {
                        continue;
                    }
                    //else if ( tile.m_State.m_State == eTileType.Path )
                    //{
                    //    continue;
                    //}
                    //else if ( tile.m_State.m_State == eTileType.Attackable )
                    //{
                    //    continue;
                    //}
                    else
                    {
                        tile.m_State = null;
                        tile.m_State = new TileStateNormal(tile.m_Position);
                        SquareTile normalTile = SquareTileFactory.CreateNormal(tile.m_Position);

                        m_Tilemap.SetTile(normalTile.m_Position, normalTile);

                        costs.Add(tile.m_Position, 0f);
                    }
                }
            }

            m_TilemapPathFind.m_Grid.UpdateGrid(costs);
        }