Unity

[Unity] Chap05. 버튼과 UI 만들기

mooni_ 2024. 3. 7. 21:58

5-1. 게임 UI 만들기

UI(user interface) 만들기

Unity에서는 가상 필터(Canvas)를 얹어서 그 위에 플레이어가 조작할 대상을 배치함

 

Canvas 표시 설정

→ Render Mode : Screen Space - Camera (Render Camera, Order in Layer 등이 활성화 됨)

→ Render Camera : Main Camera (계층 뷰에서 Main Camera Object를 끌고 오면 플레이 화면 크기로 조정됨)

→ Order in Layer : 10 (가장 앞에 배치하기 위해서 임의로 10으로 설정)

Canvas Render Mode
1) Screen Space - Overlay : 기본값, 항상 맨 앞에 배치하기 때문에 Order in Layer 등의 조작 불가
2) Screen Space - Camera : 지정 카메라를 따라 크기 조정, Order in Layer나 Place Distance 등의 조작 가능
3) World Space : 3D 공간의 한 점에 고정되어 배치, 가장 자유도가 높음, 그러나 가장 어려움

 

RESTART, NEXT가 담긴 패널을 담은 Canvas,,,

 

Canvas에 적용할 GameManager script 작성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;    //UI 사용 시 필요

public class GameManager : MonoBehaviour
{
    public GameObject mainImage;    //각 UI에 대한 이미지를 담아둘 변수
    public Sprite gameOverSpr;
    public Sprite gameClearSpr;
    public GameObject panel;
    public GameObject restartButton;
    public GameObject nextButton;

    Image titleImage;    //이미지 표시 컴포넌트

    // 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);    //패널 표시
            Button bt = restartButton.GetComponent<Button>();    
            bt.interactable = false;    //RESTART 버튼 무효화
            mainImage.GetComponent<Image>().sprite = gameClearSpr;
            PlayerController.gameState = "gameend";    //gameend 상태로 변경
        }
        else if(PlayerController.gameState == "gameover")    //게임오버 상태 시
        {
            mainImage.SetActive(true);    //이미지 표시
            panel.SetActive(true);    //패널 표시
            Button bt = nextButton.GetComponent<Button>();
            bt.interactable = false;    //NEXT 버튼 무효화
            mainImage.GetComponent<Image>().sprite = gameOverSpr;
            PlayerController.gameState = "gameend";    //gameend 상태로 변경
        }
        else if(PlayerController.gameState == "playing")    
        {
			//게임 중 상태
        }
    }

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

 

변수
public으로 변수를 선언하여 유니티 에디터에서 게임 오브젝트나 이미지를 설정할 수 있음

 

Start Method
이미지와 패널(RESTART, NEXT 버튼)을 숨기고 시작
Invoke("InactiveImage", 1.0f) : Invoke("method", time), 지정 시간 후에 앞의 method 호출

InactiveImage Method
setActive method 호출하여 이미지를 지움(T/F)

→ 결론적으로 1초 후에 해당 이미지를 지움


* Invoke에서 호출하는 매서드는 반환값이 void이고 인수는 없어야함

 

Update Method
Game State에 따라서 이미지와 패널의 표시를 다룸

 

 


5-2. 게임 재시작 기능 만들기

RESTART 버튼의 기능인 재시작을 위해 씬 변경 Script 만들기

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;    //씬 변경 시 필요

public class ChangeScene : MonoBehaviour
{
    public string sceneName;    //불러올 씬

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public void Load()
    {
        SceneManager.LoadScene(sceneName);    //씬 불러오기
    }
}

1) 씬 변경에 필요한 Engine 추가

2) 불러올 씬을 담을 public 변수 선언

3) Load() : SceneManager.LoadScene()를 사용하여 씬 불러오기

 

위의 기능을 버튼이 눌렸을 때 실행하기 위해서 RESTART, NEXT 버튼에 script 추가

On Click() 설정 패널에서 ChangeScene 스크립트 내의 Load 함수 적용 후 씬 배정

 

이후 해당 Canvas를 프리팹으로 만들었음

 


5-3. 게임 실행하기

 

했습니다.

 

*교재 : 누구나 할 수 있는 유니티 2D 게임 제작