# Lifecycle Management System - Technical Review & Recommendations **Date:** November 3, 2025 **Reviewer:** System Architect **Project:** AppleHills (6-month timeline) **Status:** Awaiting Technical Review Approval --- ## Executive Summary This document analyzes the proposed ManagedBehaviour lifecycle management system and provides a pragmatic recommendation for a 6-month project timeline. After analyzing the current codebase (20+ components using InitializePostBoot, 6+ ISaveParticipant implementations, 10+ IPausable implementations), I recommend implementing a **Streamlined ManagedBehaviour** approach that solves 80% of the problems with 20% of the complexity. **Key Recommendation:** Implement core lifecycle management without the complex multi-phase system. Focus on boot lifecycle, auto-registration, and event cleanup. Estimated implementation: 2-3 days + 1-2 days migration. --- ## 1. Current System Analysis ### 1.1 Existing Lifecycle Patterns The codebase currently uses **four different initialization patterns**: #### Pattern A: Unity Standard (Awake → Start) ```csharp void Awake() { /* Basic setup */ } void Start() { /* Initialization */ } ``` #### Pattern B: Two-Phase Bootstrap (Awake → InitializePostBoot) ```csharp void Awake() { _instance = this; BootCompletionService.RegisterInitAction(InitializePostBoot, priority: 100); } private void InitializePostBoot() { // Setup after boot completes } ``` **Usage:** 20+ components across the codebase #### Pattern C: Manual Event Subscription ```csharp void Awake() { BootCompletionService.RegisterInitAction(InitializePostBoot); } private void InitializePostBoot() { SceneManagerService.Instance.SceneLoadCompleted += OnSceneLoaded; GameManager.Instance.OnGamePaused += OnPaused; } void OnDestroy() { // MUST remember to unsubscribe - memory leak risk! SceneManagerService.Instance.SceneLoadCompleted -= OnSceneLoaded; GameManager.Instance.OnGamePaused -= OnPaused; } ``` #### Pattern D: Manual Registration (ISaveParticipant, IPausable) ```csharp private void InitializePostBoot() { SaveLoadManager.Instance.RegisterParticipant(this); GameManager.Instance.RegisterPausableComponent(this); } void OnDestroy() { SaveLoadManager.Instance.UnregisterParticipant(GetSaveId()); GameManager.Instance.UnregisterPausableComponent(this); } ``` **Usage:** 6+ ISaveParticipant, 10+ IPausable implementations ### 1.2 Bootstrap Flow ``` CustomBoot.Initialise() [BeforeSplashScreen] ↓ Load CustomBootSettings (Addressables) ↓ Unity Awake() [All MonoBehaviours, unordered] ↓ Unity Start() ↓ CustomBoot completes ↓ BootCompletionService.HandleBootCompleted() ↓ Execute registered init actions (priority sorted: 0→1000) ↓ OnBootComplete event fires ``` --- ## 2. Problem Identification ### Critical Issues #### 🔴 P0: Confusing Two-Phase Lifecycle - Developers must remember to use `Awake()` + `InitializePostBoot()` pattern - Priority is defined at registration site (not in component), making dependencies unclear - Inconsistent naming: `InitializePostBoot()`, `Initialize()`, `Init()`, `PostBootInit()` - No clear guidance on what belongs in which phase #### 🔴 P0: Memory Leak Risk - Manual event subscription requires matching unsubscription in OnDestroy() - Easy to forget unsubscribe, especially during rapid development - No automated cleanup mechanism - Found 15+ manual subscription sites #### 🟡 P1: Registration Burden - ISaveParticipant components must manually call RegisterParticipant() and UnregisterParticipant() - IPausable components must manually call RegisterPausableComponent() and UnregisterPausableComponent() - Boilerplate code repeated across 16+ components #### 🟡 P1: Late Registration Handling - Components instantiated after boot must handle "already booted" case manually - BootCompletionService handles this, but scene-specific services don't - Inconsistent behavior across different managers #### 🟢 P2: Priority System Fragmentation - Boot priority defined at call site: `RegisterInitAction(method, priority: 50)` - No centralized view of initialization order - Hard to debug dependency issues ### Non-Issues (Working Well) ✅ **Singleton Pattern:** Consistent `_instance` field + `Instance` property ✅ **BootCompletionService:** Solid priority-based initialization ✅ **Scene Management:** Event-based lifecycle works well ✅ **Save/Load System:** ISaveParticipant interface is clean ✅ **Pause System:** Counter-based pause with IPausable interface --- ## 3. Solution Options ### Option A: Minimal Enhancement (Conservative) **Description:** Keep MonoBehaviour base, add helper utilities **Changes:** - Create `BootHelper` utility class for common patterns - Add `ManagedEventSubscription` wrapper for auto-cleanup - Extension methods for auto-registration **Pros:** - Minimal code changes (< 1 day implementation) - Zero breaking changes - Very safe **Cons:** - Doesn't solve core lifecycle confusion - Still requires manual patterns - Least impactful solution **Effort:** 1 day implementation, 0 days migration **Recommendation:** ❌ Not recommended - doesn't solve main problems --- ### Option B+: Streamlined ManagedBehaviour with Scene Orchestration (RECOMMENDED) **Description:** Focused base class solving critical pain points + orchestrated scene transitions **Core Features:** 1. **Deterministic Boot Lifecycle** - `OnManagedAwake()` - Called after Unity Awake, priority-ordered - `OnBootComplete()` - Called after boot completes, priority-ordered - Properties: `ManagedAwakePriority`, `BootCompletePriority` 2. **Orchestrated Scene Lifecycle** - `OnSceneUnloading()` - Called before scene unloads, reverse priority-ordered - `OnSceneReady()` - Called after scene loads, priority-ordered - Properties: `SceneUnloadingPriority`, `SceneReadyPriority` - SceneManagerService.SwitchSceneAsync() orchestrates full flow 3. **Auto-Registration** - Auto-register ISaveParticipant (opt-in via `AutoRegisterSaveParticipant` property) - Auto-register IPausable (opt-in via `AutoRegisterPausable` property) - Auto-unregister on destroy 4. **Managed Event Subscriptions** - `RegisterManagedEvent(target, handler)` - Auto-cleanup on destroy - Prevents memory leaks - Simple, fail-safe pattern 5. **LifecycleManager** - Central orchestrator (singleton in BootstrapScene) - Maintains priority-sorted lists - Broadcasts lifecycle events - Integrates with BootCompletionService (temporarily) - Tracks which scene each component belongs to 6. **Enhanced SceneManagerService** - SwitchSceneAsync() includes full orchestration - No separate orchestrator class needed - Integrates with LifecycleManager for scene lifecycle callbacks **NOT Included** (keeping it simple): - ❌ OnManagedUpdate / OnManagedFixedUpdate - Performance overhead, rarely needed - ❌ OnPaused / OnResumed - Implement IPausable interface directly instead - ❌ Separate SceneTransitionOrchestrator - Logic integrated into SceneManagerService **Example Usage:** ```csharp public class GameManager : ManagedBehaviour { protected override int ManagedAwakePriority => 10; // Very early protected override int BootCompletePriority => 10; protected override void OnManagedAwake() { // Deterministic initialization, runs at priority 10 SetupSingleton(); } protected override void OnBootComplete() { // Replaces InitializePostBoot() InitializeSettings(); } } public class PuzzleManager : ManagedBehaviour, ISaveParticipant { protected override bool AutoRegisterSaveParticipant => true; // Auto-registers! protected override int SceneReadyPriority => 100; protected override int SceneUnloadingPriority => 100; protected override LifecycleFlags ActiveLifecyclePhases => LifecycleFlags.BootComplete | LifecycleFlags.SceneReady | LifecycleFlags.SceneUnloading; protected override void OnBootComplete() { // SaveLoadManager registration happens automatically } protected override void OnSceneReady() { // Scene fully loaded, discover puzzles in scene DiscoverPuzzlesInScene(); } protected override void OnSceneUnloading() { // Save transient state before scene unloads CleanupPuzzles(); } } ``` **Pros:** - ✅ Solves main pain points (lifecycle confusion, memory leaks, registration burden) - ✅ Orchestrated scene transitions with proper save/cleanup/restore flow - ✅ Clear migration path (change base class, rename methods) - ✅ Minimal performance overhead - ✅ Can be extended incrementally - ✅ Clean, intuitive API - ✅ ~5-7 days total implementation + migration **Cons:** - Requires base class change (20+ files) - Scene lifecycle adds some complexity (but solves critical orchestration need) - BootCompletionService remains temporarily (deprecated over time) **Effort:** 3-4 days implementation, 2-3 days migration, 1 day BootCompletionService removal **Recommendation:** ✅ **RECOMMENDED** - Best balance for 6-month project with proper scene orchestration --- ### Option C: Full ManagedBehaviour (As Proposed) **Description:** Complete 9-phase lifecycle system as documented **All Features from Option B, PLUS:** - OnSceneReady / OnSceneUnloading with automatic scene tracking - OnManagedUpdate / OnManagedFixedUpdate with priority ordering - OnPaused / OnResumed lifecycle hooks - Per-phase priority properties (9 different priority settings) - LifecycleFlags enum for opt-in per phase - IsPersistent flag for scene persistence tracking - Complex multi-list management in LifecycleManager **Pros:** - Most comprehensive solution - Future-proof and extensible - Complete control over execution order **Cons:** - ❌ High implementation complexity (5-7 days) - ❌ Significant migration effort (3-5 days for 20+ files) - ❌ Performance overhead (broadcasts every frame for OnManagedUpdate) - ❌ Over-engineered for 6-month timeline - ❌ Higher maintenance burden - ❌ More opportunities for bugs in complex orchestration **Effort:** 5-7 days implementation, 3-5 days migration, ongoing maintenance **Recommendation:** ⚠️ Too complex for current project scope --- ## 4. Detailed Recommendation: Streamlined ManagedBehaviour with Orchestrated Scene Transitions (Option B+) ### 4.1 Architecture ``` ┌─────────────────────────────────────────────────────────┐ │ CustomBoot (Unchanged) │ │ - Loads settings via Addressables │ │ - Triggers BootCompletionService │ └─────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────┐ │ BootCompletionService (Thin Adapter - TO BE DEPRECATED)│ │ - Executes legacy RegisterInitAction callbacks │ │ - Fires OnBootComplete event │ │ - Triggers LifecycleManager.OnBootCompletionTriggered()│ │ - GOAL: Remove once all code migrated │ └─────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────┐ │ LifecycleManager (Core Orchestrator) │ │ - Maintains sorted lists for each phase │ │ - BroadcastManagedAwake() │ │ - BroadcastBootComplete() │ │ - BroadcastSceneUnloading(sceneName) │ │ - BroadcastSceneReady(sceneName) │ │ - Tracks which scene each component belongs to │ └─────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────┐ │ SceneManagerService (Enhanced - Scene Orchestration) │ │ - SwitchSceneAsync() orchestrates full transition: │ │ 1. Show loading screen │ │ 2. LifecycleManager.BroadcastSceneUnloading() │ │ 3. SaveLoadManager.Save() │ │ 4. UnloadSceneAsync() │ │ 5. LoadSceneAsync() │ │ 6. LifecycleManager.BroadcastSceneReady() │ │ 7. Hide loading screen │ └─────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────┐ │ ManagedBehaviour (Base Class) │ │ - Auto-registers with LifecycleManager in Awake() │ │ - OnManagedAwake() / OnBootComplete() │ │ - OnSceneUnloading() / OnSceneReady() │ │ - Priority properties for all lifecycle hooks │ │ - Auto-registration for ISaveParticipant/IPausable │ │ - Managed event subscriptions with auto-cleanup │ └─────────────────────────────────────────────────────────┘ ↓ uses ┌─────────────────────────────────────────────────────────┐ │ ManagedEventSubscription (Helper) │ │ - Stores event subscriptions │ │ - Auto-unsubscribes on destroy │ └─────────────────────────────────────────────────────────┘ ``` ### 4.2 Migration End Goal **Target State:** Remove all legacy lifecycle services - ❌ BootCompletionService - Completely removed - ❌ Manual RegisterInitAction calls - Eliminated - ❌ InitializePostBoot methods - Converted to OnBootComplete - ✅ LifecycleManager - Single source of truth for all lifecycle - ✅ ManagedBehaviour - Standard base class for all components - ✅ SceneManagerService - Orchestrates scene transitions with lifecycle integration ### 4.2 Lifecycle Flow ``` Unity Awake() (All MonoBehaviours) ↓ ManagedBehaviour.Awake() └→ Registers with LifecycleManager ↓ Unity Start() ↓ CustomBoot completes ↓ BootCompletionService.HandleBootCompleted() ↓ LifecycleManager.BroadcastManagedAwake() └→ Calls OnManagedAwake() in priority order (0→∞) ↓ LifecycleManager.BroadcastBootComplete() └→ Calls OnBootComplete() in priority order (0→∞) └→ Auto-registers ISaveParticipant/IPausable if configured ↓ [Game Loop] ↓ ManagedBehaviour.OnDestroy() └→ Auto-unregisters from LifecycleManager └→ Auto-unsubscribes all managed events └→ Auto-unregisters from SaveLoadManager/GameManager ``` ### 4.3 Implementation Plan #### Phase 1: Core Infrastructure (Day 1) 1. **Create LifecycleEnums.cs** - `LifecyclePhase` enum (ManagedAwake, BootComplete) 2. **Create ManagedEventSubscription.cs** - Internal struct to store subscription info - ManagedEventManager for auto-cleanup 3. **Create ManagedBehaviour.cs** - Base class extending MonoBehaviour - Virtual properties: `ManagedAwakePriority`, `BootCompletePriority`, `AutoRegisterSaveParticipant`, `AutoRegisterPausable` - Virtual methods: `OnManagedAwake()`, `OnBootComplete()` - Auto-registration in Awake() - Auto-cleanup in OnDestroy() - `RegisterManagedEvent()` helper 4. **Create LifecycleManager.cs** - Singleton in BootstrapScene - Sorted lists for each phase - Register/Unregister methods - BroadcastManagedAwake/BootComplete methods - Integration with BootCompletionService #### Phase 2: Integration (Day 2) 5. **Modify BootCompletionService.cs** - After existing init actions, call LifecycleManager broadcasts 6. **Extend SaveLoadManager.cs** - Add `AutoRegisterParticipant(ISaveParticipant, ManagedBehaviour)` method - Add `AutoUnregisterParticipant(ManagedBehaviour)` method - Track auto-registrations 7. **Extend GameManager.cs** - Add `AutoRegisterPausable(IPausable, ManagedBehaviour)` method - Add `AutoUnregisterPausable(ManagedBehaviour)` method - Track auto-registrations #### Phase 3: Testing & Documentation (Day 3) 8. **Create Example Implementations** - ExampleManagedSingleton.cs - ExampleManagedComponent.cs - ExampleManagedSaveParticipant.cs 9. **Write Migration Guide** - Step-by-step conversion process - Common patterns and gotchas 10. **Create Validation Tools** (Optional) - Editor script to find components needing migration - Automated conversion helper #### Phase 4: Migration (Days 4-5) 11. **Migrate Core Systems** (Priority Order) - GameManager (priority 10) - SceneManagerService (priority 15) - SaveLoadManager (priority 20) - AudioManager (priority 25) 12. **Migrate UI Systems** (Priority 50-100) - UIPageController - LoadingScreenController - PauseMenu - CardSystemUI components 13. **Migrate Gameplay Systems** (Priority 100-200) - PuzzleManager - CardSystemManager - FollowerController - PlayerTouchController - DialogueComponent ### 4.4 Migration Process (Per Component) **Step 1:** Change base class ```csharp // Before public class GameManager : MonoBehaviour // After public class GameManager : ManagedBehaviour ``` **Step 2:** Set priorities ```csharp protected override int ManagedAwakePriority => 10; protected override int BootCompletePriority => 10; ``` **Step 3:** Move initialization ```csharp // Before void Awake() { _instance = this; BootCompletionService.RegisterInitAction(InitializePostBoot); } private void InitializePostBoot() { /* ... */ } // After protected override void OnManagedAwake() { _instance = this; } protected override void OnBootComplete() { // Former InitializePostBoot() code } ``` **Step 4:** Enable auto-registration (if applicable) ```csharp // For ISaveParticipant protected override bool AutoRegisterSaveParticipant => true; // For IPausable protected override bool AutoRegisterPausable => true; // Remove manual registration code from InitializePostBoot/OnDestroy ``` **Step 5:** Convert event subscriptions ```csharp // Before private void InitializePostBoot() { SceneManagerService.Instance.SceneLoadCompleted += OnSceneLoaded; } void OnDestroy() { SceneManagerService.Instance.SceneLoadCompleted -= OnSceneLoaded; } // After protected override void OnBootComplete() { RegisterManagedEvent(SceneManagerService.Instance, nameof(SceneManagerService.SceneLoadCompleted), OnSceneLoaded); } // OnDestroy cleanup automatic! ``` **Step 6:** Test thoroughly - Verify initialization order - Check event subscriptions work - Confirm save/load integration - Test pause functionality --- ## 5. Risk Assessment ### Technical Risks | Risk | Likelihood | Impact | Mitigation | |------|-----------|--------|------------| | Base class change breaks existing components | Medium | High | Incremental migration, thorough testing | | Performance overhead from lifecycle broadcasts | Low | Medium | Profile in real scenarios, optimize if needed | | Managed event system fails to unsubscribe | Low | High | Extensive unit tests, code review | | LifecycleManager initialization order issues | Medium | High | Careful integration with BootCompletionService | | Developers revert to old patterns | Medium | Low | Clear documentation, code review enforcement | ### Schedule Risks | Risk | Likelihood | Impact | Mitigation | |------|-----------|--------|------------| | Implementation takes longer than estimated | Low | Medium | 3-day buffer built into 6-month timeline | | Migration uncovers edge cases | Medium | Medium | Migrate critical systems first, iterate | | Team resistance to new pattern | Low | Medium | Provide clear examples, migration support | ### Mitigation Strategy 1. **Implement core infrastructure first** - Validate approach before migration 2. **Migrate critical systems first** - GameManager, SaveLoadManager 3. **Incremental rollout** - Don't migrate everything at once 4. **Comprehensive testing** - Unit tests + integration tests 5. **Documentation-first** - Write migration guide before starting 6. **Code reviews** - Ensure proper usage patterns --- ## 6. Success Criteria ### Quantitative Metrics - ✅ All 20+ components using InitializePostBoot migrated - ✅ Zero memory leaks from event subscriptions (verified via profiler) - ✅ < 5% performance overhead in worst-case scenarios - ✅ 100% of ISaveParticipant/IPausable use auto-registration ### Qualitative Goals - ✅ Clear, consistent lifecycle pattern across codebase - ✅ Reduced boilerplate (no manual registration code) - ✅ Easier onboarding for new developers - ✅ Better debuggability (centralized lifecycle view) --- ## 7. Timeline Estimate ### Option B+: Streamlined ManagedBehaviour with Scene Orchestration (Recommended) - **Phase 1 - Core Infrastructure:** 2 days - Day 1: LifecycleEnums, ManagedEventSubscription, ManagedBehaviour structure - Day 2: LifecycleManager implementation, prefab setup - **Phase 2 - Integration:** 1 day - BootCompletionService integration, SaveLoadManager/GameManager extensions, SceneManagerService prep - **Phase 3 - Scene Orchestration:** 2 days - Day 4: SceneManagerService.SwitchSceneAsync() orchestration, examples - Day 5: Migration guide, testing & validation - **Phase 4 - Migration & Cleanup:** 3 days - Day 6: Core systems migration (GameManager, SceneManagerService, SaveLoadManager) - Day 7: UI & gameplay systems migration (12+ files) - Day 8: Final testing, BootCompletionService removal, documentation - **Total:** 8 days (~1.5 weeks) - **% of 6-month project:** 1.6% ### Full ManagedBehaviour (Not Recommended) - **Implementation:** 5-7 days - **Migration:** 3-5 days - **Testing & Documentation:** 2 days - **Ongoing Maintenance:** Higher - **Total:** 10-14 days (~2-3 weeks) - **% of 6-month project:** 3.5% --- ## 8. Alternative Approaches Considered ### 8.1 Unity ECS/DOTS **Rejected Reason:** Too radical a change, incompatible with existing MonoBehaviour architecture ### 8.2 Dependency Injection Framework (Zenject/VContainer) **Rejected Reason:** Solves different problems, adds external dependency, steeper learning curve ### 8.3 Event Bus System **Rejected Reason:** Doesn't address lifecycle ordering, adds complexity without solving core issues ### 8.4 Unity's Initialization System (InitializeOnLoad) **Rejected Reason:** Editor-only, doesn't solve runtime lifecycle ordering --- ## 9. Incremental Extension Path If future needs arise, the Streamlined ManagedBehaviour can be extended: **Phase 2 Additions** (if needed later): - Add `OnSceneReady()` / `OnSceneUnloading()` hooks - Automatic scene tracking based on GameObject.scene - Priority-based scene lifecycle **Phase 3 Additions** (if needed later): - Add `OnManagedUpdate()` / `OnManagedFixedUpdate()` - Opt-in via LifecycleFlags - Performance profiling required **Phase 4 Additions** (if needed later): - Add `OnPaused()` / `OnResumed()` hooks - Integrate with GameManager pause system - Alternative to IPausable interface **Key Principle:** Start simple, extend only when proven necessary --- ## 10. Recommendation Summary ### Primary Recommendation: ✅ APPROVE Option B+ (Streamlined ManagedBehaviour with Scene Orchestration) **Rationale:** 1. **Solves critical problems** - Lifecycle confusion, memory leaks, registration burden, scene orchestration 2. **Appropriate scope** - 8 days for complete implementation, migration, and cleanup 3. **Low risk** - Incremental migration, clear patterns, well-tested approach 4. **Extensible** - Can add features later if needed 5. **Team-friendly** - Clear API, good examples, comprehensive migration guide 6. **End Goal Achievable** - Complete removal of BootCompletionService and legacy patterns **Deliverables:** - LifecycleManager (singleton in BootstrapScene) - ManagedBehaviour base class with 4 lifecycle hooks - ManagedEventSubscription system for auto-cleanup - Enhanced SceneManagerService with orchestrated transitions - Extended SaveLoadManager/GameManager with auto-registration - Migration guide and examples - 20+ components migrated - BootCompletionService completely removed **Deprecation Strategy:** 1. **Phase 1-2:** BootCompletionService triggers LifecycleManager (adapter pattern) 2. **Phase 3:** Scene orchestration integrated into SceneManagerService 3. **Phase 4:** All components migrated, BootCompletionService removed 4. **End State:** LifecycleManager as single source of truth **Next Steps if Approved:** 1. Create feature branch `feature/managed-behaviour` 2. Implement core infrastructure (Days 1-2) 3. Integration with existing systems (Day 3) 4. Scene orchestration (Days 4-5) 5. Migration (Days 6-7) 6. Cleanup and BootCompletionService removal (Day 8) 7. Code review and testing 8. Merge to main --- ## 11. Questions for Technical Review 1. **Do you agree with the recommended scope?** (Streamlined vs Full) 2. **Should we migrate all 20+ components immediately or incrementally?** 3. **Any specific components that should NOT be migrated?** 4. **Should we create automated migration tools or manual migration?** 5. **Any additional lifecycle hooks needed for specific game systems?** 6. **Performance profiling required before or after implementation?** --- ## 12. References - Original Proposal: `managed_bejavior.md` - Bootstrap Documentation: `bootstrap_readme.md` - Current BootCompletionService: `Assets/Scripts/Bootstrap/BootCompletionService.cs` - Current GameManager: `Assets/Scripts/Core/GameManager.cs` - Current SaveLoadManager: `Assets/Scripts/Core/SaveLoad/SaveLoadManager.cs` - Current SceneManagerService: `Assets/Scripts/Core/SceneManagerService.cs` --- ## Appendix A: Code Impact Analysis ### Files Using InitializePostBoot Pattern (20 files) ``` UI/Core/UIPageController.cs UI/LoadingScreenController.cs UI/CardSystem/CardAlbumUI.cs UI/CardSystem/CardSystemSceneVisibility.cs UI/PauseMenu.cs Dialogue/DialogueComponent.cs Sound/AudioManager.cs Movement/FollowerController.cs PuzzleS/PuzzleManager.cs Levels/MinigameSwitch.cs Core/GameManager.cs Core/SceneManagerService.cs Core/SaveLoad/SaveLoadManager.cs + others ``` ### Files Implementing ISaveParticipant (6 files) ``` PuzzleS/PuzzleManager.cs Movement/FollowerController.cs Input/PlayerTouchController.cs Interactions/SaveableInteractable.cs Data/CardSystem/CardSystemManager.cs Core/SaveLoad/AppleMachine.cs ``` ### Files Implementing IPausable (10+ files) ``` Sound/AudioManager.cs Minigames/DivingForPictures/Player/PlayerController.cs Minigames/DivingForPictures/DivingGameManager.cs Minigames/DivingForPictures/Utilities/RockPauser.cs Minigames/DivingForPictures/Tiles/TrenchTileSpawner.cs + others ``` **Total Estimated Migration:** ~25-30 files affected --- ## Appendix B: Performance Considerations ### Overhead Analysis (Streamlined ManagedBehaviour) **Per-Component Cost:** - Registration: One-time O(log n) insertion into sorted list (~microseconds) - ManagedAwake broadcast: Once per component at boot (~milliseconds total) - BootComplete broadcast: Once per component at boot (~milliseconds total) - Event subscription tracking: Minimal memory overhead per subscription - Unregistration: One-time O(n) removal (~microseconds) **Total Overhead:** < 1% frame time at boot, zero overhead during game loop **Full ManagedBehaviour Would Add:** - OnManagedUpdate broadcast: Every frame, O(n) iteration - OnManagedFixedUpdate broadcast: Every physics frame, O(n) iteration - This is why we exclude it from the recommended approach --- ## Approval **Awaiting Technical Review Team Decision** Please review and approve/reject/request modifications for this proposal. **Prepared by:** System Architect **Review Requested:** November 3, 2025 **Decision Deadline:** [TBD]