[레트로의 유니티] 유니런3
1. 캔버스 만들기
UI를 만들기 위해서 Canvas를 생성한다.
Create > UI > Canvas
Canvas Scaler 컴포넌트의 UI Scale Mode를 Scale with Screen Size로 변경
Reference Resolution은 (640, 360)
2. UI 추가
-
Score 텍스트
점수를 표시하는 UI를 만든다.
Text 오브젝트를 생성, 이름 Score Text, Rect (300, 80), Anchor Preset을 alt+shift - bottom-center로 변경한다.
Text 필드 : Score : 0
Font : Kenny Mini Square
Font Size : 50
Alignment : Center, Middle
Color : 255, 255, 255선명하게 보이기 위해서 Shadow 컴포넌트를 추가해준다.
-
Gameover 텍스트
Score Text를 복제해서 사용한다.
이름을 Gameover Text로 변경, Anchor Preset은 top-center
Text 필드 : Gameover!
Color : 255, 66, 85 -
Restart 텍스트
Gameover Text를 복제, Restart Text 이름 변경한다.
Rect Transform의 X : -40 Text 필드 : Jump To Restart
Font Size : 33Restart Text오브젝트는 Gameover Text의 자식으로 만들고 Gameover Text를 비활성화 시킨다.
3. 게임매니저
점수 저장, 게임오버 처리 및 표현, UI 관리 등의 기능을 다루기 위해서 게임매니저를 만든다.
GameManager 이름의 빈 오브젝트를 만들고 GameManager 스크립트를 추가한다.
-
싱글턴
게임매니저는 싱글턴 패턴을 사용해서 만들어 일괄적인 데이터 관리와 처리를 한다.
// GameManager.cs
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
// 게임 오버 상태를 표현하고, 게임 점수와 UI를 관리하는 게임 매니저
// 씬에는 단 하나의 게임 매니저만 존재할 수 있다.
public class GameManager : MonoBehaviour {
public static GameManager instance; // 싱글톤을 할당할 전역 변수
public bool isGameover = false; // 게임 오버 상태
public Text scoreText; // 점수를 출력할 UI 텍스트
public GameObject gameoverUI; // 게임 오버시 활성화 할 UI 게임 오브젝트
private int score = 0; // 게임 점수
// 게임 시작과 동시에 싱글톤을 구성
void Awake() {
// 싱글톤 변수 instance가 비어있는가?
if (instance == null)
{
// instance가 비어있다면(null) 그곳에 자기 자신을 할당
instance = this;
}
else
{
// instance에 이미 다른 GameManager 오브젝트가 할당되어 있는 경우
// 씬에 두개 이상의 GameManager 오브젝트가 존재한다는 의미.
// 싱글톤 오브젝트는 하나만 존재해야 하므로 자신의 게임 오브젝트를 파괴
Debug.LogWarning("씬에 두개 이상의 게임 매니저가 존재합니다!");
Destroy(gameObject);
}
}
void Update() {
// 게임 오버 상태에서 게임을 재시작할 수 있게 하는 처리
}
// 점수를 증가시키는 메서드
public void AddScore(int newScore) {
}
// 플레이어 캐릭터가 사망시 게임 오버를 실행하는 메서드
public void OnPlayerDead() {
}
}
씬 전환을 위해서 업데이트를 통해서 입력을 확인해서 처리한다.
void Update() {
// 게임 오버 상태에서 게임을 재시작할 수 있게 하는 처리
if (isGameover && Input.GetMouseButtonDown(0))
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
}
점수를 관리하고 Score Text를 갱신한다. AddScore 메서드에 동작 추가
public void AddScore(int newScore) {
if (!isGameover)
{
// 점수를 증가
score += newScore;
scoreText.text = "Score : " + score;
}
}
플레이어 사망을 감지해서 처리할 메서드이다. OnPlayerDead
public void OnPlayerDead() {
isGameover = true;
gameoverUI.SetActive(true);
}
-
PlayerController 스크립트 수정
플레이어와 상호작용 시키기 위해서 스크립트를 수정해준다.
// PlayerController.cs // 게임매니저의 게임오버 처리 실행하는 코드 추가 GameManager.instance.OnPlayerDead();
-
ScrollingObject 스크립트 수정
게임오버시 움직이는 배경과 발판의 동작을 멈추도록 한다.
private void Update() { // 게임오버가 아닐 때만 동작 if (!GameManager.instance.isGameover) { transform.Translate(Vector3.left * speed * Time.deltaTime); } }
-
GameManager 컴포넌트 추가
GameManager 스크립트에 오브젝트를 드래그앤드롭으로 등록시켜준다.
Score Text = Score Text 오브젝트
Gameover UI = GameManager Text 오브젝트