TIL 25.02.20 - 개인과제_2

강진규·2025년 2월 20일

Today I Learned

목록 보기
17/34
post-thumbnail

[ 필수 기능 ]

  • 캐릭터 이동 및 맵 탐색
  • 미니 게임 실행
  • 점수 시스템
  • 게임 종료 및 복귀
  • 카메라 추적 기능

[ 미니 게임 실행 ]

2개의 씬을 사용하여 구성하였다.
특정 오브젝트에 레이어를 설정고 RayCastHit2D를 사용하여
그 오브젝트가 조건 레이어를 가지고 있다면 미니게임 설명 UI가 실행되게 만들었다.
이 UI를 통해 미니게임을 실행할지 UI를 닫을지 결정하게 하였다.

발생했던 문제

  • RayCastHit2D를 사용했는데 키입력시 작동을 안했음
  • UI까지는 띄우기를 성공했는데, 그 다음 씬 전환에서 Null 오류가 발생함

해결

  • input asset을 사용하여 동작하게 했는데, 여기서 input.isPressed 이 조건을
    사용을 안했었다. 이 조건문을 사용하니 제대로 눌렸을때 작동을 하게 되었다.
    고치는 김에 UI 활성화하는 방식도 UIManager를 통해 해주었다.
void OnPress(InputValue input)      // input asset 사용 space로 동작
{
    Vector2 playerDirection = movementDirection != Vector2.zero ? movementDirection : lastDirection;
    RaycastHit2D hit = Physics2D.Raycast(transform.position, playerDirection, 5f, 1 << (LayerMask.NameToLayer("MiniGame")));

    if (input.isPressed)
    {
        if (hit.collider != null && (hit.collider.gameObject.layer == LayerMask.NameToLayer("MiniGame")))
        {
            UIManager.Instance.ChangeState(UIState.How);
        }
    }
    else
    {
        EventSystem.current.SetSelectedGameObject(null);
    }
}
  • 두 개였던 스크립트를 UIManager를 하나로 합치고 DontDestroyOnLoad를 사용하여
    오브젝트가 겹쳐지지 않게 하였다. 미니게임씬에 있던 기존 사용하던 UI오브젝트들을
    싹다 지우고 메인 씬에 있는 오브젝트가 넘어가는 방식으로 바꿔주었다.
 if (Instance == null)
 {
     Instance = this;
     DontDestroyOnLoad(gameObject);
 }
 else
 {
     Destroy(gameObject);
     return;
 }


[ 점수 시스템 ]

현재 점수, 최고 점수, 종합 점수로 구성했고
Flappy Plane 게임 진행 방식에 따라 1점씩 획득하게 된다.
게임 중에는 현재 점수가 표시되고 결과창에는 현재, 최고 점수가 표시된다.
메인 씬으로 넘어오면 메인화면에 최고 점수와 종합 점수가 표시된다.

발생했던 문제

  • 현재 점수가 게임을 다시 하면 초기화 되야 되는데 그게 안 이루어짐
  • 한번 더 진행시 메인화면UI의 점수들이 Null 오류가 발생함
  • 메인화면UI의 점수가 갱신이 안됨

해결

  • 현재 점수를 초기화 해주는 메서드를 작성하고 알맞은 위치에서 작동하게 구현했다.
게임매니저

public void StartGame()
{
    UIManager.Instance.ResetNowScore();  // 현재 점수 초기화
    SceneManager.LoadScene("MiniGameScenes");
}

--------------------------------------
UI매니저

public void ResetNowScore()
{
    nowScore = 0;

    OnScoreUpdated?.Invoke(nowScore, totalScore, bestScore);
}
  • 다른 2가지의 문제는 트러블 슈팅으로 자세히 작성해두었다.

[ 게임 종료 및 복귀 ]

미니게임에서 사망하게 되면 결과창UI를 띄어주고 버튼을 통해
한번 더 게임을 할건지 메인씬으로 돌아갈건지 결정하게 만들었다.

발생했던 문제

  • 결과창에서 점수 표시가 1번째에만 제대로 나오고 그 다음부터는 제대로 안나옴

해결

  • 아무래도 start부분에 점수 표시 부분을 작성해뒀는데 재시작 시에는 작동을 안하기때문에
    start부분에 작성했던 것을 Update로 옮겨주었다.
private void Update()
{
    Score.text = UIManager.Instance.nowScore.ToString();
    bestScore.text = UIManager.Instance.bestScore.ToString();
}

[ 결과 ]

https://www.youtube.com/watch?v=6LK9-IwRgEc


아무래도 유니티는 처음이다 보니까 작업하는데 좀 많이 어려웠다.
아직도 제대로 이해하지 못한 것들이 엄청 많다.
그래도 필수 기능은 어느정도 구현이 된 것 같아 개인적으로 조금 만족스럽긴하다.
다음 챕터는 다시 팀 과제일텐데 부족한게 많지만 열심히 해봐야겠다.

0개의 댓글