내일배움캠프 - TIL/내일배움캠프 - TIL

내일배움캠프 25일차 - 데이터 드리븐

rudals4469 2025. 5. 22. 17:58

🎮 데이터 드리븐 개발(Data-Driven Development)이란?

데이터 드리븐 개발게임의 로직이나 설정을 코드에 직접 하드코딩하지 않고, 외부 데이터 파일(JSON, CSV, ScriptableObject 등)을 통해 정의하고 이를 코드에서 읽어 처리하는 방식입니다.

즉, 코드를 수정하지 않고도 데이터만 바꿔서 게임의 기능이나 밸런스를 바꿀 수 있는 구조입니다.

 


✅ 왜 데이터 드리븐 방식을 사용하는가?

  • 빠른 수정 가능
    코드 수정 없이 밸런스나 콘텐츠를 조정할 수 있어 빠른 테스트와 반복이 가능합니다.
  • 기획자 친화적
    개발자가 아닌 기획자나 디자이너도 데이터를 직접 수정해 테스트할 수 있어 협업 효율이 향상됩니다.
  • 하드코딩 지양
    수많은 조건문과 중복을 줄이고, 유지보수하기 쉬운 간결한 코드를 작성할 수 있습니다.
  • 실시간 콘텐츠 수정 가능
    JSON 등의 데이터를 수정해도 컴파일 없이 즉시 적용할 수 있어, 빠른 업데이트가 가능합니다.

📈 예시 1. 레벨업 시스템

❌ 하드코딩 방식

public class PlayerLevel : MonoBehaviour
{
    private int level = 1;
    private int exp = 0;

    public void AddExp(int amount)
    {
        exp += amount;

        if (level == 1 && exp >= 50)//수정할떄 마다 들어가서 수정.
        {
            level = 2;
            exp = 0;
        }
        else if (level == 2 && exp >= 200)
        {
            level = 3;
            exp = 0;
        }
        else if (level == 3 && exp >= 400)
        {
            level = 4;
            exp = 0;
        }
    }
}

 

문제점

  • 레벨 수가 많아지면 조건문이 폭증
  • 요구 경험치나 구조가 바뀌면 매번 코드 수정 필요
  • 기획자가 직접 수정 불가

 

✅ 데이터 드리븐 방식

[
  { "level": 1, "requiredExp": 100 },
  { "level": 2, "requiredExp": 200 },
  { "level": 3, "requiredExp": 400 },
  { "level": 4, "requiredExp": 800 },
  { "level": 5, "requiredExp": 800 }
  { "level": 6, "requiredExp": 800 }
  { "level": 7, "requiredExp": 8000 }
  { "level": 10, "requiredExp": 9900 }
]

 

public class LevelData
{
    public int level;
    public int requiredExp;
}

public class PlayerLevel : MonoBehaviour
{
    private List<LevelData> levelTable;
    public int level = 1;
    public int exp = 0;

    public void AddExp(int amount)
    {
        exp += amount;

        while (true)
        {
            LevelData current = levelTable.FirstOrDefault(l => l.level == level);
            if (current == null || exp < current.requiredExp) break;

            exp -= current.requiredExp;
            level++;
        }

    }

}

 

장점

  • JSON만 바꾸면 레벨 구조나 밸런스 변경 가능
  • 수백 레벨까지도 if 없이 처리 가능
  • 기획자가 Excel이나 구글 시트로 작성 가능

🎲 예시 2. 가챠 시스템

 

❌ 하드코딩 방식

public class GachaHardcoded
{
    public string Pull()
    {
        float rand = UnityEngine.Random.value;

        if (rand < 0.01f)
            return "전설";
        else if (rand < 0.10f)
            return "희귀";
        else
            return "일반";
    }
}

 

문제점

  • 등급/확률 변경 시 코드 수정 필요
  • 등급 추가할수록 if문이 늘어남
  • 디자이너가 직접 수정할 수 없음

✅ 데이터 드리븐 방식

[
  { "name": "전설", "rate": 0.01 },
  { "name": "희귀", "rate": 0.09 },
  { "name": "일반", "rate": 0.90 }
]

 

public class GachaDataDriven
{
    private List<GachaItem> table;

    public string Gacha()
    {
        float rand = UnityEngine.Random.value;
        float sum = 0;

        foreach (var item in table)
        {
            sum += item.rate;
            if (rand <= sum)
                return item.name;
        }

        return "???";
    }
}

 

장점

  • JSON만 수정하면 확률 및 등급 변경 가능
  • 새로운 등급도 데이터에만 추가하면 됨
  • 기획자가 직접 확률 조정 가능
  • UI 연동, 통계 분석, 로깅 시스템과 쉽게 결합 가능

⚠️ Unity 에디터 안에 파서 툴을 넣는 것의 위험성

데이터 파싱 툴을 Unity 프로젝트 안에 두면 다음과 같은 문제가 생깁니다:

  • 즉시 반영의 위험성
    구글 시트에 실수로 잘못된 데이터를 입력해도 Unity에 바로 반영되어 버그 유발 가능성이 높아짐
  • 컴파일 실패로 전체 차단
    잘못된 CSV나 JSON 구조가 클래스 자동 생성에 영향을 주면 컴파일 오류 발생 → 게임 자체 실행 불가
  • 버전 관리 충돌
    자동으로 생성된 파일이 Git 등 버전 관리 도구와 충돌하거나 추적이 어려워짐
  • 배포 버전 불일치
    기획자가 수정 중인 데이터가 실시간으로 반영되면 배포 버전과 로컬이 달라지는 문제 발생

🔧 따라서, 별도의 외부 프로그램이나 툴체인을 통해 CSV → 클래스 변환 후 Unity에서 사용하는 방식을 추천합니다.


🧠 관련 개념 요약

용어설명
Data-Driven Design 로직을 외부 데이터에 위임해 확장성과 유연성을 높이는 설계 방식
Code Generation 입력 데이터(CSV 등)를 바탕으로 자동으로 코드 생성
Schema-Based Code Generation JSON/CSV의 구조를 분석하여 타입 추론 및 클래스 자동 생성
Externalized Configuration 데이터나 설정을 코드 외부에서 관리하는 방식 (CSV, JSON 등 활용)

🕹️ 물리 기반 캐릭터 이동의 난점

단순히 Rigidbody를 사용한다고 해서 자연스럽고 재미있는 캐릭터 조작감이 나오지는 않습니다.

왜 어려운가?

  • 물리 효과의 부작용
    마찰, 반발력 등의 요소로 인해 예상치 못한 슬라이딩, 튕김 등 발생
  • 충돌 감지의 불확정성
    점프 후 튕기거나 벽에 끼이는 등 물리적 예외상황 발생

어떻게 개선할 수 있나?

  • 자체 구현보다는 검증된 레퍼런스를 참고
    • 점프킹, OnlyUp, 항아리 게임 등에서 영감을 얻기
    • 커스터마이징 가능한 물리 컨트롤러 제작
    • 슬로프, 계단, 구르기 등 복잡한 상황 고려