XR플밍 - 12. UnityEngine3D Reactive 프로그래밍 - 기업협약 프로젝트 20일차 (9/12)

이형원·2025년 9월 12일
0

XR플밍

목록 보기
194/215

1. 금일 한 업무 정리

오늘은 CBT 빌드본을 QA팀한테 제출하는 날이었고, 마지막으로 추가할 기능과 연결 및 테스트 작업을 진행했다.

  • 시너지 활성화 UI 표기 기능 구현
  • UI 폴리싱 작업 및 팝업 UI 추가I 폴리싱 작업 및 팝업 UI 추가

2. 문제의 발생과 해결 과정

활성화된 시너지만을 UI로 표기하기 위해 아래와 같이 처리했다.

  • TeamOrganizeMnanager에서 프리셋에 대한 시너지 효과를 딕셔너리로 전달.
private void InitializeSynergy()
{
    foreach (Synergy synergy in Enum.GetValues(typeof(Synergy)))
    {
        if (synergy == Synergy.Length)
            continue;

        synergyCounts[synergy] = 0;
    }
}

public Dictionary<Synergy, int> GetSynergyCount()
{
    // 초기화를 안해주면 프리셋을 바꿀 때 UI가 초기화가 안되서 일단 이렇게 처리하는데...
    // 더 좋은 방법이 있으면 개선할 필요가 있어 보입니다
    InitializeSynergy();

    foreach (var unit in _currentPreset)
    {
        if (unit.Data == null) continue;

        Synergy synergy = unit.Data.Synergy;

        if (!synergyCounts.ContainsKey(synergy))
            synergyCounts[synergy] = 0;

        synergyCounts[synergy]++;
    }

    return synergyCounts;
}
  • LobbySynergyController에서 슬롯 초기화 및 업데이트 진행
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class LobbySynergyController : MonoBehaviour
{
    [SerializeField] GameObject _synergySlotPrefab;
    [SerializeField] Transform _content;

    private Dictionary<string, LobbySynergySlot> _synergySlots = new(50);

    private TeamOrganizeManager _manager;

    private void Awake()
    {
        _manager = GetComponentInParent<TeamOrganizeManager>();
    }

    private void OnEnable()
    {
        InitializeSynergySlots();
        _manager.OnCharacterDataChanged += UpdateSynergySlots;
    }

    private void OnDisable()
    {
        _manager.OnCharacterDataChanged -= UpdateSynergySlots;
    }

    private void InitializeSynergySlots()
    {
        if (Manager.Data.SynergyDB == null || _synergySlots.Count != 0) return;

        foreach (var data in Manager.Data.SynergyDB._synergyDataDic.Values)
        {
            if (data is UnitSynergyData unitSynergy)
            {
                LobbySynergySlot slot = Instantiate(_synergySlotPrefab, _content).GetComponent<LobbySynergySlot>();
                slot.Init(data, 0);
                _synergySlots.Add(unitSynergy.Synergy.ToString(), slot);
                Debug.Log(unitSynergy.Synergy.ToString());
            }
        }
    }    

    private void UpdateSynergySlots()
    {
        if (Manager.Data.SynergyDB._synergyDataDic == null || _synergySlots == null) return;

        Dictionary<Synergy, int> synergyCount = _manager.GetSynergyCount();

        foreach(var data in synergyCount)
        {
            Synergy synergy = data.Key;
            int count = data.Value;

            _synergySlots[synergy.ToString()].UpdateUI(count);
        }

        SetHiararchy();
    }
   

    private void SetHiararchy()
    {
        List<LobbySynergySlot> slots = new List<LobbySynergySlot>(_synergySlots.Values);

        slots.RemoveAll(s => s.ActiveCount <= 0);

        slots.Sort((a, b) =>
        {
            int result = b.ActiveCount.CompareTo(a.ActiveCount);
            if (result == 0)
                result = b.UpgradeCount.CompareTo(a.UpgradeCount);

            return result;
        });

        for (int i = 0; i < slots.Count; i++)
        {
            slots[i].transform.SetSiblingIndex(i);
        }
    }
}
  • LobbySynergySlot에서 Update를 진행, 비활성화를 image컬러를 clear로 만드는 것으로 처리
using UnityEngine;
using UnityEngine.UI;

public class LobbySynergySlot : MonoBehaviour
{
    [SerializeField] private Image _icon;

    private SynergyData _synergyData;
    private int[] _synergyCountArray;
    public int ActiveCount { get; private set; }
    public int UpgradeCount => _synergyData.CurrentUpgradeIdx;

    public void Init(SynergyData data, int activeCount)
    {        
        _synergyData = data;
        _icon.sprite = data.Icon;
        SetSynergyCount();
        UpdateUI(activeCount);
    }

    public void UpdateUI(int activeCount)
    {
        ActiveCount = activeCount;
        if(ActiveCount < _synergyCountArray[0])
        {
            _icon.color = Color.clear;
        }
        else
        {
            _icon.color = Color.white;
        }
    }

    public void SetSynergyCount()
    {
        _synergyCountArray = new int[_synergyData.SynergyLevelData.Length];

        for (int i = 0; i < _synergyData.SynergyLevelData.Length; i++)
        {
            _synergyCountArray[i] = _synergyData.SynergyLevelData[i].SynergyNeedCount;
        }
    }
}

3. 개선점 및 과제

3.1 빌드본 안정화 작업

3.2 각종 게임 데이터 DB에 연동하는 작업 본격적으로 시작

3.3 QA에서 보고하는 버그 수정

3.4 리팩토링

profile
게임 만들러 코딩 공부중

0개의 댓글