Files
AppleHillsProduction/docs/editor_lifecycle_bootstrap_summary.md

303 lines
8.5 KiB
Markdown
Raw Normal View History

2025-11-05 10:20:18 +01:00
# Editor Lifecycle Bootstrap - Implementation Summary
**Date:** November 5, 2025
**Feature:** Editor-Only Quality of Life Improvement
**Status:** ✅ Complete & Ready to Use
---
## Quick Start
**No setup required!** Simply press Play in any scene and the lifecycle will work correctly.
### What This Fixes
Before this feature:
```
Press Play in "AppleHillsOverworld" scene
✅ OnManagedAwake() called
❌ OnSceneReady() NEVER called
```
After this feature:
```
Press Play in "AppleHillsOverworld" scene
✅ OnManagedAwake() called
✅ OnSceneReady() called ← NOW WORKS!
```
---
## Files Added
### 1. EditorLifecycleBootstrap.cs
**Location:** `Assets/Editor/Lifecycle/EditorLifecycleBootstrap.cs`
**Purpose:** Automatically triggers OnSceneReady when playing directly from editor
**Type:** Editor-only (zero runtime overhead)
**Key Features:**
- Automatic detection of play mode entry
- Waits for CustomBoot to complete
- Broadcasts OnSceneReady to all components in active scene
- Skips infrastructure scenes (Bootstrap/BootstrapScene)
- Safety timeout (5 seconds)
- Error handling and comprehensive logging
### 2. Documentation
**Location:** `docs/editor_lifecycle_bootstrap.md`
**Content:** Complete technical documentation and design rationale
---
## How It Works
### Sequence of Events
1. **Developer presses Play** in Unity Editor (in any scene)
2. **PlayModeStateChange.EnteredPlayMode** event fires
3. **EditorLifecycleBootstrap** starts polling
4. **Wait for CustomBoot.Initialised** to become true
5. **Get active scene** from Unity SceneManager
6. **Call LifecycleManager.BroadcastSceneReady(sceneName)**
7. **All components receive OnSceneReady()** callback
### Code Architecture
```csharp
[InitializeOnLoad] // Runs in editor
public static class EditorLifecycleBootstrap
{
static EditorLifecycleBootstrap()
{
// Hook into Unity editor play mode events
EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
}
private static void WaitForBootAndTriggerSceneReady()
{
// Poll until boot completes
if (!Bootstrap.CustomBoot.Initialised)
return;
// Get active scene
Scene activeScene = SceneManager.GetActiveScene();
// Trigger lifecycle
LifecycleManager.Instance.BroadcastSceneReady(activeScene.name);
}
}
```
---
## Benefits
### For Development
-**Test any scene directly** - no need to always start from Bootstrap
-**Consistent behavior** - same lifecycle whether starting from Bootstrap or scene
-**Zero configuration** - works automatically
-**Better debugging** - components initialize properly in editor
### For Components
Components can now reliably use OnSceneReady for initialization:
```csharp
public class FollowerController : ManagedBehaviour
{
protected override void OnSceneReady()
{
// This now works when playing directly from editor!
FindPlayerReference();
}
}
```
### For Builds
-**No runtime impact** - editor-only code
-**No performance cost** - completely stripped from builds
-**No behavior change** - production flow unchanged
---
## Expected Console Output
When pressing Play in "AppleHillsOverworld":
```
[CustomBoot] Boot initialized
[LifecycleManager] Instance created
[LifecycleManager] Registered PlayerController (Scene: AppleHillsOverworld)
[LifecycleManager] Registered FollowerController (Scene: AppleHillsOverworld)
[LifecycleManager] === Boot Completion Triggered ===
[LifecycleManager] Broadcasting ManagedAwake to 15 components
[EditorLifecycleBootstrap] Triggering OnSceneReady for initial scene: AppleHillsOverworld
[LifecycleManager] Broadcasting SceneReady for scene: AppleHillsOverworld
[FollowerController] Finding player reference (OnSceneReady)
```
The cyan-colored log clearly indicates when the editor bootstrap triggers.
---
## Testing Checklist
### ✅ Test Case 1: Direct Play from Gameplay Scene
1. Open any gameplay scene (e.g., AppleHillsOverworld)
2. Press Play
3. Check console for EditorLifecycleBootstrap log
4. Verify components receive both OnManagedAwake and OnSceneReady
### ✅ Test Case 2: Play from Bootstrap Scene
1. Open BootstrapScene
2. Press Play
3. Verify bootstrap log says "Skipping OnSceneReady for infrastructure scene"
4. Verify normal scene transition flow works
### ✅ Test Case 3: Scene Transitions During Play
1. Play from any scene
2. Use LevelSwitch to change scenes
3. Verify SceneManagerService handles transitions normally
4. Verify EditorLifecycleBootstrap only triggers once at startup
### ✅ Test Case 4: Build Verification
1. Make a build
2. Verify EditorLifecycleBootstrap is NOT included
3. Verify production bootstrap flow works normally
---
## Compatibility
### ✅ Compatible With
- Existing lifecycle system
- SceneManagerService scene transitions
- DontDestroyOnLoad objects
- Multi-scene editing (processes active scene)
- All existing ManagedBehaviour components
### ❌ Not Needed For
- Production builds (editor-only)
- Bootstrap scene (infrastructure only)
- Scenes loaded via SceneManagerService (already handled)
---
## Safety Features
### Timeout Protection
- Maximum wait time: 5 seconds (300 frames at 60fps)
- Prevents infinite loops if boot fails
- Logs error message with diagnostic info
### Error Handling
- Try-catch around BroadcastSceneReady
- Null checks for LifecycleManager
- Scene validation before broadcasting
### Smart Scene Detection
- Skips infrastructure scenes (Bootstrap, BootstrapScene)
- Only processes gameplay scenes
- Validates scene is loaded before broadcasting
---
## Performance
### Editor Impact
- **Minimal** - Only runs during play mode entry
- **Short-lived** - Unsubscribes after first trigger
- **Efficient** - Simple polling mechanism
### Runtime Impact
- **Zero** - Code is editor-only
- **Not included in builds** - Completely stripped
- **No overhead** - Production flow unchanged
---
## Troubleshooting
### Problem: OnSceneReady still not called
**Check:**
1. Is LifecycleManager being created? (Check console for "[LifecycleManager] Instance created")
2. Is CustomBoot completing? (Check for "Boot Completion Triggered")
3. Is the scene name correct? (Not a bootstrap scene)
4. Does the component inherit from ManagedBehaviour?
**Solution:**
Enable LifecycleManager debug logging to see detailed lifecycle events.
### Problem: EditorLifecycleBootstrap not running
**Check:**
1. Is the file in Assets/Editor folder? (Editor-only location)
2. Is the AppleHillsEditor assembly definition including AppleHillsScripts?
3. Are there any compilation errors?
**Solution:**
Check Unity console for errors. Verify assembly definition references.
### Problem: Timeout error after 300 frames
**Diagnostic:**
CustomBoot is failing to initialize properly.
**Solution:**
1. Check CustomBoot logs for errors
2. Verify CustomBootSettings are loaded
3. Check Addressables are properly configured
---
## Integration with Existing Systems
### CustomBoot
- ✅ Waits for CustomBoot.Initialised flag
- ✅ Respects boot completion timing
- ✅ No modifications to CustomBoot required
### LifecycleManager
- ✅ Uses existing BroadcastSceneReady method
- ✅ No modifications to LifecycleManager required
- ✅ Follows same pattern as SceneManagerService
### SceneManagerService
- ✅ Doesn't interfere with scene transitions
- ✅ Only triggers for initial scene on editor play
- ✅ Production scene flow unchanged
---
## Future Considerations
### Potential Enhancements
1. **Developer Settings Integration** - Toggle in settings menu
2. **Multi-Scene Support** - Handle multiple loaded scenes
3. **Custom Delay** - Option to delay trigger by frames
4. **Editor Window** - Visual lifecycle state inspector
### Known Limitations
1. Only processes single active scene (not multi-scene setups)
2. Assumes Bootstrap scene naming convention
3. No support for domain reload disabled mode (edge case)
---
## Summary
The EditorLifecycleBootstrap provides a seamless, zero-configuration quality of life improvement for developers. It ensures that playing scenes directly from the Unity Editor provides the same consistent lifecycle orchestration as the production scene flow.
**Bottom Line:** Press Play anywhere, lifecycle just works. ✅
---
## Related Documentation
- `docs/editor_lifecycle_bootstrap.md` - Full technical documentation
- `docs/lifecycle_technical_review.md` - Lifecycle system overview
- `docs/lifecycle_implementation_roadmap.md` - Implementation details
- `docs/levelswitch_onsceneready_fix.md` - Related timing issue fix