Development/Unity Engine

[Retro유니티] GameManager, TextMeshPro & Build

사이바 미도리 2024. 11. 17. 15:11

목표

- Game Manager와 UI 만들기

- Scene관리자로 Scene 로드하기

- PlayerPrefs를 사용해 데이터를 저장하기

- 게임을 빌드하기

 

에셋종류별로 폴더를 추가생성하고 정리한다.

 

바닥회전기능을 구현하여 Level 게임오브젝트에 적용해보자.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Rotator:MonoBehaviour
{
    public float rotationSpeed = 60.0f;
    void Update()
    {
        // 1초에 y축기준 몇 도 회전할것인지
        transform.Rotate(new Vector3(0f, rotationSpeed, 0f) * Time.deltaTime);
    }
}

 

 

 

 

 

이제 UI를 만들어보자.

- 게임오버창

- 생존시간 띄우기

- 최고기록 띄우기

 

그러면 Text 외에도 Canvas, EventSystem 이라는 Object가 추가되는걸 확인가능하다.

UI요소들은 Canvas의 2D 평면에 배치되기 때문에, Text는 Canvas 의 자식으로 들어간다.

- 모든 UI Game Object는 Canvas Game Object의 자식이 되어야 한다.

- Event System 게임오브젝트는 UI 오브젝트에 Click, Touch, Drag 같은 상호작용을 Event Message로 전달한다.

  - EventSystem Object가 없다면, UI는 버튼클릭/슬라이드바클릭/드래그 같은 UI 상호작용을 할 수 없다.

 

Shadow를 Component 추가해준다.

 

noWrap을 선택해서, 자동줄바꿈을 없애자.

 

Record Text는 Gameover Object의 자식객체로 바꾸자. drag하면된다.

그리고, Gameover Object는 Start시 보이지 않도록 Inspector에서 체크해제하자.

 

 

Game Manager를 만들자. 역할은 아래와 같다.

- 이제 게임의 규칙과 게임오버 상태를 표현

- 생존시간을 관리

- 게임 UI를 관리

 

SampleScene 씬을 플레이하는 도중 SceneManager.LoadScene("SampleScene"); 를 실행하면,

직전까지의 SampleScene 씬을 파괴하고 SampleScene 씬을 다시 로드한다.

이것은 게임 재시작과 동일한 효과를 낸다.

참고로, SceneManager.LoadScene(0); 도 동일하다. Build Settings에서 Scene 번호로 접근가능하다는 말.

 

EndGame 메서드는 Player가 죽을때 실행되므로, public으로 선언한다.

 

PlayerPrefs는 Player Preference라고 읽는다.

간단한 방식으로 어떤 수치를 로컬에 저장했다가 불러오는 메서드를 제공하는, Unity 내장Class이다.

key-value 형식으로 로컬에 저장한다.

만약 float을 저장할 때는, PlayerPrefs.SetFloat(string key); 를 사용한다.

읽는 함수는 Set 대신 Get을 쓰면 된다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using JetBrains.Annotations;

using TMPro;

public class GameManager: MonoBehaviour
{
    public GameObject gameoverText;
    public TextMeshProUGUI timeText;
    public TextMeshProUGUI recordText;
    private float surviveTime;
    private bool isGameover;

    private void Start()
    {
        surviveTime = 0;
        isGameover = false;
    }

    private void Update()
    {
        if(!isGameover)
        {
            surviveTime += Time.deltaTime;
            timeText.text = "Time: " + (int)surviveTime;
        }
        else
        {
            if(Input.GetKeyDown(KeyCode.R))
            {
                SceneManager.LoadScene("SampleScene");
            }
        }
    }

    public void EndGame()
    {

       if (!isGameover)
        {
            isGameover = true;
            gameoverText.SetActive(true);

            float bestTime = PlayerPrefs.GetFloat("BestTime");

            if (surviveTime > bestTime)
            {
                bestTime = surviveTime;
                PlayerPrefs.SetFloat("BestTime", bestTime);
            }

            recordText.text = "Best Time: " + (int)bestTime;
        }
    }
}

 

 

이제 GameManager 스크립트를 완성했으니, PlayerController가 Die시 EndGame 메서드를 실행하도록 하자.

// 기존
    public void Die()
    {
        Debug.Log("Player died");
        gameObject.SetActive(false);
    }
    
// 변경
    public void Die()
    {
        gameObject.SetActive(false);
        GameManager gameManager = FindAnyObjectByType<GameManager>();
        gameManager.EndGame();
    }

 

GameManager 스크립트를 Game Object로 만들자.

 

기록 및 restart 까지 가능해졌다.

 

이제 빌드를 해보자.

File > Build Profiles

 

 

exe 실행시 play가 된다.

Alt F4로 종료가능하다.