TIL 25.02.25 - 팀 과제_3

강진규·2025년 2월 25일
0

Today I Learned

목록 보기
20/34
post-thumbnail

오늘은 추가 기능들 위주로 구현을 진행했고, 필요한 부분을 수정하였다.

  • 도전 과제 기능
  • 튜토리얼 씬 구성
  • 회피 판정 수정

[ 도전 과제 기능 ]

도전 과제를 달성하게 되면 UI에 완료 표시가 되고, 보상을 받을 수 있는 느낌으로 구현했다.
물론 아직 UI가 완성되지 않았고, 보상 부분도 연결 해두진 않았다.

public class Achievement
{
    // 도전 과제 이름
    public string name;
    // 목표 값
    public int total;
    // 현재 값
    public int current;
    // 도전 과제 달성 여부
    public bool Completed;
    // 목표 달성 여부 (current >= total 이면 true)
    public bool isComplete => current >= total;

    public Achievement(string _name, int _total)
    {
        this.name = _name;
        this.total = _total;
        this.current = 0;
        this.Completed = false;
    }
    
----------------------------생략--------------------------------
    
private Dictionary<string, Achievement> achievements = new Dictionary<string, Achievement>();

처음에는 각자 기능 마다 변수를 따로 선언을 해서 사용을 하였는데,
이 부분은 겹치는 부분이 많이 있다고 생각이 들어서 class로 선언 해주었고,
Dictionary를 사용하여 관리를 해주었다.

[ 발생한 문제 ]

작동에 문제가 생기진 않았었다. 하지만 이후에 기능을 추가 하다보니
튜토리얼 씬에서 업적이 카운트가 되는 문제가 발생했다.

[ 해결 ]

GameManager에 변수를 하나 선언해주었고, OnSceneLoaded를 사용하여 씬 전환 시
튜토리얼 씬인지 체크를 해주어서 튜토리얼 씬일 때 해당 변수를 true로 할당 해주었다.

private void UpdateTutorialState()
{
    // 현재 씬이 튜토리얼이 아니면 false, 맞으면 true
    isTutorialScene = SceneManager.GetActiveScene().name == "Tutorial";
}

관련 스크립트의 조건문에 isTutorialScene에 대한 조건을 추가해주어서
튜토리얼 일때는 작동하지 않게 수정해주었다.


[ 튜토리얼 씬 ]

게임에 대한 간단한 튜토리얼 씬을 구성하였다.
전반적인 키 입력과, 아이템 종류들, 게임 진행 방식을 알 수 있게 배치해두었다.
UI를 통해 정보를 알려주는 방식인데, 콜라이더를 배치해서 충돌하게 되면 UI 활성화 되게 했다.

private void OnTriggerEnter2D(Collider2D collision)
{
    // 쿠키가 충돌했고  ui가 꺼져있을때 isTutorialScene이 true 일때
    if (collision != null && collision.CompareTag("Cookie") 
    && !isActive && GameManager.Instance.isTutorialScene)
    {
        // UI 활성화
        ShowTutorial();
    }
}

[ 발생한 문제 ]

UI 활성화까지 문제 없이 잘되었는데, 활성화 된 UI가 꺼지지 않았고
활성화 된 상태로 화면에 계속 남아있었다.
또한 마지막 UI가 활성화 되면 입력을 통해 씬 전환을 하고 싶었다.

[ 해결 ]

비활성화에 대한 메서드를 만들어주었고, 추가로 엔터키를 입력했을때 꺼지도록 설정해주었다.
마지막 UI가 활성화 되었을때 입력을 하게 되면 지정한 씬으로 넘어가도록 해주었다.

void HideTutorial()
{
    // 모든 튜토리얼 UI 비활성화
    foreach (Transform child in tutorialUI.transform)
    {
        child.gameObject.SetActive(false);
    }

    //타임스케일 1로 돌려놓기
    Time.timeScale = 1f;

    // isActive를 false로 해줘서 다음에 충돌했을 때 UI가 나올 수 있게 해줌
    isActive = false;
}

void OnEnter()
{
    // 엔터키 입력시 넘어감
    if (isActive)
    {
        // UI가 마지막이거나 넘어섰을때
        if (number >= tutorialUI.transform.childCount)
        {
            // 지정한 다음 씬으로 전환
            SoundManager.Instance.StopAllSound();
            LoadNextScene();
            return;
        }
        else
        {
            // 아니면 UI 가려줌
            HideTutorial();
        }
    }
}

키 입력은 inputSystem을 사용하였다.
설정해둔 키 입력이 들어오면 활성화된 UI가 마지막일때 지정한 씬으로 넘어가게 구현했다.
마지막이 아닐때는 UI를 비활성화 해주게 만들었다.


[ 회피 판정 수정 ]

기존에는 RayCast를 통해 장애물을 컨택하고 회피 판정을 하였는데, 이 부분을 수정해보았다.

[ 수정한 이유 ]

RayCast를 통해 사용했을때는 회피가 끝났음에도 여러번 메서드가 호출되는 점도 있었고,
Update에서 사용하다 보니 프레임마다 실행되기 때문에 게임이 진행이 되면 될수록
게임 진행에 있어 문제가 생길 수도 있겠다고 판단하여 바꾸기로 했는데
아주 좋은 선택이였던 것 같다.

[ 수정 ]

타일맵을 사용하여 장애물마다 길다란 콜라이더를 찍어주었다.

스크립트를 작성해 해당 타일맵에 넣어주었다.
OnTriggerExit2D를 사용하여 해당 타일맵과 충돌 시 도전 과제에서
회피한 횟수를 1 증가시켜주었다.

장애물과는 별개로 나누어 놔서 충돌 시 회피 수 리셋도 잘 작동하였다.

public class DodgeZone : MonoBehaviour
{
    private void OnTriggerExit2D(Collider2D collision)
    {
        if (collision != null && collision.CompareTag("Cookie"))
        {
            AchievementManager.Instance.UpdateAchievement("Dodge", 1);
        }
    }
}

이렇게 바꾸니까 훨씬 간편하고 보기도 좋았다.
스테이지를 여러개 만들때에도 타일맵으로 생성을 했기 때문에
똑같이 장애물에 맞춰 사용하면 되서 그 점도 좋은 듯 하다.


오늘도 열심히 달렸다... 중간에 모르는 것이 있으면 우리 팀장인 상민님한테 물어봐서
대부분 해결 할 수 있었다. 다른 팀원들도 진행 사항이 어느정도 마무리 단계에
들어갔기 때문에 거의 완성에 가까워졌다고 볼 수 있을 것 같다.

물론 내일도 추가로 기능을 더 구현해볼 생각이긴하다.
회의를 통해 이미 정해둔 기능들이 있어서 그거 위주로 하지 않을까 싶다.

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN