1. 목적 / 기능 요약
- 게임 씬은 플레이어, UI, 매니저, 게임 상태 등을 총괄하는 기능을 담당합니다.
- 게임 씬에 관련된 자세한 내용은 별도로 다루겠습니다.
2. 관련 주요 스크립트 목록
스크립트 파일 |
설명 |
SceneGame.cs |
게임 씬의 전반적인 로직 처리 |
MapManager.cs |
타일맵, Npc, 몬스터, 플레이어 로드 |
… |
|
3. 스크립트 동작 흐름
SceneGame.cs
/// <summary>
/// 게임 씬 관리 클래스
/// </summary>
public class SceneGame : DefaultScene
{
public static SceneGame Instance { get; private set; }
public enum GameState { Begin, Combat, End, DirectionStart, DirectionEnd, QuestDialogueStart, QuestDialogueEnd }
[Header("기본오브젝트")]
[Tooltip("메인으로 사용되는 Camera")]
public Camera mainCamera;
[Tooltip("UI 에 사용되는 메인 Canvas")]
public Canvas canvasUI;
...
[Header("매니저")]
[Tooltip("윈도우 매니저")]
public UIWindowManager uIWindowManager;
[Tooltip("시스템 메시지 매니저")]
public SystemMessageManager systemMessageManager;
[Tooltip("카메라 매니저")]
public CameraManager cameraManager;
...
private void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
return;
}
InitializeManagers();
}
/// <summary>
/// 매니저 스크립트 오브젝트 생성하기
/// </summary>
private void InitializeManagers()
{
GameObject managerContainer = new GameObject("Managers");
calculateManager = CreateManager<CalculateManager>(managerContainer);
mapManager = CreateManager<MapManager>(managerContainer);
saveDataManager = CreateManager<SaveDataManager>(managerContainer);
...
}
private T CreateManager<T>(GameObject parent) where T : Component
{
GameObject obj = new GameObject(typeof(T).Name);
obj.transform.SetParent(parent.transform);
return obj.AddComponent<T>();
}
...
}
Awake
에서 싱글턴을 설정합니다.
InitializeManagers
에서 각 매니저들을 초기화 합니다.
- 많은 매니저가 있기에 게임 씬만 별도로 설명 예정입니다.
- 매니저중 MapManager 를 예로 설명 드리겠습니다.
MapManager.cs
/// <summary>
/// 맵 매니저
/// </summary>
public class MapManager : MonoBehaviour
{
...
// 맵 로드 상태
private MapConstants.State currentState = MapConstants.State.None;
// 현재 맵 uid
private int currentMapUid;
protected void Awake()
{
...
mapLoadCharacters = new MapLoadCharacters();
mapLoadCharacters.Initialize(this);
...
}
protected void Start()
{
...
// 저장된 맵 불러오기
int startMapUid = GetStartMapUid();
LoadMap(startMapUid);
}
/// <summary>
/// 맵 불러오기
/// </summary>
/// <param name="mapUid"></param>
private void LoadMap(int mapUid = 0)
{
...
Reset();
currentState = MapConstants.State.FadeIn;
currentMapUid = mapUid;
StartCoroutine(UpdateState());
}
/// <summary>
/// 맵 로드 상태별 처리
/// </summary>
/// <returns></returns>
private IEnumerator UpdateState()
{
while (currentState != MapConstants.State.Complete && currentState != MapConstants.State.Failed)
{
switch (currentState)
{
case MapConstants.State.FadeIn:
...
break;
case MapConstants.State.UnloadPreviousStage:
...
break;
case MapConstants.State.LoadTilemapPrefab:
...
break;
case MapConstants.State.LoadPlayerPrefabs:
...
break;
case MapConstants.State.LoadMonsterPrefabs:
...
break;
case MapConstants.State.LoadNpcPrefabs:
...
break;
case MapConstants.State.LoadWarpPrefabs:
...
break;
case MapConstants.State.FadeOut:
...
break;
}
yield return null;
}
if (currentState == MapConstants.State.Complete)
{
OnMapLoadComplete();
}
else
{
Debug.LogError("맵 로드 실패");
}
}
...
}
Awake
에서 캐릭터를 관리하는 MapLoadCharacters
를 생성합니다.
MapLoadCharacters
에서는 Npc, 몬스터, 플레이어를 스폰합니다.
Start
에서 시작할 맵 고유번호를 찾고 맵을 로드합니다.
- 로드되는 순서는 타일맵을 먼저 로드하고, 플레이어, 몬스터, Npc 순서로 캐릭터를 로드합니다.
- 그다음 워프와 같은 맵 오브젝트를 로드합니다.
4. 주요 스크립트 설명