GameManager 게임매니저 클래스
유니티에서는 전체 게임의 실행을 담당하는 GameManager 클래스를 지원하고 있다. GameManager 클래스와 관련해서 몇가지 공부했던 내용을 정리하려고 한다.
전역 변수 선언 과정에서 다음과 같은 내용을 확인할 수 있다.
[HideInInspector]는 어트리뷰트 종류 중 하나로, 한 칸 바로 밑에 있는 변수를 숨기는 역할을 한다. 마찬가지로 이와 비슷한 역할을 하는 [System.NonSerialized]는 유니티 에디터 자체에서 저장하지 않으므로 외부에 노출이 되지 않는 역하을 한다.
멀티 플랫폼으로 C#과 .NET의 역할, 컴파일(Compile)과 IL(Intermediate Language), dll 파일
C# 문법을 사용하다 보면 Serialize를 종종 사용하곤 한다. 특히, 변수 선언 과정에서 다음과 같은 Serialize 어트리뷰트를 사용하는데 그 역할을 이해하기 위해서는 C#과 .NET의 특징을 먼저 살펴볼 필요가 있다.
마이크로소프트(Microsoft)에서 제공하는 .NET 생태계는 Andoid, iOS 등등 멀티 플랫폼에 대응하기 위해 만들어진 크로스 플랫폼 기능을 제공한다. 여기서 사용하는 언어인 C#은 Low-Level-Language로 사용자 친화형 언어를 의미한다. 그렇기 때문에 언어적 난이도도 높지 않고, 유연하며, 유저 친화적인 서비스를 제공하고 있다.
우리가 유니티 에디터에서 플레이를 실행하면 Compiler가 구동된다. 컴파일러가 하는 컴파일(Compile) 작업은 인간이 작성한 C# 코드를 기계가 실행할 수 있는 언어(C++ 등)로 전환(번역)하는 작업을 의미한다. 이러한 기계어는 High-Level-Language로 컴퓨터(기계) 자체에 친화적인 언어라고 생각하면 되겠다.
이렇게 C#과 .NET 생태계가 제공하는 멀티 플랫폼은 유니티의 최대 장점 중 하나라고 볼 수 있다. 하지만 여러 플랫폼에서 대응하다보니 대상 플랫폼 별로 실행해야하는 문법이 조금씩 달라서 문제가 발생하기도 한다.
유니티에서는 멀티 플랫폼에 대응하기 위해 안드로이드 또는 iOS 등등 다른 플랫폼에 필요한 언어 확장자로 미리 변환해 두고, 그때그때 명령이 떨어지면 실행하는 방법으로 이러한 문제에 유연하게 대응하고 있다. 이럴 때 C#을 번역해둔 언어를 Intermediate Language(IL), 중간 언어(확장자명 .dll)라고 부른다.
유니티는 C# 파일을 IL로 컴파일해서 나온 .dll 파일을 메모리에 올려두어 사용한다. 그리고 Serialize는 이러한 .dll 파일을 저장하는 역할을 한다. 따라서 우리가 유니티에서 작업한 프로젝트를 실행 또는 빌드 할 때, C# 코드에서 선언한 public 필드의 변수 값이 아닌, 인스펙터 창에서 바꾸어놓은 변수 값으로 실행이 된다.
결국 우리는 public한 .cs 파일을 사용하는게 아니라, 인스펙터 창에서 최종으로 수정되는 .dll 파일을 사용하는 것이다. .
https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/concepts/serialization/
state와 enum type
상태를 표시하는 GameState는 보통 public GameState m_State; 로 선언하는데 실제 저장하고 유니티 에디터에 가보면 m_State가 아닌, State로만 인스펙터창에 보여진다. 이는 유니티 개발자들이 상태 표시 변수를 선언할 때 m_State로 약속한 것처럼 빈번히 사용하기 때문에 에디터에서 자동으로 상태 표시 변수임을 알고 State만 보여주는 것이기 때문에 놀랄 필요가 없다.
public int Ready = 0;
public int Start = 1;
public int Playing = 2;
public int GameOver = 3;
GameState m_state = Ready;
게임 상태를 표시하기 위해 변수로 다음과 같이 int 형으로 선언해주었다. 하지만 m_state 값을 Ready로 선언해주려고 하면 오류가 발생한다. 그 이유는 동적 영역에서 변수들이 생성되는 탓에 m_state는 Ready, Start, Playing, GameOver 변수들을 모르기 때문이다. 따라서 이러한 경우 GameState static m_state으로 선언해 m_state를 static 영역에서 미리 메모리 할당하므로서 상태 변수들을 선언해 줄 수 있다.
하지만 이런 경우 대게 enum이라는 사용자 정의 자료형 변수를 선언해 사용한다.
public enum GameState
{
Ready,
Start,
Playing,
GameOver
}
public GameState m_State = GameState.Ready;
enum은 자료형, 열거형 변수이므로 static 영역에 자동으로 메모리 할당이 된다.
'게임 프로그래밍 > 유니티 프로젝트' 카테고리의 다른 글
Unity Engine의 그래픽 연산 과정에 대한 이해(DirectX, OpenGL, MeshRenderer, MeshFilter) (0) | 2022.07.28 |
---|---|
[Unity] Joystick 제작 원리 (0) | 2022.07.20 |
[Unity] 2D 게임 플레이 영역 제한하기, Rendering Pipeline의 좌표 공간에 대한 이해(WorldToViewport / ViewportToWorld) (0) | 2022.07.19 |
[유니티] 오브젝트 회전(Euler/Quaternion), Vector3의 외적/내적, 삼각함수를 이용한 플레이어 이동 및 총알 발사 (2022.07.14) (0) | 2022.07.19 |
[Unity] File 저장과 PlayerPrefs (0) | 2022.07.15 |