그냥 그대로 딕셔너리를 쓸까요 아니면 초기화를 위한 리스트를 안써도 될것같은 리스트로 바꿔볼까요?
네? 씬이 바뀌는거니까 리스트가 필요가 없다구요? 네?
오늘 대화의 요약이다.
현재 TileManager에서는 타일을 딕셔너리로 저장하여 위치를 확인하고 관리하고 있다.
타일을 파괴한 후 게임이 끝날 때 딕셔너리에 있는 타일들을 전부 파괴하고, 코루틴을 이용해 타일을 재생성하는 방식으로 구현했다. 하지만 내가 의도했던 구조는 타일이 파괴된 후 게임이 재시작할 때 파괴된 타일이 돌아오지 않을거라 예상하고, 초기 타일 위치를 따로 리스트에 저장해두고 게임이 새로 시작되거나 재시작 시 리스트에서 타일 정보를 불러오는 방식으로 구현했다. 하지만 싱글톤 패턴을 사용하면서 로컬 변수로 설정한 덕분에 씬이 바뀔 때 객체가 파괴되고 초기화되면서 타일들이 재생성된다는 사실을 몰랐기 때문에 리스트를 사용하려고 했으나 그럴 필요가 없어져 해당 부분을 삭제하고 다시 리팩토링 하게되었다.
public class TileManager : Singleton<TileManager>
{
protected override bool IsPersistent => false;
public GameObject lockBlockTile;
// Vector3Int : 월드 좌표나 그리드 좌표를 기준으로 씀 - gird position, gridpos : 격자 좌표, 딕셔너리에 타일 오브젝트 저장
public Dictionary<Vector3Int, GameObject> tiles = new Dictionary<Vector3Int, GameObject>();
// 그리드 좌표로 변환, 딕셔너리의 키로 만들어줄수있게 하는 함수, 플레이어쪽에선 그리드 좌표를 구하고 타일이 있는지 확인 후 상호작용으로 처리 가능
private Vector3Int GridPosition(Vector3 worldPos)
{
return Vector3Int.RoundToInt(worldPos);
}
// 상호작용한 위치의 타일 제거
public void RemoveTile(Vector3 worldPos)
{
Vector3Int gridPos = GridPosition(worldPos);
if (tiles.TryGetValue(gridPos, out GameObject tile))
{
Destroy(tile);
tiles.Remove(gridPos);
}
}
}
그래서 이렇게 간단하게 변경, 그리고 다른 곳도 간단하게 리팩토링 하고있다!
근데 왜캐 빙빙 돌고있는 느낌일까..!
그래도 오늘 이것저것 많이 알게되었긴 하지만 내일은 하던거 다 정리하고 테스트 진행 꼭 할거다...... 파이팅
- 오늘은 스승님(같은조원분) 덕분에
1. 값형 vs 참조형
2. 스코프
3. 응집도
이렇게 쉽게 알게되었는데 값형 vs 참조형에 대해 진짜 유익하게 잘 알게되었다. 이부분은 나중에 다시한번 정리해서 복습하려고 하는데 현재 메모는...
'Unity > Project' 카테고리의 다른 글
[Unity] 내배캠 최종프로젝트 : 루시퍼 서바이벌 9일차, 다들 힘내 좋아 (0) | 2025.04.17 |
---|---|
[Unity] 내배캠 최종프로젝트 : 루시퍼 서바이벌 8일차, (0) | 2025.04.16 |
[Unity] 내배캠 최종프로젝트 : 루시퍼 서바이벌 6일차, 멍 (0) | 2025.04.11 |
[Unity] 내배캠 최종프로젝트 : 루시퍼 서바이벌 5일차, (0) | 2025.04.10 |
[Unity] 내배캠 최종프로젝트 : 루시퍼 서바이벌 4일차, 시작 (0) | 2025.04.09 |