목표
- 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로 종료가능하다.
'Development > Unity Engine' 카테고리의 다른 글
[Retro유니티] 2D Collider 및 Animation 추가 (0) | 2024.11.22 |
---|---|
[Retro유니티] 2D 프로젝트 열기 (0) | 2024.11.20 |
[Retro유니티] BulletSpawner - Update() 함수로 실행반복 (0) | 2024.11.17 |
[Retro유니티] Bullet Spawner 구현 - Start() (0) | 2024.11.15 |
[Retro유니티] Bullet 구현 (1) | 2024.11.13 |