1. 목적 / 기능 요약

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>();
    }
    ...
}

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("맵 로드 실패");
        }
    }
    ...
}

4. 주요 스크립트 설명