Unity_개발일지_54

홍신영·2025년 1월 7일
0

Unity

목록 보기
56/62

오늘도 빌드를 위해 테스트를 하며 각종 버그들을 발견하고 고치는 작업을 했다.
이번주에 유저테스트를 진행하기 위해 아직 완성되지 않은 부분들이 많지만 마무리하고 추가개발은 유저테스트 이후에 더 해야할 것 같다.

오늘 수정한 버그들 첫 번째이다.
사실 버그는 아니고, 게임의 진행을 위한 것에 가까운 것같다.
몬스터가 떨어지는 문제이다.
몬스터 필드에서 떨어지면 처음에 스폰 되었던 위치로 위치를 재지정 해주는 작업을 진행하였다.

떨어짐을 감지하기 위해 이전에 트리거를 이용해서 플레이어를 재위치 시켜주는 코드가 있어 이 부분에 추가해주었다.

    protected virtual void OnTriggerStay(Collider other) { }
    protected virtual void OnTriggerEnter(Collider other) { }

    protected bool IsCollisionWithLayer(GameObject obj, LayerMask layer)
    {
        return ((1 << obj.layer) & layer) != 0;
    }
}

이렇게 상위 추상클래스에서 충돌한 물체의 레이어와 내가 지정한 레이어가 같다면 true를 반환하도록 메소드를 만들어 준 것을 활용하였다.

이렇게 플레이어 몬스터를 각각 감지해줄수 있게 되었고, 다음으로는 몬스터가 스폰될 위치를 잡아주는 부분이였다. 임의로 스폰을 정해줄 수도 있지만 그러면 한 곳에 몬스터가 쏠리수 있게 되기도 하고 해서 처음에 스폰했던 위치로 하도록 생각해봤다.

그러기 위해서는 던전매니저에서 몬스터를 생성하면서 지정해준 위치를 알아야했다.

그래서 이 전에 몬스터 스폰을 위해 만든 Mapdata에 접근해주었다.
여기서는 몬스터의 스폰 위치를 반환해주는데 여기가 아니라 던전매니저에서 최종적으로 그 위치에 스폰하기에 다시 돌려 던전매니저에서 mapdata에서 반환받은 위치로 스폰할 때, 딕셔너리를 통해 추가해주었다.

    private Dictionary<GameObject, Vector3> initialMonsterPositions = new Dictionary<GameObject, Vector3>();
    public Dictionary<GameObject, Vector3> InitialMonsterPositions => initialMonsterPositions;

몬스터오브젝트를 키 값으로, 위치를 알아낼 수 있게 되었다.

Transform spawnPoint = mapData.GetMonsterSpawnPoint();
                    if (spawnPoint == null)
                    {
                        Debug.LogWarning("스폰 포인트 못찾음 지정 확인");
                        return;
                    }
                    GameObject monsterInstance = Instantiate(monsterPrefab, spawnPoint);
                    initialMonsterPositions.Add(monsterInstance, spawnPoint.position);

위처럼 mapdata로 위치를 받고 생성한 몬스터오브젝트를 딕셔너리에 추가해주었다.

그리고 이제 던전매니저에 딕셔너리에 접근하여 트리거에 닿은 몬스터를 딕셔너리의 키 값으로 받아 재시폰할 위치를 반환하여 이동시켜준다.

Vector3 initialPosition = dungeonManager.InitialMonsterPositions[other.gameObject];

                CharacterController characterController = other.GetComponent<CharacterController>();
                if (characterController != null)
                {
                    characterController.enabled = false;
                    characterController.transform.position = initialPosition;
                    characterController.enabled = true;
                }

몬스터가 rigidbody인줄 알았는데 charactercontroller여서 처음에 왜 안되지 하다가 확인 후 닿은 몬스터에 컴포넌트에 접근해 위에서 받은 위치로 이동 시켜주었다.
이 때 charactercontroller에서 비정상적인 위치 이동으로 오류가 날 수 있을 것 같아 잠시 끄고 이동 후 켜주도록 하였다.

다음으로 고친 것은 스테이지 클리어 데이터 저장 부분이다.
유니티에서는 jsonutility를 제공하여 데이터를 파싱하도록 한다. 보통 기본적인 형식은 다 제공하는 것으로 알고 있지만, vector, transform, 다차원 배열등은 지원을 안하는 것으로 알고 있다. 이런류의 데이터를 불러올 일이 있을지는 모르겠지만 스테이지 클리어 데이터는 2차원 배열로 관리를 하고 있어 newtonsoft를 이용하여 json불러오고 저장하는 방식으로 변경하였다.

// SaveData를 JSON 형식으로 변환
        string json = JsonConvert.SerializeObject(data, Formatting.Indented);
// JSON을 객체 형식으로 변환
        SaveData data = JsonConvert.DeserializeObject<SaveData>(json);

위처럼 저장 및 로드를 해줄 수 있었다.

사실 조금 귀찮게 작업을 한다면 설계한 대로 별자리배열 클래스, 스테이지배열클래스를 각각 만들어 넣어주면 가능하기도 할 것 같다. 하지만 뉴톤소프트 기능을 사용해 보는 것도 좋을 것 같기도 하고 훨씬 간단히 마무리 될 것 같아 사용하였다.

이외에도 플레이어 ui가 마을에서는 안뜨도록 던전에서만 뜨도록 마을에서 계속 null에러 나는 문제, 던전에서 닳은 체력이 다른 스테이지가서도 유지되는 문제 초기화로 방지해주는등 각종 버그를 무사히 고쳤다.

그러곤 디자인도 신경이 안쓰일수가 없어서 ui와 맵 디자인을 조금씩 배치를 바꾸고 테스트를 해보며 수정하고 하다 보니 시간이 벌써.. 오늘은 여기까지 끝

profile
게임 클라이언트 개발자

0개의 댓글