본문 바로가기

Unity/▶ Game Development: Dodge

[Dodge] #7. 게임 완성

728x90
반응형

게임 UI 만들기

유니티의 UI 시스템은 UI 요소를 게임 월드 속 게임 오브젝트로 취급한다. 따라서 UI 요소는 씬 속의 하나의 게임 오브젝트가 되며 씬 내부에서 편집이 가능하다.

 

생존 시간 UI 제작

  1. Scene > 2D 
  2. 하이어 라키> Create > UI > Text
  3. 하이어 라키 > Canvas 더블클릭

우측 상단의 2D 클릭

하이어 라키의 + 버튼을 클릭하여 Legacy를 선택하여 Text를 클릭한다.

캔버스와 이벤트 시스템

Text 게임 오브젝트는 Canvas 게임 오브젝트의 자식 오브젝트로 설정되어있다. UI 요소들은 캔버스의 2차원 평면에 배치된다.

 

UI 게임 오브젝트는 일반 게임 오브젝트와 달리 트랜스폼 컴포넌트를 확장한 사각 컴포넌트를 가진다. 즉, UI 요소는 자신이 배치될 2차원의 액자가 필요하고 Canvas 게임 오브젝트는 UI 요소가 배치될 수 있는 액자 역할을 한다.

 

따라서 UI 게임 오브젝트를 만들 때 Canvas 게임 오브젝트가 씬에 없다면 하나 생성되며, 모든 UI 오브젝트는 Canvas의 자식이 된다.

+ EnventSysytem
EnventSysytem 게임 오브젝트는 이벤트 시스템 컴포넌트를 가진 게임 오브젝트로, UI 게임 오브젝트의 클릭, 터치, 드래그 같은 상호작용을 이벤트 메시지로 전달하는 역할을 한다.

 

텍스트 정리

  1. Text 게임 오브젝트의 이름을 Time Text으로 변경
  2. 인스펙터 창에서 앵커 프리셋 클릭
  3. top-center 설정

폰트와 텍스트의 위치를 설정한다.

Horizontal Overflow와 Vertical Overflow

표시할 글자 크기가 너무 크거나 표시할 글자 수가 너무 많으면 글이 글상자를 넘치게 되는 오버플로우가 발생하게 된다. 

 

이때 텍스트 컴포넌트의 수평 오버플로수직 오버플로는 글이 글 상자를 넘칠 경우 해당 방향으로의 글자를 잘라낼 것인지 혹은 그대로 넘치게 표시할 것인지 결정한다.

 

  • 수평 오버플로의 기본 값인 래핑(wrap)은 글자가 수평 방향으로 글 상자를 넘칠 때 강제로 줄 바꿈을 적용하며, 오버플로를 적용하면 수평 방향으로 글상자를 넘친 글이 줄바꿈을 하지 않고 표시한다.
  • 수직 오버플로의 기본값인 자르기(Truncate)는 글자가 수직 방향으로 글 상자를 넘칠 때 넘친 글자들을 잘라낸다. 오버플로를 적용하면 수직 방향으로 글 상자를 벗어난 글들을 잘라내지 않고 그래도 표시한다.

그림자 효과

  • Time Text 게임 오브젝트에 Shadow 컴포넌트 추가(UI > Effect > Shadow)

게임오버 텍스트/ 최고 기록 텍스트

플레이 시간 텍스트 게임 오버 텍스트

다음과 같이 설정한다. 단 Gameover Text는 비활성화한다.

게임 메니저 제작

GameManager 스크립트 생성

씬 관리와 관련된 코드를 using을 이용하여 가져온다.

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

using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
UnityEngine.UI
유니티 UI 시스템과 관련된 코드를 가져온다.
이 선언을 추가하지 않으면 UI 관련 컴포넌트를 선언하고 사용할 수 없다.
UnityEngine.SceneManagement
씬 관리자 등이 포함된 씬 관련 코드를 가져온다.
이 선언으로 게임 도중 씬을 재시작하는 기능을 사용할 수 있다.

GameManager 스크립트에 필요한 변수와 메서드 선언하기

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

using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
    // Start is called before the first frame update
    public GameObject gameoverText;
    public Text timeText;
    public Text recordText;

    private float surviveTime;
    private bool isGameOver;
    void Start()
    {
        surviveTime = 0;
        isGameOver = false;
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public void EndGame(){

    }
}
public 변수
gameoverText
게임 오버시 활성화 할 텍스트 게임 오브젝트.
timeText
생존 기간을 표시할 텍스트 컴포넌트
recordText
최고 기록을 표시할 텍스트 컴포넌트
private 변수
surviveTime
게임 시작 이후 현재까지 플레이 시간.
0으로 시작하여 플레이어가 죽을 때까지 갱신됨.
isGameOver
게임 오버 상태를 표현

생존 시간 표시

void Update()
{
    //게임 오버가 아니라면
    if(isGameOver){
        surviveTime += Time.deltaTime; //생존 시간 갱신
        timeText.text = "Time"+(int)surviveTime; // 갱신한 생존 시간을 텍스트 컴포넌트를 이용해 표시
    }
}

변수 timeText 에는 Time Text 게임 오브젝트의 텍스트 컴포넌트를 할당할 것이기 때문에 timeText.text는 인스펙터 창에서 편집했던 Time Text 게임 오브젝트의 텍스트 컴포넌트의 필드라는 점에 주목한다.

게임 재시작 구현 

게임 오버 상태이면 R키가 눌러지는지 확인하고 R키가 눌러진 경우, SceneManager.LoadScene이 실행되어 로드된다.

 

SceneManager.LoadScene는 using UnityEngine.SceneManagement로 가져온 유니티에 내장된 씬 관리자이다. 

void Update()
{
    //게임 오버가 아니라면
    if(isGameOver){
        surviveTime += Time.deltaTime; //생존 시간 갱신
        timeText.text = "Time"+(int)surviveTime; // 갱신한 생존 시간을 텍스트 컴포넌트를 이용해 표시
    }
    else if(Input.GetKeyDown(KeyCode.R)){
        SceneManager.LoadScene("SmapleScene");
    }
}

LoadScene 메서드

LoadScene 메서드는 입력으로 씬의 이름을 받아 해당 씬을 로드한다.

SceneManager.LoadScene(string sceneName);

 

SampleScene 씬을 플레이 하는 도중 SceneManager.LoadScene("SampleScene");이  실행되면 직전까지의 SampleScene씬을 파괴하고 SampleScene을 다시 로드한다.
 

EndGame() 구현

EndGame() 메서드는 플레이어가 죽을 때 실행되며, 현재 게임 상태를 게임 오버 상태로 변경하고 게임 오버 시 필요한 처리를 수행한다.

  •  게임 오버 상태를 true로 변경
  • 현재 생존 시간 기록과 최고 생존 시간 비교
  • 게임오버 UI를 활성화하고 최고 기록 표시

EndGame() 메서드는 게임 메니저가 아닌 플레이어가 호출하도록 한다. 플레이어가 죽었을 때 PlayerController 스크립트에서 접근하여 실행한다.

 

public void EndGame(){
    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;
}
isGameOver = true;
gameoverText.SetActive(true);

isGameOver가 true가 되면 Update 메서드에서 생존 시간 surviveTime이 더 이상 갱신되지 않도록 한다.

 

gameoverText.SetActive(true); 가 실행되면 gameoverText에는 씬이 있는 Gameover Text 게임 오브젝트를 할당할 것이므로 Gameover Text 게임 오브젝트가 활성화 되고 게임 오버 안내 텍스트가 화면에 표시된다.

 

그 다음 EndGame() 메서드는 이전에 저장된 최고 기록을 불러와 현재 생존시간과 비교 후 업데이트 한다.

최고 기록 등의 수치를 컴퓨터에 저장하여 프로그램 종료 후에 유지하고 나중에 다시 불러와 사용하는 처리PlayerPrefs로 구현할 수 있다.

 

PlayerPrefs

PlayerPrefs는 플레이어 설정으 줄임말로 간단한 방식으로 어또한 수치를 로컬에 저장하고 나중에 다시 불러오는 메서드를 제공한다. 

 

PlayerPrefs는 키-값 단위로 데이터를 로컬에 저장하고, 값을 저장할 때 사용할 키가 무엇인지 기억하고 있다면 나중에 같은 키를 사용해 저장된 값을 가져올 수 있다.

 

728x90
반응형

'Unity > ▶ Game Development: Dodge' 카테고리의 다른 글

[Dodge] #6. 바닥 회전  (0) 2022.03.02
[Dodge] #5. 탄알 생성기  (0) 2022.02.26
[Dodge] #4. 탄알 생성  (0) 2022.02.25
[Dodge] #3. 스크립트 개선하기  (0) 2022.02.24
[Dodge] #2. 플레이어  (0) 2022.02.04
댓글