반응형

Roto-Versus를 개발하면서 최근 해결할 수 없는 '버그'로 인하여 새롭게 프로젝트를 구성하고자 합니다.

그 전에, 이전에는 작성하지 못했던 개발에 필요한 기획서(GDD) / 계획서 / 개발 과정 체크리스트 / 게임 방법(설명서) 등 모든 문서에 대하여 작성하고 기록하고자 합니다.

모든 통합 문서는 본 게시물을 지속적으로 업데이트 하는 것으로 진행합니다.


  • [2025.09.09] Roto-Versus 통합 문서 자료 (Ver1.0) 작성

 


Roto-Versus 게임 기획서 (Ver 1.0)

 

더보기

Roto-Versus 게임 기획서 (Ver 1.0)

1. 개요 (Overview)

항목 내용
게임 제목 Roto-Versus (가제)
플랫폼 모바일 (Android, iOS), PC (향후 고려)
장르 1:1 턴제 퍼즐 보드게임
타겟 유저 간단한 규칙의 전략적인 두뇌 싸움을 즐기는 캐주얼 게이머
로그라인 한 명은 자신의 말을 이동시키고, 다른 한 명은 '세상의 방향'을 바꾸는 나침반을 회전시키는 비대칭 1:1 턴제 퍼즐 대전 게임.

2. 핵심 컨셉 (Core Concept)

본 게임의 핵심 재미는 **'비대칭 역할'**과 **'예측 불가능성'**에서 비롯되는 깊이 있는 심리전에 있다. 플레이어는 매 턴 '이동(Mover)'과 '회전(Rotator)'이라는 상이한 역할을 번갈아 맡게 된다. 이동자는 자신의 말을 목표 지점으로 보내는 데 집중하고, 회전자는 상대방의 의도를 예측하고 방해하는 데 집중하며, 이 과정에서 발생하는 치열한 수 싸움이 게임의 중심을 이룬다.

3. 게임 플레이 (Gameplay)

3.1. 게임 목표

  • 5x5 크기의 보드 위에서, 상대보다 먼저 자신의 '말(Pawn)'을 중앙 (0,0)에 위치한 목표 지점에 도달시키는 것.

3.2. 게임 흐름 (Game Flow)

  1. 선공 정하기: 게임 시작 시, 두 플레이어는 '가위바위보'를 진행한다.
  2. 우선권 선택: 가위바위보의 승자는 '선공(Mover)' 또는 '후공(Rotator)' 역할을 첫 턴에 맡을지 선택할 권리를 갖는다.
  3. 턴 진행:
    • 각 턴은 'Mover'의 선택 단계와 'Rotator'의 선택 단계로 나뉜다.
    • Mover: 4장의 방향 카드(앞, 뒤, 좌, 우) 중 하나를 선택한다.
    • Rotator: 2장의 회전 카드(좌 90도, 우 90도) 중 하나를 선택한다.
  4. 턴 결과 실행:
    • 두 플레이어의 선택이 모두 끝나면, '회전'이 먼저 적용된다. (맵 아래의 나침반이 회전)
    • 그 후, 회전된 방향을 기준으로 '이동'이 적용된다.
    • 이동 효과는 Mover 자신의 말에만 적용된다.
  5. 턴 종료: 한 턴이 끝나면 두 플레이어의 역할(Mover/Rotator)이 서로 바뀐다.
  6. 게임 종료: 한 플레이어의 말이 목표 지점에 도착하면 즉시 해당 플레이어의 승리로 게임이 종료된다.

3.3. 핵심 시스템

  • 정적 맵(Static Map): 게임 보드 자체는 회전하지 않아 플레이어의 시각적 혼란을 최소화한다.
  • 회전 나침반(Rotating Compass): 맵 아래에 위치한 '나침반' 오브젝트가 회전하며 현재 '앞' 방향이 어디인지를 시각적으로 알려준다. 모든 이동은 이 나침반의 방향을 기준으로 계산된다.
  • 시작 시 랜덤 회전: 매 게임 시작 시, 나침반이 0, 90, 180, 270도 중 무작위 방향으로 설정되어 매번 새로운 퍼즐을 제공한다.

4. 게임 모드 (Game Modes)

  • 솔로 플레이 (vs AI): 1인 플레이어가 컴퓨터 AI와 대결하는 모드.
  • 함께하기 (2인 로컬 PvP): 하나의 기기를 이용해 두 명의 플레이어가 마주 보고 플레이하는 모드.
  • 온라인 대전: (향후 확장 목표) 인터넷을 통해 다른 플레이어와 대결하는 모드.

5. UI/UX 컨셉

  • 세로 화면 최적화: 모바일 기기에 최적화된 세로 UI 레이아웃을 채택한다.
  • 마주보고 플레이: '함께하기' 모드에서 2P의 UI는 180도 회전되어, 맞은편에 앉은 플레이어가 직관적으로 조작할 수 있도록 한다.
  • 순차적 턴 UI: '함께하기' 모드에서는 한 번에 한 플레이어의 카드 선택 화면만 보여주어, 상대방이 어떤 카드를 선택했는지 알 수 없도록 한다.
  • 시각적 피드백: 카드 선택, 나침반 회전, 말 이동 등 모든 행동에 부드러운 애니메이션과 효과를 적용하여 '보는 재미'를 더한다.

6. 아트 스타일

  • 테마: 미니멀하고 깔끔한 '디지털 보드게임' 컨셉.
  • 맵 & 말: 심플한 기하학적 형태나 직관적인 아이콘 형태를 사용. (커스터마이징 가능성을 열어둠)
  • 나침반: 게임의 핵심 오브젝트로서, 디테일하고 미려한 3D 모델을 사용하여 시각적 중심을 잡는다.
  • UI: 직관적인 아이콘과 가독성 높은 폰트를 사용하여 명확한 정보 전달에 집중한다.

Roto-Versus 개발 계획서

더보기

Roto-Versus 개발 계획서

본 문서는 'Roto-Versus' 프로젝트를 성공적으로 완성하기 위한 단계별 개발 로드맵을 정의한다. 각 단계는 명확한 목표를 가지며, 이전 단계의 완성을 기반으로 진행된다.

Phase 1: 프로토타입 재구축 및 안정화 (현재 단계)

목표: 이전 프로젝트에서 확인된 모든 버그를 해결하고, 기획서 1.0 버전에 명시된 핵심 게임플레이 루프를 완벽하게 구현한 안정적인 기반을 다시 구축한다.

  • Task 1.1: 새 Unity 프로젝트 설정 및 기본 아키텍처(폴더, 씬 구조) 구축.
  • Task 1.2: '함께하기' 모드의 전체 게임 흐름(타이틀 -> 메뉴 -> 게임) 구현.
    • 씬 전환 시스템(SceneLoader) 구현.
    • 반응형 세로 UI 레이아웃(Canvas Scaler, Anchors) 설정.
  • Task 1.3: GameManager, UIManager, BoardManager 등 핵심 매니저 스크립트 재작성.
    • '정적 맵 + 회전 나침반' 시스템 적용.
    • '순차적 턴 UI' 로직 적용.
  • Task 1.4: 모든 기능(가위바위보, 선/후공 선택, 턴 진행, 승리 판정, 재시작)이 버그 없이 완벽하게 동작하는지 검증.

Phase 2: UI/UX 고도화 및 '보는 재미' 강화

목표: 현재의 기능적 UI를 넘어, 플레이어에게 시각적 즐거움과 만족감을 주는 세련된 UI/UX를 완성한다.

  • Task 2.1: 게임의 전체적인 아트 스타일 및 디자인 테마 확정.
  • Task 2.2: 최종 디자인의 카드, 배경, 플레이어 말 등 그래픽 에셋 제작 및 적용.
  • Task 2.3: UI 애니메이션 구현.
    • 카드가 나타나고 사라지는 애니메이션.
    • 버튼 클릭 시 시각적 피드백 (색상 변경, 크기 변화 등).
  • Task 2.4: 사운드 시스템 구현.
    • 배경 음악(BGM) 추가.
    • 주요 행동(카드 선택, 나침반 회전, 승리 등)에 대한 효과음(SFX) 추가.

Phase 3: "혼자 하기" 모드 완성 (AI 개발)

목표: 플레이어가 혼자서도 게임을 충분히 즐길 수 있도록, 도전적인 AI 상대를 구현한다.

  • Task 3.1: AIPlayerController 스크립트 구체화.
  • Task 3.2: AI 의사결정 로직 구현.
    • Level 1 (Random AI): 모든 선택을 무작위로 하는 AI. (기본 기능 검증용)
    • Level 2 (Greedy AI): 목표 지점으로 가는 최단 경로를 우선적으로 선택하는 AI.
    • Level 3 (Strategic AI): 상대방을 방해하는 회전을 고려하는 등, 좀 더 전략적인 수를 계산하는 AI.
  • Task 3.3: AI 피드백 UI 추가.
    • "AI가 생각 중입니다..." 와 같은 시각적 표시.
    • AI의 선택을 시각적으로 보여주는 기능 (예: AI가 선택한 카드가 잠시 나타났다 사라짐).

Phase 4: 최종 폴리싱 및 빌드

목표: 게임의 완성도를 최종적으로 높이고, 실제 플레이가 가능한 빌드를 생성한다.

  • Task 4.1: 게임 편의 기능 추가.
    • 게임 오버 시 '메뉴로 돌아가기', '다시 하기' 버튼 기능 활성화.
    • 간단한 설정 메뉴 (사운드 On/Off 등).
  • Task 4.2: 전체적인 테스트 및 밸런스 조정.
  • Task 4.3: 플랫폼별(PC/모바일) 빌드 및 테스트.

프로토타입 재구축 체크리스트

더보기

Roto-Versus 프로토타입 재구축 체크리스트

새 프로젝트에서 안정적인 '함께하기' 모드 프로토타입을 다시 구축하기 위한 기술적 작업 목록.

1. 프로젝트 및 씬 설정

  • [ ] 새 3D (URP) 프로젝트 생성
  • [ ] 폴더 구조 생성 (_Scripts, Scenes, Prefabs, Models, Materials 등)
  • [ ] 씬 3개 생성 및 이름 지정 (00_TitleScene, 01_MenuScene, 02_GameScene)
  • [ ] Build Settings에 3개 씬 순서대로 등록

2. UI 시스템 구축

  • [ ] 각 씬에 CanvasEventSystem 배치
  • [ ] 모든 CanvasCanvas Scaler를 세로 모드(1080x1920, Match 0.5)로 설정
  • [ ] 00_TitleScene: 로고, 시작 버튼 UI 배치 및 Anchor 설정
  • [ ] 01_MenuScene: 모드 선택 버튼 UI 배치 및 Anchor 설정
  • [ ] 02_GameScene: P1_Area, P2_Area 등 세로 레이아웃 구조 설계
  • [ ] P2_AreaScale(-1, -1, 1)로 설정하여 '마주보기' UI 구현
  • [ ] 한글 폰트 에셋 생성 및 모든 TextMeshPro 오브젝트에 적용

3. 핵심 스크립트 재작성

  • [ ] SceneLoader.cs 작성 및 타이틀/메뉴 씬의 버튼에 연결
  • [ ] PlayerController, HumanPlayerController, AIPlayerController 기본 구조 작성
  • [ ] GameAction.cs (enum 정의) 작성
  • [ ] PlayerPawn.cs (이동 코루틴) 작성
  • [ ] BoardManager.cs 재작성
    • [ ] boardTransform, compassTransform 변수 선언
    • [ ] CreateBoard: 타일, 목표, 나침반 생성 로직
    • [ ] SpawnPlayers: 플레이어 생성 로직
    • [ ] RotateBoardRoutine: 나침반 회전 코루틴
  • [ ] UIManager.cs 재작성
    • [ ] 모든 UI 요소(Panel, Text, Button 등) 변수 연결
    • [ ] ShowRPSUI, ShowWinnerChoiceUI, ShowTurnUI 등 상태별 UI 제어 함수
  • [ ] GameManager.cs 재작성
    • [ ] SetupRoutine: 가위바위보 -> 우선권 선택 흐름 구현
    • [ ] GameLoopTurnRoutine: 순차적 턴 진행 흐름 구현
    • [ ] GetRotatedVector: 나침반 각도를 기준으로 이동 방향 계산
    • [ ] 승리 조건, 경계 체크 등 모든 보조 로직 구현

4. 프리팹(Prefab) 및 에셋 재설정

  • [ ] Tile 프리팹 생성 및 Scale 설정
  • [ ] Player1, Player2 프리팹 생성 (빈 부모 + 2D Quad 자식)
  • [ ] Goal 프리팹 생성
  • [ ] Compass 3D 모델 임포트 및 PBR 머티리얼 설정
  • [ ] Compass 프리팹 생성 (빈 부모 + 3D 모델 자식, Pivot 정렬)
  • [ ] GameManager 오브젝트 재설정 및 모든 컴포넌트, 변수 연결
  • [ ] 모든 카드 버튼(가위바위보, 선/후공, 이동/회전)의 OnClick() 이벤트 재연결

Roto-Versus 게임 방법

더보기

Roto-Versus 게임 방법

게임 목표

상대방보다 먼저 당신의 '말'을 보드 중앙에 있는 목표 지점에 도달시키세요!

게임 시작하기: 선공 정하기

  1. 가위바위보: 게임이 시작되면, 두 플레이어는 가위바위보를 합니다. 화면에 나타나는 가위, 바위, 보 카드 중 하나를 선택하세요.
  2. 우선권 선택: 가위바위보에서 이긴 플레이어는 이번 게임의 첫 턴에 '선공'을 할지, '후공'을 할지 선택할 수 있습니다.
    • 선공: 첫 턴에 자신의 말을 움직이는 '이동(Move)' 역할을 맡습니다.
    • 후공: 첫 턴에 세상의 방향을 바꾸는 '회전(Rotate)' 역할을 맡습니다.

당신의 턴

매 턴마다 두 플레이어는 서로 다른 역할을 맡게 됩니다. 한 턴이 끝나면 역할은 자동으로 서로 바뀝니다.

1. 이동(Move) 역할일 때

당신은 '이동자(Mover)'입니다. 당신의 목표는 말을 목표 지점으로 옮기는 것입니다.

  • 화면에 4장의 방향 카드(앞, 뒤, 왼쪽, 오른쪽)가 나타납니다.
  • 당신의 말이 이동할 방향을 선택하세요.

2. 회전(Rotate) 역할일 때

당신은 '회전자(Rotator)'입니다. 당신의 목표는 상대방의 움직임을 방해하거나, 다음 내 턴에 유리한 상황을 만드는 것입니다.

  • 화면에 2장의 회전 카드(왼쪽 90도, 오른쪽 90도)가 나타납니다.
  • 맵 아래에 있는 '나침반'을 회전시킬 방향을 선택하세요.

턴 결과

두 플레이어가 모두 선택을 마치면, 다음과 같은 순서로 결과가 실행됩니다.

  1. 회전: '회전자'가 선택한 방향으로 맵 아래의 나침반이 먼저 회전합니다.
  2. 이동: 그 후, 회전된 나침반이 가리키는 '앞' 방향을 기준으로 '이동자'가 선택한 방향으로 말이 한 칸 움직입니다.

예시:

  • 나침반이 정면을 가리키고 있습니다.
  • 당신(이동자)은 '앞으로' 카드를 선택했습니다.
  • 상대방(회전자)은 '오른쪽 90도 회전' 카드를 선택했습니다.
  • 결과: 나침반이 오른쪽으로 90도 회전한 뒤, 당신의 말은 새로운 '앞' 방향, 즉 오른쪽으로 한 칸 움직입니다.

승리하기

이 과정을 반복하여, 상대보다 먼저 당신의 말을 보드 중앙의 목표 지점에 올려놓으면 승리합니다!

Roto-Versus 버그 리포트

더보기

Roto-Versus 개발 문제 해결 기록 (Post-mortem)

이전 프로젝트에서 발생했던 주요 문제점과 그 해결 과정을 기록하여, 새 프로젝트에서 동일한 실수를 반복하지 않기 위한 문서.

[초기 개발 단계] 3D 오브젝트 배치 및 설정 오류

1. 플레이어가 맵 타일에 파묻히는 현상

  • 문제 현상: BoardManager가 생성한 플레이어 말이 타일 내부에 절반쯤 파묻혀서 보임.
  • 디버깅 과정: 플레이어 생성 시 Y좌표 값을 0.01f로 설정했으나 문제가 지속됨. Game 뷰에서 직접 Y값을 조절하며 확인.
  • 근본 원인: 기본 Cube 프리팹의 높이는 1이며, 중심점(Pivot)이 정중앙에 있다. 따라서 Position Y=0에 생성된 타일의 윗면은 정확히 Y=0.5에 위치한다.
  • 최종 해결책: BoardManagerSpawnUnits 함수에서 플레이어 생성 시 Y좌표를 0.51f로 설정하여 타일 윗면에 정확히 위치하도록 수정.

2. 탑뷰에서 2D 플레이어가 보이지 않는 문제

  • 문제 현상: 2D 이미지를 적용한 Quad 오브젝트가 탑뷰에서 선으로만 보이거나 거의 보이지 않음.
  • 디버깅 과정: 프리팹 수정 모드에서 QuadRotation 값을 확인.
  • 근본 원인: Quad 오브젝트가 수직으로 서 있도록 Rotation X 값이 0으로 설정되어 있었음.
  • 최종 해결책: QuadRotationX: 90, Y: 0, Z: 0으로 설정하여 바닥에 평평하게 눕도록 수정.

[UI 시스템 구현 단계] 반응형 UI 및 에셋 설정 오류

3. 화면 비율에 따라 UI가 깨지는 현상

  • 문제 현상: Game 뷰의 화면 비율을 바꾸면 버튼이나 이미지가 화면 밖으로 나가거나 크기가 이상해짐.
  • 디버깅 과정: Canvas Scaler 설정과 각 UI 요소의 Rect Transform을 점검.
  • 근본 원인: Canvas Scaler가 세로 모드(1080x1920)에 맞게 설정되지 않았고, 각 UI 요소에 **앵커(Anchor)**가 올바르게 지정되지 않았음.
  • 최종 해결책: Canvas ScalerScale With Screen Size, 기준 해상도 1080x1920, Match0.5로 설정. 모든 UI 요소에 위치에 맞는 앵커(top-center, bottom-stretch 등)를 지정.

4. 한글 폰트가 'ㅁ'으로 깨지는 문제

  • 문제 현상: TextMeshPro 텍스트에 한글을 입력하면 모두 네모(ㅁ)로 표시됨.
  • 근본 원인: TextMeshPro의 기본 폰트 에셋에 한글 글리프(Glyph) 정보가 포함되어 있지 않음.
  • 최종 해결책: 무료 한글 폰트(.ttf)를 프로젝트에 추가하고, Window > TextMeshPro > Font Asset Creator를 이용해 한글 문자셋이 포함된 새로운 폰트 에셋(SDF)을 생성하여 적용.

5. 2P UI가 상하/좌우 모두 뒤집히는 문제

  • 문제 현상: '마주보기' UI를 위해 2P 영역을 뒤집었더니, 상하뿐만 아니라 좌우까지 반전되어 카드의 순서가 이상해짐.
  • 근본 원인: Rotation Z: 180을 사용하여 점대칭으로 회전시켰기 때문.
  • 최종 해결책: Rotation 대신 Scale 값을 (X: -1, Y: -1, Z: 1)로 설정하여, 2P 플레이어 입장에서 직관적인 좌우 대칭이 되도록 수정. 이 과정에서 UI의 **피봇(Pivot)**을 반드시 정중앙(0.5, 0.5)으로 맞춰야 함을 확인.

[후기 개발 단계] 원인 불명의 '유령 버그' (프로젝트 손상)

6. 카드 UI가 사라지지 않고, 플레이어가 맵을 탈출하는 현상

  • 문제 현상: 턴이 시작되면 모든 카드가 동시에 나타나고 사라지지 않음. 플레이어는 명령과 상관없이 대각선으로 맵 끝까지 이동함.
  • 디버깅 과정:
    • GameManagerTurnRoutine에 상세한 Debug.Log를 추가하여 변수 값 추적. 로그 상으로는 모든 좌표 계산과 함수 호출이 정상적으로 이루어짐을 확인.
    • Hierarchy에 중복된 GameManager 오브젝트나 컴포넌트가 없는지 확인.
    • PlayerPawn의 이동 기능을 고립시켜 테스트했을 때 정상 작동함을 확인.
    • Reimport All Assets 시도 후 일시적으로 문제가 해결되는 듯 했으나 재발.
  • 근본 원인 (추정): 코드 자체의 논리적 오류가 아닌, 프로젝트의 메타데이터나 캐시(Library 폴더)가 손상되어 발생한 **'유령 버그'**로 최종 판단. 에디터에서 보이는 것과 실제 내부적으로 실행되는 코드 사이에 불일치가 발생.
  • 최종 해결책: 새 프로젝트를 생성하고, 기존 프로젝트의 Assets 폴더만 이주하여 오염된 프로젝트 설정을 모두 초기화하기로 결정.
반응형

+ Recent posts