# Hockey Game UI and Timer System This update adds a UI Builder scoreboard with timer control and a "puck in play" system that controls when the timer runs and when players can move. ## Features Implemented ### 1. **GameManager** (Central Game Control) - Manages game time (countdown from 20:00) - Tracks home/away scores - Controls period tracking - **Puck In Play Control**: Timer only runs when puck is in play - Events system for UI updates ### 2. **UI System** (UI Toolkit/UI Builder) - **Scoreboard Layout**: "Home Team" 0 | Timer | 0 "Away Team" - Real-time score updates - Countdown timer display (MM:SS format) - Period indicator - Styled with professional hockey scoreboard look ### 3. **Faceoff Integration** - Timer stops during faceoffs - Players are frozen until faceoff resolves to: - HomeWin - AwayWin - Struggle - Timer starts automatically when puck is in play ### 4. **Player Movement Control** - Both human and AI players respect "puck in play" state - No movement during faceoffs - Smooth deceleration when frozen ## Setup Instructions ### Step 1: Add GameManager 1. In your scene, create an empty GameObject 2. Name it "GameManager" 3. Add the `GameManager` component 4. Configure settings (optional): - Period Duration: 1200 seconds (20:00) - Total Periods: 3 ### Step 2: Setup UI 1. Create an empty GameObject named "GameUI" 2. Add `UIDocument` component 3. Configure UIDocument: - **Source Asset**: Select `Assets/UI/GameUI.uxml` - **Panel Settings**: Create or use existing Panel Settings (see Step 3) 4. Add `UIController` component to the same GameObject 5. In UIController, set: - Home Team Name: "Home Team" (or your team name) - Away Team Name: "Away Team" (or your team name) ### Step 3: Create Panel Settings (if needed) 1. Right-click in Project window 2. Select: **Create > UI Toolkit > Panel Settings Asset** 3. Name it "GameUIPanelSettings" 4. Configure: - **Scale Mode**: Scale With Screen Size - **Reference Resolution**: 1920 x 1080 - **Screen Match Mode**: Match Width Or Height - **Match**: 0.5 (balance between width and height) 5. Assign this Panel Settings to your UIDocument component ### Step 4: Link FaceoffManager (if not already linked) Your existing FaceoffManager is already updated to work with the new system. It will automatically: - Set puck in play to false when faceoff starts - Set puck in play to true when faceoff completes - Freeze all players during faceoffs ### Step 5: Test the System 1. Press Play in Unity 2. Press **F** to trigger a faceoff at center ice 3. Observe: - Timer stops - Players freeze - Faceoff resolves after ~2 seconds - Timer starts counting down - Players can move ## How It Works ### Puck In Play Flow ``` Game Starts ↓ Timer: 20:00, Puck In Play: FALSE ↓ Press F (Faceoff Starts) ↓ Freeze Players, Timer Stays Paused ↓ Faceoff Resolves (HomeWin/AwayWin/Struggle) ↓ Puck In Play: TRUE ↓ Timer Counts Down, Players Can Move ↓ Goal Scored ↓ Puck In Play: FALSE (new faceoff needed) ``` ### Key Scripts #### GameManager.cs - Singleton pattern - Controls game state - Manages timer countdown - Score tracking - Event broadcasting #### UIController.cs - Subscribes to GameManager events - Updates UI labels in real-time - Formats time display #### FaceoffManager.cs (Updated) - Signals GameManager when faceoff starts/ends - Controls puck in play state #### PlayerMovement.cs (Updated) - Checks `GameManager.Instance.IsPuckInPlay` - Stops player input when false - Applies deceleration #### PlayerAIMovement.cs (Updated) - Checks `GameManager.Instance.IsPuckInPlay` - Stops AI decisions when false - Stops AI movement when false ## Testing Checklist - [ ] GameManager exists in scene - [ ] UI displays correctly at top of screen - [ ] Timer shows "20:00" at start - [ ] Period shows "Period 1" - [ ] Scores show "0 - 0" - [ ] Press F to start faceoff - [ ] Timer remains at 20:00 during faceoff - [ ] Players cannot move during faceoff - [ ] After faceoff completes, timer counts down - [ ] Players can move after faceoff - [ ] Score updates work (test manually via GameManager.Instance.AddHomeScore(1)) ## Customization ### Change Team Names In UIController component: - Home Team Name: Enter your home team name - Away Team Name: Enter your away team name ### Change Period Duration In GameManager component: - Period Duration: Set in seconds (1200 = 20:00) ### Style Modifications Edit `Assets/UI/GameUI.uss` to customize: - Colors (background, text, scores) - Font sizes - Spacing and padding - Border styles ### Add Goal Detection To automatically trigger scoring when puck enters net: ```csharp // In your goal detection script: if (GameManager.Instance != null) { if (isHomeGoal) GameManager.Instance.AddAwayScore(); else GameManager.Instance.AddHomeScore(); } ``` ## Files Created/Modified ### New Files - `Assets/Scripts/GameManager.cs` - Main game controller - `Assets/Scripts/UIController.cs` - UI manager - `Assets/UI/GameUI.uxml` - UI layout - `Assets/UI/GameUI.uss` - UI styles - `Assets/UI/SETUP_INSTRUCTIONS.md` - This file ### Modified Files - `Assets/Scripts/FaceoffManager.cs` - Added GameManager integration - `Assets/Scripts/Player/PlayerMovement.cs` - Added puck in play check - `Assets/Scripts/Player/AI/PlayerAIMovement.cs` - Added puck in play check - `Assets/Scripts/MainGameScript.cs` - Added setup documentation ## Troubleshooting ### Timer not counting down - Check GameManager exists in scene - Verify faceoff has completed (press F and wait) - Check Console for "Puck in play: True" message ### UI not showing - Verify UIDocument has GameUI.uxml assigned - Check Panel Settings is assigned - Ensure UIDocument has UIController component - Check Canvas scale mode ### Players still moving during faceoff - Verify GameManager.Instance is not null - Check FaceoffManager is calling SetPuckInPlay - Verify PlayerMovement/PlayerAIMovement have been updated ### Events not firing - Ensure only ONE GameManager exists in scene - Check UIController OnEnable is subscribing to events - Verify GameManager.Instance is accessible ## Future Enhancements Possible additions: - Pause menu integration - Overtime periods - Shot clock - Penalty timer display - Replay last goal - Game statistics