Unity

개발 일지 - 포션 아이템 추가 및 점수, 골드 아이템 스크립트 변경(Interface)

devrabbit22 2025. 11. 26. 05:22

기존에는 아이템들을 ScriptableObject로 관리하고, 각 아이템 오브젝트가 OnTriggerEnter2D를 통해 플레이어와 충돌 시 작동하는 방식으로 구현했다.

그러나 아이템을 추가하면서, 각 챕터마다 다른 스프라이트와 점수를 가진 아이템들을 관리해야 하는 상황이 생겼다. 기존 방식으로는 switch문이나 개별 스크립트를 수정해야 했기 때문에, 확장성과 유지보수하는데 불편함을 느꼈다.

이를 개선하기 위해 IItem 인터페이스를 만들고, 각 아이템 클래스가 이를 구현하도록 구조를 변경했다.

  • 인터페이스를 구현하면 아이템마다 별도의 스크립트를 수정하지 않아도, 공통된 방식으로 효과를 적용할 수 있다.
  • OnTriggerEnter2D 방식은 그대로 유지하면서, 각 아이템의 효과는 IItem 인터페이스를 통해 처리된다.
  • 이렇게 하면 새로운 아이템 추가나 기존 아이템 수정 시에도 코드 수정 범위를 최소화할 수 있어, 유지보수와 확장성이 크게 향상된다.

우선 간단하게 IItem 인터페이스를 구현하여, 아이템의 이름(Name)과 획득 시 발생하는 효과에 대한 메서드만 정의했다.

각 아이템 클래스에서는 이 인터페이스를 구현 하도록 작성하여, 아이템마다 서로 다른 효과를 효율적으로 적용할 수 있었다.
이 방식 덕분에 기존처럼 switch문으로 분기하거나 개별 스크립트를 일일이 수정할 필요 없이, 새로운 아이템을 추가할 때도 공통 인터페이스 구조만 유지하면 쉽게 기능을 확장할 수 있다.

// 간단하게 구현한 Item 인터페이스
using System.Collections;
using System.Collections.Generic;

public enum ItemType
{
    Coin,
    GiantItem,
    SpeedItem,
    ShieldItem,
    HealItem,
    ScoreItem
}

public interface IItem
{
    ItemType Type { get; }   // 아이템 종류
    void OnPickUp(GameManager gm);
}

하나의 인터페이스를 사용해 여러가지 아이템을 유연하게 구현할 수 있다.

게임 시작 전 카운트다운 도중 버튼을 통해 캐릭터의 행동이 가능하던 현상

GameManager에서 게임이 시작하면 isGameStart값이 true가 되는데 이 Bool 변수를 사용해 각 사용가능한 버튼들에게 조건을 추가해 버튼들을 제어하도록 수정했습니다.

스테이지 도전 시 행동력 소모 처리

스테이지 진입 과정에 행동력(스태미나) 소모 시스템을 추가했다.
현재 구조는 다음과 같다.

  • 스테이지 도전 시: 게임 플레이 시작
  • 스테이지 클리어 실패 후
    • 재도전: 추가 차감 없이 그대로 진행
    • 포기: LobbyScene으로 이동, 행동력 차감 없음
  • 스테이지 선택 화면에서 차감 체크 (UI 확인을 위해 활성화 시킨 이미지)

탐색시작을 눌러 게임을 시작하기 전에 체크한다.

현재 구현된 시스템에서는 스테이지 클리어 성공 시에만 행동력이 차감된다.

  • 스테이지 도전 시: 게임 플레이 시작
  • 스테이지 클리어 성공 시: 행동력 차감
  • 스테이지 클리어 실패 후
    • 재도전: 추가 차감 없이, 그대로 진행
    • 포기: 행동력 차감 없음 (환급 개념과 동일)

Firebase에 플레이어 데이터를 저장하기 위해 해당 메서드를 async로 선언하고, 내부에서 await를 사용하여 비동기 저장 함수(SavePlayerData)가 완료될 때까지 안전하게 대기하도록 구현했다.

게임이 클리어되면서 Firebase에 변동사항을 저장시킨다.

변동된 데이터로 저장된 모습

다만 한 가지 문제가 있었다. 현재 경험치는 경험치 테이블을 기반으로 계산되지만, 저장된 데이터는 totalExp로만 관리되고 있었다.
그 결과, 로드 시 currentExp와 UI의 경험치 슬라이더가 갱신되지 않는 문제가 발생했다.

이를 해결하기 위해, 데이터를 로드할 때 totalExp를 기반으로 현재 레벨과 현재 경험치를 계산하도록 구현하였다.
이 방식으로, 저장된 데이터를 불러와도 경험치 슬라이더와 레벨 정보가 정상적으로 갱신되는것을 확인했다.

구현 내역 영상

플레이 이후 저장된 플레이어 데이터 값


이후 개발 예정 내역

1. 인게임 UI 추가

  • 플레이어 체력, 쉴드 UI 구현
  • 로딩 UI 구현

2. Lobby UI 추가

  • 상점 UI
  • 뽑기 UI

3. 게임 시스템 추가

  • 상점 시스템
    • 판매 아이템 예시:
      • 시작 가속
      • 쉴드 +1
      • 부활 (체력 1로 부활)

4. 기획할 내역

  • 상점 주인 캐릭터 설정 및 디자인
  • 상점 판매 아이템 이름 설정
  • 뽑기 상점 캐릭터 설정 및 디자인
  • 기획한 캐릭터들과 챕터 정보 기반 간단한 스토리 기획

기획을 병행하다 보니 프로토타입 개발이 다소 지연되고 있다.
하지만 기획을 진행하면서 빠진 부분을 점차 개발하고 확인할 수 있으며, 무엇보다 기획부터 개발까지 하나의 게임 구현 과정을 직접 경험하고 있다는 점에 의의를 두고 있다.

예전에도 개발 도중 중간에 멈췄던 프로젝트들이 있었지만, 이번에는 그때와 달리 마지막까지 꾸준히 구현하며 완성하는 경험을 쌓고자 한다.

추가로, 기획한 내역들도 정리하여 문서화해보려고 한다.
문서가 정리되면, 이를 바탕으로 추후 개발 일지에 반영하여 기록할 계획이다.