485 lines
14 KiB
Markdown
485 lines
14 KiB
Markdown
# Airplane Minigame - Unity Setup Guide
|
|
|
|
**Implementation Status**: ✅ Code Complete
|
|
**Setup Time**: ~20 minutes
|
|
**Assets Required**: 0 ScriptableObjects (all settings-based!)
|
|
|
|
---
|
|
|
|
## What's Been Implemented
|
|
|
|
### Core Features
|
|
✅ **3 Airplane Types** - Jet, Bobbing, Drop (settings-based configuration)
|
|
✅ **3 Unique Abilities** - Hold to boost, tap to jump, tap to dive
|
|
✅ **Pre-Game Selection UI** - Choose airplane before game starts
|
|
✅ **In-Flight Ability Button** - Shows icon, cooldown, and handles input
|
|
✅ **Pre-Spawn System** - Airplane visible at slingshot before launch
|
|
✅ **Cooldown Management** - Visual fill animation and state tracking
|
|
✅ **InputManager Integration** - Proper touch handling (no legacy Input)
|
|
✅ **Adaptive Spawning** - Retry keeps same obstacles, success regenerates
|
|
✅ **Person Reactions** - Success/failure behaviors with proper sequencing
|
|
|
|
### Game Flow
|
|
```
|
|
Game Start → Airplane Selection → Intro → Person Turn → Aiming (airplane at slingshot)
|
|
→ Launch → Flying (ability button active) → Hit/Miss → Reaction → Next Person/Retry
|
|
```
|
|
|
|
---
|
|
|
|
## Unity Setup Steps
|
|
|
|
### STEP 1: Configure Airplane Settings (5 minutes)
|
|
|
|
**Location**: `Tools > Settings > Airplane Settings`
|
|
|
|
You'll see collapsible sections for each airplane type. Configure:
|
|
|
|
#### **Jet Plane**
|
|
```
|
|
Display Name: "Jet Plane"
|
|
Prefab: [Assign airplane prefab with sprite/model]
|
|
Preview Sprite: [Assign for selection UI]
|
|
Ability Type: Jet (already set)
|
|
|
|
Physics Overrides (optional):
|
|
☐ Override Mass
|
|
☐ Override Gravity Scale
|
|
☐ Override Drag
|
|
```
|
|
|
|
#### **Jet Ability**
|
|
```
|
|
Ability Name: "Jet Boost"
|
|
Ability Icon: [Assign sprite for button]
|
|
Cooldown Duration: 5.0 seconds
|
|
Jet Speed: 15.0
|
|
Jet Angle: 0 (flies horizontally)
|
|
```
|
|
|
|
#### **Bobbing Plane**
|
|
```
|
|
Display Name: "Bobbing Plane"
|
|
Prefab: [Assign airplane prefab]
|
|
Preview Sprite: [Assign for selection UI]
|
|
Ability Type: Bobbing (already set)
|
|
|
|
Physics Overrides (optional):
|
|
☐ Override Mass
|
|
☐ Override Gravity Scale
|
|
☐ Override Drag
|
|
```
|
|
|
|
#### **Bobbing Ability**
|
|
```
|
|
Ability Name: "Air Hop"
|
|
Ability Icon: [Assign sprite for button]
|
|
Cooldown Duration: 3.0 seconds
|
|
Bob Jump Force: 10.0
|
|
Speed Reduction: 0.7 (70% of original speed)
|
|
```
|
|
|
|
#### **Drop Plane**
|
|
```
|
|
Display Name: "Drop Plane"
|
|
Prefab: [Assign airplane prefab]
|
|
Preview Sprite: [Assign for selection UI]
|
|
Ability Type: Drop (already set)
|
|
|
|
Physics Overrides (optional):
|
|
☐ Override Mass
|
|
☐ Override Gravity Scale
|
|
☐ Override Drag
|
|
```
|
|
|
|
#### **Drop Ability**
|
|
```
|
|
Ability Name: "Dive Bomb"
|
|
Ability Icon: [Assign sprite for button]
|
|
Cooldown Duration: 4.0 seconds
|
|
Drop Force: 20.0
|
|
Drop Distance: 5.0
|
|
☑ Zero Horizontal Velocity
|
|
```
|
|
|
|
#### **Default Selection**
|
|
```
|
|
Default Airplane Type: Jet (or your preference)
|
|
```
|
|
|
|
**Note**: If all 3 airplane prefabs are the same, that's fine! The abilities are what differentiate them.
|
|
|
|
---
|
|
|
|
### STEP 2: Build Selection UI (10 minutes)
|
|
|
|
**Create Hierarchy**: `Canvas/AirplaneSelectionPanel`
|
|
|
|
```
|
|
AirplaneSelectionPanel (GameObject)
|
|
├── BackgroundImage (Image - semi-transparent dark overlay)
|
|
├── TitleText (TextMeshPro)
|
|
│ └── Text: "Choose Your Airplane"
|
|
├── ButtonContainer (GameObject + Horizontal Layout Group)
|
|
│ ├── JetButton (Button)
|
|
│ │ ├── Background (Image)
|
|
│ │ ├── Icon (Image - jet plane icon)
|
|
│ │ └── Label (TextMeshPro: "Jet Plane")
|
|
│ ├── BobbingButton (Button)
|
|
│ │ ├── Background (Image)
|
|
│ │ ├── Icon (Image - bobbing plane icon)
|
|
│ │ └── Label (TextMeshPro: "Bobbing Plane")
|
|
│ └── DropButton (Button)
|
|
│ ├── Background (Image)
|
|
│ ├── Icon (Image - drop plane icon)
|
|
│ └── Label (TextMeshPro: "Drop Plane")
|
|
└── ConfirmButton (Button)
|
|
└── Label (TextMeshPro: "Confirm")
|
|
```
|
|
|
|
**Add Component**: `AirplaneSelectionUI` to `AirplaneSelectionPanel`
|
|
|
|
**Configure Component**:
|
|
- Jet Plane Button → Drag `JetButton`
|
|
- Bobbing Plane Button → Drag `BobbingButton`
|
|
- Drop Plane Button → Drag `DropButton`
|
|
- Confirm Button → Drag `ConfirmButton`
|
|
- Selected Color: `#FFFF00` (yellow)
|
|
- Normal Color: `#FFFFFF` (white)
|
|
|
|
**Important**: ☑ Set panel **inactive** in Inspector (checkbox next to name)
|
|
|
|
---
|
|
|
|
### STEP 3: Build Ability Button (5 minutes)
|
|
|
|
**Create Hierarchy**: `Canvas/GameplayUI/AbilityButton`
|
|
|
|
```
|
|
AbilityButton (GameObject)
|
|
├── ButtonBackground (Image - circular)
|
|
├── AbilityIcon (Image - set dynamically)
|
|
├── CooldownFill (Image)
|
|
│ └── Image Type: Filled
|
|
│ └── Fill Method: Radial 360
|
|
│ └── Fill Origin: Top
|
|
│ └── Clockwise: ☑
|
|
└── CooldownText (TextMeshPro - optional)
|
|
```
|
|
|
|
**Add Component**: `AirplaneAbilityButton` to `AbilityButton`
|
|
|
|
**Configure Component**:
|
|
- Button → Drag Button component reference
|
|
- Ability Icon → Drag `AbilityIcon` Image
|
|
- Cooldown Fill → Drag `CooldownFill` Image
|
|
- Cooldown Text → Drag `CooldownText` (optional)
|
|
- Ready Color: `#FFFFFF` (white)
|
|
- Cooldown Color: `#808080` (gray)
|
|
- Active Color: `#FFFF00` (yellow)
|
|
|
|
**Position**: Bottom-right corner (accessible for thumb on mobile)
|
|
|
|
**Important**: ☑ Set button **inactive** in Inspector (checkbox next to name)
|
|
|
|
---
|
|
|
|
### STEP 4: Wire Game Manager (2 minutes)
|
|
|
|
**GameObject**: `AirplaneGameManager`
|
|
|
|
**Assign New References**:
|
|
- Selection UI → Drag `AirplaneSelectionPanel`
|
|
- Ability Button → Drag `AbilityButton`
|
|
|
|
**Verify Existing References** (should already be assigned):
|
|
- Person Queue
|
|
- Camera Manager
|
|
- Launch Controller
|
|
- Target Validator
|
|
- Spawn Manager
|
|
|
|
---
|
|
|
|
## Testing Checklist
|
|
|
|
### Selection UI
|
|
- [ ] Panel appears on game start
|
|
- [ ] Clicking button highlights it (turns yellow)
|
|
- [ ] Confirm button enables after selection
|
|
- [ ] Clicking confirm hides panel and starts game
|
|
|
|
### Airplane Spawning
|
|
- [ ] Selected airplane appears at slingshot
|
|
- [ ] Airplane stays in place (not falling)
|
|
- [ ] Trajectory preview works
|
|
- [ ] Launching works correctly
|
|
|
|
### Jet Ability (Hold to Activate)
|
|
- [ ] Button appears after launch with jet icon
|
|
- [ ] **Hold button** → Airplane flies straight (no gravity)
|
|
- [ ] **Release button** → Gravity returns
|
|
- [ ] Cooldown fill animates 1.0 → 0.0
|
|
- [ ] Button grays out during cooldown
|
|
- [ ] Can use again after cooldown ends
|
|
|
|
### Bobbing Ability (Tap to Activate)
|
|
- [ ] Button appears after launch with bobbing icon
|
|
- [ ] **Tap button** → Airplane jumps upward
|
|
- [ ] Speed reduces after jump
|
|
- [ ] Cooldown starts immediately
|
|
- [ ] Can use multiple times per flight
|
|
|
|
### Drop Ability (Tap to Activate)
|
|
- [ ] Button appears after launch with drop icon
|
|
- [ ] **Tap button** → Airplane drops straight down
|
|
- [ ] Stops dropping after configured distance
|
|
- [ ] Cooldown starts after drop ends
|
|
- [ ] Can use again after cooldown
|
|
|
|
### Integration
|
|
- [ ] Ability button hides after turn ends
|
|
- [ ] Retry uses same airplane type
|
|
- [ ] Success switches to next person (can choose again if cycling)
|
|
- [ ] No console errors
|
|
- [ ] Performance is smooth
|
|
|
|
---
|
|
|
|
## How Abilities Work
|
|
|
|
### Jet Ability - "Jet Boost"
|
|
**Input**: Hold button down
|
|
**Effect**: Flies straight at constant speed, ignoring gravity
|
|
**Duration**: While held (player controlled)
|
|
**Cooldown**: After release
|
|
**Use Case**: Fly over obstacles, reach distant targets
|
|
|
|
### Bobbing Ability - "Air Hop"
|
|
**Input**: Tap button
|
|
**Effect**: Jump upward, lose horizontal speed
|
|
**Duration**: Instant
|
|
**Cooldown**: After activation
|
|
**Use Case**: Gain altitude, avoid low obstacles, extend flight time
|
|
|
|
### Drop Ability - "Dive Bomb"
|
|
**Input**: Tap button
|
|
**Effect**: Drop straight down for fixed distance
|
|
**Duration**: Until distance reached
|
|
**Cooldown**: After drop completes
|
|
**Use Case**: Precision strikes, hitting low targets
|
|
|
|
---
|
|
|
|
## Architecture Overview
|
|
|
|
### Settings-Based System (No Assets Required!)
|
|
|
|
**Old Way** (NOT used):
|
|
- Create JetAbility.asset
|
|
- Create BobbingAbility.asset
|
|
- Create DropAbility.asset
|
|
- Create JetPlaneType.asset
|
|
- Create BobbingPlaneType.asset
|
|
- Create DropPlaneType.asset
|
|
- Wire references everywhere
|
|
|
|
**New Way** (Implemented):
|
|
- Configure everything in `AirplaneSettings` (one file!)
|
|
- Abilities created at runtime from settings
|
|
- Enum-based selection (`AirplaneAbilityType.Jet/Bobbing/Drop`)
|
|
- No asset management needed
|
|
|
|
### Code Structure
|
|
|
|
```
|
|
AirplaneSettings (ScriptableObject)
|
|
├─ Jet Plane Config + Jet Ability Config
|
|
├─ Bobbing Plane Config + Bobbing Ability Config
|
|
└─ Drop Plane Config + Drop Ability Config
|
|
|
|
AbilityFactory
|
|
└─ Creates ability instances from settings at runtime
|
|
|
|
BaseAirplaneAbility (abstract class)
|
|
├─ JetAbility (hold to fly straight)
|
|
├─ BobbingAbility (tap to jump)
|
|
└─ DropAbility (tap to dive)
|
|
|
|
Game Flow
|
|
├─ AirplaneSelectionUI (choose type)
|
|
├─ AirplaneController (initialized with type)
|
|
├─ AirplaneAbilityButton (shows during flight)
|
|
└─ AbilityFactory (creates ability on demand)
|
|
```
|
|
|
|
### Input System Integration
|
|
|
|
✅ Uses project's `InputManager` (no legacy Unity Input)
|
|
✅ Implements `ITouchInputConsumer` interface
|
|
✅ Override consumer registration for priority input
|
|
✅ Proper hold/release detection for Jet ability
|
|
✅ Works on mobile and desktop
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### Selection UI doesn't appear
|
|
- Check `AirplaneGameManager.selectionUI` is assigned
|
|
- Verify panel is inactive by default
|
|
- Check console for errors
|
|
|
|
### Airplane doesn't spawn at slingshot
|
|
- Verify prefab is assigned in settings for selected type
|
|
- Check `LaunchController` has launch anchor assigned
|
|
- Check console for "Cannot spawn" errors
|
|
|
|
### Ability button doesn't appear
|
|
- Verify `AirplaneGameManager.abilityButton` is assigned
|
|
- Check button is inactive by default
|
|
- Ensure airplane was initialized with type
|
|
- Check console for ability creation errors
|
|
|
|
### Hold doesn't work for Jet ability
|
|
- Verify `InputManager` exists in scene
|
|
- Check button implements `ITouchInputConsumer`
|
|
- Try click-and-hold with mouse first
|
|
- Check console for registration messages
|
|
|
|
### Cooldown fill doesn't animate
|
|
- Verify `CooldownFill` Image is assigned
|
|
- Check Fill Type is set to "Filled"
|
|
- Verify Fill Method is "Radial 360"
|
|
- Check fill amount starts at 0
|
|
|
|
### Wrong airplane spawns
|
|
- Check which type was selected in Selection UI
|
|
- Verify correct prefab is assigned in settings
|
|
- Check console logs for "Selected airplane: [type]"
|
|
|
|
---
|
|
|
|
## Advanced Configuration
|
|
|
|
### Physics Tuning Per Airplane
|
|
|
|
You can override physics per airplane type in settings:
|
|
|
|
**Lighter Airplane** (faster, less stable):
|
|
```
|
|
☑ Override Mass: 0.8
|
|
☑ Override Gravity Scale: 0.9
|
|
☑ Override Drag: 0.1
|
|
```
|
|
|
|
**Heavier Airplane** (slower, more stable):
|
|
```
|
|
☑ Override Mass: 1.2
|
|
☑ Override Gravity Scale: 1.1
|
|
☑ Override Drag: 0.3
|
|
```
|
|
|
|
### Ability Balance
|
|
|
|
**Make abilities more powerful**:
|
|
- Increase Jet Speed (15 → 20)
|
|
- Increase Bob Jump Force (10 → 15)
|
|
- Increase Drop Force (20 → 30)
|
|
|
|
**Make abilities have shorter cooldowns**:
|
|
- Jet: 5s → 3s
|
|
- Bobbing: 3s → 2s
|
|
- Drop: 4s → 3s
|
|
|
|
**Make abilities last longer**:
|
|
- Drop Distance: 5 → 8 (drops farther)
|
|
|
|
---
|
|
|
|
## Common Questions
|
|
|
|
**Q: Do I need different airplane prefabs for each type?**
|
|
A: No! You can use the same prefab for all three. The abilities differentiate them.
|
|
|
|
**Q: Can I add a 4th airplane type?**
|
|
A: Yes! Add enum value → Create config classes → Add to settings → Update factory. See full docs for details.
|
|
|
|
**Q: Can I skip the selection UI?**
|
|
A: Yes! Leave `selectionUI` unassigned in GameManager. The default type from settings will be used.
|
|
|
|
**Q: What if I don't assign ability icons?**
|
|
A: The button will work but show no icon. It's recommended to assign icons for clarity.
|
|
|
|
**Q: Can abilities be disabled?**
|
|
A: Currently no, but you could set cooldown to 999 to effectively disable them.
|
|
|
|
**Q: How do I test a specific airplane without the selection UI?**
|
|
A: Set the default type in settings, then don't assign the selection UI to GameManager.
|
|
|
|
---
|
|
|
|
## Performance Notes
|
|
|
|
- Abilities are created once per airplane (lightweight)
|
|
- Cooldown updates every frame (negligible cost)
|
|
- UI updates only during cooldown (efficient)
|
|
- No GC allocations during ability use
|
|
- Factory pattern avoids reflection overhead
|
|
|
|
---
|
|
|
|
## Summary
|
|
|
|
### What Code Does (Already Implemented)
|
|
✅ Manages game state and flow
|
|
✅ Creates abilities from settings at runtime
|
|
✅ Handles airplane spawning and initialization
|
|
✅ Updates cooldowns and ability state
|
|
✅ Proper input handling via InputManager
|
|
|
|
### What You Do (Unity Setup)
|
|
1. Configure 3 airplane types + abilities in settings (**5 min**)
|
|
2. Build selection UI panel with buttons (**10 min**)
|
|
3. Build ability button with cooldown fill (**5 min**)
|
|
4. Wire 2 references to GameManager (**2 min**)
|
|
5. Test! (**5 min**)
|
|
|
|
**Total Time: ~27 minutes to full functionality** ⚡
|
|
|
|
---
|
|
|
|
## Quick Start Checklist
|
|
|
|
Setup:
|
|
- [ ] Open `AirplaneSettings`, configure 3 airplane types
|
|
- [ ] Assign prefabs and sprites for all types
|
|
- [ ] Assign ability icons for all abilities
|
|
- [ ] Set default airplane type
|
|
- [ ] Create `AirplaneSelectionPanel` with 3 buttons
|
|
- [ ] Add `AirplaneSelectionUI` component, wire buttons
|
|
- [ ] Create `AbilityButton` with icon + cooldown fill
|
|
- [ ] Add `AirplaneAbilityButton` component, wire references
|
|
- [ ] Assign both UI references to `AirplaneGameManager`
|
|
- [ ] Set both UI elements inactive by default
|
|
|
|
Testing:
|
|
- [ ] Play → Selection appears
|
|
- [ ] Select → Confirm → Airplane spawns
|
|
- [ ] Launch → Ability button appears
|
|
- [ ] Use ability → Works correctly
|
|
- [ ] Cooldown → Animates and resets
|
|
- [ ] Turn ends → Button hides
|
|
- [ ] Retry → Same airplane
|
|
- [ ] Success → Next person
|
|
|
|
When all checked → System complete! 🎉
|
|
|
|
---
|
|
|
|
**Documentation Version**: 1.0
|
|
**Last Updated**: December 6, 2025
|
|
**Implementation**: Settings-Based Architecture
|
|
**Assets Required**: 0 ScriptableObjects ✅
|
|
|