Files
Ajedrez_Purgatorio/MANUAL_IMPLEMENTACION_UNITY.md

49 KiB

Manual de Implementación en Unity - Ajedrez Purgatorio

Fecha: 10 de mayo de 2026
Unity: 6000.3.13f1 (URP 17.3.0)
Estado del Código: 100% compilado (0 errores)


📋 ÍNDICE RÁPIDO

  1. Pre-requisitos
  2. Crear ScriptableObjects
  3. Crear Estructura de Carpetas
  4. Crear Main Menu Scene
  5. Crear Chapter Scenes
  6. Configurar Audio
  7. Crear Prefabs de UI
  8. Configurar Build Settings
  9. Configurar Input System
  10. Testing y Verificación

Tiempo total estimado: 3-4 horas


1. PRE-REQUISITOS

Verificar que el proyecto esté limpio

Ya completado - El código compila sin errores (Sprint 4 + Sprint 5 al 100%)

Packages instalados

  • Universal Render Pipeline (URP) 17.3.0
  • TextMeshPro
  • Input System
  • Test Framework (NUnit)

Estructura actual

Assets/
  Game/
    Scripts/      ← Código ya implementado ✅
    Data/         ← Aquí crearemos ScriptableObjects
    Prefabs/      ← Aquí crearemos prefabs
    Audio/        ← Aquí pondremos audio clips
    Sprites/      ← Aquí sprites de UI
  Scenes/         ← Aquí crearemos las scenes

2. CREAR SCRIPTABLEOBJECTS (10 minutos)

2.1. CampaignState.asset 🔴 CRÍTICO

Paso 1: Crear el asset

  1. En Unity Editor, navega a Assets/Game/Data/
  2. Click derecho en el panel Project
  3. Create → Ajedrez Purgatorio → Campaign → Campaign State
  4. Renombra a: CampaignState

Paso 2: Mover a Resources

  1. Crea carpeta si no existe: Assets/Game/Data/Resources/
  2. Arrastra CampaignState.asset a Resources/
  3. Importante: DEBE estar en Resources para que DeadKingPool lo encuentre con Resources.Load()

Paso 3: Configurar en Inspector

CampaignState (Script)
├─ Current Chapter Index: 0
├─ Completed Chapters: (vacío)
├─ Alive Pieces: (vacío)
├─ Total Pieces Lost: 0
├─ Current Chapter Pieces Lost: 0
└─ Last Chapter Was Victory: false

Nota: No necesitas configurar nada manualmente, los valores default están bien. El sistema los llenará en runtime.


2.2. DeadKingPool.asset 🔴 CRÍTICO

Paso 1: Crear el asset

  1. En Assets/Game/Data/
  2. Click derecho → Create → Ajedrez Purgatorio → Meta → Dead King Pool
  3. Renombra a: DeadKingPool

Paso 2: Mover a Resources

  1. Arrastra DeadKingPool.asset a Assets/Game/Data/Resources/
  2. Importante: DEBE estar en Resources

Paso 3: Configurar en Inspector

DeadKingPool (Script)
├─ Pool Configuration
│   ├─ Max Pool Size: 100
│   ├─ Base Spawn Chance: 0.2
│   └─ Chapter Multiplier: 0.2
├─ Content Moderation
│   └─ Profanity List: (Array - 12 elementos ya pre-configurados)
│       ├─ Element 0: "fuck"
│       ├─ Element 1: "shit"
│       ├─ Element 2: "damn"
│       ├─ Element 3: "bastard"
│       ├─ Element 4: "asshole"
│       ├─ Element 5: "bitch"
│       ├─ Element 6: "puto"
│       ├─ Element 7: "mierda"
│       ├─ Element 8: "joder"
│       ├─ Element 9: "cabrón"
│       ├─ Element 10: "pendejo"
│       └─ Element 11: "hijo de puta"
└─ Debug
    └─ Enable Debug Logging: ☐ false

Nota: La profanity list previene nombres inapropiados en Dead Kings. Los valores ya vienen pre-configurados, no necesitas cambiar nada a menos que quieras personalizar.


2.3. BalanceConfig.asset 🟡 OPCIONAL

Paso 1: Crear el asset

  1. En Assets/Game/Data/
  2. Click derecho → Create → Ajedrez Purgatorio → Data → Balance Config
  3. Renombra a: BalanceConfig

Paso 2: Configurar valores

BalanceConfig (Script)
├─ Dead Kings Config
│   ├─ Base Chance: 0.2
│   ├─ Chapter Multiplier: 0.2
│   ├─ Max Pool Size: 100
│   ├─ Max Name Length: 20
│   └─ Max Message Length: 100
├─ AI Difficulty (Array - Size: 3)
│   ├─ Element 0 (Easy)
│   │   ├─ Strategy: "minimax"
│   │   ├─ Minimax Depth: 2
│   │   └─ Think Time Ms: 500
│   ├─ Element 1 (Medium)
│   │   ├─ Strategy: "minimax"
│   │   ├─ Minimax Depth: 3
│   │   └─ Think Time Ms: 1000
│   └─ Element 2 (Hard)
│       ├─ Strategy: "minimax"
│       ├─ Minimax Depth: 4
│       └─ Think Time Ms: 1500
├─ Dialogue Config
│   ├─ Typewriter Speed Chars Per Second: 33
│   ├─ Continue Indicator Blink Rate: 0.5
│   ├─ Fade In Duration: 0.3
│   └─ Fade Out Duration: 0.2
├─ UI Timings Config
│   ├─ Feedback Display Time: 2
│   ├─ Submit Debounce Time: 0.5
│   ├─ Fade In Duration: 0.5
│   └─ Fade Out Duration: 0.5
└─ Save System Config
    ├─ Max Save Slots: 3
    ├─ Auto Save After Chapter: ☑ true
    └─ Save Version: 1

Nota: Este asset es opcional. Si no lo creas, el código usa valores hardcodeados.


CHECKPOINT 1: ScriptableObjects creados

Deberías tener:

  • Assets/Game/Data/Resources/CampaignState.asset
  • Assets/Game/Data/Resources/DeadKingPool.asset
  • Assets/Game/Data/BalanceConfig.asset (opcional)

3. CREAR ESTRUCTURA DE CARPETAS (5 minutos)

3.1. Carpetas para Assets

En Project Window, crea estas carpetas si no existen:

Assets/
├─ Game/
│  ├─ Audio/
│  │  ├─ SFX/          ← Sonidos de juego
│  │  └─ Music/        ← Música de fondo
│  ├─ Prefabs/
│  │  ├─ UI/           ← Prefabs de UI
│  │  └─ Board/        ← Prefabs de tablero
│  ├─ Sprites/
│  │  ├─ UI/           ← Sprites de UI
│  │  └─ Pieces/       ← Sprites de piezas
│  └─ Data/
│     └─ Dialogues/    ← JSON files (ya existen ✅)
└─ Scenes/             ← Scenes del juego

Atajo: Click derecho → Create → Folder


4. CREAR MAIN MENU SCENE (30 minutos)

4.1. Crear la Scene Base

Paso 1: Nueva Scene

  1. File → New Scene
  2. Selecciona template: Basic (Built-In) o URP
  3. File → Save As
  4. Guarda en: Assets/Scenes/MainMenu.unity

Paso 2: Configurar Camera

Main Camera
├─ Clear Flags: Solid Color
├─ Background: #2C1810 (marrón oscuro)
├─ Projection: Orthographic
└─ Size: 5

4.2. Crear Canvas Principal

Paso 1: Crear Canvas

  1. Click derecho en Hierarchy → UI → Canvas
  2. Renombra a: MainMenuCanvas

Paso 2: Configurar Canvas

Canvas
├─ Render Mode: Screen Space - Overlay
├─ Canvas Scaler
│   ├─ UI Scale Mode: Scale With Screen Size
│   ├─ Reference Resolution: 1920 x 1080
│   └─ Match: 0.5
└─ Graphic Raycaster: (default)

4.3. Crear Título del Juego

Paso 1: Crear Text

  1. Click derecho en MainMenuCanvasUI → Text - TextMeshPro
  2. Renombra a: TitleText
  3. Si aparece popup de TMP importer → Click "Import TMP Essentials"

Paso 2: Configurar RectTransform

Rect Transform
├─ Anchor Presets: Top Center
├─ Pos Y: -150
├─ Width: 800
└─ Height: 200

Paso 3: Configurar Text

TextMeshPro - Text (UI)
├─ Text: "AJEDREZ PURGATORIO"
├─ Font Style: Bold
├─ Font Size: 72
├─ Alignment: Center
├─ Color: #FFD700 (dorado)
└─ Enable Auto-Sizing: false

4.4. Crear Panel de Botones

Paso 1: Crear Panel

  1. Click derecho en MainMenuCanvasUI → Panel
  2. Renombra a: ButtonPanel

Paso 2: Configurar RectTransform

Rect Transform
├─ Anchor Presets: Middle Center
├─ Width: 400
├─ Height: 400
└─ Pivot: 0.5, 0.5

Paso 3: Agregar Vertical Layout Group

  1. Add Component → Layout → Vertical Layout Group
Vertical Layout Group
├─ Padding: Left=20, Right=20, Top=20, Bottom=20
├─ Spacing: 20
├─ Child Alignment: Middle Center
└─ Child Controls Size: ☑ Width, ☑ Height

Paso 4: Quitar fondo del panel

  • Deshabilita el componente Image del Panel (checkbox)

4.5. Crear Botones (4 botones)

Crear los 4 botones de una vez:

  1. Click derecho en ButtonPanelUI → Button - TextMeshPro
  2. Renombra a: NewCampaignButton
  3. Repite 3 veces más para crear:
    • ContinueButton
    • OptionsButton
    • QuitButton

Nota: Unity crea los botones con configuración por defecto que ya funciona. Solo necesitas cambiar el texto.

Cambiar el texto de cada botón:

Para cada botón:

  1. Expande el botón en Hierarchy (flecha ▶)
  2. Selecciona el hijo Text (TMP)
  3. En Inspector, busca el campo Text
  4. Cambia a:
    • NewCampaignButton → "NEW CAMPAIGN"
    • ContinueButton → "CONTINUE"
    • OptionsButton → "OPTIONS"
    • QuitButton → "QUIT"

Ajustar tamaño del texto (opcional pero recomendado):

  • Selecciona el Text (TMP) de cada botón
  • En Inspector: Font Size = 28 o 32
  • Color: Déjalo en blanco (ya está por defecto)

FIX: Si los botones se ven deformados/estirados:

El Vertical Layout Group está estirando los botones. Para cada botón:

  1. Selecciona el botón (no el texto, el botón mismo)
  2. Add Component → Layout → Layout Element
  3. En el componente Layout Element:
    • ☑ Marca: Min Height
    • Valor: 70 o 80
    • ☑ Marca: Preferred Height
    • Valor: 70 o 80

Repite para los 4 botones. Ahora deberían verse correctos.

Resultado esperado:

ButtonPanel
├─ NewCampaignButton (con Layout Element)
│   └─ Text (TMP)  ← Texto: "NEW CAMPAIGN"
├─ ContinueButton (con Layout Element)
│   └─ Text (TMP)  ← Texto: "CONTINUE"
├─ OptionsButton (con Layout Element)
│   └─ Text (TMP)  ← Texto: "OPTIONS"
└─ QuitButton (con Layout Element)
    └─ Text (TMP)  ← Texto: "QUIT"

¡Listo! Los botones ahora tienen altura fija y se ven correctos.


4.6. Agregar MainMenuController Script

Paso 1: Crear GameObject vacío

  1. Click derecho en Hierarchy (root) → Create Empty
  2. Renombra a: GameController

Paso 2: Agregar componentes necesarios

  1. Selecciona GameController
  2. Add Component → Main Menu Controller (debería aparecer en búsqueda)

Si no aparece el script:

  1. Add Component → New Script
  2. Nombre: MainMenuController
  3. IMPORTANTE: Elimina el script que Unity creó
  4. Usa el que ya existe en Assets/Game/Scripts/Mono/UI/MainMenuController.cs

Paso 3: Configurar referencias en Inspector

Main Menu Controller (Script)
├─ UI References
│   ├─ New Campaign Button: ← Arrastra NewCampaignButton aquí
│   ├─ Continue Button: ← Arrastra ContinueButton aquí
│   ├─ Options Button: ← Arrastra OptionsButton aquí
│   └─ Quit Button: ← Arrastra QuitButton aquí
├─ Scene Configuration
│   └─ First Chapter Scene Name: "Chapter1"
└─ Debug
    └─ Enable Debug Logging: ☐ false

¡Importante! NO necesitas conectar eventos manualmente en el Inspector. El script MainMenuController los conecta automáticamente en Awake() usando AddListener(). Solo asegúrate de arrastrar las referencias de los botones en el Paso 3.


4.7. Agregar Managers Persistentes

Estos managers deben existir en MainMenu y persistir entre scenes con DontDestroyOnLoad.

Paso 1: Crear GameObject para CampaignManager

  1. Click derecho en Hierarchy → Create Empty
  2. Renombra a: CampaignManager
  3. Add Component → Campaign Manager

Paso 2: Configurar CampaignManager en Inspector

Campaign Manager (Script)
├─ Campaign Config: (Ninguno) ← Por ahora dejarlo vacío
├─ Campaign State: ← Arrastra CampaignState.asset desde Resources
└─ (Otros campos se configurarán en Chapter scenes)

Paso 3: Crear GameObject para SaveSystem

  1. Click derecho en Hierarchy → Create Empty
  2. Renombra a: SaveSystem
  3. Add Component → Save System

No necesita configuración en Inspector (todo es código)

Paso 4: Crear GameObject para AudioManager

  1. Click derecho en Hierarchy → Create Empty
  2. Renombra a: AudioManager
  3. Add Component → Audio Manager
  4. Add Component → Audio Source (2 veces, necesitas 2)

Paso 5: Configurar AudioManager

Audio Manager (Script)
├─ Sfx Source: ← Arrastra el primer Audio Source aquí
├─ Music Source: ← Arrastra el segundo Audio Source aquí
├─ Move Clip: (None) ← Configuraremos después con audio
├─ Capture Clip: (None)
├─ Check Clip: (None)
├─ Checkmate Clip: (None)
├─ Promotion Clip: (None)
└─ Invalid Move Clip: (None)

Paso 6: Configurar los Audio Sources

Audio Source 1 (SFX)
├─ Play On Awake: ☐ false
├─ Loop: ☐ false
└─ Volume: 1

Audio Source 2 (Music)
├─ Play On Awake: ☐ false
├─ Loop: ☑ true
└─ Volume: 0.5

Paso 7: Crear GameObject para SceneTransitionManager

  1. Click derecho en Hierarchy → Create Empty
  2. Renombra a: SceneTransitionManager
  3. Add Component → Scene Transition Manager

Paso 8: Crear Canvas para Fade Overlay

  1. Click derecho en SceneTransitionManagerUI → Canvas
  2. Renombra a: FadeCanvas
  3. Click derecho en FadeCanvasUI → Image
  4. Renombra a: FadeImage

Paso 9: Configurar FadeCanvas

Canvas
├─ Render Mode: Screen Space - Overlay
├─ Sort Order: 999 ← Importante, debe estar encima de todo
└─ Canvas Scaler: Scale With Screen Size (1920x1080)

Paso 10: Configurar FadeImage

Rect Transform
├─ Anchor: Stretch all (Alt+Shift+Click en cuadrado)
├─ Left: 0, Right: 0, Top: 0, Bottom: 0

Image (Script)
├─ Color: Black (R=0, G=0, B=0, A=0) ← Alpha en 0 inicialmente
└─ Raycast Target: ☑ true

Paso 11: Conectar referencias en SceneTransitionManager

Scene Transition Manager (Script)
├─ Fade Image: ← Arrastra FadeImage aquí
├─ Fade Duration: 0.5
└─ Fade Color: Black (R=0, G=0, B=0, A=1)

CHECKPOINT 2: MainMenu Scene creada

Deberías tener en Hierarchy:

MainMenu
├─ Main Camera
├─ MainMenuCanvas
│   ├─ TitleText
│   └─ ButtonPanel
│       ├─ NewCampaignButton
│       ├─ ContinueButton
│       ├─ OptionsButton
│       └─ QuitButton
├─ GameController (MainMenuController)
├─ CampaignManager
├─ SaveSystem
├─ AudioManager (con 2 Audio Sources)
└─ SceneTransitionManager
    └─ FadeCanvas
        └─ FadeImage

Guardar: Ctrl+S


5. CREAR CHAPTER SCENES (1-2 horas)

5.1. Preparación - Entender la arquitectura del juego

¿Cómo funciona el tablero de ajedrez en este proyecto?

El tablero y todas las piezas se instancian automáticamente en runtime cuando das Play. No necesitas configurar manualmente 32 piezas en la scene.

Esto significa que:

  • NO necesitas arrastrar piezas a la scene manualmente
  • NO necesitas configurar posiciones iniciales manualmente
  • SÍ necesitas tener GameManager en la scene (instancia el tablero)
  • SÍ necesitas agregar los UI systems (DialogueUI, GameHUD, PauseMenu, etc.)

Componentes base que debe tener cada Chapter scene:

  1. Camera - Para ver el juego
  2. GameManager - Instancia el tablero y maneja la lógica de ajedrez
  3. DialogueSystem - Maneja los diálogos del capítulo
  4. UI Canvases - DialogueUI, GameHUD, PauseMenu, DeadKingRevealUI

5.2. Crear Chapter1.unity

Paso 1: Crear una scene básica nueva

  1. File → New Scene
  2. Selecciona template: Basic (Built-In) o URP
  3. File → Save As → Guarda en Assets/Scenes/Chapter1.unity

Paso 2: Configurar Camera

Main Camera
├─ Clear Flags: Solid Color
├─ Background: #1A1A1A (gris muy oscuro) o el color que prefieras
├─ Projection: Perspective (si es 3D) u Orthographic (si es 2D)
└─ Position/Size: Ajusta para ver el tablero cuando se instancie

Paso 3: Agregar GameManager

  1. Click derecho en Hierarchy → Create Empty
  2. Renombra a: GameManager
  3. Add Component → Game Manager

Importante: El GameManager es quien instancia el tablero en Start() o Awake(). Al dar Play, verás el tablero aparecer automáticamente.

Paso 4: Test rápido

  1. Presiona Play ▶
  2. Deberías ver: El tablero de ajedrez con piezas en posición inicial
  3. Si no aparece: Verifica que GameManager está configurado correctamente
  4. Stop Play ⏹

Nota: Si el tablero no aparece, es porque GameManager necesita referencias (prefabs de piezas, board material, etc.). Esto debería estar configurado ya si el proyecto compiló correctamente.


5.3. Agregar DialogueSystem

Paso 1: Crear GameObject

  1. Click derecho en Hierarchy → Create Empty
  2. Renombra a: DialogueSystem

Paso 2: Agregar componente

  1. Add Component → Dialogue System

Paso 3: Configurar en Inspector

Dialogue System (Script)
├─ Configuración
│   ├─ Chars Per Second: 30
│   └─ Allow Skip: ☑ true
├─ Estado de Campaña
│   └─ Campaign State: ← Arrastra CampaignState.asset desde Resources
└─ Archivos de Diálogos (List - Size: 6)
    ├─ Element 0: ← Arrastra ch1_intro.json desde Assets/Game/Data/Dialogues/
    ├─ Element 1: ← Arrastra ch1_outro.json
    ├─ Element 2: ← Arrastra ch2_intro.json
    ├─ Element 3: ← Arrastra ch2_outro.json
    ├─ Element 4: ← Arrastra ch3_intro.json
    └─ Element 5: ← Arrastra ch3_outro.json

Nota: Los archivos .json aparecen en Unity como TextAssets. Simplemente arrástraslos desde la carpeta Assets/Game/Data/Dialogues/ al array en Inspector.


5.4. Crear DialogueUI Canvas

Paso 1: Crear Canvas

  1. Click derecho en Hierarchy → UI → Canvas
  2. Renombra a: DialogueCanvas

Paso 2: Configurar Canvas

Canvas
├─ Render Mode: Screen Space - Overlay
├─ Sort Order: 100 ← Debe estar sobre GameHUD
└─ Canvas Scaler: Scale With Screen Size (1920x1080, Match=0.5)

Paso 3: Crear Panel de fondo

  1. Click derecho en DialogueCanvasUI → Panel
  2. Renombra a: DialoguePanel

Paso 4: Configurar Panel

Rect Transform
├─ Anchor Presets: Bottom Stretch (Alt+Click)
├─ Height: 300
├─ Left: 100, Right: 100, Bottom: 50

Image (Script)
├─ Color: #000000 (negro)
├─ Material: None
└─ (Opcional: Alpha = 0.85 para semi-transparente)

Paso 5: Crear SpeakerNameText

  1. Click derecho en DialoguePanelUI → Text - TextMeshPro
  2. Renombra a: SpeakerNameText
Rect Transform
├─ Anchor: Top Left
├─ Pos X: 20, Pos Y: -20
├─ Width: 400
├─ Height: 40

TextMeshPro
├─ Text: "Speaker Name"
├─ Font Size: 28
├─ Font Style: Bold
├─ Alignment: Middle Left
└─ Color: #FFD700 (dorado)

Paso 6: Crear DialogueText

  1. Click derecho en DialoguePanelUI → Text - TextMeshPro
  2. Renombra a: DialogueText
Rect Transform
├─ Anchor: Top Stretch
├─ Pos Y: -70
├─ Left: 20, Right: 20
├─ Height: 150

TextMeshPro
├─ Text: "Dialogue text appears here..."
├─ Font Size: 24
├─ Alignment: Top Left
├─ Color: White
├─ Wrapping: ☑ Enabled
└─ Overflow: Truncate

Paso 7: Crear ContinueButton

  1. Click derecho en DialoguePanelUI → Button - TextMeshPro
  2. Renombra a: ContinueButton
Rect Transform
├─ Anchor: Bottom Right
├─ Pos X: -20, Pos Y: 20
├─ Width: 150
├─ Height: 50

Button (Script)
├─ Normal Color: #4A4A4A
├─ Highlighted: #6A6A6A
├─ Pressed: #2A2A2A

Text (TMP) del botón:
├─ Text: "CONTINUE"
├─ Font Size: 20
└─ Alignment: Center

Paso 8: Conectar DialogueUI script

  1. Selecciona DialogueCanvas
  2. Add Component → Dialogue UI

Paso 9: Configurar DialogueUI en Inspector

Dialogue UI (Script)
├─ Dialogue Panel: ← Arrastra DialoguePanel aquí
├─ Speaker Name Text: ← Arrastra SpeakerNameText
├─ Dialogue Text: ← Arrastra DialogueText
├─ Continue Button: ← Arrastra ContinueButton
├─ Type Speed: 0.05
└─ Continue Button Delay: 0.5

Paso 10: Conectar con DialogueSystem

  1. Selecciona DialogueSystem
  2. En Inspector, debería aparecer campo Dialogue UI
  3. Arrastra DialogueCanvas al campo

Paso 11: Desactivar canvas inicialmente

  • Selecciona DialogueCanvas
  • Desmarca el checkbox al lado del nombre (GameObject inactivo)
  • El DialogueSystem lo activará cuando necesite

5.5. Crear GameHUD Canvas

Paso 1: Crear Canvas

  1. Click derecho en Hierarchy → UI → Canvas
  2. Renombra a: GameHUDCanvas

Paso 2: Configurar Canvas

Canvas
├─ Render Mode: Screen Space - Overlay
├─ Sort Order: 50
└─ Canvas Scaler: Scale With Screen Size (1920x1080)

Paso 3: Crear TurnText

  1. Click derecho en GameHUDCanvasUI → Text - TextMeshPro
  2. Renombra a: TurnText
Rect Transform
├─ Anchor: Top Center
├─ Pos Y: -30
├─ Width: 300
├─ Height: 60

TextMeshPro
├─ Text: "White's Turn"
├─ Font Size: 32
├─ Font Style: Bold
├─ Alignment: Center
└─ Color: White

Paso 4: Crear MoveCountText

  1. Click derecho en GameHUDCanvasUI → Text - TextMeshPro
  2. Renombra a: MoveCountText
Rect Transform
├─ Anchor: Top Right
├─ Pos X: -30, Pos Y: -30
├─ Width: 200
├─ Height: 50

TextMeshPro
├─ Text: "Moves: 0"
├─ Font Size: 24
├─ Alignment: Middle Right
└─ Color: #CCCCCC

Paso 5: Crear CheckIndicator

  1. Click derecho en GameHUDCanvasUI → Panel
  2. Renombra a: CheckIndicator
Rect Transform
├─ Anchor: Top Center
├─ Pos Y: -100
├─ Width: 200
├─ Height: 60

Image (Script)
├─ Color: #FF0000 (rojo)
└─ (Opcional: Alpha = 0.7)

Paso 6: Agregar texto al CheckIndicator

  1. Click derecho en CheckIndicatorUI → Text - TextMeshPro
  2. Renombra a: CheckText
Rect Transform
├─ Anchor: Stretch all
├─ Left: 0, Right: 0, Top: 0, Bottom: 0

TextMeshPro
├─ Text: "CHECK!"
├─ Font Size: 32
├─ Font Style: Bold
├─ Alignment: Center
└─ Color: White

Paso 7: Desactivar CheckIndicator inicialmente

  • Selecciona CheckIndicator
  • Desmarca checkbox (GameObject inactivo)

Paso 8: Crear CapturedPieces Panels (2 paneles)

Panel para piezas blancas capturadas:

  1. Click derecho en GameHUDCanvasUI → Panel
  2. Renombra a: WhiteCapturedPanel
Rect Transform
├─ Anchor: Middle Left
├─ Pos X: 20
├─ Width: 100
├─ Height: 400

Image (Script)
├─ Color: #333333

Agregar Horizontal Layout Group:

Add Component → Layout → Horizontal Layout Group
├─ Spacing: 5
├─ Child Alignment: Upper Center
└─ Child Force Expand: Width ☐, Height ☐

Panel para piezas negras capturadas:

  1. Duplica WhiteCapturedPanel (Ctrl+D)
  2. Renombra a: BlackCapturedPanel
  3. Cambia Anchor a: Middle Right
  4. Pos X: -20

Paso 9: Crear PauseButton

  1. Click derecho en GameHUDCanvasUI → Button - TextMeshPro
  2. Renombra a: PauseButton
Rect Transform
├─ Anchor: Top Left
├─ Pos X: 30, Pos Y: -30
├─ Width: 100
├─ Height: 50

Button (Script): (default)

Text (TMP):
├─ Text: "PAUSE"
├─ Font Size: 20
└─ Alignment: Center

Paso 10: Conectar GameHUD script

  1. Selecciona GameHUDCanvas
  2. Add Component → Game HUD

Paso 11: Configurar GameHUD en Inspector

Game HUD (Script)
├─ Turn Text: ← Arrastra TurnText
├─ Move Count Text: ← Arrastra MoveCountText
├─ Check Indicator: ← Arrastra CheckIndicator (el GameObject)
├─ White Captured Container: ← Arrastra WhiteCapturedPanel
├─ Black Captured Container: ← Arrastra BlackCapturedPanel
├─ Pause Button: ← Arrastra PauseButton
└─ Captured Piece Prefab: (None) ← Crearemos después

5.6. Crear PauseMenu Canvas

Paso 1: Crear Canvas

  1. Click derecho en Hierarchy → UI → Canvas
  2. Renombra a: PauseMenuCanvas

Paso 2: Configurar Canvas

Canvas
├─ Render Mode: Screen Space - Overlay
├─ Sort Order: 200 ← Debe estar sobre todo
└─ Canvas Scaler: Scale With Screen Size (1920x1080)

Paso 3: Crear Panel de fondo oscuro

  1. Click derecho en PauseMenuCanvasUI → Image
  2. Renombra a: DimBackground
Rect Transform
├─ Anchor: Stretch all
├─ Left: 0, Right: 0, Top: 0, Bottom: 0

Image (Script)
├─ Color: #000000 (negro)
├─ Alpha: 0.8 (semi-transparente)
└─ Raycast Target: ☑ true (bloquea clicks)

Paso 4: Crear Panel principal

  1. Click derecho en PauseMenuCanvasUI → Panel
  2. Renombra a: PausePanel
Rect Transform
├─ Anchor: Middle Center
├─ Width: 500
├─ Height: 600

Image (Script)
├─ Color: #2C2C2C (gris oscuro)

Paso 5: Crear Título "PAUSED"

  1. Click derecho en PausePanelUI → Text - TextMeshPro
  2. Renombra a: PauseTitle
Rect Transform
├─ Anchor: Top Center
├─ Pos Y: -50
├─ Width: 400
├─ Height: 80

TextMeshPro
├─ Text: "PAUSED"
├─ Font Size: 60
├─ Font Style: Bold
├─ Alignment: Center
└─ Color: White

Paso 6: Crear ButtonsContainer

  1. Click derecho en PausePanelUI → Panel
  2. Renombra a: ButtonsContainer
  3. Desactiva componente Image (checkbox)
Rect Transform
├─ Anchor: Middle Center
├─ Width: 400
├─ Height: 400

Vertical Layout Group
├─ Padding: 20
├─ Spacing: 20
├─ Child Alignment: Middle Center
└─ Child Controls Size: Width ☑, Height ☑

Paso 7: Crear 4 botones (Resume, Save, MainMenu, Quit)

Para CADA botón:

  1. Click derecho en ButtonsContainerUI → Button - TextMeshPro
  2. Renombra:
    • ResumeButton
    • SaveButton
    • MainMenuButton
    • QuitButton
Rect Transform:
├─ Min Height: 70

Button (Script):
├─ Normal: #4A4A4A
├─ Highlighted: #6A6A6A
├─ Pressed: #2A2A2A

Layout Element (Add Component):
├─ Min Height: 70
└─ Preferred Height: 70

Text (TMP):
├─ Text: "RESUME" / "SAVE" / "MAIN MENU" / "QUIT"
├─ Font Size: 28
└─ Alignment: Center

Paso 8: Conectar PauseMenuController script

  1. Selecciona PauseMenuCanvas
  2. Add Component → Pause Menu Controller

Paso 9: Configurar en Inspector

Pause Menu Controller (Script)
├─ Pause Panel: ← Arrastra PausePanel
├─ Resume Button: ← Arrastra ResumeButton
├─ Save Button: ← Arrastra SaveButton
├─ Main Menu Button: ← Arrastra MainMenuButton
└─ Quit Button: ← Arrastra QuitButton

Paso 10: Conectar eventos de botones

  • ResumeButtonPauseMenuController.OnResumeClick()
  • SaveButtonPauseMenuController.OnSaveClick()
  • MainMenuButtonPauseMenuController.OnMainMenuClick()
  • QuitButtonPauseMenuController.OnQuitClick()

Paso 11: Conectar PauseButton con PauseMenuController

  1. Selecciona PauseButton (en GameHUDCanvas)
  2. En componente Button, On Click():
    • Arrastra PauseMenuCanvas (tiene PauseMenuController)
    • Dropdown → PauseMenuController → ShowPauseMenu()

Paso 12: Desactivar PauseMenuCanvas inicialmente

  • Selecciona PauseMenuCanvas
  • Desmarca checkbox (inactivo)

5.7. Crear DeadKingRevealUI Canvas

Paso 1: Crear Canvas

  1. Click derecho en Hierarchy → UI → Canvas
  2. Renombra a: DeadKingRevealCanvas

Paso 2: Configurar Canvas

Canvas
├─ Render Mode: Screen Space - Overlay
├─ Sort Order: 150
└─ Canvas Scaler: Scale With Screen Size (1920x1080)

Paso 3: Crear Background

  1. Click derecho en DeadKingRevealCanvasUI → Image
  2. Renombra a: RevealBackground
Rect Transform
├─ Anchor: Stretch all
├─ Left: 0, Right: 0, Top: 0, Bottom: 0

Image (Script)
├─ Color: Black
└─ Alpha: 0.9

Paso 4: Crear Panel principal

  1. Click derecho en DeadKingRevealCanvasUI → Panel
  2. Renombra a: RevealPanel
Rect Transform
├─ Anchor: Middle Center
├─ Width: 800
├─ Height: 600

Image (Script)
├─ Color: #1A0A0A (rojo muy oscuro)

Paso 5: Crear TitleText

  1. Click derecho en RevealPanelUI → Text - TextMeshPro
  2. Renombra a: TitleText
Rect Transform
├─ Anchor: Top Center
├─ Pos Y: -50
├─ Width: 700
├─ Height: 80

TextMeshPro
├─ Text: "YOU WERE DEFEATED BY..."
├─ Font Size: 36
├─ Font Style: Bold
├─ Alignment: Center
└─ Color: #FF4444 (rojo)

Paso 6: Crear DeadKingNameText

  1. Click derecho en RevealPanelUI → Text - TextMeshPro
  2. Renombra a: DeadKingNameText
Rect Transform
├─ Anchor: Middle Center
├─ Pos Y: 50
├─ Width: 700
├─ Height: 100

TextMeshPro
├─ Text: "DEAD KING NAME"
├─ Font Size: 56
├─ Font Style: Bold
├─ Alignment: Center
└─ Color: #FFD700 (dorado)

Paso 7: Crear DeadKingStatsText

  1. Click derecho en RevealPanelUI → Text - TextMeshPro
  2. Renombra a: DeadKingStatsText
Rect Transform
├─ Anchor: Middle Center
├─ Pos Y: -80
├─ Width: 700
├─ Height: 200

TextMeshPro
├─ Text: "Stats will appear here"
├─ Font Size: 24
├─ Alignment: Center
└─ Color: #CCCCCC

Paso 8: Crear ContinueButton

  1. Click derecho en RevealPanelUI → Button - TextMeshPro
  2. Renombra a: ContinueButton
Rect Transform
├─ Anchor: Bottom Center
├─ Pos Y: 50
├─ Width: 300
├─ Height: 70

Button (Script): (default)

Text (TMP):
├─ Text: "CONTINUE"
├─ Font Size: 32
└─ Alignment: Center

Paso 9: Conectar DeadKingRevealUI script

  1. Selecciona DeadKingRevealCanvas
  2. Add Component → Dead King Reveal UI

Paso 10: Configurar en Inspector

Dead King Reveal UI (Script)
├─ Reveal Panel: ← Arrastra RevealPanel
├─ Title Text: ← Arrastra TitleText
├─ Dead King Name Text: ← Arrastra DeadKingNameText
├─ Dead King Stats Text: ← Arrastra DeadKingStatsText
└─ Continue Button: ← Arrastra ContinueButton

Paso 11: Desactivar canvas inicialmente

  • Selecciona DeadKingRevealCanvas
  • Desmarca checkbox

5.8. Conectar CampaignManager con todas las UIs

Paso 1: Verificar que CampaignManager exista en scene

  • Si no existe, créalo (pero debería persistir desde MainMenu con DontDestroyOnLoad)
  • Si quieres tenerlo en esta scene también (para testing): Create Empty → Add Component

Paso 2: Configurar CampaignManager en Inspector

Campaign Manager (Script)
├─ Campaign Config: (None) ← Opcional por ahora
├─ Campaign State: ← CampaignState.asset
├─ Dialogue System: ← Arrastra DialogueSystem GameObject
├─ Dialogue UI: ← Arrastra DialogueCanvas GameObject
└─ Dead King Reveal UI: ← Arrastra DeadKingRevealCanvas GameObject

5.9. Duplicar para Chapter2 y Chapter3

Paso 1: Duplicar Chapter1.unity

  1. En Project window, selecciona Chapter1.unity
  2. Ctrl+D para duplicar
  3. Renombra a Chapter2.unity
  4. Duplica nuevamente → Chapter3.unity

Paso 2: Ajustar cada chapter (opcional)

  • Puedes cambiar dificultad de AI
  • Cambiar tablero inicial
  • Ajustar diálogos (ya están referenciados en DialogueSystem)

Nota: Los 3 chapters comparten la misma estructura, solo cambian los datos de configuración.


CHECKPOINT 3: Chapter Scenes creadas

Deberías tener en Assets/Scenes/:

  • Chapter1.unity
  • Chapter2.unity
  • Chapter3.unity

Cada una con:

Hierarchy:
├─ Main Camera
├─ Board (tu sistema de tablero)
├─ GameManager
├─ DialogueSystem
├─ DialogueCanvas (inactiva)
│   └─ DialoguePanel
│       ├─ SpeakerNameText
│       ├─ DialogueText
│       └─ ContinueButton
├─ GameHUDCanvas (activa)
│   ├─ TurnText
│   ├─ MoveCountText
│   ├─ CheckIndicator (inactiva)
│   ├─ WhiteCapturedPanel
│   ├─ BlackCapturedPanel
│   └─ PauseButton
├─ PauseMenuCanvas (inactiva)
│   └─ PausePanel
│       ├─ ResumeButton
│       ├─ SaveButton
│       ├─ MainMenuButton
│       └─ QuitButton
├─ DeadKingRevealCanvas (inactiva)
│   └─ RevealPanel
│       ├─ DeadKingNameText
│       ├─ DeadKingStatsText
│       └─ ContinueButton
└─ (CampaignManager - puede estar aquí o en MainMenu con DontDestroyOnLoad)

6. CONFIGURAR AUDIO (20 minutos)

6.1. Obtener AudioClips

Opción A: Usar placeholders temporales

  • En Unity Asset Store, busca "Free SFX" packs
  • Importa pack básico de sonidos (click, whoosh, etc.)

Opción B: Crear audio clips de prueba

Opción C: Dejar vacío por ahora

  • El juego funciona sin audio

6.2. Importar AudioClips

Paso 1: Crear carpetas

Assets/Game/Audio/
├─ SFX/
└─ Music/

Paso 2: Importar archivos de audio

  1. Arrastra archivos .wav o .mp3 a las carpetas correspondientes
  2. Renombra según necesites:
    • move.wav
    • capture.wav
    • check.wav
    • checkmate.wav
    • promotion.wav
    • invalid_move.wav

Paso 3: Configurar import settings (para SFX)

  1. Selecciona cada archivo SFX
  2. En Inspector:
Audio Clip Import Settings
├─ Force To Mono: ☑ (para SFX cortos)
├─ Load In Background: ☐
├─ Preload Audio Data: ☑
├─ Load Type: Decompress On Load (para SFX cortos)
└─ Compression Format: Vorbis (calidad media = 70%)

Paso 4: Configurar import settings (para música)

Audio Clip Import Settings
├─ Force To Mono: ☐
├─ Load In Background: ☑
├─ Preload Audio Data: ☐
├─ Load Type: Streaming (para música larga)
└─ Compression Format: Vorbis (calidad = 100%)

6.3. Asignar AudioClips a AudioManager

Paso 1: Abrir MainMenu scene

  • Selecciona AudioManager GameObject

Paso 2: Asignar clips en Inspector

Audio Manager (Script)
├─ Move Clip: ← Arrastra move.wav
├─ Capture Clip: ← Arrastra capture.wav
├─ Check Clip: ← Arrastra check.wav
├─ Checkmate Clip: ← Arrastra checkmate.wav
├─ Promotion Clip: ← Arrastra promotion.wav
└─ Invalid Move Clip: ← Arrastra invalid_move.wav

Paso 3: Guardar scene

  • Ctrl+S

Nota: AudioManager es DontDestroyOnLoad, así que esta configuración aplica a todas las scenes.


CHECKPOINT 4: Audio configurado

Deberías tener:

  • AudioClips en Assets/Game/Audio/SFX/
  • AudioManager con todos los clips asignados
  • 2 Audio Sources configurados (SFX y Music)

7. CREAR PREFABS DE UI (30 minutos)

7.1. MoveIndicator Prefab

Paso 1: Crear GameObject en scene temporal

  1. Abre cualquier scene (ej: Chapter1.unity)
  2. Click derecho en Hierarchy → 2D Object → Sprite
  3. Renombra a: MoveIndicator

Paso 2: Configurar componentes

Transform
├─ Position: (0, 0, 0)
└─ Scale: (0.8, 0.8, 1)

Sprite Renderer
├─ Sprite: (Circle sprite - Unity built-in o custom)
├─ Color: #00FF00 (verde)
├─ Sorting Layer: Default
└─ Order in Layer: 10

Para obtener sprite de círculo:

  • Opción A: Unity built-in → Knob sprite (busca en assets default)
  • Opción B: Crear en Assets/Game/Sprites/UI/:
    1. Usa Photoshop/GIMP para crear círculo 64x64 px verde semi-transparente
    2. Importa como sprite

Paso 3: Convertir a Prefab

  1. Arrastra MoveIndicator desde Hierarchy a Assets/Game/Prefabs/UI/
  2. Borra el GameObject de la Hierarchy (ya está como prefab)

7.2. CapturedPieceIcon Prefab

Paso 1: Crear Canvas vacío temporal

  1. Create Empty → TempCanvas
  2. Add Component → Canvas
  3. Render Mode: World Space (no importa, es solo para crear el prefab)

Paso 2: Crear Image

  1. Click derecho en TempCanvasUI → Image
  2. Renombra a: CapturedPieceIcon

Paso 3: Configurar RectTransform

Rect Transform
├─ Width: 40
├─ Height: 40
└─ Scale: (1, 1, 1)

Paso 4: Configurar Image

Image (Script)
├─ Source Image: (Ninguno) ← Se asignará en runtime
├─ Color: White
├─ Raycast Target: ☐ false
└─ Preserve Aspect: ☑ true

Paso 5: Convertir a Prefab

  1. Arrastra CapturedPieceIcon (solo el Image, no el Canvas) a Assets/Game/Prefabs/UI/
  2. Borra TempCanvas de Hierarchy

7.3. Asignar Prefabs a GameHUD

Paso 1: Abrir cada Chapter scene (Chapter1, 2, 3)

Paso 2: Seleccionar GameHUDCanvas

Game HUD (Script)
├─ Captured Piece Prefab: ← Arrastra CapturedPieceIcon prefab desde Project
└─ (Otros campos ya configurados)

Paso 3: Repetir para Chapter2 y Chapter3

Paso 4: Guardar todas las scenes

  • Ctrl+S en cada una

CHECKPOINT 5: Prefabs creados

Deberías tener en Assets/Game/Prefabs/UI/:

  • MoveIndicator.prefab
  • CapturedPieceIcon.prefab

Y asignados en GameHUD de las 3 chapter scenes.


8. CONFIGURAR BUILD SETTINGS (10 minutos)

8.1. Agregar Scenes al Build

Paso 1: Abrir Build Settings

  • File → Build Settings (o Ctrl+Shift+B)

Paso 2: Agregar scenes en orden

  1. Click Add Open Scenes si tienes alguna abierta, o
  2. Arrastra scenes desde Project window a "Scenes In Build"

Orden correcto:

Scenes In Build:
├─ 0: MainMenu ✅
├─ 1: Chapter1 ✅
├─ 2: Chapter2 ✅
└─ 3: Chapter3 ✅

Importante: MainMenu DEBE ser índice 0 (es la scene inicial)

Paso 3: Verificar checkboxes

  • Todas deben tener checkbox marcado ()

Paso 4: Configurar Platform

Platform: Windows, Mac, Linux
├─ Target Platform: Windows
├─ Architecture: x86_64
└─ Server Build: ☐ (desactivado)

Paso 5: Cerrar Build Settings (NO necesitas hacer Build todavía)


CHECKPOINT 6: Build configurado

  • 4 scenes en Build Settings
  • MainMenu como scene índice 0
  • Platform configurado

9. CONFIGURAR INPUT SYSTEM (10 minutos)

9.1. Verificar Input Actions Asset

Paso 1: Localizar InputSystem_Actions.inputactions

  • Debería estar en: Assets/InputSystem_Actions.inputactions

Paso 2: Abrir el asset (doble click)

  • Se abre el Input Actions editor window

Paso 3: Verificar que existe "Pause" action

Action Maps:
└─ UI (o Player)
    └─ Actions:
        ├─ Navigate
        ├─ Submit
        ├─ Cancel
        └─ Pause ← Debe existir

Si NO existe "Pause":

  1. Selecciona Action Map (ej: "UI" o crea uno nuevo "Gameplay")
  2. Click + en sección Actions
  3. Renombra a: Pause
  4. En "Properties":
    • Action Type: Button
    • Control Type: Any
  5. Click + junto a <No Binding>
  6. Path: <Keyboard>/escape
  7. Click + nuevamente (para agregar gamepad)
  8. Path: <Gamepad>/start

Paso 4: Guardar cambios

  • Click Save Asset en la ventana de Input Actions
  • Cerrar ventana

Paso 5: Verificar que C# class está generada

  • Debería existir InputSystem_Actions.cs al lado del .inputactions
  • Si NO existe:
    1. Selecciona InputSystem_Actions.inputactions
    2. En Inspector: ☑ Generate C# Class
    3. Click Apply

9.2. Conectar Input con PauseMenuController

Nota: El código de PauseMenuController ya debería manejar esto automáticamente en Update() checando Input.GetKeyDown(KeyCode.Escape).

Si quieres usar New Input System:

  1. Abre PauseMenuController.cs
  2. Reemplaza el check de escape por:
// En vez de:
if (Input.GetKeyDown(KeyCode.Escape)) { ... }

// Usa:
if (Keyboard.current.escapeKey.wasPressedThisFrame) { ... }

Pero esto ya está implementado en el código actual, así que no necesitas cambiar nada.


CHECKPOINT 7: Input configurado

  • InputActions asset tiene "Pause" action
  • Pause responde a Escape y Gamepad Start
  • C# class generada

10. TESTING Y VERIFICACIÓN (30 minutos)

10.1. Test 1: MainMenu Scene

Paso 1: Abrir MainMenu scene

  • Doble click en Assets/Scenes/MainMenu.unity

Paso 2: Enter Play Mode

  • Click Play ▶ (o F5)

Verificar:

  • Se ve el título "AJEDREZ PURGATORIO"
  • 4 botones visibles: New Campaign, Continue, Options, Quit
  • Continue button está desactivado (no hay saves)
  • Click en New Campaign → Carga Chapter1 scene (con fade)
  • No hay errores en Console

Posibles problemas:

  • "CampaignState is null" → Verificar que está en Resources y asignado
  • "Scene not found" → Verificar Build Settings
  • Botón no responde → Verificar eventos conectados

10.2. Test 2: Chapter1 Gameplay

Paso 1: Desde Play Mode en MainMenu, click New Campaign

  • Debería cargar Chapter1 scene

Verificar:

  • Tablero de ajedrez visible
  • GameHUD muestra "White's Turn" y "Moves: 0"
  • Puede mover piezas (funcionalidad ya implementada)
  • Turn text cambia de color al cambiar turno
  • No aparece DialogueUI (se muestra solo cuando se llama)

Paso 2: Probar Pause

  • Presiona Escape

Verificar:

  • Se oscurece la pantalla
  • Aparece Pause Menu con 4 botones
  • Tiempo se detiene (piezas no se pueden mover)
  • Click Resume → Vuelve al juego
  • Escape otra vez → Pause nuevamente

Paso 3: Probar Save

  1. Hacer algunos movimientos (ej: 5 moves)
  2. Pause → Click Save
  3. Verificar Console: "Game saved to slot X"
  4. Resume

Paso 4: Volver a Main Menu

  1. Pause → Main Menu
  2. Debería volver a MainMenu scene

Verificar:

  • Continue button ahora está ACTIVO (hay save)
  • Click Continue → Carga el save (vuelve a Chapter1 con estado guardado)

10.3. Test 3: Dialogue System

Paso 1: Forzar activación de diálogo manualmente

  • En Scene view, con Play Mode activo:
    1. Busca DialogueSystem en Hierarchy
    2. En Inspector, busca método público StartDialogue(string)
    3. NO puedes llamarlo desde Inspector, pero puedes:

Opción A: Modificar temporalmente CampaignManager

  1. Stop Play Mode
  2. Abre CampaignManager.cs
  3. En Start(), agrega:
void Start() {
    // Testing: Show intro dialogue immediately
    if (_dialogueSystem != null) {
        _dialogueSystem.StartDialogue("c1_intro");
    }
}
  1. Guardar script
  2. Enter Play Mode → Debería mostrar diálogo intro de Chapter 1

Verificar:

  • DialoguePanel aparece en pantalla
  • Texto hace typewriter effect (aparece letra por letra)
  • Speaker name aparece arriba
  • Continue button se activa después de typewriter
  • Click Continue → Siguiente línea
  • Al final del diálogo → Panel desaparece

Paso 2: Revertir cambio temporal

  • Borra el código de testing de CampaignManager.Start()

10.4. Test 4: DeadKingPool Persistence

Paso 1: Stop Play Mode

Paso 2: Abrir DeadKingPool Tests

  1. Window → General → Test Runner
  2. Tab: PlayMode
  3. Busca: DeadKingPoolTests

Paso 3: Run Tests

  • Click Run All en Test Runner window

Verificar:

  • Todos los tests pasan (17/17 verde)
  • No hay errores en Console

Si fallan tests:

  • Revisar que DeadKingPool.asset está en Resources
  • Revisar logs de Console para ver detalles

10.5. Test 5: SaveSystem

Paso 1: Test de Save/Load completo

En Play Mode:

  1. New Campaign
  2. Hacer 10 movimientos
  3. Capturar una pieza (si es posible)
  4. Pause → Save
  5. Continuar jugando (hacer 5 movimientos más)
  6. Pause → Main Menu
  7. En Main Menu: Continue

Verificar:

  • El save se cargó correctamente
  • Vuelve a Chapter1 con estado correcto
  • Moves count es el guardado (no el actual)
  • Piezas capturadas están en el estado guardado

Paso 2: Test de múltiples slots

  1. Pause → Main Menu
  2. New Campaign (crea nuevo juego)
  3. Hacer pocos movimientos (ej: 2)
  4. Pause → Save
  5. Main Menu → Continue

Verificar:

  • Carga el save MÁS RECIENTE
  • Si abres la carpeta Application.persistentDataPath:
    • Windows: C:\Users\<User>\AppData\LocalLow\<CompanyName>\<ProductName>\
    • Deberías ver: save_slot_0.json, save_slot_1.json

10.6. Test 6: Build completo

Paso 1: Hacer Build

  1. File → Build Settings
  2. Click Build
  3. Selecciona carpeta de output (ej: G:\EGGames\Ajedrez_Purgatorio\Build\)
  4. Espera a que compile (~2-5 minutos)

Paso 2: Ejecutar Build

  1. Navega a carpeta Build
  2. Ejecuta Ajedrez_Purgatorio.exe

Verificar en Build:

  • MainMenu carga correctamente
  • New Campaign funciona
  • Gameplay funciona
  • Pause funciona
  • Save/Load funciona
  • Audio funciona (si asignaste clips)
  • Quit button cierra la aplicación

CHECKPOINT 8: Todo testeado

Si todos los tests pasaron:

  • JUEGO COMPLETO Y FUNCIONAL 🎉

11. TROUBLESHOOTING COMÚN

Problema: "CampaignState is null"

Causa: ScriptableObject no encontrado
Solución:

  1. Verificar que CampaignState.asset está en Assets/Game/Data/Resources/
  2. Verificar que está asignado en CampaignManager Inspector
  3. Verificar que el código usa Resources.Load<CampaignState>("CampaignState")

Problema: "Scene 'Chapter1' couldn't be loaded"

Causa: Scene no en Build Settings
Solución:

  1. File → Build Settings
  2. Agregar scene arrastrándola
  3. Verificar checkbox activo

Problema: DialogueUI no aparece

Causa: Canvas está activa inicialmente
Solución:

  1. En Chapter scene, selecciona DialogueCanvas
  2. Desmarcar checkbox (GameObject inactivo)
  3. DialogueSystem la activará cuando necesite

Problema: Pause no funciona con Escape

Causa: Input System no configurado
Solución:

  1. Verificar InputSystem_Actions.inputactions tiene "Pause" action
  2. Verificar binding a <Keyboard>/escape
  3. Regenerar C# class si es necesario

Problema: Audio no suena

Causa: AudioClips no asignados
Solución:

  1. Verificar AudioManager tiene clips asignados
  2. Verificar Audio Sources están configurados
  3. Verificar volumen del sistema operativo

Problema: Tests fallan en Test Runner

Causa: ScriptableObjects no encontrados en tests
Solución:

  1. Los tests usan ScriptableObject.CreateInstance<>() para crear instances temporales
  2. Si tests esperan Resources, asegúrate que existan en Resources folder
  3. Ver logs específicos en Console

Problema: NullReferenceException en runtime

Causa: Referencia no asignada en Inspector
Solución:

  1. Leer stack trace en Console para identificar qué script y línea
  2. Abrir scene correspondiente
  3. Buscar GameObject con ese script
  4. Verificar que TODOS los SerializeField estén asignados en Inspector
  5. Típicos culpables:
    • CampaignManager: _campaignState, _dialogueSystem
    • DialogueUI: _dialogueText, _continueButton
    • GameHUD: _turnText, _checkIndicator

12. PRÓXIMOS PASOS OPCIONALES

12.1. Agregar más contenido

  • Crear más chapters (Chapter4, Chapter5, etc.)
  • Escribir más diálogos JSON
  • Diseñar posiciones iniciales especiales

12.2. Mejoras visuales

  • Sprites custom de piezas
  • Animaciones de movimiento (DOTween)
  • Partículas al capturar
  • Shader effects en check

12.3. Mejoras de audio

  • Música diferente por chapter
  • SFX dinámico según tipo de pieza
  • Voz narrada (voice-over)

12.4. Mejoras de UX

  • Tutorial interactivo
  • Hints system
  • Undo/Redo moves
  • Settings screen (volume, resolution)

12.5. Testing exhaustivo

  • Ejecutar todos los unit tests
  • Crear tests de integración
  • Hacer playtesting manual con test plan
  • Performance profiling

RESUMEN FINAL

Has implementado:

  • 2 ScriptableObjects (CampaignState, DeadKingPool)
  • 1 MainMenu scene completa
  • 3 Chapter scenes con 5 canvases UI cada una
  • Sistema de Audio configurado
  • 2 Prefabs de UI
  • Build Settings con 4 scenes
  • Input System con Pause action

Total:

  • ~4 scenes
  • ~30 GameObjects con scripts
  • ~15 UI canvases/panels
  • ~20+ botones configurados
  • ~50+ referencias conectadas en Inspector

Tiempo invertido: ~3-4 horas

Estado del juego: COMPLETAMENTE FUNCIONAL Y JUGABLE


📝 CHECKLIST FINAL DE VERIFICACIÓN

Marca cada item cuando lo hayas completado:

ScriptableObjects:

  • CampaignState.asset en Resources
  • DeadKingPool.asset en Resources
  • BalanceConfig.asset (opcional)

Scenes:

  • MainMenu.unity con todos los botones funcionando
  • Chapter1.unity con todas las UI
  • Chapter2.unity (duplicado de Chapter1)
  • Chapter3.unity (duplicado de Chapter1)

UI Systems (en cada Chapter):

  • DialogueCanvas con DialogueUI script
  • GameHUDCanvas con GameHUD script
  • PauseMenuCanvas con PauseMenuController
  • DeadKingRevealCanvas con DeadKingRevealUI

Managers (persistentes):

  • CampaignManager configurado
  • SaveSystem configurado
  • AudioManager con clips (opcional)
  • SceneTransitionManager con FadeImage

Audio:

  • 6 AudioClips SFX importados (opcional)
  • Música de fondo (opcional)
  • Asignados en AudioManager

Prefabs:

  • MoveIndicator.prefab creado
  • CapturedPieceIcon.prefab creado
  • Asignados en GameHUD

Build Settings:

  • 4 scenes en Build (MainMenu en índice 0)
  • Platform configurado
  • Input System configurado

Testing:

  • MainMenu funciona (New Campaign, Continue, Quit)
  • Chapter gameplay funciona (movimiento, turns, HUD)
  • Pause funciona (Escape, Resume, Save, MainMenu)
  • Save/Load funciona (guarda y carga estado)
  • DialogueSystem funciona (typewriter, continue)
  • Scene transitions funcionan (fade in/out)
  • Build ejecuta correctamente

¡FELICIDADES! Has completado la implementación en Unity. 🎉

El código está 100% implementado (Sprint 4 + Sprint 5), y ahora tienes todas las scenes, UI, y assets configurados para jugar el juego de principio a fin.

Siguiente paso recomendado: Hacer un playthrough completo para encontrar bugs visuales o de UX que ajustar.