반응형

게임 매니저는 유니티에서 전체적인 게임을 관리 기능을 합니다.

게임 매니저는 다른 스크립트에서 참조할 수도 있고, 게임의 상태 파악에 대한 기능을 제공합니다.

 

  • 게임의 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");
        }
    }
}
  • 게임 매니저 스크립트를 수정합니다.
  • 플레이어 사망 상태를 확인하도록 플레이어 스크립트를 추가합니다.
  • 각 게임 상태에 따른 게임 진행을 추가하였습니다.

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

 

반응형

+ Recent posts