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
- Pre-requisitos
- Crear ScriptableObjects
- Crear Estructura de Carpetas
- Crear Main Menu Scene
- Crear Chapter Scenes
- Configurar Audio
- Crear Prefabs de UI
- Configurar Build Settings
- Configurar Input System
- 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
- En Unity Editor, navega a
Assets/Game/Data/ - Click derecho en el panel Project
Create → Ajedrez Purgatorio → Campaign → Campaign State- Renombra a:
CampaignState
Paso 2: Mover a Resources
- Crea carpeta si no existe:
Assets/Game/Data/Resources/ - Arrastra
CampaignState.assetaResources/ - 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
- En
Assets/Game/Data/ - Click derecho →
Create → Ajedrez Purgatorio → Meta → Dead King Pool - Renombra a:
DeadKingPool
Paso 2: Mover a Resources
- Arrastra
DeadKingPool.assetaAssets/Game/Data/Resources/ - 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
- En
Assets/Game/Data/ - Click derecho →
Create → Ajedrez Purgatorio → Data → Balance Config - 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
File → New Scene- Selecciona template:
Basic (Built-In)oURP File → Save As- 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
- Click derecho en Hierarchy →
UI → Canvas - 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
- Click derecho en
MainMenuCanvas→UI → Text - TextMeshPro - Renombra a:
TitleText - 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
- Click derecho en
MainMenuCanvas→UI → Panel - 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
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
Imagedel Panel (checkbox)
4.5. Crear Botones (4 botones)
Crear los 4 botones de una vez:
- Click derecho en
ButtonPanel→UI → Button - TextMeshPro - Renombra a:
NewCampaignButton - Repite 3 veces más para crear:
ContinueButtonOptionsButtonQuitButton
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:
- Expande el botón en Hierarchy (flecha ▶)
- Selecciona el hijo
Text (TMP) - En Inspector, busca el campo
Text - Cambia a:
- NewCampaignButton →
"NEW CAMPAIGN" - ContinueButton →
"CONTINUE" - OptionsButton →
"OPTIONS" - QuitButton →
"QUIT"
- NewCampaignButton →
Ajustar tamaño del texto (opcional pero recomendado):
- Selecciona el
Text (TMP)de cada botón - En Inspector: Font Size =
28o32 - 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:
- Selecciona el botón (no el texto, el botón mismo)
Add Component → Layout → Layout Element- 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
- Click derecho en Hierarchy (root) →
Create Empty - Renombra a:
GameController
Paso 2: Agregar componentes necesarios
- Selecciona
GameController Add Component → Main Menu Controller(debería aparecer en búsqueda)
Si no aparece el script:
Add Component → New Script- Nombre:
MainMenuController - IMPORTANTE: Elimina el script que Unity creó
- 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()usandoAddListener(). 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
- Click derecho en Hierarchy →
Create Empty - Renombra a:
CampaignManager 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
- Click derecho en Hierarchy →
Create Empty - Renombra a:
SaveSystem Add Component → Save System
No necesita configuración en Inspector (todo es código)
Paso 4: Crear GameObject para AudioManager
- Click derecho en Hierarchy →
Create Empty - Renombra a:
AudioManager Add Component → Audio ManagerAdd 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
- Click derecho en Hierarchy →
Create Empty - Renombra a:
SceneTransitionManager Add Component → Scene Transition Manager
Paso 8: Crear Canvas para Fade Overlay
- Click derecho en
SceneTransitionManager→UI → Canvas - Renombra a:
FadeCanvas - Click derecho en
FadeCanvas→UI → Image - 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:
- Camera - Para ver el juego
- GameManager - Instancia el tablero y maneja la lógica de ajedrez
- DialogueSystem - Maneja los diálogos del capítulo
- UI Canvases - DialogueUI, GameHUD, PauseMenu, DeadKingRevealUI
5.2. Crear Chapter1.unity
Paso 1: Crear una scene básica nueva
File → New Scene- Selecciona template: Basic (Built-In) o URP
File → Save As→ Guarda enAssets/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
- Click derecho en Hierarchy →
Create Empty - Renombra a:
GameManager Add Component → Game Manager
Importante: El GameManager es quien instancia el tablero en
Start()oAwake(). Al dar Play, verás el tablero aparecer automáticamente.
Paso 4: Test rápido
- Presiona Play ▶
- Deberías ver: El tablero de ajedrez con piezas en posición inicial
- Si no aparece: Verifica que GameManager está configurado correctamente
- 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
- Click derecho en Hierarchy →
Create Empty - Renombra a:
DialogueSystem
Paso 2: Agregar componente
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
- Click derecho en Hierarchy →
UI → Canvas - 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
- Click derecho en
DialogueCanvas→UI → Panel - 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
- Click derecho en
DialoguePanel→UI → Text - TextMeshPro - 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
- Click derecho en
DialoguePanel→UI → Text - TextMeshPro - 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
- Click derecho en
DialoguePanel→UI → Button - TextMeshPro - 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
- Selecciona
DialogueCanvas 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
- Selecciona
DialogueSystem - En Inspector, debería aparecer campo
Dialogue UI - Arrastra
DialogueCanvasal 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
- Click derecho en Hierarchy →
UI → Canvas - 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
- Click derecho en
GameHUDCanvas→UI → Text - TextMeshPro - 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
- Click derecho en
GameHUDCanvas→UI → Text - TextMeshPro - 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
- Click derecho en
GameHUDCanvas→UI → Panel - 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
- Click derecho en
CheckIndicator→UI → Text - TextMeshPro - 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:
- Click derecho en
GameHUDCanvas→UI → Panel - 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:
- Duplica
WhiteCapturedPanel(Ctrl+D) - Renombra a:
BlackCapturedPanel - Cambia Anchor a: Middle Right
- Pos X: -20
Paso 9: Crear PauseButton
- Click derecho en
GameHUDCanvas→UI → Button - TextMeshPro - 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
- Selecciona
GameHUDCanvas 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
- Click derecho en Hierarchy →
UI → Canvas - 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
- Click derecho en
PauseMenuCanvas→UI → Image - 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
- Click derecho en
PauseMenuCanvas→UI → Panel - Renombra a:
PausePanel
Rect Transform
├─ Anchor: Middle Center
├─ Width: 500
├─ Height: 600
Image (Script)
├─ Color: #2C2C2C (gris oscuro)
Paso 5: Crear Título "PAUSED"
- Click derecho en
PausePanel→UI → Text - TextMeshPro - 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
- Click derecho en
PausePanel→UI → Panel - Renombra a:
ButtonsContainer - 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:
- Click derecho en
ButtonsContainer→UI → Button - TextMeshPro - Renombra:
ResumeButtonSaveButtonMainMenuButtonQuitButton
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
- Selecciona
PauseMenuCanvas 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
ResumeButton→PauseMenuController.OnResumeClick()SaveButton→PauseMenuController.OnSaveClick()MainMenuButton→PauseMenuController.OnMainMenuClick()QuitButton→PauseMenuController.OnQuitClick()
Paso 11: Conectar PauseButton con PauseMenuController
- Selecciona
PauseButton(en GameHUDCanvas) - En componente Button, On Click():
- Arrastra
PauseMenuCanvas(tiene PauseMenuController) - Dropdown →
PauseMenuController → ShowPauseMenu()
- Arrastra
Paso 12: Desactivar PauseMenuCanvas inicialmente
- Selecciona
PauseMenuCanvas - Desmarca checkbox (inactivo)
5.7. Crear DeadKingRevealUI Canvas
Paso 1: Crear Canvas
- Click derecho en Hierarchy →
UI → Canvas - 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
- Click derecho en
DeadKingRevealCanvas→UI → Image - 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
- Click derecho en
DeadKingRevealCanvas→UI → Panel - Renombra a:
RevealPanel
Rect Transform
├─ Anchor: Middle Center
├─ Width: 800
├─ Height: 600
Image (Script)
├─ Color: #1A0A0A (rojo muy oscuro)
Paso 5: Crear TitleText
- Click derecho en
RevealPanel→UI → Text - TextMeshPro - 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
- Click derecho en
RevealPanel→UI → Text - TextMeshPro - 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
- Click derecho en
RevealPanel→UI → Text - TextMeshPro - 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
- Click derecho en
RevealPanel→UI → Button - TextMeshPro - 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
- Selecciona
DeadKingRevealCanvas 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
- En Project window, selecciona
Chapter1.unity Ctrl+Dpara duplicar- Renombra a
Chapter2.unity - 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
- Usa https://sfxr.me/ para generar SFX simples
- Exporta como .wav
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
- Arrastra archivos .wav o .mp3 a las carpetas correspondientes
- Renombra según necesites:
move.wavcapture.wavcheck.wavcheckmate.wavpromotion.wavinvalid_move.wav
Paso 3: Configurar import settings (para SFX)
- Selecciona cada archivo SFX
- 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
AudioManagerGameObject
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
- Abre cualquier scene (ej: Chapter1.unity)
- Click derecho en Hierarchy →
2D Object → Sprite - 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 →
Knobsprite (busca en assets default) - Opción B: Crear en
Assets/Game/Sprites/UI/:- Usa Photoshop/GIMP para crear círculo 64x64 px verde semi-transparente
- Importa como sprite
Paso 3: Convertir a Prefab
- Arrastra
MoveIndicatordesde Hierarchy aAssets/Game/Prefabs/UI/ - Borra el GameObject de la Hierarchy (ya está como prefab)
7.2. CapturedPieceIcon Prefab
Paso 1: Crear Canvas vacío temporal
- Create Empty →
TempCanvas - Add Component → Canvas
- Render Mode: World Space (no importa, es solo para crear el prefab)
Paso 2: Crear Image
- Click derecho en
TempCanvas→UI → Image - 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
- Arrastra
CapturedPieceIcon(solo el Image, no el Canvas) aAssets/Game/Prefabs/UI/ - Borra
TempCanvasde 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+Sen 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(oCtrl+Shift+B)
Paso 2: Agregar scenes en orden
- Click
Add Open Scenessi tienes alguna abierta, o - 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":
- Selecciona Action Map (ej: "UI" o crea uno nuevo "Gameplay")
- Click
+en sección Actions - Renombra a:
Pause - En "Properties":
- Action Type: Button
- Control Type: Any
- Click
+junto a<No Binding> - Path:
<Keyboard>/escape - Click
+nuevamente (para agregar gamepad) - Path:
<Gamepad>/start
Paso 4: Guardar cambios
- Click
Save Asseten la ventana de Input Actions - Cerrar ventana
Paso 5: Verificar que C# class está generada
- Debería existir
InputSystem_Actions.csal lado del.inputactions - Si NO existe:
- Selecciona
InputSystem_Actions.inputactions - En Inspector:
☑ Generate C# Class - Click
Apply
- Selecciona
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:
- Abre
PauseMenuController.cs - 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
- Hacer algunos movimientos (ej: 5 moves)
- Pause → Click Save
- Verificar Console: "Game saved to slot X"
- Resume
Paso 4: Volver a Main Menu
- Pause → Main Menu
- 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:
- Busca
DialogueSystemen Hierarchy - En Inspector, busca método público
StartDialogue(string) - NO puedes llamarlo desde Inspector, pero puedes:
- Busca
Opción A: Modificar temporalmente CampaignManager
- Stop Play Mode
- Abre
CampaignManager.cs - En
Start(), agrega:
void Start() {
// Testing: Show intro dialogue immediately
if (_dialogueSystem != null) {
_dialogueSystem.StartDialogue("c1_intro");
}
}
- Guardar script
- 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
Window → General → Test Runner- Tab: PlayMode
- Busca:
DeadKingPoolTests
Paso 3: Run Tests
- Click
Run Allen 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:
- New Campaign
- Hacer 10 movimientos
- Capturar una pieza (si es posible)
- Pause → Save
- Continuar jugando (hacer 5 movimientos más)
- Pause → Main Menu
- 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
- Pause → Main Menu
- New Campaign (crea nuevo juego)
- Hacer pocos movimientos (ej: 2)
- Pause → Save
- 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
- Windows:
10.6. Test 6: Build completo
Paso 1: Hacer Build
File → Build Settings- Click
Build - Selecciona carpeta de output (ej:
G:\EGGames\Ajedrez_Purgatorio\Build\) - Espera a que compile (~2-5 minutos)
Paso 2: Ejecutar Build
- Navega a carpeta Build
- 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:
- Verificar que
CampaignState.assetestá enAssets/Game/Data/Resources/ - Verificar que está asignado en CampaignManager Inspector
- 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:
File → Build Settings- Agregar scene arrastrándola
- Verificar checkbox activo
Problema: DialogueUI no aparece
Causa: Canvas está activa inicialmente
Solución:
- En Chapter scene, selecciona
DialogueCanvas - Desmarcar checkbox (GameObject inactivo)
- DialogueSystem la activará cuando necesite
Problema: Pause no funciona con Escape
Causa: Input System no configurado
Solución:
- Verificar
InputSystem_Actions.inputactionstiene "Pause" action - Verificar binding a
<Keyboard>/escape - Regenerar C# class si es necesario
Problema: Audio no suena
Causa: AudioClips no asignados
Solución:
- Verificar AudioManager tiene clips asignados
- Verificar Audio Sources están configurados
- Verificar volumen del sistema operativo
Problema: Tests fallan en Test Runner
Causa: ScriptableObjects no encontrados en tests
Solución:
- Los tests usan
ScriptableObject.CreateInstance<>()para crear instances temporales - Si tests esperan Resources, asegúrate que existan en Resources folder
- Ver logs específicos en Console
Problema: NullReferenceException en runtime
Causa: Referencia no asignada en Inspector
Solución:
- Leer stack trace en Console para identificar qué script y línea
- Abrir scene correspondiente
- Buscar GameObject con ese script
- Verificar que TODOS los SerializeField estén asignados en Inspector
- Típicos culpables:
- CampaignManager:
_campaignState,_dialogueSystem - DialogueUI:
_dialogueText,_continueButton - GameHUD:
_turnText,_checkIndicator
- CampaignManager:
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.