Unity 설정 화면 만들기

삐얅·2024년 7월 10일
0

유니티

목록 보기
9/20

1. 개요

이번 프로젝트에서 UI를 맡아서 작업하게 되었다. 이번에 설정 화면 구현이 필요해서 관련 내용을 정리해보려 한다.
사실 코딩적인 부분이 많지 않아서 이걸 정리해둬야하나 싶었는데 앞서 정리한 내용과 함께 제대로 활용하지는 않았지만 정적(?)메서드를 일단 사용해 봤기에 관련내용까지 묶어서 정리해보려 한다.

2. 일시정지

가장 먼저 만든건 메뉴 창을 열었을 때 일시정지하는 화면을 출력하는 것을 구현했다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PauseUI : MonoBehaviour
{
    [SerializeField] private GameObject pauseUI;
    [SerializeField] private GameObject optionUI;

    private void OnEnable()
    {
        Time.timeScale = 0f;
    }

    public void clickResumeBtn()
    {
        pauseUI.SetActive(false);
        Time.timeScale = 1.0f;
    }

    public void clickOptionBtn()
    {
        pauseUI.SetActive(false);
        optionUI.SetActive(true);
    }
}

그렇게 복잡한건 없고 일시정지 오브젝트가 활성화 되었을 때 게임 시간 흐름을 멈추고 버튼을 눌러 메뉴를 이동하는 것들로 구성했다.

일시정지 메뉴를 만들었으면 다음으로는 조작을 입력했을 때 일시정지 화면이 나오도록 Input System을 이용해 만들었다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class UIController : MonoBehaviour
{
    [SerializeField] private GameObject pauseUI;

    private void Start()
    {
        pauseUI.SetActive(false);
    }

    public void OnOpenUI(InputAction.CallbackContext callbackContext)
    {
        if(callbackContext.phase == InputActionPhase.Started)
        {
            Toggle();
        }
    }

    public void Toggle()
    {
        if (pauseUI.activeInHierarchy)
        {
            pauseUI.SetActive(false);
        }

        else
        {
            pauseUI.SetActive(true);
        }
    }
}

간단하게 조작을 누르면 활성화 여부를 확인해 활성화 할지 비활성화 할지를 실행하는 코드다. Invoke Unity Events를 사용했는데, Send Message보다 직관적이어서 이쪽을 더 선호하게된 느낌이다.

여기서 설정으로 들어가면 뒤로가기 버튼이 있는데, 이걸 오디오와 해상도 설정이 가지고 있는 스크립트에 작성하다보니 중복되는 느낌을 받아 UIManager를 추가했다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public static class UIManager
{
    public static void ChangeMenu(GameObject currentUI, GameObject targetUI)
    {
        currentUI.SetActive(false);
        targetUI.SetActive(true);
    }
}

정적메서드를 사용했는데, 기능 자체가 단순해서 인지 이걸 사용한 것에 대한 이점을 크게 와닿지 않는 느낌을 받았다.
추후에 UI 이미지를 전환하는 부분이 필요하면 그냥 이걸 가져다가 사용할 수 있을 수 있다는 생각이 들었다.
너무 작은 부분에서 중복도를 줄이려고 신경을 써 시간을 낭비한 느낌이 들었지만, 적어도 해당 코드를 사용할 일이 있으면 두줄이 아니라 한줄로 사용을 끝낼 수 있겠구나 생각했다.

3. 정리

기능 구현에는 문제가 없지만 작성을 마무리하고 나니 UIManager가 가지고 있는 기능이 없어 Manager로써의 제기능을 못한다는 느낌이 들었다.
Manager인 만큼 보다 집중화가 필요하다고 생각했다.
추가로 단순 활성화, 비활성화만을 담고 있어 다른 부분에 문제가 생길 수 있고, 현재 메뉴를 닫을때 플레이어 캐릭터가 공격을 취하는 문제가 있어 개선할 부분이 많아보인다.

0개의 댓글

관련 채용 정보