void FindPath() { TileSystem tileSystem = TileSystem.Instance; while (0 != _pathfindingQueue.Count) { //제일 앞 타일을 하나 꺼낸다. sPathCommand command = _pathfindingQueue[0]; _pathfindingQueue.RemoveAt(0); //방문한 타일인가? if (false == command.tileCell.IsVisit()) { command.tileCell.Visit(); if (_targetTileCell.GetTilePosition().Equals(command.tileCell.GetTilePosition())) { _reverseTileCell = _targetTileCell; return; } for (int direction = 0; direction < (int)eDirection.MAX; direction++) { sTilePosition nextTilePos = new sTilePosition(command.tileCell.GetTileX(), command.tileCell.GetTileY()); TileHelper.GetNextTilePosByDirection((eDirection)direction, ref nextTilePos); TileCell nextTileCell = tileSystem.GetTileCell(nextTilePos); if (((true == tileSystem.CanMoveTileCell(nextTilePos.tileX, nextTilePos.tileY)) && false == nextTileCell.IsVisit()) || (nextTilePos.tileX == _targetTileCell.GetTileX() && nextTilePos.tileY == _targetTileCell.GetTileY())) { float newDistanceFromStart = command.tileCell.GetDistanceFromStart() + command.tileCell.GetDistanceWeight(); float newHeuristic = CalcAstarHeuristic(newDistanceFromStart, nextTileCell, _targetTileCell); if (null == nextTileCell.GetPrevCell()) { nextTileCell.SetDistanceFromStart(newDistanceFromStart); nextTileCell.SetPrevCell(command.tileCell); //이전 타일 기억 sPathCommand newCommand = new sPathCommand(); newCommand.heuristic = newHeuristic; newCommand.tileCell = nextTileCell; PushCommand(newCommand); } } } } } }
public void UpdatePosition(Vector2 position) { float speed = _status.speed + GetCurrentTileCell().GetProperties(eTileLayer.GROUND).speed; Vector2 destination = (Vector2)(_transform.position) + (position.normalized * speed * Time.deltaTime); TileSystem tileSystem = TileSystem.Instance; TileCell curTileCell = GetCurrentTileCell(); eTileDirection boundaryDirection = curTileCell.CheckTileBoundary(destination); sTilePosition nextTilePos = new sTilePosition(_tileX, _tileY); TileHelper.GetNextTilePosByTileDirection(boundaryDirection, ref nextTilePos); if (tileSystem.CanMoveTileCell(nextTilePos.tileX, nextTilePos.tileY)) { //타일 오프셋에 따른 캐릭터 y값 보정(des = des + (next.offset - cur.offset)) if (eTileDirection.IN_TILE != boundaryDirection) { int layerOrder = tileSystem.GetTileCell(nextTilePos.tileX, nextTilePos.tileY).GetGroundLayerOrder(); var sprites = GetComponentsInChildren <SpriteRenderer>(true); foreach (var spriteRenderer in sprites) { spriteRenderer.sortingOrder = layerOrder; } float curOffset = curTileCell.GetOffset(); float nextOffset = tileSystem.GetTileCell(nextTilePos.tileX, nextTilePos.tileY).GetOffset(); destination.y = destination.y + (nextOffset - curOffset); var layer = GetCurrentLayer(); tileSystem.GetTileCell(_tileX, _tileY).RemoveObject(this, layer); tileSystem.GetTileCell(nextTilePos).AddObject(this, layer); } _tileX = nextTilePos.tileX; _tileY = nextTilePos.tileY; //z값 -1 : 동일한 레이어 + 동일한 order 에서 캐릭터들이 타일보다 뒤에 있으면 안됨 transform.position = new Vector3(destination.x, destination.y, -1.0f); } }