오늘은 CBT 빌드본을 QA팀한테 제출하는 날이었고, 마지막으로 추가할 기능과 연결 및 테스트 작업을 진행했다.
활성화된 시너지만을 UI로 표기하기 위해 아래와 같이 처리했다.
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;
}
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);
}
}
}
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;
}
}
}