반응형
게임 매니저는 유니티에서 전체적인 게임을 관리 기능을 합니다.
게임 매니저는 다른 스크립트에서 참조할 수도 있고, 게임의 상태 파악에 대한 기능을 제공합니다.

- 게임의 UI에 사용할 타이틀과 Start 버튼의 이미지를 설정합니다.
- Sprite Mode를 Single 로 변경합니다.

- 빈 오브젝트 (IntroUI)를 만들고 UI 이미지를 Intro UI에 넣어줍니다.
- Intro UI 오브젝트는 0,0,0 에 위치합니다.
- 이미지는 게임 비율에 맞춰서 위치와 스케일을 변경합니다.
using UnityEngine;
public enum GameState
{
Intro,
Playing,
Dead
}
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
public GameState state = GameState.Intro;
[Header("Reference")]
public GameObject IntroUI;
public GameObject EnemySpawner;
public GameObject FoodSpawner;
public GameObject GoldenSpawner;
private void Awake()
{
if (Instance == null)
{
Instance = this;
}
}
void Start()
{
IntroUI.SetActive(true);
}
// Update is called once per frame
void Update()
{
if(state== GameState.Intro && Input.GetKeyDown(KeyCode.Space))
{
state= GameState.Playing;
IntroUI.SetActive(false);
EnemySpawner.SetActive(true);
FoodSpawner.SetActive(true);
GoldenSpawner.SetActive(true);
}
}
}
- 게임 매니저 스크립트 입니다.
- 게임 시작과 함께 UI가 활성화 되고 스페이스를 눌러서 게임이 시작되면 비활성화 된 장애물 오브젝가 활성화 됩니다.
public enum GameState
{
Intro,
Playing,
Dead
}
- 게임의 상태를 나타내는 부분입니다.
- 게임 인트로, 게임 시작, 플레이어 죽음(게임 끝) 상태를 나타냅니다.
- 게임 상태에 따라 게임의 형태를 다르게 적용합니다.
public static GameManager Instance;
public GameState state = GameState.Intro;
[Header("Reference")]
public GameObject IntroUI;
public GameObject EnemySpawner;
public GameObject FoodSpawner;
public GameObject GoldenSpawner;
private void Awake()
{
if (Instance == null)
{
Instance = this;
}
else
{
Destroy(gameObject);
}
}
- static 함수의 경우 전역 상태 관리, 게임 내에서 단일한 데이터 또는 상태를 관리하는데 사용합니다.
- 현재 스크립트는 싱글톤 패턴으로 다른 스크립트에서 접근 가능하도록 합니다.
void Start()
{
IntroUI.SetActive(true);
}
// Update is called once per frame
void Update()
{
if(state== GameState.Intro && Input.GetKeyDown(KeyCode.Space))
{
state= GameState.Playing;
IntroUI.SetActive(false);
EnemySpawner.SetActive(true);
FoodSpawner.SetActive(true);
GoldenSpawner.SetActive(true);
}
}
- 게임 시작시 비활성화 된 IntroUI가 활성화 됩니다.
- 게임이 Intro 상태에서 스페이스 키를 입력하면 게임 플레이 상태로 변환됩니다.
- IntroUI는 비활성화 되면서 장애물 오브젝트는 활성화 됩니다.

- GameManager 오브젝트를 생성하여 스크립트를 적용합니다.
- 각 IntroUI 와 장애물 Spawner를 스크립트에 적용합니다.
- 적용된 오브젝트는 비활성화 시켜줍니다.
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
public GameState state = GameState.Intro;
public int Lives = 3;
- 플레이어 사망 상태를 확인하기 위해서 게임 매니저 스크립트에 생명(Lives) 를 추가하였습니다.
void Hit()
{
GameManager.Instance.Lives -= 1;
}
void Heal()
{
GameManager.Instance.Lives = Mathf.Min(3, GameManager.Instance.Lives + 1);
}
- Player 스크립트에서 기존 Hit 와 Heal 부분을 수정합니다.
- 게임 매니저는 다른 스크립트에서 참조할 수 있기 때문에 GameManager.Instance.Lives 로 수정합니다.
public class Spawner : MonoBehaviour
{
...
private void OnDisable()
{
CancelInvoke();
}
- Spawner 스크립드도 다음과 같이 수정합니다.
- OnDisable은 게임 오브젝트나 스크립트가 비활성화될 때 호출됩니다.
- 즉, 게임플레이어가 죽으면 스크립트가 비활성화 되면서 해당 함수가 호출됩니다.
using UnityEditor.SearchService;
using UnityEngine;
using UnityEngine.SceneManagement;
...
public class GameManager : MonoBehaviour
{
...
public Player PlayerScript;
private void Awake()
{
...
}
void Start()
{
...
}
void Update()
{
if(state== GameState.Intro && Input.GetKeyDown(KeyCode.Space))
{
state= GameState.Playing;
IntroUI.SetActive(false);
EnemySpawner.SetActive(true);
FoodSpawner.SetActive(true);
GoldenSpawner.SetActive(true);
}
if(state == GameState.Playing && Lives == 0)
{
PlayerScript.KillPlayer();
EnemySpawner.SetActive(false);
FoodSpawner.SetActive(false);
GoldenSpawner.SetActive(false);
state = GameState.Dead;
}
if(state == GameState.Dead && Input.GetKeyDown(KeyCode.Space))
{
SceneManager.LoadScene("main");
}
}
}
- 게임 매니저 스크립트를 수정합니다.
- 플레이어 사망 상태를 확인하도록 플레이어 스크립트를 추가합니다.
- 각 게임 상태에 따른 게임 진행을 추가하였습니다.

- 수정된 스크립트에 따라서 오브젝트에 각 오브젝트를 적용합니다.

반응형
'Unity Project > Unity6 Challenge (김치-런)' 카테고리의 다른 글
| [Unity 6 Challenge] 배포(Publishing) (2) | 2024.12.26 |
|---|---|
| [Unity 6 Challenge] 게임 점수와 UI (3) | 2024.12.26 |
| [Unity 6 Challenge] 적 장애물 과 아이템 (0) | 2024.12.20 |
| [Unity 6 Challenge] 장애물 만들기(1) (2) | 2024.12.19 |
| [Unity 6 Challenge] 캐릭터 플레이어 애니메이션 (0) | 2024.12.18 |