최종프로젝트 1주차 - 인벤토리 기능 구현중
<오늘 작업> 6/25
이 액티브 스킬 슬롯은 인벤토리에서 스킬을 장착, 해제, 스왑 등의 일이 일어날 때마다 실시간으로 UI를 갱신하기 위해 만들었다. 이를 위해 아래 SkillChangedEvent를 이벤트버스에 발행하고 ActiveSkillSlotController에서 구독하도록 해보겠다.
먼저
public class SkillChangedEvent
{
public int slotIndex; // 0부터 시작하는 슬롯 번호
public SkillBookData skillData; // 새로 장착된 스킬 (해제 시 null)
}
를 뭐 아무 스크립트에나 넣어주자. 난 스킬 슬롯 스크립트에 넣어줬다.
팀원이 만들어준 이벤트버스 스크립트가 있어서 그걸 활용했다.
using UnityEngine;
using UnityEngine.UI;
public class ActiveSkillSlotController : MonoBehaviour
{
//액티브 스킬 슬롯 프리팹에 붙는 스크립트(실제로 사용할 스킬 슬롯)
[Header("이 액티브 슬롯의 인덱스 (0부터)")]
public int slotIndex;
public Image skillImage;
private Color color;
void OnEnable()
{
EventBus.Subscribe<SkillChangedEvent>(OnSkillChanged);
}
void OnDisable()
{
EventBus.Unsubscribe<SkillChangedEvent>(OnSkillChanged);
}
private void Start()
{
color = skillImage.color;
}
private void OnSkillChanged(SkillChangedEvent evt)
{
if (evt.slotIndex != slotIndex)
return;
if (evt.skillData == null)
{
// 빈 슬롯 표시
skillImage.sprite = null;
color.a = 0f;
skillImage.color = color;
}
else
{
// 새 스킬 아이콘 표시
skillImage.sprite = evt.skillData.icon;
color.a = 1f;
skillImage.color = color;
}
}
}
이벤트버스를 통해 인벤토리 내부 로직과 UI로직을 분리했다.
SkillChangedEvent만 바꾸면 어떤 타입의 슬롯에도 재사용할 수 있어 확장성이 높다.
또한 슬롯 인덱스로 원하는 슬롯만 골라 업데이트하므로 불필요한 리프레시를 방지할 수 있다.
오늘은 팀장님이 한 번 전체적으로 머지를 했다. 어차피 각자 씬에서 작업했고 충돌이 났다고 로그가 있었지만 대충 보니까 같은 스크립트에서 작업해서 있었던 일인 것 같은데 뭐 Enum 스크립트면 금방 고치니까 큰 문제가 아니어서 다행이었다. 오늘 내가 원하는 기능 대부분은 했는데 하나가 안돼서 마음이 답답하다. 내일은.. 될까?
내일은 아래에 있는 남은 작업 다 하면 될 것 같다.
<남은 작업>
스킬 슬롯 내에서 자유자재로 순서 변경 가능하게 하는 거 꼭 해내고 싶은데.. 오늘 두 시간 걸려도 못 고쳤는데 내일은 꼭 고쳤으면 좋겠다.