본문 바로가기
스파르타 내배캠

스파르타 내배캠 Unity 3기 - 53

by LemongO 2024. 3. 27.

ModuleManager 구조 변경

 

DataManager가 생겨나게 되면서 파츠 정보를 받는 구조가 싹 바뀌게 되었다.

어느정도 진행 후 작성하는거라 정리하기가 쉽지 않다.

 

먼저 게임을 시작할 때 기존 방법으론 Resources.LoadAll 을 통해
해당 폴더의 모든 파츠를 긁어오는 식으로 진행을 했었다.

 

하지만 현재는 DataManager에 저장된 PartData에 Prefab_Path가 담겨있고
해당 위치의 것을 가져올 수 있게 만들어 둔 상태이다.

 

 

게임을 시작하면 ModuleManager의 Init 메서드를 호출해
당장 플레이어에게 보여줄(해금이 된) 파츠들만 Dictionary에 담아놓도록 한다.

public void Init() // 게임 시작 시 Resources 폴더 내 초기 파츠 담기.
{
    InitData initData = new InitData();

    List<BasePart> lowerParts = new List<BasePart>();
    List<BasePart> upperParts = new List<BasePart>();
    List<BasePart> armWeaponParts = new List<BasePart>();
    List<BasePart> shoulderWeaponParts = new List<BasePart>();

    InitAddDict<LowerPart>(initData.LowerPartId, lowerParts);
    InitAddDict<UpperPart>(initData.UpperPartId, upperParts);
    InitAddDict<ArmsPart>(initData.ArmWeaponPartId, armWeaponParts);
    InitAddDict<ShouldersPart>(initData.ShoulderWeaponPartId, shoulderWeaponParts);

    LowerPartsCount = lowerParts.Count;
    UpperPartsCount = upperParts.Count;
    ArmWeaponPartsCount = armWeaponParts.Count;
    ShoulderWeaponPartsCount = shoulderWeaponParts.Count;

    _modules.Add(typeof(LowerPart), lowerParts);
    _modules.Add(typeof(UpperPart), upperParts);
    _modules.Add(typeof(ArmsPart), armWeaponParts);
    _modules.Add(typeof(ShouldersPart), shoulderWeaponParts);
}

 

 

 

다만 처음에 보여줄 데이터들에 한해선 아직까지는 하드코딩으로 작성해둔 상태이다.

public class InitData
{
    public readonly List<int> LowerPartId = new()
    {
        10001001,            
    };

    public readonly List<int> UpperPartId = new()
    {
        10002001,            
    };

    public readonly List<int> ArmWeaponPartId = new()
    {
        10003001,
        10003002,
        10003003,
        10003004,
    };

    public readonly List<int> ShoulderWeaponPartId = new()
    {
        10004001,
        10004002,
        10004003,
    };
}

 

 

그리고 InitAddDict<T> 메서드를 호출해 원하는 파츠의 데이터들을 리스트에 담도록 한다.

private void InitAddDict<T>(List<int> idList, List<BasePart> partList) where T : BasePart
{
    foreach (var id in idList)
    {
        PartData data = Managers.Data.GetPartData(id);
        T part = Resources.Load<T>(data.Prefab_Path);
        part.SetID(id);

        partList.Add(part);
    }
}

 

여기서 넘겨준 List들은 Init에서 만들어준 List<T>로 다시 총 관리하는 Dictionary에 담도록 한다.
기존 코드에선 Value가 배열이었는데 해금을 하면 가변적인 구조가 필요했기 때문에 List로 바꿔주었다.

private Dictionary<Type, List<BasePart>> _modules = new Dictionary<Type, List<BasePart>>();
_modules.Add(typeof(LowerPart), lowerParts);
_modules.Add(typeof(UpperPart), upperParts);
_modules.Add(typeof(ArmsPart), armWeaponParts);
_modules.Add(typeof(ShouldersPart), shoulderWeaponParts);