XR플밍 - (주말작업) 기업협약 프로젝트 0.2일차 (8/16)

이형원·2025년 8월 16일
0

XR플밍

목록 보기
167/215

1. 금일 한 업무 정리

아직까지는 기획안이 구체적으로 나오지 않은 것도 있었고, 개인 일정 때문에 작업한 내용 자체는 많지 않았다.

  • 별도의 프로젝트에서 작업하던 내용 - 본 프로젝트로 반영
  • 캐릭터 편셩 프리셋 기능 구현
  • 기획팀과의 게임 컨셉에 대한 회의
  • 업무 분장에 대한 세분화

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

2.1 프리셋 시스템의 설정 방법, 초기화 문제

기존에는 한 슬롯만 편성이 가능했지만, 이제는 여러 슬롯의 편성을 진행해야 하며 해당 데이터를 저장해 둬야 하기 때문에, 선택 슬롯에 대해 클래스를 별도로 만들었다.

[Serializable]
public class SelectedCharacters
{
    public CharacterSO[] CharLists;

    public SelectedCharacters(int size)
    {
        CharLists = new CharacterSO[size];
    }
}

이제는 이걸 초기화해주고 프리셋 설정을 바꿀 수 있도록 변경해주어야 한다.

// 초기화
private void Awake()
{
    for (int i = 0; i < 3; i++)
    {
        _selectedCharacters.Add(new SelectedCharacters(5));
    }
    _currentCharacterSOs = _selectedCharacters[0].CharLists;
}

// 변경 기능 구현
public void SelectCharacterPreset(int index)
{
    _currentCharacterSOs = _selectedCharacters[index].CharLists;
    _currentCost = 0;
    _currentOverallPower = 0;
    for(int i = 0; i <  _currentCharacterSOs.Length; i++)
    {
        if (_currentCharacterSOs[i] != null)
        {
            _currentCost += _currentCharacterSOs[i].Cost;
            _currentOverallPower += _currentCharacterSOs[i].OverallPower;
        }
    }

    OnCharacterDataChanged?.Invoke();
}

여기서 한 가지 유의해야 할 점이 있는데, OnEnable과 충돌할 가능성에 대해 염두에 두고 있어야 한다는 점이다.

using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class SelectedCharacterUnit : MonoBehaviour
{
    [Header("Index")]
    [SerializeField] private int _index;

    [Header("UI")]
    [SerializeField] private TMP_Text _charText;
    [SerializeField] private TMP_Text _costText;
    [SerializeField] private TMP_Text _jobSynergyText;
    [SerializeField] private TMP_Text _roleSynergyText;
    [SerializeField] private TMP_Text _overallPowerText;

    private CharacterSO _charData;
    private TeamOrganizeManager _manager;

    private void Awake()
    {
        _manager = GetComponentInParent<TeamOrganizeManager>();
        GetComponent<Button>().onClick.AddListener(TryDeleteCharacter);
    }

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

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

	...

    private void UIUpdate()
    {
        _charData = _manager.GetCurrentCharacterData(_index);

        if(_manager == null || _charData == null)
        {
            _charText.text = "";
            _costText.text = "";
            _jobSynergyText.text = "";
            _roleSynergyText.text = "";
            _overallPowerText.text = "";
        }
        else
        {
            _charText.text = $"{_charData.name}";
            _costText.text = $"{_charData.Cost}";
            _jobSynergyText.text = $"{_charData.CharacterSynergy.JobSynergy}";
            _roleSynergyText.text = $"{_charData.CharacterSynergy.RoleSynergy}";
            _overallPowerText.text = $"{_charData.OverallPower}";
        }
    }
}

처음에는 이와 같이 되어 있었지만, OnEnable에서 UIUpdate를 호출할 경우 캐릭터 데이터 슬롯을 생성하기도 전에 받아와서 인덱스 오버 에러가 뜨는 것을 확인했다. 따라서 이를 Start문에서 선언해야지 문제를 해결할 수 있다.

2.2 업무에 대한 분배

업무에 대한 추가적인 분배에 관해 전달받았다. 우선 필요한 씬이 로그인 씬, 로비 씬, 전투 씬, 가챠 씬 이 정도로 나뉠 수 있는데, 각각의 씬 자체를 한 사람에게 분담하기로 한 것이다. 이에 따라 내가 맡게 된 씬은 로비 씬이 되었고, 로비 씬의 구체적인 도안 같은 것이 정해지면 직접적으로 작업을 시작하게 될 것이다.
다만 씬 작업도 당장은 할 수 없는 일인지라, 다음으로 해야 할 일은 리더 시스템에 대해 틀을 잡는 것이다.

3. 개선점 및 과제

3.1 리더 시스템 구현

3.2 씬 작업에 대한 틀 잡기

3.3 CSV 데이터 SO 기능 가져와보기

profile
게임 만들러 코딩 공부중

0개의 댓글