유니티/유니런(2D 러닝 게임)

유니런(5) - 게임 매니저

무직백수취업준비생 2021. 8. 9. 01:55
728x90
반응형

게임 매니저 오브젝트를 생성한 뒤 스크립트를 작성합니다.

 

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() {
        if(isGameover &&Input.GetMouseButtonDown(0))
        {
            //게임오버 상태에서 마우스 왼쪽 버튼을 클릭하면 현재 씬 재시작
            SceneManager.LoadScene(SceneManager.GetActiveScene().name);
        }
    }

    // 점수를 증가시키는 메서드
    public void AddScore(int newScore) {
        //게임오버가 아니라면
        if (!isGameover)
        {
            //점수를 증가
            score += newScore;
            scoreText.text = "Score : " + score;
        }
    }

    // 플레이어 캐릭터가 사망시 게임 오버를 실행하는 메서드
    public void OnPlayerDead() {
        isGameover = true;
        gameoverUI.SetActive(true);
        
    }
}

 

GameManager의 OnPlayerDead() 메서드는 PlayerController 스크립트의 Die() 메서드에서 실행되어야 합니다.

 

그러니 PlayerController 스크립트의 Die() 메서드를 수정합니다.

 

   private void Die() {
        //애니메이터의 Die 트리거 파라미터를 셋
        animator.SetTrigger("Die");

        //오디오 소스에 할당된 오디오 클립을 deathClip으로 변경
        playerAudio.clip = deathClip;
        //사망 효과음 재생
        playerAudio.Play();

        //속도를 제로(0,0)로 변경
        playerRigidbody.velocity = Vector2.zero;
        //사망 상태를 true로 변경
        isDead = true;

        //게임 매니저의 게임오버 처리 실행
        GameManager.instance.OnPlayerDead();
   }

 

게임오버 실행은 이제 정상적으로 이루어지나

 

게임오버인 상태에서 발판과 배경이 멈추어야 합니다.

 

ScrollingObject 스크립트에서 GameManager의 isGameover을 검사하여 움직임 여부를 정하도록 수정합니다.

 

    private void Update() {
        //게임오버가 아니라면
        if (!GameManager.instance.isGameover)
        {
            //초당 speed의 속도로 왼쪽으로 평행이동
            transform.Translate(Vector3.left * speed * Time.deltaTime);
        }
    }

 

이제 ScrollingObject 스크립트는 매번 게임오버 상태를 검사하여 게임오버가 아닐 때만 실행상태를 유지합니다.

 

게임 매니저의 컴포넌트를 설정해줍니다.

 

실행해보면 게임오버 시 배경의 스크롤링이 멈춥니다.

 

그리고 게임오버 텍스트가 출력되며 다시 점프키(마우스 좌클릭)를 누르면 재시작됩니다.

 

 

728x90
반응형