팀 프로젝트로 타워디펜스를 제작하게 되었는데, 타일맵을 사용할 때, 타워의 설치 위치를 정해주어야 하는 상황이 생겼습니다.
일단 마우스가 Collider 에 올라가면 자신을 설치 위치로 잡아주는 오브젝트를 제작하였는데, 이것을 지정한 타일에 올려줄 방법이 필요아였습니다.
public class ConstructPoint : MonoBehaviour
{
public bool IsTowerConstructed { get; private set; }
public Transform constructPosition;
public Tower ConstructedTower { get; private set; }
[SerializeField] private GameObject selectImage;
private void OnMouseEnter()
{
selectImage.SetActive(true);
ConstructManager.Instance.SetConstructPoint(this);
}
private void OnMouseExit()
{
selectImage.SetActive(false);
ConstructManager.Instance.SetConstructPoint(null);
}
public void ConstructTower(Tower tower)
{
ConstructedTower = tower;
IsTowerConstructed = true;
Instantiate(tower.gameObject, constructPosition);
}
public void DestroyTower()
{
ConstructedTower = null;
IsTowerConstructed = false;
}
}
정보를 찾던중, 타일맵에서 Tilemap.cellBounds.allPositionsWithin 을 통해 현재 타일맵이 설치된 위치를 int 좌표로 얻을 수 있다는것을 알게되었고, 이를 기반으로 건설 가능한 지역을 정해주는 타일맵을 만든 뒤, 해당 타일맵 좌표에 오브젝트를 생성하도록 만들어주었습니다.
public class ConstructPointGenerator : MonoBehaviour
{
public Tilemap constructTile;
public GameObject constructPointPrefab;
private void Start()
{
foreach(var pos in constructTile.cellBounds.allPositionsWithin)
{
if(!constructTile.HasTile(pos)) continue;
Vector3 realPos = pos + new Vector3(0.5f, 0.75f, 0);
Instantiate(constructPointPrefab, realPos, Quaternion.identity, constructTile.transform);
}
}
}
이때 타일맵은 중앙 타일을 0,0 으로 하여 생성되는데, 이를 보정해주기 위해 추가 값을 넣어주는 방법을 사용하였습니다.
이후, 이 방법을 사용하게 될 경우, 오브젝트의 피벗을 한쪽 끝에 치우지게 만들어 타일 정 중앙에 오브젝트가 위치하도록 만들어줄 필요가 있을것같습니다.
'내일배움캠프 > TIL' 카테고리의 다른 글
특강 - 게임을 완성시키기 위한 기획 (1) | 2024.11.25 |
---|---|
게임 제작을 나누는 단계 (0) | 2024.11.22 |
중첩 코루틴, 다수의 코루틴 (0) | 2024.11.19 |
특강정리 - 디버깅, 프레임 워크 구조 (0) | 2024.11.18 |
심화주차 진행상황 - 시간부족 (1) | 2024.11.13 |