1. 목적 / 기능 요약

2. 관련 주요 스크립트 목록

스크립트 파일 설명
SceneLoading.cs 로딩 씬의 전반적인 처리를 위해 만듬
GameLoaderManager.cs 게임 플레이에 필요한 데이터를 로드
TableLoaderManager.cs 테이블 파일 로드
AddressablePrefabLoader.cs 프리팹 로드
SaveDataLoader.cs 세이브 데이터 로드

3. 스크립트 동작 흐름

GameLoaderManager.cs

public class GameLoaderManager : MonoBehaviour
{
...

private void Awake()
{
    ...
    
    GameObject gameObjectTableLoaderManager = new GameObject("TableLoaderManager");
    tableLoader = gameObjectTableLoaderManager.AddComponent<TableLoaderManager>();
    
    GameObject gameObjectAddressablePrefabLoader = new GameObject("AddressablePrefabLoader");
    prefabLoader = gameObjectAddressablePrefabLoader.AddComponent<AddressablePrefabLoader>();
    
    GameObject gameObjectSaveDataLoader = new GameObject("SaveDataLoader");
    saveDataLoader = gameObjectSaveDataLoader.AddComponent<SaveDataLoader>();
}

private void Start()
{
    StartCoroutine(LoadGameData());
}

private IEnumerator LoadGameData()
{
    yield return LoadTableData();
    yield return LoadAddressablePrefabs();
    yield return LoadSaveData();
    UnityEngine.SceneManagement.SceneManager.LoadScene(ConfigDefine.SceneNameGame);
}

/// <summary>
/// 테이블 데이터를 로드하고 진행률을 업데이트합니다.
/// </summary>
private IEnumerator LoadTableData()
{
    ...
}
/// <summary>
/// Addressable 리소스를 로드하고 진행률을 업데이트합니다.
/// </summary>
private IEnumerator LoadAddressablePrefabs()
{
    ...
}
/// <summary>
/// 세이브 데이터를 로드하고 진행률을 업데이트합니다.
/// </summary>
private IEnumerator LoadSaveData()
{
    ...
}
/// <summary>
/// 진행률을 계산하고 UI 업데이트
/// </summary>
private void UpdateLoadingProgress(Type type)
{
    ...
    if (textLoadingPercent != null)
    {
        textLoadingPercent.text = $"{subTitle} 로드 중... {Mathf.Floor(totalProgress)}%";
    }
}

TableLoaderManager

/// <summary>
/// 데이터 테이블 Loader
/// </summary>
public class TableLoaderManager : MonoBehaviour
{
    public static TableLoaderManager Instance;

    private string[] dataFiles;
    
    public TableNpc TableNpc { get; private set; } = new TableNpc();
    public TableMap TableMap { get; private set; } = new TableMap();
    public TableMonster TableMonster { get; private set; } = new TableMonster();
    ...

    protected void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }

        dataFiles = new[]
        {
            ConfigTableFileName.Map, ConfigTableFileName.Monster,
            ...
        };
    }

    public void LoadDataFile(string fileName)
    {
        try
        {
            TextAsset textFile = Resources.Load<TextAsset>($"Tables/{fileName}");
            if (textFile != null)
            {
                string content = textFile.text;
                if (!string.IsNullOrEmpty(content))
                {
                    switch (fileName)
                    {
                        case ConfigTableFileName.Animation:
                            TableAnimation.LoadData(content);
                            break;
                        case ConfigTableFileName.Monster:
                            TableMonster.LoadData(content);
                            break;
                        case ConfigTableFileName.Npc:
                            TableNpc.LoadData(content);
                            break;
                        ...
                    }
                }
            }
        }
        catch (Exception ex)
        {
            GcLogger.LogError($"테이블 파싱중 오류. file {fileName}: {ex.Message}");
        }
    }
    ...
}

AddressablePrefabLoader