오늘은 건물 기능 구현 위주로 진행하는데, 큰 문제가 생겨 리팩토링을 하였습니다.
트러블슈팅 : 많은 제네릭에는 많은 리팩토링이 따른다
데이터 구조가 제네릭 안에 제네릭이 계속 들어가는 구조였는데,
아래 구문에서 결국 문제가 발생하였습니다.
buildingScript = bluePrint.GetComponentInChildren<BaseBuilding<BasicBuildingData>>(true);
1) 문제 상황
BasicBuildingData는 다른 건물 데이터들의 부모가 되는 형태입니다.
예를 들어 BasicBuildingData를 상속하는 TurretData가 있다고 합니다.
따라서, 위 코드블럭 구문처럼 BaseBuilding<BasicBuildingData> 타입으로 찾으면
해당 오브젝트에 포함된 BaseBuilding<TurretData> 를 찾을 줄 알았는데 인식하지 못하였습니다.
2) 원인
제네릭은 상속되지 않아서
BaseBuilding<BasicBuildingData> ≠ BaseBuilding<TurretData>
즉, 서로 다른 타입으로 인식하여 찾지 못하는 것이었습니다.
3) 해결
그렇다면 결국 제네릭으로 서로 물려있는 구조를 풀어서 독립해야 했습니다.
제네릭이 필요없는 구조들을 최대한 풀어서 상속으로 해결했습니다.
공통되는 구조들을 묶고 이를 상속하는 것으로 해당 건물에 필요한 데이터를 만들어 사용하였씁니다.
[Serializable]
public class BasicBuildingData : CommonBuildingData
{
public BasicBuildingDataByLevel[] dataByLevel;
}
[Serializable]
public class CommonBuildingData
{
public BuildingIndex ID; // 건물 ID
public string name; // 건물 이름
public string description; // 건물 설명
public Sprite sprite; // 건물 이미지
}
// 레벨 별로 달라질 수 있는 데이터들의 공통된 부분만 묶은 기본형
[Serializable]
public class BasicBuildingDataByLevel
{
public float time; // 건설 시간
public int hpMax; // 체력
public ResourceRequire[] resources; // 건설에 필요한 자원들 종류 및 갯수
}
// 건설에 필요한 한 종류의 자원과 양
[Serializable]
public class ResourceRequire
{
// 자원 종류
public ItemData resourceSort;
// 필요 갯수
public int amount;
}
'스파르타코딩클럽_Unity개발과정' 카테고리의 다른 글
유니티 숙련 팀 과제 - 서바이벌 (5) (0) | 2025.05.30 |
---|---|
유니티 숙련 팀 과제 - 서바이벌 (4) (0) | 2025.05.29 |
유니티 숙련 팀 과제 - 서바이벌 (2) (0) | 2025.05.27 |
유니티 숙련 팀 과제 - 서바이벌 (1) (1) | 2025.05.26 |
유니티 숙련 개인 과제 - 3D 게임 캐릭터 이동과 물리 (3) (0) | 2025.05.23 |