일지

소원의 섬 - 5편

UniCoti-sub 2024. 9. 7.

목차

반응형

오늘도 소원의 섬을 조금 개발했다.

전에 얘기했던 장소별로 다른 기능을 지원하기 위해서

VillageManager 스크립트에서 작업을 좀 해주고  Player 스크립트에서 임시로

있었던 비슷한 내용의 스크립트를 없애서 중복을 없애주었다.

 

소원의 섬 - 5편
임시 이미지

원래 다 원으로 해놨었는데 그렇게 하니까 구분이 안되는 것 같아서

일단 임시로 크기도 조금 고려해서 이미지를 만들었다.

 

다만 이렇게 만들고 보니까 원 형태로 플레이어를 감지하는거면

문 뒤에서 들어갈 수 있는거니까 좀 이상할 것 같았다.

아무래도 문으로 들어가는 게 맞는 것 같아서 코드를 새로 짜려고 계획하고 있다.

 

아마도 구역을 정해서 콜리더를 위치시켜놓은 다음 충돌을 감지하거나

플레이어의 위치를 판단해서 문 앞인지 구분하는 등의 방법이 있을 것 같다.

내 머릿속에 있는 대로 하다보니 조금 이상해진 것 같다.

확실히 대충이라도 만들어보니까 뭐가 문제인지 쉽게 알 수 있었던 것 같다.

 

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

댓글