재미있는 실감미디어

꿈꾸는대로 만들어집니다.

유니티기초[유니티 기초] 32_게임매니저와 싱글톤 패턴

김혜영
2020-04-23
조회수 4256

유튜브 32 - https://youtu.be/zUcYmpskYT4


안녕하세요~ 오늘은 게임매니저의 쾨드를 싱글턴 패턴으로 작성하는 방법에 대하여 살펴봅니다. 싱글턴이 모냐구요? 싱글턴(Singleton)을 사전을 통해 확인해보면, 개체, 독신자(결혼을 안 했거나 애인이 없는 사람), (쌍둥이가 아닌) 외둥이 등의 의미인것을 볼 수 있습니다. 또 실험심리학 사전을 보면 싱글턴은 주의의 포착이 잘되는 단일한(복합적이지 않은) 특징을 말한다고 합니다. 유니티에서는 싱글턴의 의미는 어떤 오브젝트가 프로그램에 단 하나만 존재하고, 어느 곳에서도 쉽게 접근 가능한 것을 의미합니다. 무슨 의미인지는 코드를 통해 자세히 살펴보도록 하겠습니다.


우리가 지난시간까지 게임 타이틀과 게임화면, 게임 엔딩까지 잘 진행했습니다. 이제 엔딩에서 생각을 해봅니다. 점수를 출력할 때 실제로 앞의 게임화면에서 점수를 받아와서 화면에 뿌려주어야 겠지요? 다음과 같이 ScoreSetter 스크립트를 생성한 뒤, 코드를 작성합니다. 지금은 동적으로 코드를 받아오지 못합니다. 그래서 일단 임의로 10이라고 적어줍니다. 이것을 통해 앞서 게임 씬에서 점수를 받아올 필요성을 느끼게 됩니다. 게임씬에서 사용하는 점수 변수를 엔딩에서도 사용해야 하는 것이지요. 이것이 싱글턴 패턴이 필요한 이유입니다. 각 씬들은 독립적으로 움직이고, 씬이 끝나면 모두 소멸되기에 씬이 끝나도 변수가 소멸되지 않아야 하는 것이지요.


다음과 같이 ScoreSetter 스크립트를 뿌려줄 텍스트 오브젝트에 어태치하여 줍니다. EndingScoreText 변수에는 해당 텍스트 오브젝트를 등록하여 줍니다.


이제 게임씬에서 생각합니다. 다음과 같이 GameScore 변수에 임의로 10이라는 점수를 할당합니다. 게임이 진행하여 게임스코어를 획득해야 하지만, 지금은 일단 테스트를 통해 임의의 점수를 할당합니다. 그런데, GameScore의 점수가 엔딩에서 인식할까요? 안됩니다. 그래서 싱글턴이 필요한 이유입니다.


싱글턴 패턴이란 어떤 오브젝트가 프로그램에 단 하나만 존재하며, 어느 곳에서도 쉽게 접근 가능해야 할때 사용하는 것을 말합니다. 해당 점수가 어느 씬에서도 쉽게 접근 가능해야 하겠지요? 클래스에 선언된 변수들은 해당 클래스 타입의 오브젝트가 생성되면 함께 생성됩니다. 메모리 상에 멤버 변수가 오브젝트 수 만큼 존재하게 됩니다. 


그래서 메모리에 단 하나만 존재하고 모든 오브젝트가 공유할수 있도록 static 변수를 사용하게 됩니다. static 변수는 클래스 이름과 점(.) 연산자를 이용해 접근할 수 있습니다. 어떤 변수를 static 으로 선언하면 여러 오브젝트가 해당 변수 하나를 공유하게 되며, 정적 선언된 변수는 해당 타입의 오브젝트를 몇 개 생성하든 그 수에 상관없이 메모리에 하나만 존재하게 됩니다. static 변수는 해당 클래스와 관련 있지만 개별 오브젝트마타 하나씩 가지고 있는 것보다는 모든 오브젝트가 공유하는 것이 더 나을 때 사용하게 되며 이를 싱글턴이라고 합니다. 


이제 코드로 돌아와 다음과 같이 수정합니다. GameManager 타입으로 instance라는 변수를 만들고 static으로 선언했습니다. 이제 instance는 static 으로 선언되었으므로, 오브젝트를 몇 개 생성하든 그 수에 상관없이 메모리에 하나만 존재하게 됩니다. instance에는 this 를 할당하여 자기 자신, 즉 게임오브젝트를 할당합니다.


이제 엔딩씬에서 점수를 뿌려주는 코드에 다음의 코드를 작성합니다. static으로 선언된 변수는 메모리에 단 하나만 존재하고 모든 오브젝트가 공유됩니다. static으로 선언된 변수는 클래스 이름과 점(.) 연산자를 이용해 접근할 수 있게 됩니다.


게임을 확인합니다.


마지막으로 다음의 코드를 작성해봅니다. Awake( ) 메서드는 Start( ) 메서드처럼 초기 1회 자동 실행되며, 실행시점이 Start( ) 메서드보다 빠름니다. 현재 코드에서는 별 필요가 없지만… 일단 그렇구나… 하고 알고 넘어가세요^^


저는 싱글턴을 이 두책과 구글링을 통해 공부했습니다. 제가 한번에 싱글턴을 이해했을까요? 전혀 아닙니다. 두책을 꼼꼼히 보고 코드를 따라해보았습니다. 코드는 잘 작동됩니다. 하지만 현재 진행하고 있는 제 초간단 게임에 적용해서 변경하니 잘 작동하지 않군요. 코드의 상황이 달라졌으니까요… 제 코드 상황에 맞게 싱글턴을 구현하기위해.. 구글링을 하면서 제 코드를 썼다 지웠다를 반복했습니다. 시간으로 치면 책 본 시간 말고, 제 코드를 수정한 시간이 넉넉잡아 3시간 이상 되는 것 같습니다. 오늘 공유한 코드, 완성된 코드는 30줄 정도입니다. 이 코드 하나를 손에 넣기 위해 여러번 코드를 작성하고, 지우고, 뭐 그런 시간을 3시간 이상 보냈습니다. 코드는 해결했을때의 뿌듯함도 있지만 되지 않을때를 묵묵히 견뎌야 하는 인고의 시간이 필요합니다.


이게 왜 안되지? 하다가.. 다음날에는 이게 왜 되지? 이런 말도 안되는 상황이 발생합니다… 코드가 잘 될때는 내가 천재인것 같기도 하고, 코드에 적성이 맞는것 같기도 하다가… 안되면.. 난 바보구나.. 이길이 내길이 아닌가바.. 하는 좌절모드이다가… 아뭏든.. 다 그렇다는 것입니다. 어려워도 열심히 하자는 말입니다. ^^ 같이 100일 하시기로 하신분들~~~ 이 글을 보시는 분들은 여기까지 따라오신분들은 100일을 채우기로 하신분들이니… 우리 열심히 해봅시다^^ 하다보면 되겠지요^^ 


이제 앞으로 남은것은 음식이나 장애물이 떨어지면서 게임 스코어를 획득하는 일과.. 게임이 좀 더 즐겁게 배경음악이나 버튼 등에 효과음을 넣어줄 일이 남았습니다. 모두 모두 화이팅입니다^^ 다음시간에 또 만나요~~~

3 4

매일 한알의 마늘처럼 하나의 미션 수행!

동굴뛰쳐나가지 않고 매일 하나의 마늘을 먹기!!!

게임이나 VR, AR 에 유니티가 언리얼과 같이 많이 사용된다고 듣긴 했지만 나와는 관계없는 프로그램 같았습니다. 그러다가 우연한 계기로 게임 디자인을 하면서 유니티에 관심이 생겼습니다. 


자바스크립트가 유니티와 연동된다고 하니, 유니티가 매력있게 다가왔습니다. 유니티까지 활용한다면 작업 영역의 확장 뿐만 아니라 재미있는 콘텐츠를 제작할수 있겠다는 가능성이 보였습니다.


내가 기획하고, 디자인하고, 개발까지 하여 하나의 게임 앱을 만들수가 있다니! 얼마나 달콤한 유혹인지 모릅니다. 물론 수 많은 산을 넘고 에러를 넘고, 오류를 넘어야 하는 것은 각오를 해야 합니다. 그럼에도 불구하고 무척 매력적 입니다. 인고의 시간을 지나면 나는 상상력을 구현할수 있는 하나의 툴을, 도구를 장착할수 있는 것입니다. 아!이!언!맨! 처럼 말이지요!!!


카카오프로젝트 100은 게으른 저를 동기부여해 줍니다. 당장 통장에 계좌가 찍히는 일은 열심히 하게 되지만, 새로운것을 공부할 때는 의지가 참 약해지고 용두사미가 됩니다. 그런 의미에서 카카오프로젝트 100은 100일동안 의지를 불태울수 있는 작은 동기가 됩니다. 카카오프로젝트 시즌1에서는 자바스크립트 기초를 정리했습니다. 

시즌 2에서는 새로운 공부를 도전합니다. 바로 유!니!티!


여러분 생각은 어떤가요?

top