Files
Ajedrez_Purgatorio/MANUAL_IMPLEMENTACION_UNITY.md

1911 lines
49 KiB
Markdown

# 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](#1-pre-requisitos)
2. [Crear ScriptableObjects](#2-crear-scriptableobjects-10-minutos)
3. [Crear Estructura de Carpetas](#3-crear-estructura-de-carpetas-5-minutos)
4. [Crear Main Menu Scene](#4-crear-main-menu-scene-30-minutos)
5. [Crear Chapter Scenes](#5-crear-chapter-scenes-1-2-horas)
6. [Configurar Audio](#6-configurar-audio-20-minutos)
7. [Crear Prefabs de UI](#7-crear-prefabs-de-ui-30-minutos)
8. [Configurar Build Settings](#8-configurar-build-settings-10-minutos)
9. [Configurar Input System](#9-configurar-input-system-10-minutos)
10. [Testing y Verificación](#10-testing-y-verificación-30-minutos)
**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 `MainMenuCanvas``UI → 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 `MainMenuCanvas``UI → 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 `ButtonPanel``UI → 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 `SceneTransitionManager``UI → Canvas`
2. Renombra a: `FadeCanvas`
3. Click derecho en `FadeCanvas``UI → 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 `DialogueCanvas``UI → 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 `DialoguePanel``UI → 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 `DialoguePanel``UI → 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 `DialoguePanel``UI → 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 `GameHUDCanvas``UI → 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 `GameHUDCanvas``UI → 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 `GameHUDCanvas``UI → 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 `CheckIndicator``UI → 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 `GameHUDCanvas``UI → 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 `GameHUDCanvas``UI → 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 `PauseMenuCanvas``UI → 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 `PauseMenuCanvas``UI → 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 `PausePanel``UI → 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 `PausePanel``UI → 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 `ButtonsContainer``UI → 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
- `ResumeButton``PauseMenuController.OnResumeClick()`
- `SaveButton``PauseMenuController.OnSaveClick()`
- `MainMenuButton``PauseMenuController.OnMainMenuClick()`
- `QuitButton``PauseMenuController.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 `DeadKingRevealCanvas``UI → 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 `DeadKingRevealCanvas``UI → 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 `RevealPanel``UI → 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 `RevealPanel``UI → 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 `RevealPanel``UI → 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 `RevealPanel``UI → 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
- 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
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 `TempCanvas``UI → 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:
```csharp
// 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:
```csharp
void Start() {
// Testing: Show intro dialogue immediately
if (_dialogueSystem != null) {
_dialogueSystem.StartDialogue("c1_intro");
}
}
```
4. Guardar script
5. 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.