지우너
[Unity 3D Run] 해상도 설정 본문
게임을 실행하면 보이는 맨 처음 화면에서 게임 종료 버튼을 누르면 게임이 꺼지도록 만들고 싶었다.
Application.Quit ()
게임 종료하기 / Application.Quit() - 네이버 블로그
Create-a-Game-Source/Episode 25/Menu.cs
그리고 다음으로 메이플 사운드 옵션을 참고해서 게임의 설정을 바꿀 수 있는 옵션 창을 만들었다.
UI에 패널을 추가해서 Options라고 이름을 바꿔줬다.
슬라이더랑 텍스트를 추가해서 텍스트를 슬라이더의 자식으로 넣었다.
슬라이더의 이름을 Volume으로 바꾸고, 텍스트의 이름을 VolumeText로 변경했다.
볼륨 조정은 사용자가 직접 할 수 있어야 하기 때문에 Slider의 Interactable을 기본설정(체크된 상태)으로 뒀다.
Fill Area와 Handle Slide Area의 좌우 여백을 모두 0으로 설정해서 끝까지 왔다갔다 할 수 있도록 변경해줬다.
UI>toggle을 추가해서 이름을 Mute로 바꾸고 text를 음소거로 바꾼 뒤, Slider의 자식으로 넣어줬다.
만든 슬라이더를 복붙해서 배경음과 효과음을 만들었다.
해상도는 드롭다운을 이용해서 구현하고 싶었다.
[Unity Basic Skills] 14. UGUI Interactable - Dropdown
간단한 해상도 변경 옵션을 만들어본다. & DropDown
모니터가 지원하는 해상도는 Screen.resolutions라는 배열에 들어있다. AddRange함수를 이용해서 지원하는 함수를 전부 리스트에 넣어준다.
resolution.width:너비, resolution.height:높이, resolution.refreshRate:모니터의 화면재생빈도
On Value Changed에 +를 클릭해서(On Click처럼) Canvas를 드래그해주고 방금 만든 DropboxOptionChange 함수를 선택해준다.
이제 resolutionNum값을 이용해서 적절한 해상도 값을 리스트에서 가져와서 사용할 것이다.
처음 실행하면 Dropdown에 선택된 값이 초기화되어 있지 않으니 현재 해상도의 값과 해상도 목록을 비교해서 Dropdown에 value값을 변경해주겠습니다.
if (item.width == Screen.width && item.height ==Screen.height)
{
resolution
}
그리고 해상도 값을 가져올 때 화면 재생 빈도가 60인 값만 가져와서 목록에 넣어 줄 겁니다 해상도들을 리스트에 넣는 코드는 지워주고 반복문과 조건문을 이용해서 화면 재생 빈도 가 60인 값만 리스트에 넣어 주게끔 코드를 적어줍니다
그리고 메서드를 1개 생성하고 이것을 확인 버튼에 연결해서 확인 버튼이 눌리면 변경한 해상도로 적용이 되게끔 만들어 주겠습니다. 해상도를 종료하는 방법은 Screen 클래스의 SetResolution 함수를 통해서 가능합니다.
Screen.SetResolution(너비, 높이, 전체화면, 화면재생빈도)
순서대로 너비 높이 전체 화면모드 화면 재생 빈도 값을 넣어주면 되는데, 지금은 앞에 세 개 값만 넣어서 바꿔 주겠습니다. 전체 화면 모드는 참, 거짓만 넘겨 줘도 되지만 지금은 FullScreenMode 열거형을 사용해 주겠습니다
FullScreenMode screenMode;
다음은 토글 버튼의 연결해 줄 메소드를 1개 생성하고, 매개 변수를 bool형을 넣어준다.
public void FullScreenBtn(bool isFull) { }
그리고 isFull이 참이면 screenMode를 전체화면으로 거짓이면 창으로 바꿔줍니다.
screenMode = isFull ? FullScreenMode.FullScreenWindow : FullScreenMode.windowed;
그리고 토글 버튼의 isOn을 initUI()에서 현재 스크린이 전체 화면인지 확인 후 참 또는 거짓으로 표기와 시켜줍니다. Canvas에 어태치된 UI 스크립트 변수에 토글 버튼 오브젝트를 넣어 주고 토글 버튼 컴포넌트 On Value Change도 FullScreenBtn() 메서드를 연결해줍니다.
<최종으로 만든 옵션 화면의 모습>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class TitleUI : MonoBehaviour
{
// +++ 타이틀 / 옵션 패널 오브젝트 변수 +++
public GameObject title;
public GameObject options;
// +++ 해상도 관련 변수 +++
// FullScreenMode 열거형
FullScreenMode screenMode;
public Toggle fullScreenBtn;
// options에 값을 넣어주려면 Dropdown 변수를 선언해줘야 한다.
public Dropdown resolutionDropdown;
// DropboxOptionChange(int x)에서 x
int resolutionNum;
// 지원하는 해상도를 넣어줄 리스트 생성
List<Resolution> resolutions = new List<Resolution>();
// 게임 스타트를 누르면 스테이지 선택 씬으로 넘어감
// 스테이지 선택씬의 이름을 담는 변
public string selectStage;
// Start is called before the first frame update
void Start()
{
options.SetActive(false); // 패널숨기기
InitUI();
}
void InitUI()
{
// 모니터가 지원하는 해상도는 Screen.resolutions라는 배열에 들어있다.
// AddRange함수를 이용해서 지원하는 함수를 전부 리스트에 넣을 수 있다.
// resolutions.AddRange(Screen.resolutions);
// 화면재생빈도가 60인 것만 리스트에 넣어주기
for (int i = 0; i < Screen.resolutions.Length; i++)
{
if (Screen.resolutions[i].refreshRate == 60)
resolutions.Add(Screen.resolutions[i]);
}
// Dropdown에 있는 기존의 옵션을 전부 제거
// options는 리스트이기 때문에 리스트의 Clear()함수를 사용하여 전부 제거할 수 있다.
resolutionDropdown.options.Clear();
int optionNum = 0;
// 반복문에서 가져온 해상도의 개수만큼 반복하면서 option 추가
foreach (Resolution item in resolutions)
{
// options list의 형식은 OptionData 클래스로 되어 있다 -> OptionData 객체를 생성
Dropdown.OptionData optionData = new Dropdown.OptionData();
// OptionData의 text 변수에 해상도 값을 넣어준다.
optionData.text = item.width + "x" + item.height + " " + item.refreshRate + "hz";
// options list에 추가
resolutionDropdown.options.Add(optionData);
// 처음 실행하면 Dropdown에 선택된 값이 초기화되어 있지 않으니
// 현재 해상도의 값과 해상도 목록을 비교해서 Dropdown에 value값을 변경
if (item.width ==Screen.width && item.height == Screen.height)
{
resolutionDropdown.value = optionNum;
}
optionNum++;
}
// Dropdown의 options가 변경되었으니 새로고침 함수를 불러준다.
resolutionDropdown.RefreshShownValue();
// 현재 전체화면인지 아닌지 확인 후 토글 버튼의 체크 버튼을 초기화
// 창모드라면 창모드 토글에 체크
fullScreenBtn.isOn = Screen.fullScreenMode.Equals(FullScreenMode.Windowed) ? true : false;
}
// Dropbox의 value값을 이용하여 현재 선택된 해상도를 적용할 수 있게 하는 메서드
public void DropboxOptionChange(int x)
{
resolutionNum = x;
}
// TitleUI Input
// START 버튼을 누르면 stage 선택창으로 이동
public void OnClick_Start()
{
SceneManager.LoadScene(selectStage);
}
public void OnClick_Options()
{
options.SetActive(true); // Options 패널 활성화
}
// Title에서 QUIT버튼을 누르면 게임 종료
public void OnClick_Quit()
{
Application.Quit();
}
//OptionUI Input
// 창모드 토글 버
public void FullScreenBtn(bool isFull)
{
// 참이면 창모드 / 거짓이면 전체화(
screenMode = isFull ? FullScreenMode.Windowed : FullScreenMode.FullScreenWindow;
}
// 오른쪽 아래 확인 버튼
public void OnClick_Agree()
{
// Screen.SetResolution(너비, 높이, 전체화면, 화면재생빈도)
// 전체화면모드는 참 거짓만 넘겨줘도 되지만, 여기서는 FullScreenMode 열거형을 사용했다.
Screen.SetResolution(resolutions[resolutionNum].width,
resolutions[resolutionNum].height,
screenMode);
options.SetActive(false); // 패널숨기기
}
}
영상을 보고 위와 같이 코드를 짰는데, 창모드 토글 체크 여부에 따라 창모드 전환이 안 된다.
해상도 변경은 정상적으로 이루어지는데, 창모드 설정만 생각처럼 안 되어서 그 부분만 코드를 조금 수정하면 좋을 것 같다.
Unity Create a Game Series (E24. Menu)
Create-a-Game-Source/Episode 24/Menu.cs
유니티 UI - PlayerPrefs로 드롭다운 목록 관리하기 (Control TextMeshPro Dropdown with PlayerPrefs)
위의 깃허브, 블로그를 보면서 수정한 코드
// Title.cs
void Awake()
{
// PlayerPrefs.SetInt("screen rex index", resolutionNum);
resolutionNum = PlayerPrefs.GetInt("screen res index");
// PlayerPrefs.SetInt("WindowMode", ((isWindow) ? 1 : 0));
bool isWindow = (PlayerPrefs.GetInt("WindowMode") == 1) ? true : false;
windowModeToggle.isOn = isWindow;
}
//OptionUI Input
// 창모드 토글 버튼
public void WindowModeBtn(bool isWindow)
{
// 참이면 창모드 / 거짓이면 전체화면
screenMode = isWindow ? FullScreenMode.Windowed : FullScreenMode.FullScreenWindow;
PlayerPrefs.SetInt("WindowMode", ((isWindow) ? 1 : 0));
PlayerPrefs.Save();
}
// 오른쪽 아래 확인 버튼
public void OnClick_Agree()
{
// Screen.SetResolution(너비, 높이, 전체화면, 화면재생빈도)
// 전체화면모드는 참 거짓만 넘겨줘도 되지만, 여기서는 FullScreenMode 열거형을 사용했다.
Screen.SetResolution(resolutions[resolutionNum].width,
resolutions[resolutionNum].height,
screenMode);
PlayerPrefs.SetInt("screen rex index", resolutionNum);
PlayerPrefs.Save();
// 옵션 패널 끄고 타이틀 패널 열기
options.SetActive(false);
title.SetActive(true);
}
해상도 설정은 저장되는 것 같은데, 창모드 토글이 작동도 제대로 안 되고, 저장도 안 되는 것 같다.
enum FullScreenMode
구글번역
- ExclusiveFullScreen
Windows 플랫폼 전용. 디스플레이를 전체 화면에서만 사용할 수 있도록 애플리케이션을 설정합니다. FullScreenMode.FullScreenWindow와 달리 이 모드는 디스플레이의 운영 체제 해상도를 애플리케이션이 선택한 해상도와 일치하도록 변경합니다. Windows 이외의 플랫폼에서 이 모드는 FullScreenMode.FullScreenWindow로 돌아갑니다.
- FullScreenWindow
모든 플랫폼. 응용 프로그램 창을 전체 화면을 포함하는 전체 화면 기본 디스플레이 해상도로 설정합니다. 이 전체 화면 모드는 '테두리 없는 전체 화면'이라고도 합니다. Unity는 스크립트에 의해 설정된 해상도 또는 해상도가 설정되지 않은 경우 기본 디스플레이 해상도로 응용 프로그램을 렌더링하고 창을 채우도록 응용 프로그램의 크기를 조정합니다. Unity는 렌더링된 출력에 검정색 막대('레터박스')를 추가하여 콘텐츠가 늘어나는 것을 방지합니다. IME(입력기) 창과 같은 운영 체제의 오버레이 UI는 전체 화면 창 위에 표시됩니다.
- MaximizedWindow
macOS 플랫폼 전용. 응용 프로그램 창을 숨겨진 메뉴 표시줄과 도크가 있는 전체 화면 창인 운영 체제의 최대화 정의로 설정합니다. macOS 이외의 플랫폼에서 이 모드는 FullScreenMode.FullScreenWindow로 대체됩니다.
- Windowed
데스크톱 플랫폼 전용. 응용 프로그램을 전체 화면이 아닌 이동 가능한 표준 창으로 설정합니다. 창의 크기는 애플리케이션의 해상도에 따라 다릅니다.
토글 강좌 (고박사의 유니티 노트)
다른 블로그나 영상에서는 토글의 on value changed 안에 체크박스가 없었는데, 나는 있길래 토글 공부가 부족해서 모른다고 생각, 토글만 다룬 강의를 찾아봤다. 근데 여기도 없어서 기존에 있던 on value changed를 지우고, 다시 만들었다. 그랬더니 체크박스가 사라졌고, 빌드&런 해보니 제대로 전체화면 토글이 작동했다.
코드는 크게 변경한 점은 없는데, 토글을 누를 때마다 PlayerPrefs에 값을 변경하는 것보다 확인을 누르고 값을 변경했을 때 그 값을 저장하는 게 유의미하다고 느껴졌다. 그래서 확인 버튼을 눌러 해상도 설정을 변경했을 때만 PlayerPrefs의 값을 수정하도록 코드의 위치를 변경했다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class TitleUI : MonoBehaviour
{
// +++ 타이틀 / 옵션 패널 오브젝트 변수 +++
public GameObject title;
public GameObject options;
// +++ 해상도 관련 변수 +++
// FullScreenMode 열거형
FullScreenMode screenMode;
// 창모드 여부
bool isWindow;
public Toggle windowModeToggle; // 창모드 토글
// options에 값을 넣어주려면 Dropdown 변수를 선언해줘야 한다.
public Dropdown resolutionDropdown;
// DropboxOptionChange(int x)에서 x
int resolutionNum;
// 지원하는 해상도를 넣어줄 리스트 생성
List<Resolution> resolutions = new List<Resolution>();
// 게임 스타트를 누르면 스테이지 선택 씬으로 넘어감
// 스테이지 선택씬의 이름을 담는 변수
public string selectStage;
void Awake()
{
// PlayerPrefs.SetInt("screen rex index", resolutionNum);
resolutionNum = PlayerPrefs.GetInt("screen res index");
// PlayerPrefs.SetInt("WindowMode", ((isWindow) ? 1 : 0));
isWindow = (PlayerPrefs.GetInt("WindowMode") == 1) ? true : false;
windowModeToggle.isOn = isWindow;
}
void Start()
{
// 옵션 패널숨기기
options.SetActive(false);
InitResolutionDropdown();
}
// 해상도 드롭다운의 값을 모니터 지원 해상도 값 목록으로 초기화해주는 함/
void InitResolutionDropdown()
{
// Dropdown에 있는 기존의 옵션을 전부 제거
// options는 리스트이기 때문에 리스트의 Clear()함수를 사용하여 전부 제거할 수 있다.
resolutionDropdown.options.Clear();
// 모니터가 지원하는 해상도는 Screen.resolutions라는 배열에 들어있다.
// AddRange함수를 이용해서 지원하는 함수를 전부 리스트에 넣을 수 있다.
// resolutions.AddRange(Screen.resolutions);
// 화면재생빈도가 60인 것만 리스트에 넣어주기
for (int i = 0; i < Screen.resolutions.Length; i++)
{
if (Screen.resolutions[i].refreshRate == 60)
resolutions.Add(Screen.resolutions[i]);
}
int optionNum = 0;
// 위에서 지원하는 해상도를 resolutions 리스트에 넣었다
// 리스트의 길이 만큼 반복하면서 option 추가
foreach (Resolution item in resolutions)
{
// options list의 형식은 OptionData 클래스로 되어 있다 -> OptionData 객체를 생성
Dropdown.OptionData optionData = new Dropdown.OptionData();
// OptionData의 text 변수에 해상도 값을 넣어준다.
optionData.text = item.width + "x" + item.height + " " + item.refreshRate + "hz";
// options list에 추가
resolutionDropdown.options.Add(optionData);
// 처음 실행하면 Dropdown에 선택된 값이 초기화되어 있지 않으니
// 현재 해상도의 값과 해상도 목록을 비교해서 Dropdown에 value값을 변경
if (item.width ==Screen.width && item.height == Screen.height)
{
resolutionDropdown.value = optionNum;
}
optionNum++;
}
// Dropdown의 options가 변경되었으니 새로고침 함수를 불러준다.
resolutionDropdown.RefreshShownValue();
// 현재 전체화면인지 아닌지 확인 후 토글 버튼의 체크 버튼을 초기화
// 창모드라면 창모드 토글에 체크
// windowModeToggle.isOn = Screen.fullScreenMode.Equals(FullScreenMode.Windowed) ? true : false;
}
// Dropbox의 value값을 이용하여 현재 선택된 해상도를 적용할 수 있게 하는 메서드
public void DropboxOptionChange(int x)
{
resolutionNum = x;
}
// TitleUI Input
// START 버튼을 누르면 stage 선택창으로 이동
public void OnClick_Start()
{
SceneManager.LoadScene(selectStage);
}
public void OnClick_Options()
{
// Options 패널 활성화, title 패널 끄기
options.SetActive(true);
title.SetActive(false);
}
// Title에서 QUIT버튼을 누르면 게임 종료
public void OnClick_Quit()
{
Application.Quit();
}
//OptionUI Input
// 창모드 토글 버튼
public void WindowModeBtn(bool isWindowOn)
{
// 버튼이 클릭되면 isWindow 변수를 변경
isWindow = isWindowOn;
// 참이면 창모드 / 거짓이면 전체화면
screenMode = isWindow ? FullScreenMode.Windowed : FullScreenMode.FullScreenWindow;
}
// 오른쪽 아래 확인 버튼
public void OnClick_Agree()
{
// Screen.SetResolution(너비, 높이, 전체화면, 화면재생빈도)
// 전체화면모드는 참 거짓만 넘겨줘도 되지만, 여기서는 FullScreenMode 열거형을 사용했다.
Screen.SetResolution(resolutions[resolutionNum].width,
resolutions[resolutionNum].height,
screenMode);
// 해상도랑 창모드를 PlayerPrefs에 저장
PlayerPrefs.SetInt("screen rex index", resolutionNum);
PlayerPrefs.Save();
PlayerPrefs.SetInt("WindowMode", ((isWindow) ? 1 : 0));
PlayerPrefs.Save();
// 옵션 패널 끄고 타이틀 패널 열기
options.SetActive(false);
title.SetActive(true);
}
}
앞으로 해야 할 것: 사운드, 캐릭터의 점프 구현, 스테이지 선택 화면
있으면 좋겠다 싶은 기능: 캐릭터 모양 선택(캡슐, 큐브, 구 등), 사망 애니메이션(죽으면 부서지는 것 같은 느낌으로)
'Project' 카테고리의 다른 글
[Unity 3D Run] (아직 못함) 캐릭터를 가리는 오브젝트의 투명도 처리 (0) | 2023.05.27 |
---|---|
[Unity 3D Run] 게임오버/클리어 UI (3) (1) | 2023.03.25 |
[Unity 3D Run] 게임오버 UI (2) 공부+약간 수정 (0) | 2023.03.21 |
[Unity 3D Run] 게임 오버 UI(1) (0) | 2023.03.16 |
[Unity 3D Run] 장애물 충돌 설정 (0) | 2023.03.13 |