게임 전반을 관리하는 GameManager를 만들겠습니다. 프로젝트뷰의 +를 클릭해 C# Script를 만들고 GameManager라 이름 변경합니다. 아이콘이 톱니바퀴모양으로 됩니다. 이걸 끌어다 하이라키의 Canvas에 끌어다 어태치합니다.

GameManager 스크립트를 다음과 같이 작성합니다.

UI를 컨트롤 하기 위해 다음과 같이 선언합니다.

GameManager.cs
0.00MB

using UnityEngine.UI; // UI 를 사용할 때 필요

GUI를 다루기 위해 변수를 선언합니다. 아까 만들었던 패널  버튼 이미지등입니다.

public GameObject mainImage;        // 이미지를 담아두는 GameObject
public Sprite gameOverSpr;          // GAME OVER 이미지
public Sprite gameClearSpr;         // GAME CLEAR 이미지
public GameObject panel;            // 패널
public GameObject restartButton;    // RESTART 버튼
public GameObject nextButton;       // NEXT 버튼
Image titleImage;                   // 이미지를 표시하고있는 Image 컴포넌트

보통은 시작화면을 게임씬과 분리하여 독립된 씬으로 사용하는데 여기서는 게임씬안에서 시작시 감추네요

Invoke()함수로 "GAME START이미지를 Inactive하는InactiveImage()"를 1초후 호출합니다. 

panel.SetActive()를 이용 감춥니다. 포함된 버튼들도 다 감추어 집니다.

void Start() {
    Invoke("InactiveImage", 1.0f); // 이미지 숨기기
    panel.SetActive(false); // 버튼(패널)을 숨기기
}

Invoke() 함수는 다음과 같이 SetActive()를 이용해 비활성화 합니다.

void InactiveImage() {
    mainImage.SetActive(false); // 이미지 숨기기
}

Update()에서는 PlayerController.gameState 변수를 참조해서 Image오브젝트들을 표시하거나 설정합니다.

원래 런타임시의 객체에 접근하려면 Public으로 참조하던지 Find해야하는데 PlayerController는 아무런 참조없이 그냥 사용하고 있습니다. 이건 gameState를 static으로 선언했기 때문입니다. PlayerController의 gameState외 다른것들은 꼭 연결후 사용하셔야 합니다. 일종의 싱글턴 기법입니다. 

GameOver일시 NEXT버튼의 interactable변수를 false로 해 비활성 상태로 만듭니다. 또한 PlayerController.gameState=gameend로 설정해 다음 프레임부터 아무런 처리도 안하게 만들어 줍니다.

if (PlayerController.gameState == "gameClear"){
    ~생략
}
else if (PlayerController.gameState == "gameOver"){
    ~생략
}
else if (PlayerController.gameState == "playing"){
    // 게임 중
}

이제 하이라키에서 Canvas를 선택하고 GameManager의 변수들을 연결해야합니다. 하이라키의  Cavans에서 Image, Panel, RestartButton, NextButtong을 다음과 같이 끌어서 연결합니다. 이후  Images폴더에서 GameOver, StageClear 스프라이트를 끌어다 놓와줍니다.

GameManager의 전체코드 입니다

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // UI 를 사용할 때 필요

public class GameManager : MonoBehaviour
{
    public GameObject mainImage;        // 이미지를 담아두는 GameObject
    public Sprite gameOverSpr;          // GAME OVER 이미지
    public Sprite gameClearSpr;         // GAME CLEAR 이미지
    public GameObject panel;            // 패널
    public GameObject restartButton;    // RESTART 버튼
    public GameObject nextButton;       // NEXT 버튼
    Image titleImage;                   // 이미지를 표시하고있는 Image 컴포넌트

    // Start is called before the first frame update
    void Start() {
        Invoke("InactiveImage", 1.0f); // 이미지 숨기기
        panel.SetActive(false); // 버튼(패널)을 숨기기
    }

    // Update is called once per frame
    void Update()
    {
        if (PlayerController.gameState == "gameClear")
        {
            // 게임 클리어
            mainImage.SetActive(true); // 이미지 표시
            panel.SetActive(true); // 버튼(패널)을 표시
            // RESTART 버튼 무효화 
            Button bt = restartButton.GetComponent<Button>();
            bt.interactable = false;
            mainImage.GetComponent<Image>().sprite = gameClearSpr;
            PlayerController.gameState = "gameEnd";
        }
        else if (PlayerController.gameState == "gameOver")
        {
            // 게임 오버
            mainImage.SetActive(true);      // 이미지 표시
            panel.SetActive(true);          // 버튼(패널)을 표시
            // NEXT 버튼 비활성
            Button bt = nextButton.GetComponent<Button>();
            bt.interactable = false;
            mainImage.GetComponent<Image>().sprite = gameOverSpr;
            PlayerController.gameState = "gameEnd";
        }
        else if (PlayerController.gameState == "playing")
        {
            // 게임 중

        }
    }
    
    void InactiveImage() {
        mainImage.SetActive(false); // 이미지 숨기기
    }
}

'유니티2D게임 > 버튼과 UI' 카테고리의 다른 글

게임 재시작 기능 만들기  (0) 2023.05.14
게임UI 만들기  (3) 2023.05.14

유니티에서 제공하는 UI는 3가지가 있다.

  • IMGUI (Immediate Made GUI) : 코드를 이용해서 UI를 표시하는 방법
  • UI Toolkit : 현재 개방중, 속성을 수치로 관리
  • UNIT UI (UGUI) : 게임 오브젝트 기반의 UI, UI요소를 컴포넌트로 구현

 

+ Recent posts