게임 전반을 관리하는 GameManager를 만들겠습니다. 프로젝트뷰의 +를 클릭해 C# Script를 만들고 GameManager라 이름 변경합니다. 아이콘이 톱니바퀴모양으로 됩니다. 이걸 끌어다 하이라키의 Canvas에 끌어다 어태치합니다.
GameManager 스크립트를 다음과 같이 작성합니다.
UI를 컨트롤 하기 위해 다음과 같이 선언합니다.
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 |