섹션8. Scene
위 글은 인프런에 있는 Rookiss님의 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진 강의를 듣고 남긴 필기입니다.
SceneManagerEx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class SceneManagerEx
{
public BaseScene CurrentScene => GameObject.FindObjectOfType<BaseScene>();
// UnityEngine에 구현되어있는 SceneManager를 이용해 만든 Scene전환 기능 함수.
public void LoadScene(Define.Scene type)
{
CurrentScene.Clear();
SceneManager.LoadScene(GetSceneName(type));
}
// 현재 Scene의 이름을 받아오는 함수. LoadScene(Define.Scene type)에서 활용됨.
string GetSceneName(Define.Scene type)
{
// enum을 string으로 바꾼다. C#의 Reflection기능
string name = System.Enum.GetName(typeof(Define.Scene), type);
return name;
}
}
Utils > Deifne.cs
에서Scene
들을enum
으로 정의
1
2
3
4
5
6
7
8
9
10
11
12
public class Define
{
// 이는 실제 Scene와 Utils > Deifne.cs 에서 Scene들을 enum으로 정의이름이 동일해야 함.
public enum Scene
{
Unknown,
Login,
Lobby,
Game,
}
//...
}
- 모든 Scene에 빈 게임 오브젝트를 만들고,
- 이름을
@Scene
으로 정하고,BaseScene
을 상속하는 스크립트를 만들어 붙인다.- 이 오브젝트는
현재 Scene에 대한 정보
를 갱신하고, Scene 내부에서 최초로 UI를 불러들이는 역할을 한다.
- 이 오브젝트는
- 이름을
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public abstract class BaseScene : MonoBehaviour
{
// 현재 Scene에 대한 정보
public Define.Scene SceneType
{
get; // get은 public
protected set; // set은 protected
} = Define.Scene.Unknown;
void Awake()
{
Init();
}
// UI와 상호작용을 위한 EventSystem Instantiate
protected virtual void Init()
{
var obj = GameObject.FindObjectOfType(typeof(EventSystem));
if (obj == null)
Managers.Resource.Instantiate("UI/EventSystem").name = "@EventSystem";
}
public abstract void Clear();
}
BaseScene
을 상속하는 클래스는Init()
내부에서base.Init();
을 호출해야 함.BaseScene.SceneType
변수를 현재Scene
에 맞게 정의하여 (혹은 정의한 것을 이용해), 값을 갱신한다.- 미리 정의한 UIManager를 이용해 필요한 UI를 화면에 띄운다.
Managers.UI.ShowSceneUI<~>();
와 같이.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.