과제

[Unity,C#] 메타버스 제작 과제 1일차

leejiyoung0511 2025. 2. 17. 21:11

● 이번 목표

  • 예외 처리나 방어 코드 꼭 쓰기
  • 객체 지향으로 코드 작성하기
  • 주석으로 코드 설명하기
  • 도전 과제 까지 다하기

● 추가로 도전할 부분

  • 뽑기 구현 → 미니 게임 보상으로 얻은 티켓으로 뽑기 가능

● 오늘 할일

  • 캐릭터 이동
  • 맵 설정
  • 카메라 추적과 이동 범위 제한
  • NPC (대화는 아직, 기반은 구현)
  • 독버섯 피하기 미니게임, 점수 저장

● 오늘의 트러블 슈팅

#1 플레이어 정지 후 강제 플립 문제

 

아래와 같이 플레이어 이동 정지 후 강제 플립 되는 문제를 발견했다.

 

▼문제 영상

원인을 찾아보니 아래와 같이 direction == 0 (정지일때) 의 조건도 같이 계산 하고 있었다.

m_SpriteRenderer.flipX = direction.x < 0;

 

조건을 나누는것으로 해결했다.

        if (direction.x < 0)
        {
            m_SpriteRenderer.flipX = true;
        }
        else if (direction.x > 0)
        {
            m_SpriteRenderer.flipX = false;
        }

 

▼해결 영상

 

#2 NPC 충돌후 표시되는 UI위치가 밀리는 문제 

 

플레이어가 NPC에  충돌을 하면 SPACE를 누르라는 UI를 표시를 구현했다.

동작 확인 하는 도중에 UI위치가 밀리는 현상을 발견했다.

 

▼문제 영상

UI를 표시할 좌표가 월드 좌표에 존재하고 있어

WorldToScreenPoint를 사용해 스크린좌표로 변환해주었다.

Camera.main.WorldToScreenPoint(m_ShowUIPos.position);

 

원인을 확인해보니 좌표는 플레이어가 움직일때 마다 바뀌는데

한번 밖에 실행이 안되는OnTriggerEnter2D 안에서 계산을 하고있었기 떄문이었다.

 

OnTriggerEnter2D안에서가 아닌 OnTriggerStay2D안에서 계산을 하니 해결이 되었다.

 

▼해결 영상

#3 점수가 기하급수적으로 늘어나는 문제

 

버티는 시간으로 점수를 추가하는 로직을 구현했다.

하지만 실행을 해보니 점수가 기하급수적으로 늘어나는것을 발견했다.

 

▼문제 영상

코드를 다시보고 원인을 찾아보니

Update 함수는 초당 60프레임(60FPS)이라면 1초에 60번 실행되는걸 까먹고

m_CurrentTime가 계속 누적되고 있는데 거기에 +를 해줘서 여러번 증가하고 있던것이였다.

m_CurrentTime += Time.deltaTime;
Score += (int)(m_CurrentTime);

 

+를 빼주고 Mathf.FloorToInt()를 사용해 정수 부분만 넣어주니 해결 됐다!

Score = Mathf.FloorToInt(m_CurrentTime);

 

▼해결 영상

#4 게임을 재시작 하면 버섯이 더 많이 생성되는 문제

 

게임 재시작 로직을 구현하고 난뒤, 재시작을 해보니 버섯이 더 많이 생성되고있는것을 발견했다.

 

▼문제 영상

이유를 찾아보니 Initalize()에서 아래의 코드가 재시작 할때 마다 호출되고 있었기 때문이었다.

InvokeRepeating("CreatePoisonMushroom", 0.0f, m_RepeatCreateTime);

 

InvokeRepeating 함수는 한 번 호출되면 중복 실행을 방지하는 기능이 없었다.

그래서 코루틴을 쓰기로 했다.

 

StopCoroutine()을 사용하여 쉽게 중단 할 수 있기 때문에 아래의 코드로 수정했다.

        public void Initalize()
        {
            m_Controller = (SceneBase.Current as AvoidMushroomSceneController);
            if (m_MushroomCoroutine != null)
            {
                StopCoroutine(m_MushroomCoroutine);
            }
            m_MushroomCoroutine = StartCoroutine(ICreatePoisonMushroom());
        }

        private IEnumerator ICreatePoisonMushroom()
        {
            while (true)
            {
                CreatePoisonMushroom();
                yield return new WaitForSeconds(m_RepeatCreateTime);
            }
        }

 

수정했더니 중복 없이 버섯이 생성되었다!


▼해결 영상