오늘도 소원의 섬을 조금 개발했다.
전에 얘기했던 장소별로 다른 기능을 지원하기 위해서
VillageManager 스크립트에서 작업을 좀 해주고 Player 스크립트에서 임시로
있었던 비슷한 내용의 스크립트를 없애서 중복을 없애주었다.

원래 다 원으로 해놨었는데 그렇게 하니까 구분이 안되는 것 같아서
일단 임시로 크기도 조금 고려해서 이미지를 만들었다.
다만 이렇게 만들고 보니까 원 형태로 플레이어를 감지하는거면
문 뒤에서 들어갈 수 있는거니까 좀 이상할 것 같았다.
아무래도 문으로 들어가는 게 맞는 것 같아서 코드를 새로 짜려고 계획하고 있다.
아마도 구역을 정해서 콜리더를 위치시켜놓은 다음 충돌을 감지하거나
플레이어의 위치를 판단해서 문 앞인지 구분하는 등의 방법이 있을 것 같다.
내 머릿속에 있는 대로 하다보니 조금 이상해진 것 같다.
확실히 대충이라도 만들어보니까 뭐가 문제인지 쉽게 알 수 있었던 것 같다.
void CheckIsPlayerInRange(float range) {
Collider2D[] nearThings = Physics2D.OverlapCircleAll(transform.position, range);
bool IsPlayerInRange = false;
for(int i = 0; i < nearThings.Length; i++) {
if(nearThings[i].gameObject.CompareTag("Player")) {
IsPlayerInRange = true;
}
}
PlayerInRange = IsPlayerInRange;
}
코드로 표현하면, 이 코드를 다른 코드로 바꿔야 한다.
원래 range를 입력받아 원을 그려서 그 안에 플레이어가 있는지 판단했는데
위에 언급한 방식 등으로 바꿀 예정이다. 아마 소원의 섬 - 6편에서 바꾸지 않을까 싶다.
public void Interact(string place) {
CheckPlayerInRange(placeList);
if(!player.IsPlayerInRange) {
return;
}
switch (place) {
case "PlayZone":
PlayZone();
break;
case "ChiefHouse": //족장의 집
ChiefHouse();
break;
case "Forge": //대장간
Forge();
break;
case "Shop":
Shop();
break;
}
}
void PlayZone() {
print("PlayZone");
}
void ChiefHouse() {
print("ChiefHouse");
}
void Forge() {
print("Forge");
}
void Shop() {
print("Shop");
}
오늘은 이걸 만들었다.
뭐 코드 자체는 매우 쉬운 코드지만, 각기 다른 장소, 각기 다른 기능을
어떻게 한 함수를 호출하는 것 만으로 처리할 지 고민을 많이 했다.
네임스페이스, 클래스, 함수 중 단위를 고민하기도 했고
매니져에 갈지 Player에 갈지 Place에 갈지도 고민했다.
어쨌든 이름의 의미상 매니져로 가는 게 가장 적합하다고 판단했고
기존에 만들어둔 CheckPlayerInRange() 덕분에 지역을 미리 가져올 수 있었다.
그래서 이제 switch-case문 만으로도 구분이 가능했고 (각기 다른 장소)
기능의 구분은 따로 함수를 만들어서 실현했다 (각기 다른 기능)
이게 간단하게만 보여도 나름대로 확장성도 좋고 보기에도 편한 것 같다.
한가지 단점은 이름을 기반으로 가져오고, 실행하는 거라서 휴먼 에러가 발생할 수 있다.
(*인간의 입력 실수 등에서 오는 오류)
일단 여기까지 개발했고,
지금 고민중인건 place에서 public으로 player 객체를 받아들이는데,
place마다 player를 받게 되어있다. 다만 player가 결국 다 똑같은 객체라서
너무 무의미하게 반복이 많다고 생각했다.
이건 나중에 리팩토링 때 고치면 좋겠다.
또한 상점, 대장간, 족장의 집 등 여러 장소가 있는데,
이걸 모두 각기 다른 씬으로 표현해야할지 난처하다.
어차피 각기 다른 씬으로 표현할거면 함수를 나눌이유도 별로 없다.
이름만 바꿔서 LoadScene으로 퉁칠 수 있기 때문이다.
다만 그렇게 하면 자칫 로딩이 발생할 수 있기에 고민중이다.
난이도 자체는 새로운 씬이 더 쉬울 것 같다.
다음번은, CheckPlayerInRange 함수를 원에서 다른 형식으로 바꾸는걸
진행하면 될 것 같다. 그래도 오늘 지역별로 각기 다른 기능이 실행되는
한개의 함수를 만드는 데 성공했다. 다음번에도 순주롭길 바란다.
'일지' 카테고리의 다른 글
소원의 섬 - 7편 (1) | 2024.09.08 |
---|---|
소원의 섬 - 6편 (1) | 2024.09.08 |
소원의 섬 - 4편 (0) | 2024.09.04 |
소원의 섬 - 3편 (0) | 2024.08.31 |
소원의 섬 - 2편 (0) | 2024.08.27 |
댓글