2024.12.18 작업내용

ggm-_-·2024년 12월 18일
2

TIL (Tody I Learn)

목록 보기
46/51

2024.12.18(수)

  • DomainArmy.cs
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;

// 군 전체 정보
public class DomainArmy : MonoBehaviour
{
    Domain domainData;

    // 전략 세팅 시스템
    StrategySettingSystem strategySettingSystem;

    // 임시로 ui와 연결
    public UI_StrategySetting ui_StrategySetting;


    // 데이터 관리와 실제 군 관리는 동시에 이루어진다.(그렇게 할 예정)

    // 영주 데이터
    public Lord LordData { get; private set; }
    // 전체 기사 데이터 리스트
    public List<UserKnight> WholeKnightDataList { get; private set; } = new List<UserKnight>();
    // 전체 병종 데이터 리스트
    public List<UserUnitType> WholeUnitTypeDataList { get; private set; } = new List<UserUnitType>();

    // 지휘관
    public ArmyCommander ArmyCommander { get; private set; }
    // 지휘관 부대 데이터
    public UnitDivision ArmyCommanderUnitDivisionData { get; private set; }
    // 지휘관 부대
    public ArmyUnitDivision ArmyCommanderUnitDivision { get; private set; }
    // 지휘관 프리펩
    ArmyCommander armyCommanderPrefabs;

    // 보유 기사 데이터 리스트(출전x)
    public List<UserKnight> OwnedKnightDataList { get; private set; } = new List<UserKnight>();
    // 보유 병종 데이터 리스트(출전x)
    public List<UserUnitType> OwnedUnitTypeDataList { get; private set; } = new List<UserUnitType>();

    // 출전 기사 데이터 리스트
    public List<UserKnight> DeployedKnightDataList { get; private set; } = new List<UserKnight>();
    // 출전 병종 데이터 리스트
    public List<UserUnitType> DeployedUnitTypeDataList { get; private set; } = new List<UserUnitType>();




    // 전체 전략과 부대, 부대배치, 부대임무는 출전 병력의 데이터만 사용할 것이다.
    // 기본 전략
    public Strategy StartStrategy { get; private set; }
    // 전체 전략 데이터 리스트
    public List<Strategy> StrategyDataList { get; private set; } = new List<Strategy>();
    // 전체 부대 데이터 리스트
    public List<UnitDivision> UnitDivisionDataList { get; private set; } = new List<UnitDivision>();
    // 전체 부대배치 데이터 리스트
    public List<UnitDivisionPosition> UnitDivisionPositionDataList { get; private set; } = new List<UnitDivisionPosition>();
    // 전체 부대임무 데이터 리스트
    public List<UnitDivisionRole> UnitDivisionRoleDataList { get; private set; } = new List<UnitDivisionRole>();


    /// <summary>
    /// 전략을 관리하기 위해, 하나의 전략에 있는 데이터들을 가져와서 묶어 놓는다.
    /// 전략 리스트 (ArmyStategy)
    /// 	전략1
    /// 	    부대 리스트
    /// 		    부대
    /// 		    부대배치
    /// 		    부대임무
    /// 		    ...
    /// 	전략2
    /// 	    부대 리스트
    /// 		    부대
    /// 		    부대배치
    /// 		    부대임무
    /// 		    ...
    /// 	...
    /// </summary>
    // 전략 리스트 (ArmyStategy)
    public List<ArmyStrategy> ArmyStrategyList { get; private set; } = new List<ArmyStrategy>();
    // 기본 전략 (실제)
    public ArmyStrategy StartArmyStrategy { get; private set; }
    // ArmyStrategy 부모 위치
    [SerializeField] private Transform strategyParent;
    // ArmyStrategy 프리팹 참조
    [SerializeField] private ArmyStrategy armyStrategyPrefab;
    

    // 영주 출전 여부
    public bool IsLordDeployed { get; private set; }

    /// <summary>
    /// 실제로 군대가 출전했을 때의 동작을 담당하게 될 군대 데이터가 있는 리스트
    /// 출전 부대 리스트 (실제)
    /// 	출전 부대
    /// 		출전 기사
    /// 		출전 병종
    /// 		부대 임무 - 기본 전략의 임무
    /// 	...
    /// </summary>
    // 출전 부대 리스트 (실제)
    public List<ArmyUnitDivision> AllArmyUnitDivisionList { get; private set; } = new List<ArmyUnitDivision>();

    //ArmyLord domainArmyLord;
    //List<ArmyKnight> knightList = new List<ArmyKnight>();
    //List<ArmyUnitType> unitTypeList = new List<ArmyUnitType>();



    private void Awake()
    {
        strategySettingSystem = new StrategySettingSystem(this);
        StrategyManager.Instance.strategySettingSystem = strategySettingSystem;

        armyCommanderPrefabs = Resources.Load<ArmyCommander>("Prefabs/TestUnits/ArmyCommander");
        ArmyCommander = Instantiate(armyCommanderPrefabs, transform);
        LoadDomainData();
        LoadDomainArmy(domainData);
        strategySettingSystem.SetStrategySettingSystemData();

        strategySettingSystem.SetUIStrategySettingData();
    }
    private void Start()
    {

    }


    public void LoadDomainData(string domainID = "do007")
    {
        List<Domain> domainList = LocatorManager.Instance.dataManager.domainInfo.Data.Domain;
        for (int i = 0; i < domainList.Count; i++)
        {
            if (domainList[i].ID == domainID)
            {
                domainData = domainList[i];
            }
        }
    }

    public void LoadDomainArmy(Domain inputDomainData)
    {
        string doID = inputDomainData.ID;
        List<Lord> lordList = LocatorManager.Instance.dataManager.lordInfo.Data.Lord;
        for (int i = 0; i < lordList.Count; i++)
        {
            if (lordList[i].DomainID == doID)
            {
                LordData = lordList[i];
                break;
            }
        }
        List<UserKnight> userKnightList = LocatorManager.Instance.dataManager.userKnightInfo.Data.UserKnight;
        for (int i = 0;i < userKnightList.Count; i++)
        {
            if (userKnightList[i].DomainID == doID)
            {
                WholeKnightDataList.Add(userKnightList[i]);
            }
        }
        if (WholeKnightDataList.Count == 0)
        {
            Debug.LogWarning("LoadDomainArmy: WholeKnightDataList is empty after loading!");
        }
        List<UserUnitType> userUnitTypeList = LocatorManager.Instance.dataManager.userUnitTypeInfo.Data.UserUnitType;
        for (int i = 0; i < userUnitTypeList.Count; i++)
        {
            if (userUnitTypeList[i].DomainID == doID)
            {
                WholeUnitTypeDataList.Add(userUnitTypeList[i]);
            }
        }
        List<Strategy> strategyList = LocatorManager.Instance.dataManager.strategyInfo.Data.Strategy;
        for (int i = 0; i < strategyList.Count; i++)
        {
            if (strategyList[i].DomainID == doID)
            {
                StrategyDataList.Add(strategyList[i]);
            }
        }
        List<UnitDivision> unitDivisionList = LocatorManager.Instance.dataManager.unitDivisionInfo.Data.UnitDivision;
        for (int i = 0; i < unitDivisionList.Count; i++)
        {
            if (unitDivisionList[i].DomainID == doID)
            {
                UnitDivisionDataList.Add(unitDivisionList[i]);
            }
        }

        // 기본 전략은 첫 번째 전략
        if (StrategyDataList.Count > 0)
        {
            StartStrategy = StrategyDataList[0];
        }
        else
        {
            Debug.LogError("StrategyDataList is empty!");
            // TODO : 새로운 Strategy를 자동 생성하는 코드
        }

        // 전략 리스트 (ArmyStategy)
        for (int i = 0; i < StrategyDataList.Count; i++)
        {
            ArmyStrategy armyStrategy = Instantiate(armyStrategyPrefab, strategyParent);
            ArmyStrategyList.Add(armyStrategy);
            armyStrategy.SetStrategyData(StrategyDataList[i], unitDivisionList);
        }

        // 출전 부대 리스트 (실제)
        for (int i = 0; i < ArmyStrategyList.Count; i++)
        {
            List<ArmyUnitDivision> strategyUnitDivisionList = ArmyStrategyList[i].StrategyUnitDivisionList;
            for (int j = 0; j < strategyUnitDivisionList.Count; j++)
            {
                AllArmyUnitDivisionList.Add(strategyUnitDivisionList[j]);
            }
        }

        // 기본 전략 (ArmyStrategy) 설정
        for (int i = 0; i < ArmyStrategyList.Count; i++)
        {
            if (StartStrategy.ID == ArmyStrategyList[i].StrategyData.ID)
            {
                StartArmyStrategy = ArmyStrategyList[i];
            }
        }

        // 전략에 로드가 있는 부대가 있으면 true
        IsLordDeployed = StartArmyStrategy.IsLordDeployed;


        // 부대 기준으로 세팅(ArmyUnitDivision에서 세팅)
        // 중복 방지하면서 세팅
        for (int i = 0; i < AllArmyUnitDivisionList.Count; i++)
        {
            AddListUnique<UnitDivisionPosition>(UnitDivisionPositionDataList, AllArmyUnitDivisionList[i].UnitDivisionPositionData);
            AddListUnique<UnitDivisionRole>(UnitDivisionRoleDataList, AllArmyUnitDivisionList[i].UnitDivisionRoleData);
        }


        // 보유 병종과 출전 병종 데이터 Init(보유 = 전체, 출전 = 0)
        for (int i = 0; i < WholeUnitTypeDataList.Count; i++)
        {
            AddListUnique(OwnedUnitTypeDataList, (UserUnitType)WholeUnitTypeDataList[i].Clone());
            AddListUnique(DeployedUnitTypeDataList, (UserUnitType)WholeUnitTypeDataList[i].Clone());
            DeployedUnitTypeDataList[i].UnitTypePersonnal = 0;
        }


        // 기본 전략 기준으로 보유 병력(기사, 병종), 출전 병력 세팅
        List<ArmyUnitDivision> startStrategyUnitDivisionList = StartArmyStrategy.StrategyUnitDivisionList;
        for (int i = 0; i < startStrategyUnitDivisionList.Count; i++)
        {
            // 출전 기사 데이터 삽입
            AddListUnique(DeployedKnightDataList, startStrategyUnitDivisionList[i].KnightData);
            // 보유 병종과 출전 병종의 인원 설정
            for (int j = 0; j < OwnedUnitTypeDataList.Count; j++)
            {
                if (startStrategyUnitDivisionList[i].UnitDivisionData.UserUnitTypeID == OwnedUnitTypeDataList[j].ID)
                {
                    OwnedUnitTypeDataList[j].UnitTypePersonnal -= startStrategyUnitDivisionList[i].UnitDivisionData.UnitDivisionPersonnel;
                    DeployedUnitTypeDataList[j].UnitTypePersonnal += startStrategyUnitDivisionList[i].UnitDivisionData.UnitDivisionPersonnel;
                }
            }
            // 지휘관 설정
            if (startStrategyUnitDivisionList[i].UnitDivisionData.IsCommander == true)
            {
                ArmyCommanderUnitDivision = startStrategyUnitDivisionList[i];
                ArmyCommanderUnitDivisionData = ArmyCommanderUnitDivision.UnitDivisionData;
                if (ArmyCommanderUnitDivision.IsKnightLord)
                {
                    ArmyCommander.SetArmyCommander(ArmyCommanderUnitDivision.LordData);
                }
                else
                {
                    ArmyCommander.SetArmyCommander(ArmyCommanderUnitDivision.KnightData);
                }
            }
        }
        // 전체 기사에서 출전 기사를 제외한 나머지를 보유 기사에 편입

        // 보유/출전 기사 분리
        for (int i = 0; i < WholeKnightDataList.Count; i++)
        {
            bool isDeployed = false;

            for (int j = 0; j < DeployedKnightDataList.Count; j++)
            {
                if (WholeKnightDataList[i].ID == DeployedKnightDataList[j].ID)
                {
                    isDeployed = true;
                    break;
                }
            }

            if (!isDeployed)
            {
                AddListUnique(OwnedKnightDataList, WholeKnightDataList[i]);
            }
        }

    }

    // 리스트에 추가할 때, 중복되는 데이터 방지
    public void AddListUnique<T>(List<T> list, T item)
    {
        if (!list.Contains(item))
        {
            list.Add(item);
        }
    }
    // OwnedKnightDataList DeployedKnightDataList
    public void DeployKnight(UserKnight deployedKnight)
    {
        for (int i = 0; i < OwnedKnightDataList.Count; i++)
        {
            if (OwnedKnightDataList[i].ID == deployedKnight.ID)
            {
                DeployedKnightDataList.Add(deployedKnight);
                OwnedKnightDataList.RemoveAt(i);
                i--;
            }
        }
    }

    public void UnDelpoyKnight(UserKnight unDeployedKnight)
    {
        for (int i = 0; i < DeployedKnightDataList.Count; i++)
        {
            if (DeployedKnightDataList[i].ID == unDeployedKnight.ID)
            {
                OwnedKnightDataList.Add(unDeployedKnight);
                DeployedKnightDataList.RemoveAt(i);
                i--;
            }
        }
    }
}
  • StrategySettingSystem.cs
using System.Collections.Generic;
using System.Text;
using UnityEngine;
// 전략 설정 시스템
public class StrategySettingSystem
{
    public DomainArmy DomainArmy { get; private set; }

    // ui와 연결
    UI_StrategySetting ui_StrategySetting;

    // 영주 데이터
    public Lord LordData { get; private set; }
    // 전체 기사 데이터 리스트
    public List<UserKnight> WholeKnightDataList { get; private set; }
    // 전체 병종 데이터 리스트
    public List<UserUnitType> WholeUnitTypeDataList { get; private set; }

    // 지휘관
    public ArmyCommander ArmyCommander { get; private set; }
    // 지휘관 부대 데이터
    public UnitDivision ArmyCommanderUnitDivisionData { get; private set; }
    // 지휘관 부대
    public ArmyUnitDivision ArmyCommanderUnitDivision { get; private set; }

    // 보유 기사 데이터 리스트(출전x)
    public List<UserKnight> OwnedKnightDataList { get; private set; }
    // 보유 병종 데이터 리스트(출전x)
    public List<UserUnitType> OwnedUnitTypeDataList { get; private set; }

    // 출전 기사 데이터 리스트
    public List<UserKnight> DeployedKnightDataList { get; private set; }
    // 출전 병종 데이터 리스트
    public List<UserUnitType> DeployedUnitTypeDataList { get; private set; }

    // 전체 전략과 부대, 부대배치, 부대임무는 출전 병력의 데이터만 사용할 것이다.
    // 기본 전략
    public Strategy StartStrategy { get; private set; }
    // 전체 전략 데이터 리스트
    public List<Strategy> StrategyDataList { get; private set; }
    // 전체 부대 데이터 리스트
    public List<UnitDivision> UnitDivisionDataList { get; private set; }
    // 전체 부대배치 데이터 리스트
    public List<UnitDivisionPosition> UnitDivisionPositionDataList { get; private set; }
    // 전체 부대임무 데이터 리스트
    public List<UnitDivisionRole> UnitDivisionRoleDataList { get; private set; }

    // 전략 리스트 (ArmyStategy)
    public List<ArmyStrategy> ArmyStrategyList { get; private set; }
    // 기본 전략 (실제)
    public ArmyStrategy StartArmyStrategy { get; private set; }
    // 영주 출전 여부
    public bool IsLordDeployed { get; private set; }
    // 출전 부대 리스트 (실제)
    public List<ArmyUnitDivision> AllArmyUnitDivisionList { get; private set; }


    // 현재 (세팅중인) 전략
    public Strategy CurrentStrategy { get; private set; }

    public ArmyStrategy CurrentArmyStrategy { get; private set; }


    public StrategySettingSystem(DomainArmy domainArmy)
    {
        DomainArmy = domainArmy;
        SetStrategySettingSystemData();
    }


    // DomainArmy의 데이터를 참조해서 설정
    public void SetStrategySettingSystemData()
    {
        ui_StrategySetting = DomainArmy.ui_StrategySetting;
        LordData = DomainArmy.LordData;
        WholeKnightDataList = DomainArmy.WholeKnightDataList;
        WholeUnitTypeDataList = DomainArmy.WholeUnitTypeDataList;
        OwnedKnightDataList = DomainArmy.OwnedKnightDataList;
        OwnedUnitTypeDataList = DomainArmy.OwnedUnitTypeDataList;
        DeployedKnightDataList = DomainArmy.DeployedKnightDataList;
        DeployedUnitTypeDataList = DomainArmy.DeployedUnitTypeDataList;
        StartStrategy = DomainArmy.StartStrategy;
        StrategyDataList = DomainArmy.StrategyDataList;
        UnitDivisionDataList = DomainArmy.UnitDivisionDataList;
        UnitDivisionPositionDataList = DomainArmy.UnitDivisionPositionDataList;
        UnitDivisionRoleDataList = DomainArmy.UnitDivisionRoleDataList;
        ArmyStrategyList = DomainArmy.ArmyStrategyList;
        StartArmyStrategy = DomainArmy.StartArmyStrategy;
        IsLordDeployed = DomainArmy.IsLordDeployed;
        AllArmyUnitDivisionList = DomainArmy.AllArmyUnitDivisionList;
        if (StartStrategy != null)
        {
            CurrentStrategy = StartStrategy;
            CurrentArmyStrategy = StartArmyStrategy;
        }
    }
    // 데이터가 잘 들어갔는지 확인
    public void LogStrategySettingSystemData()
    {
        //StringBuilder sb = new StringBuilder();
        //sb.Append("로드: ");
        //sb.Append(domainArmyLord.LordData.Name);
        //sb.Append("\n");
        //sb.Append("전략 시스템's \n전략 목록: ");
        //for (int i = 0; i < strategyList.Count; i++)
        //{
        //    sb.Append(strategyList[i].StrategyData.Name);
        //    sb.Append(", ");
        //}
        //sb.Append("\n");
        //sb.Append("부대 임무 목록: ");
        //for (int i = 0; i < unitDivisionRoleDataList.Count; i++)
        //{
        //    sb.Append(unitDivisionRoleDataList[i].Name);
        //    sb.Append(", ");
        //}
        //sb.Append("\n");
        //sb.Append("기사 목록: ");
        //for (int i = 0; i < knightList.Count; i++)
        //{
        //    sb.Append(knightList[i].KnightData.NameKr);
        //    sb.Append(", ");
        //}
        //sb.Append("\n");
        //sb.Append("병종 목록: ");
        //for (int i = 0; i < unitTypeList.Count; i++)
        //{
        //    sb.Append(unitTypeList[i].UnitTypeData.NameKr);
        //    sb.Append(", ");
        //}
        //sb.Append("\n");
        //Debug.Log(sb);
    }


    // UI의 반응과 연계하여 전략 설정 및 저장


    public void SetUIStrategySettingData()
    {
        ui_StrategySetting.SetOwnedKnightData(OwnedKnightDataList);
        ui_StrategySetting.SetDeployedKnightData(DeployedKnightDataList);
        ui_StrategySetting.SetDeployedUnitTypeData(DeployedUnitTypeDataList);
    }
}
  • ArmyCommander.cs
using UnityEngine;

public class ArmyCommander : MonoBehaviour
{
    // 영주 출전 여부
    public bool IsLordDeployed { get; private set; }
    
    public Lord LordData { get; private set; }
    public UserKnight KnightData { get; private set; }

    public void SetArmyCommander(Lord lordData)
    {
        IsLordDeployed = true;
        LordData = lordData;
    }
    public void SetArmyCommander(UserKnight knightData)
    {
        IsLordDeployed = false;
        KnightData = knightData;
    }
    public Lord GetArmyLordCommander()
    {
        return LordData;
    }
    public UserKnight GetArmyKnightCommaner()
    {
        return KnightData;
    }
}
  • ArmyStrategy.cs
using System;
using System.Collections.Generic;
using UnityEngine;

// 전략
public class ArmyStrategy : MonoBehaviour
{
    // 영주 출전 여부
    public bool IsLordDeployed { get; private set; }
    // 전략 정보
    public Strategy StrategyData { get; private set; }
    // 부대 리스트
    public List<ArmyUnitDivision> StrategyUnitDivisionList { get; private set; } = new List<ArmyUnitDivision>();
    public List<UserKnight> WholeKnightDataList { get; private set; }
    public List<UserUnitType> WholeUnitTypeDataList { get; private set; }

    private ArmyUnitDivision armyUnitDivisionPrefab;

    private void Awake()
    {
        armyUnitDivisionPrefab = Resources.Load<ArmyUnitDivision>("Prefabs/ArmyUnitDivisionControll/ArmyUnitDivision");
    }
    private void Start()
    {
        WholeKnightDataList = StrategyManager.Instance.strategySettingSystem.WholeKnightDataList;
        WholeUnitTypeDataList = StrategyManager.Instance.strategySettingSystem.WholeUnitTypeDataList;
    }
    public void SetStrategyData(Strategy inputStrategyData, List<UnitDivision> unitDivisionList)
    {
        if (armyUnitDivisionPrefab == null)
        {
            Debug.LogError("SetStrategyData: ArmyUnitDivision prefab is not loaded!");
            return;
        }

        if (inputStrategyData == null)
        {
            Debug.LogError("SetStrategyData: inputStrategyData is null!");
            return;
        }

        if (unitDivisionList == null)
        {
            Debug.LogError("SetStrategyData: unitDivisionList is null!");
            return;
        }

        StrategyData = inputStrategyData;
        for (int i = 0; i < unitDivisionList.Count; i++)
        {
            if (unitDivisionList[i].StrategyID == StrategyData.ID)
            {
                // 부대 생성 및 초기화
                ArmyUnitDivision armyUnitDivision = Instantiate(armyUnitDivisionPrefab);
                if (armyUnitDivision == null)
                {
                    Debug.LogError("SetStrategyData: Failed to instantiate ArmyUnitDivision prefab!");
                    continue;
                }


                // 부대 이끄는 자가 로드인지
                if (unitDivisionList[i].KnightID[0] == 'l')
                {
                    Lord lord = StrategyManager.Instance.strategySettingSystem.LordData;

                    armyUnitDivision.SetUnitDivisionData(unitDivisionList[i], lord);
                }
                else
                {
                    UserKnight knight = FindKnight(unitDivisionList[i].KnightID);
                    if (knight == null)
                    {
                        Debug.LogWarning($"SetStrategyData: Knight with ID {unitDivisionList[i].KnightID} not found.");
                    }


                    armyUnitDivision.SetUnitDivisionData(unitDivisionList[i], knight);
                }
                StrategyUnitDivisionList.Add(armyUnitDivision);
            }
        }
    }

    public UserKnight FindKnight(string userKnightID)
    {
        if (WholeKnightDataList == null)
        {
            Debug.Log("FindKnight: WholeKnightDataList is null!");
            WholeKnightDataList = StrategyManager.Instance.strategySettingSystem.DomainArmy.WholeKnightDataList;
        }

        for (int i = 0; i < WholeKnightDataList.Count; i++)
        {
            if (WholeKnightDataList[i].ID == userKnightID)
            {
                return WholeKnightDataList[i];
            }
        }
        Debug.LogWarning($"FindKnight: Knight with ID {userKnightID} not found in WholeKnightDataList.");
        return null;
    }
}
  • ArmyUnitDivision.cs
using DG.Tweening;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UIElements;
// 부대
public class ArmyUnitDivision : MonoBehaviour
{
    // 부대 정보
    public UnitDivision UnitDivisionData { get; private set; }
    public UnitDivisionPosition UnitDivisionPositionData { get; private set; }
    public UnitDivisionRole UnitDivisionRoleData { get; private set; }
    Vector3 position;
    Vector3 rotaion;
    public bool IsKnightLord { get; private set; } = false;
    public Lord LordData { get; private set; }
    public UserKnight KnightData { get; private set; }
    public ArmyKnight ArmyKnight { get; private set; }
    public UserUnitType UnitTypeData { get; private set; }
    public List<ArmySoldier> ArmySoldierList { get; private set; }

    ArmySoldier soldierPrefab;


    private void Awake()
    {
    }

    // Set ArmyUnitDivision - 기사일 때
    public void SetUnitDivisionData(UnitDivision inputUnitDivisionData, UserKnight knightData)
    {
        if (inputUnitDivisionData == null)
        {
            Debug.LogError("SetUnitDivisionData: inputUnitDivisionData is null!");
            return;
        }

        if (knightData == null)
        {
            Debug.LogError($"SetUnitDivisionData: Knight with ID {inputUnitDivisionData.KnightID} is null!");
        }

        UnitDivisionData = inputUnitDivisionData;

        // 기사인 부분
        KnightData = knightData;
        IsKnightLord = false;

        List<UnitDivisionPosition> unitDivisionPositionList = LocatorManager.Instance.dataManager.unitDivisionPositionInfo.Data.UnitDivisionPosition;
        for (int i = 0; i < unitDivisionPositionList.Count; i++)
        {
            if (unitDivisionPositionList[i].UnitDivisionID == UnitDivisionData.ID)
            {
                UnitDivisionPositionData = unitDivisionPositionList[i];
                break;
            }
        }
        if (UnitDivisionPositionData == null)
        {
            Debug.LogError($"SetUnitDivisionData: Position data for UnitDivisionID {UnitDivisionData.ID} is missing!");
        }

        List<UnitDivisionRole> unitDivisionRoleList = LocatorManager.Instance.dataManager.unitDivisionRoleInfo.Data.UnitDivisionRole;
        for (int i = 0; i < unitDivisionRoleList.Count; i++)
        {
            if (unitDivisionRoleList[i].UnitDivisionID == UnitDivisionData.ID)
            {
                UnitDivisionRoleData = unitDivisionRoleList[i];
                break;
            }
        }
        if (UnitDivisionRoleData == null)
        {
            Debug.LogError($"SetUnitDivisionData: Role data for UnitDivisionID {UnitDivisionData.ID} is missing!");
        }

        // Position & Rotation 설정
        if (UnitDivisionPositionData != null)
        {
            position = new Vector3(UnitDivisionPositionData.PositionX, UnitDivisionPositionData.RotationZ, UnitDivisionPositionData.PositionY);
            rotaion = new Vector3(UnitDivisionPositionData.RotationX, UnitDivisionPositionData.RotationZ, UnitDivisionPositionData.RotationY);
        }

        soldierPrefab = Resources.Load<ArmySoldier>("Prefabs/TestUnits/ArmySoldier");

        if (soldierPrefab == null)
        {
            Debug.LogError("Soldier prefab not found in Resources!");
        }

        // 월드 좌표 설정
        SetUnitDivisionToWorld();
    }

    // Set ArmyUnitDivision - 로드일 때
    public void SetUnitDivisionData(UnitDivision inputUnitDivisionData, Lord lordData)
    {
        if (inputUnitDivisionData == null)
        {
            Debug.LogError("SetUnitDivisionData: inputUnitDivisionData is null!");
            return;
        }

        if (lordData == null)
        {
            Debug.LogError($"SetUnitDivisionData: Knight with ID {inputUnitDivisionData.KnightID} is null!");
        }

        UnitDivisionData = inputUnitDivisionData;

        // 영주인 부분
        LordData = lordData;
        IsKnightLord = true;

        List<UnitDivisionPosition> unitDivisionPositionList = LocatorManager.Instance.dataManager.unitDivisionPositionInfo.Data.UnitDivisionPosition;
        for (int i = 0; i < unitDivisionPositionList.Count; i++)
        {
            if (unitDivisionPositionList[i].UnitDivisionID == UnitDivisionData.ID)
            {
                UnitDivisionPositionData = unitDivisionPositionList[i];
                break;
            }
        }
        if (UnitDivisionPositionData == null)
        {
            Debug.LogError($"SetUnitDivisionData: Position data for UnitDivisionID {UnitDivisionData.ID} is missing!");
        }

        List<UnitDivisionRole> unitDivisionRoleList = LocatorManager.Instance.dataManager.unitDivisionRoleInfo.Data.UnitDivisionRole;
        for (int i = 0; i < unitDivisionRoleList.Count; i++)
        {
            if (unitDivisionRoleList[i].UnitDivisionID == UnitDivisionData.ID)
            {
                UnitDivisionRoleData = unitDivisionRoleList[i];
                break;
            }
        }
        if (UnitDivisionRoleData == null)
        {
            Debug.LogError($"SetUnitDivisionData: Role data for UnitDivisionID {UnitDivisionData.ID} is missing!");
        }

        // Position & Rotation 설정
        if (UnitDivisionPositionData != null)
        {
            position = new Vector3(UnitDivisionPositionData.PositionX, UnitDivisionPositionData.RotationZ, UnitDivisionPositionData.PositionY);
            rotaion = new Vector3(UnitDivisionPositionData.RotationX, UnitDivisionPositionData.RotationZ, UnitDivisionPositionData.RotationY);
        }

        soldierPrefab = Resources.Load<ArmySoldier>("Prefabs/TestUnits/ArmySoldier");

        if (soldierPrefab == null)
        {
            Debug.LogError("Soldier prefab not found in Resources!");
        }

        // 월드 좌표 설정
        SetUnitDivisionToWorld();
    }


    public void SetUnitDivisionToWorld()
    {
        transform.position = position;
        transform.rotation = Quaternion.Euler(rotaion);
        //armyKnight = Instantiate(armyKnight);
        //boxCubeFieldGenerator.GenerateField(soldierPrefab, 10, 10);
    }

    public void SetArmyKnight(ArmyKnight inputArmyKnight)
    {
        ArmyKnight = inputArmyKnight;
    }
    public void SetArmyLord(Lord inputLordData)
    {
        LordData = inputLordData;
    }

    public void LoadSoldierPrefab<T>()
    {
        //T prefab = Resources.Load<T>($"Prefabs/TestUnits/{typeof(T)}");
    }

    // 유닛 배치 변경
    public void MoveUnitDivisionPosition()
    {

    }
}
  • StrategyManager.cs
public class StrategyManager : MonoSingleton<StrategyManager>
{
    public StrategySettingSystem strategySettingSystem;
    public ArmyPrefabsSO armyPrefabs;
}
  • ArmyPrefabsSO.cs
using UnityEngine;

[CreateAssetMenu(fileName = "Army Prefabs", menuName = "Army Prefabs")]
public class ArmyPrefabsSO : ScriptableObject
{
    public ArmyLord armyCommander;
    public ArmyKnight armyKnight;
    public ArmySoldier armySoldier;
}
profile
미숙한 초보 게임 개발자

4개의 댓글

comment-user-thumbnail
2024년 12월 19일

대단합니다!!

1개의 답글
comment-user-thumbnail
2024년 12월 19일

항상 응원합니다!!!!

1개의 답글