어제부터 진행중인 버섯 AI를 위해
유니티 타일맵에 대한 스크립트를 짜려고합니다.
코딩을 하기 위해서 우선 생각을 해야겠죠?
무엇이 필요한가?
1. 위치 A와 B를 입력하면 A에서 B까지 타일의 존재 유무, 타일의 Type이 Ground인지에 따라 bool 값을 return하는 함수
따라서 매개변수로 Vector3 A, Vector3 B 전달, bool 값을 return하는
public bool IsThereARoadFromAtoB(Vector3 A, Vector3 B)를 제작할 것이다.
타일의 존재 유무
타일의 존재 유무를 판단하기 위해선
1. 판단하려는 Tile을 가지고 있는 Tilemap 필요
=> Tilemap.WorldToCell로 특정 위치를 지정하고 Tilemap.GetTile로 타일을 가져온다
타일의 Type 비교
1. 검색이 빠른 Dictionary를 사용하여 해당 자리 타일의 type값을 가져온다
=> Dictionary<TileBase, TileSO>
[SerializeField]
private Tilemap map;
[SerializeField]
private List<TileSO> tileDatas;
private Dictionary<TileBase, TileSO> dataFromTiles;
private Vector3Int enemyBottomTilePos;
private Vector3Int playerBottomTilePos;
private TileBase CompareTile;
private Vector3Int dir;
private int distance;
protected override void Awake()
{
base.Awake();
dataFromTiles = new Dictionary<TileBase, TileSO>();
foreach (var tileData in tileDatas)
{
foreach (var tile in tileData.tiles)
{
dataFromTiles.Add(tile, tileData);
}
}
}
public bool IsThereARoadFromAtoB(Vector3 A, Vector3 B)
{
enemyBottomTilePos = map.WorldToCell(A);
playerBottomTilePos = map.WorldToCell(B);
distance = Math.Abs(enemyBottomTilePos.x - playerBottomTilePos.x);
if (distance == 0) return true;
//검색 시작 위치.x가 검색 종료 위치.x보다 크다면
//검색 종료 위치는 왼쪽이므로 왼쪽방향으로 검사해야함
dir = A.x > B.x ? Vector3Int.left : Vector3Int.right;
for (int i = 0; i < distance + 1; ++i)
{
//시작위치부터 끝 위치까지 타일 순차검색
CompareTile = map.GetTile(enemyBottomTilePos + dir * i);
//해당 위치에 타일이 없는 경우
if (CompareTile == null)
return false;
//타일의 Type이 Ground가 아닌 경우
if (CheckTileLayer(dataFromTiles[CompareTile], TileType.Ground) == false)
return false;
}
//모든 검사에 통과했을 경우 true
return true;
}
이렇게 사용하는 중입니다
'프로젝트 > Color Lim 개발일지' 카테고리의 다른 글
2021-06-01 개발일지 (0) | 2021.06.01 |
---|---|
2021-05-30 개발일지 (0) | 2021.05.31 |
2021-05-27~28 개발일지 (0) | 2021.05.28 |
2021-05-25 개발일지 (0) | 2021.05.26 |
2021-05-18 개발일지 (0) | 2021.05.19 |