본문 바로가기
유니티5 독학 & 게임 제작

유니티5 독학하기 그 59번째 걸음-GameManager생성과 적용하기

by 인터넷떠돌이 2018. 7. 27.
반응형

안녕하세요?


이번 포스팅에서는 게임 매니저라는 것을 만들어서 게임의 상태가 어떤지에 대해서 일일히 지정을 하는 작업을 하였고, 그 내용을 포스팅 하고자 합니다. 



먼저 Assets>Scripts라는 폴더 안에서 GameManager.cs라는 C#스크립트를 생성 하도록 합니다.



유니티5의 모노 디벨롭을 열어서 위 스크린샷과 같이 코딩을 해 주도록 합니다.



Alt + Shift + N으로 새로운 게임 오브젝트를 계층뷰에 만든 다음에, 이름을 GameManager라고 지어 줍니다.



그리고 인스펙터 뷰에서 GameManager를 추가해 주도록 합니다.




다음으로는 enum이라고 해서 코드의 흐름을 제어할 수 있는 특별한 상수의 모음이 있는데, 게임의 상태가 현재 게임중인지, 메뉴를 보는 상태인지, 아니면 게임 오버등의 상태를 지정할 수 있게 됩니다. 이런 것을 지정하는 이유는 책에서는 크게 오타로 인한 에러를 줄이기 위해서 있다고 하는데, 실제로는 이렇게 미리 정리해 두는 것이 편하기 때문으로 보입니다.



다음으로 GameManager.cs에서 위 스크린샷과 같은 코드를 추가해 주고, Start()에 StartGame()라는 함수를 만들어 주는 것으로 유니티에서 게임을 시작하자 마자 게임의 상태가 [게임중]이 되도록 만들어 줍니다.



다음으로는 위 스크린샷과 같이 사용자 정의 함수를 만들어 주도록 하고, 그 다음에는 변수 선언 부분에서 게임이 시작하자 마자 GameState는 menu상태라는 것 선언하도록 합니다. 이렇게 해도 Start()에서 StartGame()이라는 함수를 실행 시키도록 했기 때문에, 바로 플레이어 캐릭터가 달리게 됩니다.



다음으로는 GameManager를 싱글톤(Singleton)혹은 싱글턴 클래스로 만드는 작업에 들어가게 됩니다. 이 작업을 하는 이유는 하나의 객체로 시스템 전체에 걸친 동작을 통제할 수 있다. 즉 위 코드처럼 선언을 하면, 어떤 코드에서건 간에 이 GameManager.cs에 접근할 수 있게 되는 것입니다.




여기서 public static GameManager instance; 에서 GameManager는 임의로 지정을....... 글쎄요. 가만히 보니까 왠만하면 스크립트의 이름과 같도록 지정을 해 주는 것이 좋을 것 같고, Awake()라는 메소드에서 Start()가 시작하기 바로 직전에 실행을 하는 메소드인데, instance = this; 라고 해서 바로 싱글톤 클래스로 실행을 시켜 주도록 합니다.


이런 식으로 왜 지정을 하느냐 하면, GameManager.instance.아무개; 라고 입력을 하는 것만으로도, GameManager.cs에 있는 모든 퍼블릭 함수나 변수에 접근을 할 수 있기 때문에 이런 싱글톤 클래스를 지정합니다. 물론 여기서 아무개는 당연하다면 당연하게도 GameManager.cs에 있는 퍼블릭 함수와 변수 이름이어야 합니다.



이제 PlayerController.cs에 위 스크린샷과 같은 코드를 추가해 주는데, 각각의 밑줄이 의미하는 것은 간단하게도 게임의 상태가 게임중이 아니면 점프를 하지 말고, 달리지도 말라는 의미가 됩니다. 실제로 유니티에서 플레이 버튼을 눌러보면 플레이어 캐릭터가 움직이지 않습니다. 이제 menu상태에 있는 게임을 어떻게 inGame으로 돌리기 위해서 s키를 이용할 것입니다.



여기서 사용할 함수는 Input.GetKeyDown이라고 해서 지정한 키보드의 자판이 입력이 되면, 특정한 행동을 하도록 지정을 할 수 있는 함수를 사용하는데, 이 함수는 bool형식이라고 해서, true나 false의 값을 return(반환)하게 됩니다.



이제 더 앞선 작업을 하기 위해서 먼저 Start()에 이전에 있던 것을 지우도록 합니다.



그리고 나서 시작하자 마자 currentGameState = GameState.menu; 로 타이핑을 해서 menu상태에 게임이 머무르도록 합니다. 이제 유니티5를 시작하자 마자 바로 게임의 상태가 게임중이 아니기 때문에, 키보드에서 s키를 누르면 inGame상태로 되도록 만들어 줍니다.




GameManager.cs에서 있는 Update()에 s키를 누르면 게임을 시작하는 사용자 정의 함수인 StartGame()이 실행이 되도록 위 스크린샷과 같이 코딩을 해 주도록 합니다.



이제는 다시 유니티5로 돌아가서, 이번에는 Edit>Project Settings>Input 선택하도록 합니다.



그러면 위 스크린샷과 같이 인스펙터 뷰에서 InputManager가 있는 것을 볼 수 있습니다. 먼저 위 에 있는 Axes를 열어서 Size항목이 가장 먼저 나오는데, 이를 1더했는 값으로 더 키우도록 합니다.



그리고 이름과 Positive Button을 s라고 지정을 하도록 하고, 기존에 Alt Positive button.... 이건 아마도 대체라고 해서 다른 버튼이나 입력 장치의 내용에서 값을 넣어도 같은 효과를 주라는 것 같은데, 여기서는 아예 비우도록 합니다.



마지막으로 최종 완료된 결과 입니다. 이제 유니티5에서 플레이 버튼을 누르자 마자 바로 플레이어 캐릭터가 달려 나가지 않고, 제가 s키를 누르면 움직이는 것을 볼 수 있습니다. 이것으로 챕터 10의 절반을 끝냈으며, 다음 포스팅에서는 어떻게 해서 게임오버를 구현하며, 다시 시작하는 것을 구현해 보고, 관련된 내용을 올리도록 하겠습니다.



반응형