[Unity3D 액션 게임 제작기] 2. 그래픽 설정 변경
이번 목표
요약하자면 이것이 되게 하자.
액션 게임 만든다면서 뜬금없이 설정 창부터 만드는 의식의 흐름...
설정 창은 여태 만들어본 적이 없어서 유니티 기본 그래픽 설정 변경에 대해 알아볼 겸 먼저 만들어보게 되었다.
Web GL이 기본적으로 전체화면 취소 버튼에 Escape가 할당되어 있어서 그런지 Escape 버튼이 조금 오락가락한다. Web GL에서 테스트하는데 한 번 눌러서 작동하지 않는다면 두세 번 눌러보자.
보면 단축키 탭도 있는데 이건 지금 하기엔 키 할당 되어있는 기능도 거의 없어서 나중에 한다.
이거 만드는 과정에서 UI 관련하여 꽤 공을 많이 들였는데 글로 작성하려니 재미도 없고 시간도 오래 걸리고 쓸데없는 내용만 길어져서 생략했다.
WebGL에서 직접 조작해보고 깃허브 코드 보면서 궁금한 게 있다면 언제든지 질문 바란다.
일단 언급만 해두자면...
- 켜진 캔버스는 Escape 버튼(ESC)으로도 닫을 수 있다. 여러 개 켜져 있으면 역순으로 꺼진다.
- 그래픽 설정은 변경해도 바로 반영되지 않는다. 적용 버튼을 눌러야 한다. 변경한게 있는데 그냥 닫으려 하면 경고하고 적용 버튼을 누르면 15초 안전장치가 마련되어 있다.(단, Web GL은 해상도 및 전체 화면 여부 변경이 플레이어 내에서 불가하다.)
- 사운드 및 게임플레이 관련 설정은 수치를 조절하면 즉시 반영 및 저장된다.
- 주변에 들어가면 BGM이 재생되는 핑크색 박스가 3개 있다. BGM 재생 및 페이드 교체 테스트 용도로 만들었다.
esc를 누르면 나오는 일시정지 창.
재시작은 뭔가 허전해서 넣었다.
종료는 Web GL 플랫폼에선 비활성화되도록 해놓았다. 다른 플랫폼에선 작동한다.
설정을 들어가자
탭은 심플하게 구성.
설정에서 건든 것은 다음에 게임을 다시 켜도 저장되어있어야 하므로 PlayerPrefs에서 데이터를 관리한다.
좌상단의 디버깅용 저장 값 초기화 버튼은 그걸 초기화시켜준다.
개발 도중 값의 사용처가 바뀐다든가 등의 이유로 이전 값이 그대로 오면 난감한 경우 사용하기 위함이다.
UI 배경을 반투명으로 하니 일시정지 창이랑 겹쳐서 별로 이뻐 보이진 않는데 그래픽 변화를 보다 잘 보이게 하기 위해 그냥 반투명으로 뒀다.
그래픽은 애초에 신경 쓰지 않기로 했으니 미관 문제는 넘어가자
그래픽 설정에서 변경 가능한 부분은 해상도, 전체 화면, 주사율, 텍스처, 그림자, 안티앨리어싱, 수직 동기화, 비등방성 필터링이 있다.
이 설정들이 선정된 이유를 묻는다면
별거 없다. 그냥 Unity 퀄리티 세팅에서 변경 가능한 옵션들이 위와 같다. (해상도나 주사율 등은 퀄리티 세팅과 무관하지만 디스플레이 영역도 그냥 포함했다)
디테일한 설정들은 제외하고 다른 게임에서도 흔히 볼 수 있는 대표 그래픽 요소들만 가져왔다.
여기서 더 많은 요소를 조정하고 싶다면 PostProcessing이나 쉐이더 요소를 건드릴수 있는 옵션이 있으면 좋겠지만 이 프로젝트는 그래픽을 신경 쓰지 않으니 넘긴다.
위에 나열한 그래픽 설정 요소들은 전부 유니티 API로 변경이 가능하다.
//그래픽 설정 변수
private static int resolutionWidth; //해상도 너비
private static int resolutionHeight; //해상도 높이
private static int fullScreenMode; //전체 화면 //0: 전체화면, 1: 전체 창보드, 3: 윈도우 (2도 전체 창모드이나 MAC 전용이라 제외)
private static int framerate; //주사율
private static int textureQuality; //텍스처 //0 ~ 2, 0이 제일 고해상도 텍스처 사용
private static int shadowQuality; //그림자 //0 ~ 3, 3이 제일 고해상도 텍스처 사용
private static int antiAliasing; //안티앨리어싱 //0: 안함, 2: x2, 4: x4, 8: x8
private static int vSync; //수직동기화 //0: 끄기, 1: 켜기
private static int anisotropicFiltering; //비등방성 필터링 //0: 끄기, 2: 켜기
//그래픽 변경 적용
Screen.SetResolution(resolution.Item1, resolution.Item2, (FullScreenMode)fullScreenMode);
Application.targetFrameRate = framerate;
QualitySettings.masterTextureLimit = textureQuality;
if (shadowQuality == -1)
{
QualitySettings.shadows = UnityEngine.ShadowQuality.Disable;
QualitySettings.shadowResolution = ShadowResolution.Low;
}
else
{
QualitySettings.shadows = UnityEngine.ShadowQuality.All;
QualitySettings.shadowResolution = (ShadowResolution)shadowQuality;
}
QualitySettings.antiAliasing = antiAliasing;
QualitySettings.vSyncCount = vSync;
QualitySettings.anisotropicFiltering = (AnisotropicFiltering)anisotropicFiltering;
변수로 위와 같이 두고 적용은 아래와 같이 둔다.
resolutionWidth과 resolutionHeight는 각각 resolution.Item1, resolution.Item2에 대응한다.
해당 코드를 참고하면 해상도는 튜플 리스트를 두고 사용하고 있어서 Item1, 2라는 이름을 사용한다.
나머지 옵션에 대해선 변수 옆에 적어둔 주석을 참고하자.
특이사항으로 그림자의 경우 끄는 기능도 있어야 하므로 추가 처리를 해주었다.
위 값들은 값이 변하면 실시간으로 그래픽에 변화가 생기는 것을 확인할 수 있다.