본문 바로가기
게임 프로그래밍/게임개발 중급

게임개발 중급(90) - Monster Killer(52)

by jyppro 2024. 8. 9.

Monster Killer

 

점수 합산

이전에 만든 점수를 얻는 과정은 플레이어가 스테이지에 진입하면, 해당 스테이지 내부적으로 설정된 시간이 지남에 따라 점수가 같이 감소하고, 클리어 타임에 맞는 점수를 획득하도록 구현했습니다. 그 과정에서 최소 점수도 20점으로 설정을 해주었는데 아직 한 가지 문제가 더 있습니다.

 

바로 재도전 시 같은 스테이지에서 여러 번 점수를 얻는 경우입니다. 지금은 아무런 장치가 없기 때문에 만약 최초로 1스테이지에서 50점을 얻고 다시 1스테이지를 도전하여 20점을 얻었다면 총 70점이 합산될 것입니다. 하지만 같은 스테이지를 재도전할 때에는 최고 점수를 기준으로 반영되어야 하기 때문에 이런 장치를 추가해 줄 것입니다.

 

게임매니저1

 

게임 매니저에서 최고 점수에 대한 함수를 만들고

 

스테이지-컨트롤러

 

기존에 스테이지 컨트롤러에서 스테이지 클리어를 담당하는 함수에 현재 획득한 점수와 이전 최고 점수를 비교하여 더 높은 점수를 플레이어의 점수로 반영되도록 해줍니다.

 

이렇게 하면 1스테이지에서 50점, 20점을 순서대로 얻으면 총점은 50점이고, 50점, 60점을 얻었다면 60점이 총점으로 반영됩니다.

 

스테이지 해금

이번엔 스테이지 클리어에 따른 해금을 구현하겠습니다. 스테이지 별로 난이도가 있기 때문에 사실 일정 수준에 도달하지 못하면 어차피 상위 스테이지는 클리어하지 못하지만 그래도 순서대로 진행하는 것이 더 보기 좋고, 다음 스테이지에 대한 궁금증을 유발시킬 수 있기 때문에 구현하게 되었습니다.

 

우선 스테이지 클리어 처리는 만들어 둔 것이 있으니 해당 정보를 가지고 발전 시킬 수 있습니다. 가장 먼저 해야 하는 것은 1스테이지를 제외한 모든 스테이지를 잠그는 것입니다.

 

게임매니저2

 

각 스테이지는 인덱스를 통해 관리되고 있는데, 마찬가지로 게임 매니저를 통해서 클리어 된 스테이지인지 판단하는 함수를 추가해 줍니다. 그리고 클리어 되었다면 다음 스테이지를 해금시키는 함수도 만들어 줍니다.

 

스테이지-해금

 

이것도 스테이지 컨트롤러에서 클리어 처리를 할 때 해당 함수를 실행하여 해금을 처리해 줍니다.

 

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Collections;
using TMPro;

public class StageButton : MonoBehaviour
{
    public int modeIndex; // 모드 인덱스
    public int stageIndex; // 스테이지 인덱스
    public Image FadeOutPage;
    public Button button;
    public Sprite unlockedSprite;
    public Sprite lockedSprite;
    public TextMeshProUGUI buttonText;

    private void Start()
    {
        GetComponent<Button>().onClick.AddListener(OnStageSelected);
        UpdateButtonState(); // 스테이지 상태에 따라 버튼 상태 업데이트
    }

    private void OnStageSelected()
    {
        if (GameManager.Instance.IsStageCleared(modeIndex, stageIndex) || stageIndex == 0) // 첫 번째 스테이지는 항상 접근 가능
        {
            StartCoroutine(FadeOutAndLoad());
        }
    }

    private IEnumerator FadeOutAndLoad()
    {
        FadeOutPage.gameObject.SetActive(true);
        Color alpha = FadeOutPage.color;

        float time = 0.0f;
        float fadeTime = 1.0f;

        while (alpha.a < 1.0f)
        {
            time += Time.deltaTime / fadeTime;
            alpha.a = Mathf.Lerp(0, 1, time);
            FadeOutPage.color = alpha;
            yield return null;
        }

        // 스테이지 인덱스와 모드 인덱스 설정
        StageLoader.Instance.SetCurrentStage(modeIndex, stageIndex);
        
        // Get the appropriate scene name based on the mode
        string sceneName = StageLoader.Instance.GetCurrentSceneName();
        SceneManager.LoadScene(sceneName); // 해당 씬으로 이동
    }

    private void UpdateButtonState()
    {
        bool isCleared = GameManager.Instance.IsStageCleared(modeIndex, stageIndex);
        if (stageIndex == 0 || isCleared) // 첫 번째 스테이지는 항상 활성화
        {
            button.interactable = true;
            GetComponent<Image>().sprite = unlockedSprite; // 활성화된 버튼 이미지
            if (buttonText != null) buttonText.enabled = true; // 텍스트 보이기
        }
        else
        {
            button.interactable = false;
            GetComponent<Image>().sprite = lockedSprite; // 비활성화된 버튼 이미지
            if (buttonText != null) buttonText.enabled = false; // 텍스트 숨기기
        }
    }
}

 

그리고 이것은 스테이지 버튼 스크립트인데, 이 곳에서 스테이지 잠금과 해금에 따라 UI가 변경되도록 만들어줍니다.

 

실행 결과

결과

 

이제 1스테이지는 기본적으로 열려 있고, 나머지 스테이지는 잠겨 있는 모습입니다. 1스테이지를 클리어 하면 2스테이지가 해금됩니다.

 

헌트모드

 

헌트모드에서 약간의 플레이를 통해 2스테이지까지 클리어 하여 3스테이지까지 해금이 된 모습입니다.

 

<NEXT>

이제 헌트모드와 전체적인 게임 모드에 대한 세팅은 된 것 같습니다. 다음에는 보스 모드를 만들어 보도록 하겠습니다. 감사합니다.