안녕하세요?


드디어...... 드디어 이래저래 유니티 NGUI 게임 프로젝트라는 책의 챕터4가 다 끝났습니다. 이번 포스팅에서는 마지막 부분이라고 할 수 있는 이전 씬-메인 메뉴의 게임 오브젝트가 게임씬으로 옮겨가면서 원래는 다 파괴가 되는데, 그걸 막아서 다른 씬에 가서도 이 게임 오브젝트 들이 그대로 이어 지도록 만들어 주는 것 입니다.



먼저 이 작업을 위해서는 Singleton.cs라는 C# 스크립트 파일을 생성 하도록 합니다.



제일 처음에는 위 스크린샷과 같은 상태인데, 여기서 클래스 선언하는 부분-바로 이 스크립트 파일의 이름이 무엇이며, MonoBehaviour라는 부분을 변경해 주어야 합니다. 그래서 이런 작업을 위해서 아래의 스크린샷과 같이 만들어 주도록 합니다.



먼저 위 스크린샷과 같이 바꾸어 주는데, 나중에 안 사실이지만 오타를 냈었습니다. 어디가 오타이냐 하면, MonoBehaviour인데 u자 하나를 빼 먹은 것이였습니다.



그 다음에는 광역 변수로 T라는 인스턴스를 하나 선언하도록 하고, 그 다음에는 appIsClosing이라는 것도 선언을 했는데 T는 다른 것으로 변경을 해도 될 것 같으나, appIsClosing이라는 것은 어떻게 될지 모르겠다는 생각이 들어서 왠만하면 이게 앱을 종료한다는 것을 의미하는 것 같으니 변경하지 않도록 했습니다.



그 다음에는 public static T Instance{}라는 글로벌 변수라는 것을 선언한다고 합니다. 저는 이게 어째서 변수인지는 잘 모르겠습니다만, 일단 여기 안에 있는 내용으로 따지면 먼저 public이라고 선언을 해서 어디서든 접근을 할 수 있도록 T의 퍼블릭 인스턴스를 설정한다고 합니다. 그리고 이어지는 내용은 다음과 같은데....


get{ }  //오버라이드된 getter메소드를 사용한다.

if(appIsClosing){ return null; } //앱이 닫히는 중이라면 null을 반환하고 더 이상은 진행하지 않는다. 

그리고 나서 이후 앱이 닫히지 않는 조건하에서 다시 들어가는 if문은 아래와 같은 구조를 가진다고 합니다.


if (_instance == null) { _instance = (T) FindObjectOfType(typeof(T));  /*_instance가 할당되지 않았다면 씬에 이미 인스턴

                                                                                 스가 있는지 확인해 본다.*/

   if(_instance == null) { ~~~} //만약 씬에 인스턴스가 있는지 확인해 보아서 없다면? 새로 만들어라는 명령입니다.


이후에 이어지는  


GameObject 변수명 = new GameObject();

_instance = 변수명.AddComponent<T>();

변수명.name=typeof(T).ToString();


이런 식으로 해서 새로운 게임 오브젝트를 새로 생성해서 일일히 다음 씬에다가 전달을 하라는 의미가 됩니다.

그렇게 해서 씬이 바뀌더라도 부수지 말라는 의미로 DontDestroyOnLoad();라는 메소드까지 사용을 하도록 합니다.




다음으로는 Singleton.cs의 Start()에서 위 스크린샷과 같이 메소드를 또 추가해 주도록 합니다. 여기 프로그램의 의미는 책의 내용에 의하면 [씬 안의 모든 싱글톤의 인스턴스를 얻은 다음 하나 이상의 인스턴스가 존재하면, 발견된 인스턴스에 각각 체크해서 현재 인스턴스가 아니라면 파괴하고 현재 인스턴스는 DontDestroyOnLoad()로 보낸다. 라는 의미가 됩니다.



그런데 예상치 않게 에러가 떴는데, 처음에는 이게 어디서 뜬 에러인지 몰랐습니다만.......



위에서 소개를 했다 시피 u자 하나를 빼먹어서 생긴 에러였습니다.



하나 해결했더니 여러개의 다른 에러가 떴는데 모두 오타로 인한 에러라는 것이였습니다.



그래서 하는 수 없이 위 스크린샷처럼 오타를 모두 수정해야 했습니다.



마지막으로 OnApplicationQuit()라는 메소드를 만들어서 앱이 종료될때 appIsClosing = true;로 만들어 주어서 어떤 스크립트가 MenuManager.Instance가 파괴된 후에 호출해서 이상한 유령 오브젝트를 만들 수 있기에 이를 막아주는 역할을 하는데, 제가 이해를 하기로는 좀 더 깔끔한 마무리를 위해서 추가해 준다는 것으로 이해를 하였습니다.



마지막으로 이게 제대로 적용이 되기 위해서 MenuManager.cs에 있는 위 스크린샷에 보이는 MonoBehaviour를 아래의 스크린샷과 같이 바꾸어 주도록 합니다.



위 스크린샷처럼 Singleton<MenuManager>로 바꾸어 주는데, 이렇게만 해주면 MonoBehaviour를 따로 지정하지 않아도 자동으로 따라오게 됩니다.



그리고 나서 잠시 이게 왜 적용이 안되는지 몰랐는데, 그 이유가 MenuManager.cs처럼 Singleton.cs의 클래스를 소위 상속받는다고 해야 할까요? 이렇게 적용받는 스크립트라면 Start() 메소드가 있으면 서로 충돌을 일으켜서 제대로 적용이 안되는 현상이 벌어지는 것이였습니다. 그래서 굳이 Start()라는 메소드가 필요하다면, base.Start() 라고 지정을 해야만 합니다.



그렇게 해서 이제 메뉴씬에서 Play버튼을 눌러서 Game씬으로 넘어가면 위 스크린샷과 같이 나오는 것을 볼 수 있는데, 여기서 제대로 메뉴씬에 있던 게임 오브젝트들이 그대로 계승이 된 것을 볼 수 있습니다. 그런데 여기서는 환영문구가 계속 살아 있는 문제가 있는데, 이를 해결하기 위한 작업을 해야만 합니다.




먼저 메뉴씬으로 가서, UIRoot>Main>Buttons>Play라는 게임 오브젝트를 선택하도록 합니다.



다음으로는 AddComponent를 선택해서 Disappear On Click라는 컴포넌트를 추가하도록 합니다.



다음으로 Target을 환영인사 메세지인 Welcome으로 지정을 해서 없애도록 합니다.



이제서야 제대로 환영인사 메세지가 사라진 것을 볼 수 있습니다.



이것으로 유용해 보이는 자료가 많았는 유니티 NGUI 게임 프로젝트라는 책의 챕터4를 다 끝내는데 성공했습니다. 이제 챕터5를 잠시 훑어 보고서 여기서 유용한 것이 당장에 있는지 없는지를 살펴본 다음에 다음 행동을 결정해야 겠다는 생각이 듭니다. 왜냐하면 계속해서 Yukku run의 제작을 미룰 수많은 없지만, 그래도 이 책을 잠시 살펴본 이유라면 역시 씬의 전환과 같은 것이 제게도 필요하기 때문이였습니다.


+ Recent posts

티스토리 툴바