본문으로 건너뛰기

canvas-menu

Canvas에서 메뉴 by Unity

이 글은 기존 블로그의 원문에서 가져왔습니다. 원문 작성일: 2021-08-18

게임을 진행하다가도 메뉴를 열 수 있어야하기 때문에 canvas에 메뉴를 만들기로 했다.

1. UI

일단 위와 같은 식으로 이중 panel의 형태로 메뉴창을 만들었다.

Canvas

ㄴ 반투명 panel

ㄴ 검은색 panel

ㄴ Button_1

Button_2

Button_3 과 같은 구조를 가진다.

이런 식으로 option창이나 원하는 메뉴창들을 만들어줬다.


2. class

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
 
public class MainMenuManager : MonoBehaviour
{
    public GameObject menu;
    public GameObject main;
    public GameObject option;
 
    void Start()
    {
        DontDestroyOnLoad(gameObject);
    }
 
    public void openMainPage() //처음 화면으로 나오는 함수이다.
    {
        main.SetActive(false);
        option.SetActive(false);
        if ("StartScene" != SceneManager.GetActiveScene().name) //게임 화면을 보고 있을 때는 처음 화면으로 이동하기 위해서 DontDestroyOnLoad인 오브젝트들을 삭제해준다.
        {
            Destroy(gameObject);
            Destroy(GameObject.FindWithTag("Player"));
            Destroy(GameObject.FindWithTag("MainCamera"));
            LoadingSceneManager.LoadScene("StartScene");
        }
    }
 
    public void openMain()
    {
 
        main.SetActive(true);
        option.SetActive(false);
    }
 
    public void openOption()
    {
        main.SetActive(false);
        option.SetActive(true);
    }
 
    public void closeAll()
    {
        main.SetActive(false);
        option.SetActive(false);
    }
 
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape)) // esc를 이용해서 메뉴창을 열 수 있게 해준다.
        {
            openMain();
        }
    }
 
}
 

15 - 여러 게임 화면들을 지나면서 계속 존재해야하기 때문에 다른 scene을 load할 때 파괴되지 않도록 했다.

20~21 - 이런 식으로 SetActive()를 이용해서 상황에 알맞은 함수들을 만든다. (parameter로 true를 전달하면 눈에도 보이고 상호작용도 할 수 있지만 false를 전달하면 보이지도 않고 상호작용도 할 수 없다.)

52~55 - esc버튼을 눌렀을 때 메뉴창을 열 수 있도록 했다.

이 class는 만든 메뉴 창들을 담고 있는 canvas에 연결해준다.


3. 버튼, 함수 연결

위 사진과 같이 버튼을 클릭해서 Inspector을 열고 onClick()에 +를 누른고 나서

아까 위에서 만든 class를 넣어준 (이 사진에서는 'menu' type은 Canvas) Canvas를 넣어준다.

그리고 오른쪽에 dropDown에서 c#Script/함수를 적절히 선택해서 연결해줄 수 있다.