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/함수를 적절히 선택해서 연결해줄 수 있다.