# 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 `` 6. Path: `/escape` 7. Click `+` nuevamente (para agregar gamepad) 8. Path: `/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\\AppData\LocalLow\\\` - 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")` --- ### 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 `/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.