Project/우주적 베이글샵

[우주적 베이글샵 개발일지 #02] 유니티 스킬 카드 시스템 1차안 — 추상 클래스 + ScriptableObject + UI로 푼 구조

hipop1109 / 2026. 5. 29. 09:30

안녕하세요, '우주적 베이글샵' PO(Product Owner) 장조성이에요.

이번 주에는 게임의 핵심 시스템인 스킬 카드 추가 시스템의 1차안을 완성했어요.

 

이 글에서는 시스템을 어떤 목표(확장성·편의성·직관성)로 설계했는지,

그리고 어떤 구조(추상 클래스 + ScriptableObject + UI)로 풀어냈는지 공유할게요.

코드 일부와 UI 구조 스크린샷도 함께 볼 수 있어요.

 

이번 주 목표

게임 개발 초기 단계에서 게임의 주요 특징인 "여러 가지 스킬을 활용한 게임 플레이" 를 안정적으로 구현하기 위해, 확장성과 편의성, 직관성을 고려한 스킬 카드 추가 시스템을 구성하기로 했어요.

 

이 시스템의 목표는 3가지였어요.

  • 확장성: 수치 변화, 유틸리티 시스템, 맵 구조 변화 등 다양한 종류의 스킬을 포괄적으로 적용할 수 있는 시스템 만들기
  • 편의성: 스킬 카드의 모든 구성 요소를 하나로 묶어 적용할 수 있는 시스템 만들기
  • 직관성: 적용한 스킬 카드가 바로 게임의 메인 UI에 장착되고 활용될 수 있는 시스템 만들기

 

실제로 한 것

1. 베이스 카드 추상 클래스 (BaseCardBehavior)

using UnityEngine;

/// <summary>
/// 모든 카드 효과 프리팹이 상속받아야 하는 뼈대 클래스
/// </summary>
public abstract class BaseCardBehavior : MonoBehaviour
{
    [HideInInspector]
    public int currentLevel;

    /// <summary>
    /// 카드가 장착(Equip)될 때 GameUIManager에서 이 메서드를 호출하여 레벨을 주입하고 로직을 활성화
    /// </summary>
    public void Initialize(int level)
    {
        this.currentLevel = level;
        OnEquip();
    }

    /// <summary>
    /// 개발자가 오버라이드하여 작성할 실제 장착 시의 동작
    /// 예: 전역 이벤트(BagelEventManager 등) 구독, 스탯 버프 적용 등
    /// </summary>
    protected virtual void OnEquip() { }

    /// <summary>
    /// 장착이 해제(Unequip)될 때 오브젝트가 파괴되면서 자동으로 호출
    /// 예: 구독했던 이벤트를 취소하거나 버프를 원상복구하는 로직 작성
    /// </summary>
    protected virtual void OnDestroy() { }
}

 

 

가장 먼저 짠 구조는 오버라이드를 활용한 베이스 카드 추상 클래스예요.

이 코드를 상속받아 여러 스킬을 자유롭게 만들 수 있도록 확장성을 고려해 작업을 진행했어요.

 

이 클래스는 카드 구성 요소에 포함되어, 실제 게임에 적용됐을 때 타이밍에 맞춰 작동할 수 있도록 만들 예정이에요.

 

2. 카드 정보 ScriptableObject

앞에서 만든 추상 클래스를 포함해, 카드의 전체 정보를 담는 ScriptableObject(에셋으로 저장해서 여러 곳에서 재사용할 수 있는 Unity의 데이터 컨테이너) 구조도 작성했어요.

 

카드 이름·카드 설명·카드 가격을 명시해서 카드를 설명하기 쉽게 만들었어요.

또 카드 스프라이트를 구성 요소에 포함하면서, 추후 실제 UI에 적용했을 때 비주얼이 바로 보이도록 설계했어요.

그리고 추상 클래스를 통해 실제 장착 시 효과가 적용되는 구조도 함께 만들었어요.

 

[스크린샷: CardData ScriptableObject 인스펙터 — 카드 이름·설명·가격·스프라이트·효과 프리팹 필드를 한눈에 확인할 수 있는 구조]

 

3. 카드 장착 UI 시스템

위에서 만든 ScriptableObject를 UI에 연결해서, 카드를 직관적으로 적용하고 바로 확인할 수 있는 장착 시스템을 만들었어요.

UI 구조는 계속 다듬고 있는데, 기본 방향은 "마우스 호버 시 호버링 패널(마우스를 올렸을 때 나타나는 보조 정보 패널)로 상세 정보 보여주기" 예요.

 

이렇게 하면 메인 화면의 직관성은 유지하면서도 정보가 부족하지 않은 구조를 만들 수 있어요.

 

[스크린샷: 구성 중인 카드 장착 UI]

 

막힌 부분 또는 변경된 점

이번 1차안에는 보완해야 할 두 가지 지점이 있어요.

 

첫째, 카드 레벨 시스템과 관련된 세부 정보가 부족해요. 

카드의 레벨 시스템이 존재하기 때문에, 이를 반영한 스킬 레벨별 스탯 상승 수치나 레벨별 판매 가격·구매 가격 같은 정보가 명시되어야 해요. 이는 추가적인 기획을 통해 늘려 갈 예정이에요.

 

둘째, 모든 스킬을 "스킬"이라는 하나의 이름으로 묶어 둔 점이 적절하지 않다는 피드백을 받았어요. 

저희 게임에는 수치 변화·유틸리티 시스템·맵 구조 변화 등 다양한 종류의 스킬이 존재하는데, 이를 구분하지 않고 한 묶음으로 다루면 확장성에서 한계가 생긴다는 의견이었어요. 이 부분은 세부 파트를 나누어 구분할 수 있는 구조로 개선하기로 했어요. 구체적인 분류 방식은 아직 정해지지 않았고, 다음 회의에서 정할 예정이에요.

 

다음 주 계획

현재 저희의 목표는 최대한 많은 스킬을 구현하고 테스트하는 것이고,

그를 위해 지금 작성한 구조를 토대로 기획 파트·개발 파트·PO 관계없이 많은 아이디어를 끌어내는 게 최종 목표예요.

 

또한 6월 내로 도출할 프로토타입 작업에 박차를 가할 예정이에요.