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:
- 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
- In your scene, create an empty GameObject
- Name it "GameManager"
- Add the
GameManager component
- Configure settings (optional):
- Period Duration: 1200 seconds (20:00)
- Total Periods: 3
Step 2: Setup UI
- Create an empty GameObject named "GameUI"
- Add
UIDocument component
- Configure UIDocument:
- Source Asset: Select
Assets/UI/GameUI.uxml
- Panel Settings: Create or use existing Panel Settings (see Step 3)
- Add
UIController component to the same GameObject
- 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)
- Right-click in Project window
- Select: Create > UI Toolkit > Panel Settings Asset
- Name it "GameUIPanelSettings"
- 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)
- 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
- Press Play in Unity
- Press F to trigger a faceoff at center ice
- 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
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:
// 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