Game Programming/Game Engine

Unity3D :: state pattern source with control in Unity (유니티에서 상태 패턴 소스코드 및 컨트롤)

VallistA2016. 5. 20. 11:19

유니티에서 씬 단위로 게임을 만들때, 불편한 점은 씬 사이간의 로딩을 잡아줘야 되며 컨트롤을 다르게 하고 작업할 때 한 씬에서 공유를 못한다는 것이 있는데 이러한 문제를 해결하기 위해서 한 씬에서 모든 작업을 하고 상태패턴으로 컨트롤을 하는 방식을 꼽을 수 있겠다.


상태패턴을 사용을 하지 않고도 껏다 켯다 하는 방식으로 구현이 가능하지만. 이왕이면 이벤트 등등의 확실한 전송을 통해서 깔끔한 코딩을 해보도록 하자.


1. 먼저 아래의 소스코드 3개를 다운받는다. 그리고 프로젝트에 넣어준다.


State.cs



StateController.cs



Singleton.cs




2. State.cs


State는 무엇을 의미하는지 아는가? 바로 상태에 대해서 이야기를 한다.

위의 소스를 보면 알겠지만 굉장히 간단하게 들어가 있다.

State는 우리가 분리할 상태 클래스의 부모로 상속해주면 된다.


State를 상속한 클래스는 이제 StateController로 컨트롤 할 수 있는 영역에 들은 것이다.


3. StateController.cs


StateController는 State들에 대해서 컨트롤 하는 클래스라고 볼 수 있다.


수많은 State들이 존재할 수 있고 상대적으로 적은 State들이 존재할 수 있는데 결과적으로 게임내에서 돌아가야 할 상태는 1개가 될 것이다.

왜냐하면 Game, Menu, Title등이 존재한다고 했을 때 Game이 돌면서 Menu까지 같이 돌 이유는 없으니까 말이다 (... 혹시나 이런 사람이 있나)


결과적으로 돌아가는 원칙은 굉장히 쉽다고 볼 수 있다.

ChangeState 라는 함수를 써서 string 형으로 해당 State의 이름을 Call 하면 Hierarchy에서 등록한 State들에 대해 Awake때 Dictionary에 스크립트의 이름과 함께 등록하는 과정에서 등록한 스크립트 이름과 매칭을 하여 해당 상태를 현재 상태로 등록을 하고, 이전 상태에 대해서는 Exit 함수를 호출하고 현재 상태가 될 상태의 Init을 호출한다.


즉 끝과 시작을 지정을 할 수 있다.

끝에는 게임 씬이면 게임씬에 대해서 꺼주는 구문을 쓰면 되겠고 

시작에는 메뉴 신이면 메뉴씬에 대해서 켜주는 구문을 쓰면 되겠다.


근데 이러한 컨트롤러는 어디에서나 호출을 자유롭게 할 수 있어야 하는데, 그것이 바로 Singleton을 상속한 이유이다.


4. Singleton.cs


Singleton은 굉장히 이 블로그에서 많이 다루는 주제중에 한개인데.

Singleton은 모든 곳에서 접근 할 수 있고, 시작과 동시에 메모리를 계속 해제되지 않은채 유지되어 있고,

게임이 끝날때 같이 메모리가 해제되는 것이라고 볼 수 있다.


즉 Singleton은 많이 있을수록 안좋으며, 내부에 메모리등을 많이 먹도록 설계하면 안된다는 것이다.

양날의 검이라 볼 수 있다.


링크


위의 링크를 누르면 Unity Singleton에 대해서 이동한다.


5. 사용방법


 5.1 소스코드


SceneManager.cs

 


MenuScene.cs 






GameScene.cs


여기서 살펴볼 부분은 아래쪽의 Init을 보면 params object[] datas 쪽을 봐야한다는 것이다.

params object[] datas는 가변인자라는 것이고, 저 곳에 인자의 갯수를 무한개도 넣을 수 있고, 

배열로 호출하여 형변환 시켜 사용을 할 수 있다.

클래스, 함수 다 넣을수 있다.


MenuScene에서 버튼을 누르면 a면 true, d면 false를 넣는데 Init에서 보면 알 수 있듯 true가 넘어와야 SetActive를 보이게 해준다.

 


5.2 Project View



5.3 Hierarchy with inspector view



 여기서 중요한 점은 기존에 있던 Canvas 뷰를 꺼놓는다는 것이고,

 Game Scene에 꺼둔 Canvas를 드래그해서 넣고.

 Scene Manager에 보면 StateList에 MenuScene과 GameScene을 등록해야한다.


 Project에서 다이렉트로 꽃아넣는 사람이 있는데 이거 안된다.

 먼저 Scene inspector에 넣고, 그 다음 드래그 해야한다.

 

 5.4 실행


 a = Menu -> Game (인자 true 전달)

 s = Game -> Menu

 d = Menu -> Game (인자 false 전달)


 


A입력하여 게임씬 갔을때.



D입력하여 게임씬 갔을때



맨 처음 메뉴 씬


 5.5 프로젝트


 

Test.zip


안의 test Scene을 클릭해서 테스트 하면 된다.

댓글

댓글쓰기 폼

VallistA

병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.

자고 싶습니다. ㅠㅠ

페이스북    :: 링크
카카오톡    :: kingbye1
Github      :: 링크

궁금한점 문의 주시면 답변드리도록 하겠습니다

VISITED

Today : 19

Total : 414,365

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘