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

이형원·2025년 8월 22일
0

XR플밍

목록 보기
173/215

1. 금일 한 업무

어제자 작업까지 포함하여 PR을 올린 내역이다.

  • 플레이어 데이터 연동 완료
  • 프리셋 세팅 데이터를 DataManager 구성을 통해 분리 및 싱글톤으로 선언
  • 게임시작 직전 단계까지의 연결 완료

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

2.1 데이터를 저장할 방법의 변경

기존에는 데이터의 저장을 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;
    }
}

팀장님과의 상의 이후에도 이 방식을 유지하는 것이 좋겠다는 판단을 했고장님과의 상의 이후에도 이 방식을 유지하는 것이 좋겠다는 판단을 했고

2.2 자동 편성 이후에 발생하는 버그 - 참조의 문제

수동 편성까지는 문제가 없었는데, 자동 편성 이후 해제를 하면 콜렉션 목록의 데이터를 저장하는 원본 데이터가 삭제되고 이후 다시 캐릭터를 등록하려고 할 때 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;

3. 개선점 및 과제

3.1 데이터베이스 연동

3.2 UI 폴리싱

3.3 업무 분배

3.4 리팩토링

profile
게임 만들러 코딩 공부중

0개의 댓글