C# Rookiss Part7 MMORPG : MapManager
๐โโ๏ธMapManager
๐ชMapManager
๋งต๋งค๋์ ์ถ๊ฐ
- Managers์ ์ถ๊ฐ
MapManager _map = new MapManager(); public static MapManager Map {get { return Instance._map;}}
- ์ง์ง MapManager์ ์ถ๊ฐ ```cs public Grid CurrentGrid{get; private set;}
public void LoadMap(int mapId) { DestroyMap();
string mapName = โMap_โ + mapId.ToString(โ000โ); GameObject go = Managers.Resources.Instantiate($โMap/{mapName}โ); go.name = โMapโ;
GameObject collision = Util.FindChild(go, โTilemap_Collisionโ, true); if(collision != null) collision.SetActive(false);
CurrentGrid = go.GetComponent
public void DestroyMap() { GameObject map = GameObject.Find(โMapโ); if(map != null) { GameObject.Destory(map); CurrentGrid = null; }
`_grid`๋ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ์ ๊ฑฐ, ๊ทธ์ ๋ง๊ฒ ๋ค๋ฅธ๋ถ๋ถ ๊ต์ฒด(`Mamagers.Map.CurrentGrid`์ฌ์ฉ)
๊ฒ์ ์ฌ ๋ด์ฉ
๊ฒ์์ฌ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐ (๊ธฐ์กด 3๊ฐ์์ ๋ง๋ค์๋ ๋ด์ฉ)
`Managers.Map.LoadMap(1);`
๋งต์ ๋ณด๋ฅผ ํ์ผ๋งต๋ฒ ์ด์ค๋ฅผ ๋ฐํ์ผ๋ก ๋ง๋ค๊ธฐ
MapEditor์์ ์ค์
๋งต์ ์ํํ๋ฉด์ ์ฒดํฌํ๋ ๋ถ๋ถ์ ํ์ผ๋งต๋ฒ ์ด์ค๋ก ์ค์
**MapManager์์ Collision ๊ด๋ จ ํ์ผ์ LoadMap์ ์ถ๊ฐ**
* ํ๋๋ถ๋ถ
```cs
public int MinX {get; set;}
public int MaxX {get; set;}
public int MinY {get; set;}
public int MaxY {get; set;}
bool[,] _collision;
- Collision ๊ด๋ จ ํ์ผ
```
TxtAsset txt = Managers.Resource.Load
($"Map/{mapName}"); StringReader reader = new StringReader(txt.text);
MinX = int.Parse(reader.ReadLine()); MaxX = int.Parse(reader.ReadLine()); MinY = int.Parse(reader.ReadLine()); MaxY = int.Parse(reader.ReadLine());
int xCount = MaxX - MinX + 1; int yCount = MaxY - MinY + 1;
_collision = new bool[yCount, xCount];
for (int y = 0; y < yCount; y++) { string line = reader.ReadLine(); for (int x = 0; x < xCount; x++) { _collision[y,x] = (line[x] == โ1โ ? true : false); } }
public bool CanGo(Vector3Int cellPos) { if(cellPos.x < MinX || cellPos.x > MaxX) return false; if(cellPos.y < MinY || cellPos.y > MaxY) return false; int x = cellPos.x - MinX; int y = MaxY - cellPos.y; return !_collision[y,x]; }
**PlayerController์ ์ค์ ๋ก ์ด๋ ๋ถ๋ถ์ ์์ **
void UpdateIsMoving() { if(_isMoving == false && _dir != MoveDir.None) { Vector3Int destPos = _cellPos; switch (_dir) { case MoveDir.Up: destPos += Vector3Int.up; break; case MoveDir.Down: destPos += Vector3Int.down; break; case MoveDir.Left: destPos += Vector3Int.left; break; case MoveDir.Right: destPos += Vector3Int.right; break; }
if(Managers.Map.CanGo(destPos))
{
_cellPos = destPos;
_isMoving = true;
} } } ```
์นด๋ฉ๋ผ ์ด๋(PlayerController)
void LateUpdate()
{
Camera.main.transform.position = new Vector3(transform.position.x, transform.position.y, -10);
}