요약
젬파이에서 주최한 옥탑방 게임잼에서 개발한 슬링샷과 타워 디펜스를 결합한 혁신적인 탑 뷰 디펜스 게임. 2박 3일이라는 극한의 시간 제약 속에서 4인 팀의 메인 개발자로 참여하여, 타워 병합 시스템과 Sprite 기반 공격 메커닉 등 핵심 게임플레이를 담당 구현한 프로젝트.
역할
•
4인 팀(기획/아트 1, 개발 2, 사운드 1)에서 메인 프로그래머 담당
•
타워 시스템 전체 설계 및 구현 (병합, 공격, 업그레이드)
•
적 시스템 및 아이템/버프 시스템 구현
성과
•
2박 3일 내 독창적인 타워 병합 메커닉 완성
•
Sprite와 콜라이더를 활용한 효율적 공격 시스템 구현
•
확장 가능한 아이템 효과 시스템 구축
시기
•
2024.XX.XX - 2024.XX.XX (2박 3일)
옥탑방에서 만난 업계 인사이트
좁은 옥탑방에 십여 명이 모여서 옹기종기 코딩하는 광경은 정말 독특했습니다. 각자 노트북을 펼치고 집중하다가도, 틈틈이 옆 팀과 자연스럽게 대화가 이어졌습니다.
가장 인상 깊었던 건 다양한 배경의 개발자들과 나눈 업계 이야기였습니다. 방치형 게임의 수익 구조, 미소녀 게임의 일본 시장 특성, 해외 퍼블리셔들에게 피칭하는 방법 등. 특히 한 시니어분이 "모바일 게임은 라이브하며 수치 관리를 안 해보면 이해할 수 없다"고 하신 말씀이 기억에 남습니다.
이런 대화들을 통해 게임 개발이 단순히 코딩 기술만의 문제가 아니라는 걸 느꼈습니다. 시장 트렌드, 플랫폼별 특성, 장르별 개발 패턴까지 고려해야 하는 복합적인 영역이라는 것을 배웠습니다.
트릭키한 해결책이 가져다준 시간 절약
다양한 타워의 공격 패턴을 구현해야 하는데, 각각 다른 모양과 범위를 가진 공격들을 어떻게 처리할지 고민이 많았습니다. 검 휘두르기는 부채꼴, 화염 분사는 원뿔, 마법 폭발은 원형 등 복잡한 모양들이었죠.
일반적으로는 각 공격마다 별도의 히트박스를 만들고 수동으로 조정해야 하는데, 시간도 부족하고 번거로웠습니다. 그때 아티스트분이 그려주신 공격 스프라이트를 보면서 아이디어가 떠올랐습니다. "이 스프라이트로 콜라이더를 구워버리면 어떨까?"
// SpriteAttackComponent에서 스프라이트 기반 공격 처리
protected override void ExecuteAttack()
{
if (currentTarget != null)
{
// 스프라이트 애니메이션과 동시에 구워진 콜라이더로 히트 판정
spriteRenderer.sprite = attackSprites[currentFrame];
attackCollider.enabled = true;
StartCoroutine(DisableColliderAfterFrame());
}
}
C#
복사
트릭키한 방법이긴 했지만, 정말 많은 시간을 아꼈습니다. 시각적으로 보이는 공격 범위와 실제 히트 판정이 완벽하게 일치했고, 새로운 공격 패턴 추가도 스프라이트만 바꾸면 끝이었거든요. 게임잼이라는 시간 제약 상황에서는 이런 효율성이 정말 중요했습니다.
설계 강박과 실용성 사이의 줄타기
사실 저는 평소에 설계에 쓸데없이 힘이 들어가는 편입니다. 게임잼에서는 자제하려고 하는데, 타워 병합 시스템을 구현할 때도 결국 그 성향이 나왔네요.
처음에는 단순하게 "Fire + Hound = FireHound"를 하드코딩으로 처리하려 했습니다. 하지만 코딩하다 보니 "이렇게 하면 나중에 조합 추가할 때 너무 번거롭겠다"는 생각이 들어서 결국 타입 기반 매트릭스로 설계했습니다.
private TowerBase GetMergedPrefab(TowerType type1, TowerType type2)
{
TowerType baseType, elementType;
if (IsBaseType(type1) && IsElementType(type2))
{
baseType = type1;
elementType = type2;
}
// 순서에 관계없이 병합 가능하도록 처리
else if (IsBaseType(type2) && IsElementType(type1))
{
baseType = type2;
elementType = type1;
}
// 체계적인 조합 로직
switch (baseType)
{
case TowerType.Hound:
switch (elementType)
{
case TowerType.Fire: return FireHoundPrefab;
case TowerType.Ice: return IceHoundPrefab;
// ...
}
}
}
C#
복사
결과적으로는 이 선택이 도움이 되었습니다. 개발 마지막에 Thunder 원소 추가 요청이 왔을 때, 프리팹만 추가하면 자동으로 모든 조합이 가능해졌거든요. 제한된 시간 내에 아이디어를 현실로 만들기 위해 이런저런 방법으로 열심히 달린 결과였습니다.