어제자 작업까지 포함하여 PR을 올린 내역이다.
기존에는 데이터의 저장을 TeamOrganizeManager에서 진행했지만, 프리셋의 저장 및 향후 다음 씬으로 데이터를 연결하는 것까지 감안하면, 데이터를 저장하는 공간을 따로 두는 것이 좋다고 판단했다. 따라서 임시로 데이터 매니저를 만들고, 데이터를 이곳에 저장한 채로 싱글톤으로 다음 씬까지 옮겨지는 방식을 고안했다.
using System.Collections.Generic;
using UnityEngine;
public class TempDataManager : MonoBehaviour
{
public static TempDataManager Instance { get; private set; }
#region Data
private int _selectedPresetIndex = -1;
public int SelectedPresetIndex => _selectedPresetIndex;
private List<TeamPresetData> _presetData = new List<TeamPresetData>();
public List<TeamPresetData> PresetData => _presetData;
#endregion
private void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
Init();
}
private void Init()
{
PresetDataInit();
}
private void PresetDataInit()
{
if (_presetData.Count == 0)
{
for (int i = 0; i < 2; i++)
{
_presetData.Add(new TeamPresetData(5));
}
}
}
public void CreatePreset(int size)
{
_presetData.Add(new TeamPresetData(size));
}
public TeamPresetData ReadCurrentSelectedPreset()
{
if (_selectedPresetIndex == -1) return null;
return _presetData[_selectedPresetIndex];
}
public void SelectPresetIndex(int index)
{
_selectedPresetIndex = index;
}
}
팀장님과의 상의 이후에도 이 방식을 유지하는 것이 좋겠다는 판단을 했고장님과의 상의 이후에도 이 방식을 유지하는 것이 좋겠다는 판단을 했고
수동 편성까지는 문제가 없었는데, 자동 편성 이후 해제를 하면 콜렉션 목록의 데이터를 저장하는 원본 데이터가 삭제되고 이후 다시 캐릭터를 등록하려고 할 때 NRE가 뜨는 경우가 발견되었다.
이는 사용하는 데이터 자체가 List 형태 - 참조가 되고 있었기 때문에 캐릭터 편성을 빼는 과정에서 원본 데이터가 삭제되는 것이 원인으로 확인되었다. 따라서 아래와 같이 처리했다.
// 최적 편성 적용
for (int i = 0; i < bestTeam.Count; i++)
{
_currentPreset[i] = bestTeam[i];
_currentCost += bestTeam[i].Data.Cost;
}
_currentOverallPower = bestPower;
// 최적 편성 적용
for (int i = 0; i < bestTeam.Count; i++)
{
_currentPreset[i] = new UnitStatus(bestTeam[i].Data, bestTeam[i].Level);
_currentCost += bestTeam[i].Data.Cost;
}
_currentOverallPower = bestPower;