정지 화면

옵션 화면

Unity 5.2로 '유니티 5.x 게임 개발의 시작' 2. GUI 만들기 따라하기.

이전 만든 1장의 슈팅게임에 추가하는 방식으로 계속.

* 텍스트 해상도 따라 크기 적절하게 보이게 하기:
Canvas 선택, Canvas Scaler에서 UI Scale Mode를 Scale With Screen Size로 변경해 주고 Refernce Resolution: 800/600으로 설정하면 해상도에 따라 텍스트를 적절하게 보이게 해준다.

* 버튼 추가:
Hierarchie탭에서 Canvas에 마우스 우클릭, UI/Button 선택하여 Canvas 아래에 버튼 새로 생성, 'StartButton'으로 명명한 뒤 선택하고 Inspector창에서 Anchor Preset 메뉴를 열어 Bottom-Stretch 선택(Pos X, Width가 각각 Left, Right로 변화한다).
Left/Right: 300/300으로, Pivot Y: 0, Pos Y: 100으로 설정하여 오브젝트 중심에서 좌우로 300픽셀 떨어지게, 화면 하단에서 100픽셀만큼 떨어지게 한다. 자식인 Text 선택, Text: Start Game으로, Font Size: 25로 설정.

StartButton 선택, Button(Script) 컴포넌트에서 Transition: Color Tint에서 Sprite Swap으로 변경, Highlighted Sprite, Pressed Sprite, Disabled Sprite에 각각 마우스가 버튼 위에 올라왔을 때, 눌렸을 때, 사용되지 않을 때에 해당되는 png 파일을 넣는다. Image(Script) 컴포넌트 Source Image에 기본이 되는 버튼 png 파일을 넣고 Image Type: Sliced로 설정한다.

이 버튼 png들을 Project 창에서 선택, Texture Type: Sprite(2D and UI)를 선택하고 Sprite Editor 버튼을 눌러 편집 모드로 들어간 뒤 Border L/R/T/B: 10/10/10/10으로 설정하여 이미지가 늘어나도 변하지 않을 4 모서리 부분을 설정한 뒤 Apply 적용.
완성된 StartButton을 선택, Ctrl-D로 복제한 뒤 'ExitButton'으로 이름 변경, Pos Y: 50으로, Text의 내용 'Exit Game'으로 변경.
버튼 이미지 때문에 http://acornpub.co.kr/book/unity5-game-blueprints에서 책의 예제 파일들을 다운받다.

* 버튼 클릭시 처리:
빈 게임오브젝트 새로 생성, 'MainMenuBehavior'라 명명, 새로 mainMenuBehavior.cs 생성, 새 레벨 불러오는 함수인 LoadLevel(string levelName), 플레이/앱 종료 함수인 QuitGame() 함수 추가. 책에선 UnityEngine.SceneManagement를 using으로 추가하고 SceneManager.LoadScene (levelName);로 하고 있는데 내 유니티 5.2 버전엔 해당 라이브러리가 없어 Application.LoadLevel (levelName);로 대체.
StartButton 선택, Button(Script) 컴포넌트 On Click()에서 +를 눌러 추가한 뒤 mainMenuBehavior.cs, LoadLevel(string levelName) 함수 차례로 선택, 매개변수에 불러올 Scene 이름을 적어준다.
ExitButton 선택, Button(Script) 컴포넌트 On Click()에서 +를 눌러 추가, mainMenuBehavior.cs, QuitGame() 함수 차례로 선택.

* 버튼 prefab 화 하기:
StartButton 선택, Ctrl-D로 복제한 뒤 'ButtonPref'로 이름 변경, Button(Script) 컴포넌트 On Click()에서 - 클릭해 선택된 함수 없애고 Project창으로 끌어 Prefab으로 변경한다. ButtonPref 선택한 뒤 Inspector 창에서 Anchor Preset 메뉴를 열어 Center-Center 선택, Width: 150으로 설정.

* 게임 중 정지, 메인메뉴로 돌아가기, 게임 끝내기 메뉴가 나오는 패널 추가:
Shooting1 씬의 Canvas 선택, UI/Panel 선택하여 새 패널 추가, 'PausePanel'이라 명명, Anchor Preset 메뉴를 열어 Center-Center 선택, Width/Height: 150/150으로 설정. Canvas 오브젝트 선택 뒤 Canvas Scaler의 UI Scale Mode: Scale with Screen Size로, Rendering Resolution: 800/600으로 설정.
PausePanel 선택, Vertical Layout Group 컴포넌트 추가하고 모든 방향 Padding, Spacing을 10으로 설정. 프리팹화한 ButtonPref을 자식으로 넣고 Ctrl-D로 2개 더 추가. 각각의 텍스트를 'Resume', 'Main Menu', 'Exit Game'으로 변경.
빈 게임오브젝트 새로 생성, 'PauseMenuBehavior'라 명명, 새로 pauseMenuBehavior.cs 생성(mainMenuBehavior.cs의 상속을 받게 설정.), 게임을 멈출지 여부를 결정하는 코드, 게임을 다시 실행하는 ResumeGame()함수 추가.
게임 정지시 플레이어도 중지시키기위해 playerBehavior.cs의 Update()함수의 내용을
if (!pauseMenuBehavior.isPaused){}로 감싸는 형태로 수정한다.
PausePanel의 버튼들 Button(Script)의 OnClick()에 +로 PauseMenuBehavior 선택한 뒤 각각 ResumeGame(), LoadLevel(), GuitGame()함수를 적용.
PausePanel을 비활성화 시켜 둔다.
esc키를 누르면 포즈 메뉴가 뜨고 해당 버튼을 누르면 게임 재개, 메인 메뉴 화면으로 돌아가기, 게임 끝내기가 실행된다.

-현재 다른건 다 제대로 작동하는데 메인메뉴로 돌아갔다가 다시 게임을 시작하면 게임이 멈춘 상태에서 진행이 안되는 버그가 있다. pauseMenuBehavior.cs의 Static 변수인 isPaused가 초기화되지 않아 발생하는 문제인걸로 보이는데 다시 esc키를 눌러 나타나는 메뉴에서 Resume을 선택하면 다시 움직인다. 완전히 해결되진 않은 상태.
시간을 다시 원래대로 흐르게 하는 Time.timeScale = 1; 코드를 mainMenuBehavior.cs의 LoadLevel()함수 앞에 넣어주자 해결됐다. 이후 Restart시의 문제도 동일한 방법으로 해결.

* Option 패널 추가하고 슬라이더로 볼륨 조절, 버튼으로 랜더링 퀄리티 조절하기:
PausePanel에 Option 버튼 추가하고 PausePanel 선택 뒤 Ctrl+D로 복제, 'OptionPanel'이라 명명.
pauseMenuBehavior.cs에 랜더링 퀄리티 증감과 표시, 볼륨 조절과 표시용 함수, 기본 포즈 메뉴와 옵션 메뉴 각각을 보이고 사라지게 하는 함수들 코드 추가.
Slider 추가하고 On Value Changed에 +로 추가하고 pauseMenuBehavior의 SetVolume() 함수 선택.
- 현재 패널안 Vertical Layout Group, Horizontal Layout Group의 설정이 제대로 되지 않은 듯 보기좋게 들어가지 않고 삐죽삐죽하다.
어쨋건 2장 GUI만들기 따라하기 완료.

17/8/30 수