Files
AppleHillsProduction/docs/migration_target_list.md

733 lines
24 KiB
Markdown
Raw Normal View History

# ManagedBehaviour Migration Target List
**Generated:** November 3, 2025
**Purpose:** Comprehensive list of MonoBehaviours using legacy patterns that need migration to ManagedBehaviour
---
## Executive Summary
**Total Components Identified:** 23 unique MonoBehaviours
**Migration Priority Groups:** 3 groups (Core Services, UI Systems, Gameplay Systems)
---
## Category 1: Core Services (HIGHEST PRIORITY)
These are the foundational systems we modified in Phases 1-2. They need migration first.
### 1.1 GameManager.cs
**Location:** `Assets/Scripts/Core/GameManager.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService
**Usage:**
- ✅ Uses `RegisterInitAction(InitializePostBoot)` in Awake
- ✅ Has empty `InitializePostBoot()` method (no actual post-boot logic)
- ✅ Implements singleton pattern
- ⚠️ Other components register IPausable with this manager
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `10` (core infrastructure)
- Move Awake logic to `OnManagedAwake()`
- Remove `RegisterInitAction` call
- Delete empty `InitializePostBoot()` method
- No scene lifecycle hooks needed (persistent singleton)
**Dependencies:** None (can migrate immediately)
---
### 1.2 SceneManagerService.cs
**Location:** `Assets/Scripts/Core/SceneManagerService.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService
**Usage:**
- ✅ Uses `RegisterInitAction(InitializePostBoot)` in Awake
- ✅ Has `InitializePostBoot()` method that sets up loading screen events
- ✅ Implements singleton pattern
- ✅ Exposes scene lifecycle events (SceneLoadStarted, SceneLoadCompleted, etc.)
- ⚠️ Multiple components subscribe to its events
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `15` (core infrastructure, after GameManager)
- Combine Awake + InitializeCurrentSceneTracking + InitializePostBoot → `OnManagedAwake()`
- Remove `RegisterInitAction` call
- Delete `InitializePostBoot()` method
- No scene lifecycle hooks needed (persistent singleton)
**Dependencies:**
- LoadingScreenController (needs to be available in OnManagedAwake)
---
### 1.3 SaveLoadManager.cs
**Location:** `Assets/Scripts/Core/SaveLoad/SaveLoadManager.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService and SceneManagerService events
**Usage:**
- ✅ Uses `RegisterInitAction(InitializePostBoot)` in Awake
- ✅ Subscribes to `SceneManagerService.SceneLoadCompleted` in InitializePostBoot
- ✅ Implements singleton pattern
- ✅ Implements ISaveParticipant itself
- ⚠️ Components register ISaveParticipant with this manager
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `20` (core infrastructure, after SceneManagerService)
- Move Awake + InitializePostBoot logic → `OnManagedAwake()`
- Remove `RegisterInitAction` call
- **REPLACE** SceneLoadCompleted subscription with `OnSceneReady()` hook
- Delete `InitializePostBoot()` method
- Use `OnSceneReady()` for scene-specific restore logic
**Dependencies:**
- SceneManagerService (for scene events)
- DeveloperSettingsProvider (already available)
**Event Migration:**
- `SceneLoadCompleted` subscription → `OnSceneReady()` lifecycle hook
---
### 1.4 ItemManager.cs
**Location:** `Assets/Scripts/Core/ItemManager.cs`
**Current Pattern:** MonoBehaviour with SceneManagerService events
**Usage:**
- ✅ Subscribes to `SceneManagerService.SceneLoadStarted` in Awake
- ✅ Has `OnSceneLoadStarted()` callback
- ❌ No BootCompletionService usage
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `50` (gameplay support system)
- Keep Awake singleton logic
- **REPLACE** SceneLoadStarted subscription with `OnSceneUnloading()` hook (use for cleanup before scene unloads)
- No InitializePostBoot
**Event Migration:**
- `SceneLoadStarted``OnSceneUnloading()` (cleanup before new scene loads)
---
### 1.5 QuickAccess.cs
**Location:** `Assets/Scripts/Core/QuickAccess.cs`
**Current Pattern:** MonoBehaviour with SceneManagerService events
**Usage:**
- ✅ Subscribes to `SceneManagerService.SceneLoadCompleted` conditionally
- ✅ Has `OnSceneLoadCompleted()` callback
- ❌ No BootCompletionService usage
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `60` (developer tool)
- **REPLACE** SceneLoadCompleted subscription with `OnSceneReady()` hook
- Keep conditional subscription logic
**Event Migration:**
- `SceneLoadCompleted``OnSceneReady()`
---
### 1.6 SceneOrientationEnforcer.cs
**Location:** `Assets/Scripts/Core/SceneOrientationEnforcer.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService
**Usage:**
- ✅ Uses `RegisterInitAction(InitializePostBoot)` in Awake
- ✅ Has `InitializePostBoot()` method
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `70` (platform-specific utility)
- Move Awake + InitializePostBoot → `OnManagedAwake()`
- Remove `RegisterInitAction` call
---
## Category 2: UI Systems (MEDIUM PRIORITY)
UI components that manage menus, navigation, and visual feedback.
### 2.1 UIPageController.cs
**Location:** `Assets/Scripts/UI/Core/UIPageController.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService
**Usage:**
- ✅ Uses `RegisterInitAction(InitializePostBoot)` in Awake
- ✅ Has `InitializePostBoot()` method
- ✅ Implements singleton pattern
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `50` (UI infrastructure)
- Move Awake + InitializePostBoot → `OnManagedAwake()`
- Remove `RegisterInitAction` call
- Consider using `RegisterManagedEvent()` for UI events
---
### 2.2 LoadingScreenController.cs
**Location:** `Assets/Scripts/UI/LoadingScreenController.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService
**Usage:**
- ✅ Uses `RegisterInitAction(InitializePostBoot)` in Awake
- ✅ Has `InitializePostBoot()` method
- ✅ Implements singleton pattern
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `45` (UI infrastructure, before UIPageController - needed by SceneManagerService)
- Move Awake + InitializePostBoot → `OnManagedAwake()`
- Remove `RegisterInitAction` call
---
### 2.3 PauseMenu.cs
**Location:** `Assets/Scripts/UI/PauseMenu.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService and SceneManagerService events
**Usage:**
- ✅ Uses `RegisterInitAction(InitializePostBoot)` in Awake
- ✅ Has `InitializePostBoot()` method
- ✅ Subscribes to `SceneManagerService.SceneLoadCompleted` in InitializePostBoot
- ✅ Has `SetPauseMenuByLevel()` callback
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `60` (UI component)
- Move Awake + InitializePostBoot → `OnManagedAwake()`
- **REPLACE** SceneLoadCompleted subscription with `OnSceneReady()` hook
- Use `RegisterManagedEvent()` for any remaining event subscriptions
**Event Migration:**
- `SceneLoadCompleted``OnSceneReady()`
---
### 2.4 CardAlbumUI.cs
**Location:** `Assets/Scripts/UI/CardSystem/CardAlbumUI.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService
**Usage:**
- ✅ Uses `RegisterInitAction(InitializePostBoot)` in Awake
- ✅ Has `InitializePostBoot()` method
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `80` (UI feature)
- Move Awake + InitializePostBoot → `OnManagedAwake()`
- Remove `RegisterInitAction` call
---
### 2.5 CardSystemSceneVisibility.cs
**Location:** `Assets/Scripts/UI/CardSystem/CardSystemSceneVisibility.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService and SceneManagerService events
**Usage:**
- ✅ Uses `RegisterInitAction(InitializePostBoot, priority: 95)` in Awake
- ✅ Has `InitializePostBoot()` method
- ✅ Subscribes to `SceneManagerService.SceneLoadCompleted` in InitializePostBoot
- ✅ Has `OnSceneLoaded()` callback
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `95` (UI feature, matches current priority)
- Move Awake + InitializePostBoot → `OnManagedAwake()`
- **REPLACE** SceneLoadCompleted subscription with `OnSceneReady()` hook
- Use `RegisterManagedEvent()` for CardSystemManager events
**Event Migration:**
- `SceneLoadCompleted``OnSceneReady()`
---
### 2.6 DivingTutorial.cs
**Location:** `Assets/Scripts/UI/Tutorial/DivingTutorial.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService
**Usage:**
- ✅ Uses `RegisterInitAction(InitializeTutorial)` in Awake
- ✅ Has `InitializeTutorial()` method
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `100` (tutorial system)
- Move Awake + InitializeTutorial → `OnManagedAwake()`
- Remove `RegisterInitAction` call
---
## Category 3: Gameplay Systems (MEDIUM-LOW PRIORITY)
Core gameplay mechanics and managers.
### 3.1 AudioManager.cs
**Location:** `Assets/Scripts/Sound/AudioManager.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService and IPausable
**Usage:**
- ✅ Uses `RegisterInitAction(InitializePostBoot)` in Awake
- ✅ Has `InitializePostBoot()` method
- ✅ Implements IPausable interface
- ✅ Manually calls `GameManager.Instance.RegisterPausableComponent(this)` in InitializePostBoot
- ✅ Implements singleton pattern
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `30` (audio infrastructure)
- Set `AutoRegisterPausable = true` (enables auto-registration)
- Move Awake + InitializePostBoot → `OnManagedAwake()`
- **REMOVE** manual `RegisterPausableComponent()` call (auto-handled)
- Remove `RegisterInitAction` call
**Auto-Registration:**
- ✅ Implements IPausable → will auto-register with GameManager
---
### 3.2 InputManager.cs
**Location:** `Assets/Scripts/Input/InputManager.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService and SceneManagerService events
**Usage:**
- ✅ Uses `RegisterInitAction(InitializePostBoot)` in Awake
- ✅ Has `InitializePostBoot()` method
- ✅ Subscribes to `SceneManagerService.SceneLoadCompleted` in InitializePostBoot
- ✅ Has `SwitchInputOnSceneLoaded()` callback
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `25` (input infrastructure)
- Move Awake + InitializePostBoot → `OnManagedAwake()`
- **REPLACE** SceneLoadCompleted subscription with `OnSceneReady()` hook
- Remove `RegisterInitAction` call
**Event Migration:**
- `SceneLoadCompleted``OnSceneReady()`
---
### 3.3 PlayerTouchController.cs
**Location:** `Assets/Scripts/Input/PlayerTouchController.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService and ISaveParticipant
**Usage:**
- ✅ Uses `RegisterInitAction(InitializePostBoot)` in Awake
- ✅ Has `InitializePostBoot()` method
- ✅ Implements ISaveParticipant interface
- ✅ Manually calls `SaveLoadManager.Instance.RegisterParticipant(this)` in InitializePostBoot
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `100` (player control)
- Move Awake + InitializePostBoot → `OnManagedAwake()`
- **KEEP** manual ISaveParticipant registration (global save data)
- Remove `RegisterInitAction` call
- Consider adding `OnSaveRequested()` / `OnRestoreRequested()` if level-specific data exists
**Note:**
- ISaveParticipant is for **global** persistent data (player state across all levels)
- If component has **level-specific** data, use OnSaveRequested/OnRestoreRequested hooks instead
---
### 3.4 FollowerController.cs
**Location:** `Assets/Scripts/Movement/FollowerController.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService and ISaveParticipant
**Usage:**
- ✅ Uses `RegisterInitAction(InitializePostBoot)` in Awake
- ✅ Implements ISaveParticipant interface
- ✅ Manually calls `SaveLoadManager.Instance.RegisterParticipant(this)` in InitializePostBoot
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `110` (NPC behavior)
- Move Awake + InitializePostBoot → `OnManagedAwake()`
- **KEEP** manual ISaveParticipant registration (global save data - follower state)
- Remove `RegisterInitAction` call
- Consider `OnSceneReady()` if follower needs scene-specific setup
---
### 3.5 PuzzleManager.cs
**Location:** `Assets/Scripts/PuzzleS/PuzzleManager.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService, SceneManagerService events, and ISaveParticipant
**Usage:**
- ✅ Uses `RegisterInitAction(InitializePostBoot)` in Awake
- ✅ Has `InitializePostBoot()` method
- ✅ Subscribes to `SceneManagerService.SceneLoadCompleted` in InitializePostBoot
- ✅ Subscribes to `SceneManagerService.SceneLoadStarted` in InitializePostBoot
- ✅ Has `OnSceneLoadCompleted()` and `OnSceneLoadStarted()` callbacks
- ✅ Uses anonymous `RegisterInitAction()` to register ISaveParticipant
- ✅ Implements ISaveParticipant interface
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `120` (level manager - scene-specific)
- Move Awake + InitializePostBoot → `OnManagedAwake()`
- **REPLACE** SceneLoadCompleted with `OnSceneReady()` hook
- **REPLACE** SceneLoadStarted with `OnSceneUnloading()` hook (for cleanup)
- **CONSIDER:** Does puzzle state need to be global (ISaveParticipant) or level-specific (OnSaveRequested/OnRestoreRequested)?
- If puzzle progress persists across game sessions globally → Keep ISaveParticipant
- If puzzle progress resets per-level → Use OnSaveRequested/OnRestoreRequested
- Remove both `RegisterInitAction` calls
**Event Migration:**
- `SceneLoadStarted``OnSceneUnloading()` (cleanup before leaving level)
- `SceneLoadCompleted``OnSceneReady()` (setup when entering level)
---
### 3.6 CardSystemManager.cs
**Location:** `Assets/Scripts/Data/CardSystem/CardSystemManager.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService and ISaveParticipant
**Usage:**
- ✅ Uses `RegisterInitAction(InitializePostBoot)` in Awake
- ✅ Has `InitializePostBoot()` method
- ✅ Implements ISaveParticipant interface
- ✅ Uses anonymous RegisterInitAction to register ISaveParticipant
- ✅ Implements singleton pattern
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `40` (game data manager - persistent across scenes)
- Move Awake + InitializePostBoot → `OnManagedAwake()`
- **KEEP** manual ISaveParticipant registration (global save data - card collection)
- Remove both `RegisterInitAction` calls
- No scene lifecycle hooks needed (persistent singleton)
---
### 3.7 DialogueComponent.cs
**Location:** `Assets/Scripts/Dialogue/DialogueComponent.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService
**Usage:**
- ✅ Uses `RegisterInitAction(InitializePostBoot)` in Awake
- ✅ Has `InitializePostBoot()` method
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `150` (dialogue system - scene-specific)
- Move Awake + InitializePostBoot → `OnManagedAwake()`
- Remove `RegisterInitAction` call
- Consider `OnSceneReady()` if dialogue needs scene-specific initialization
---
### 3.8 MinigameSwitch.cs
**Location:** `Assets/Scripts/Levels/MinigameSwitch.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService
**Usage:**
- ✅ Uses `RegisterInitAction(InitializePostBoot)` in Awake
- ✅ Has `InitializePostBoot()` method
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `140` (level transition - scene-specific)
- Move Awake + InitializePostBoot → `OnManagedAwake()`
- Remove `RegisterInitAction` call
- Consider `OnSceneReady()` for scene-specific setup
---
### 3.9 DivingGameManager.cs
**Location:** `Assets/Scripts/Minigames/DivingForPictures/DivingGameManager.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService and IPausable
**Usage:**
- ✅ Uses `RegisterInitAction(InitializePostBoot)` in Awake
- ✅ Has `InitializePostBoot()` method
- ✅ Implements IPausable interface
- ✅ Manually calls `GameManager.Instance.RegisterPausableComponent(this)` conditionally
- ✅ Implements singleton pattern
- ⚠️ Also has its own pausable registration system for diving minigame components
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `130` (minigame manager - scene-specific)
- Set `AutoRegisterPausable = true` (conditional logic can stay in OnManagedAwake)
- Move Awake + InitializePostBoot → `OnManagedAwake()`
- **REMOVE** manual `RegisterPausableComponent()` call (auto-handled)
- Remove `RegisterInitAction` call
- Use `OnSceneReady()` for minigame initialization
- Use `OnSceneUnloading()` for cleanup
---
### 3.10 Pickup.cs
**Location:** `Assets/Scripts/Interactions/Pickup.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService
**Usage:**
- ✅ Uses anonymous `RegisterInitAction()` lambda in Awake
- ❌ No InitializePostBoot method (inline lambda)
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `160` (interactable - scene-specific)
- Move anonymous lambda logic into `OnManagedAwake()` override
- Remove `RegisterInitAction` call
---
### 3.11 SaveableInteractable.cs
**Location:** `Assets/Scripts/Interactions/SaveableInteractable.cs`
**Current Pattern:** MonoBehaviour with ISaveParticipant
**Usage:**
- ✅ Implements ISaveParticipant interface
- ✅ Manually calls `SaveLoadManager.Instance.RegisterParticipant(this)` in Awake
- ❌ No BootCompletionService usage
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `170` (saveable interactable - scene-specific)
- Move ISaveParticipant registration into `OnManagedAwake()`
- **CONSIDER:** Is this global save (ISaveParticipant) or level-specific (OnSaveRequested)?
- If state persists across all levels globally → Keep ISaveParticipant
- If state is per-level → Use OnSaveRequested/OnRestoreRequested
---
### 3.12 AppleMachine.cs
**Location:** `Assets/Scripts/Core/SaveLoad/AppleMachine.cs`
**Current Pattern:** MonoBehaviour with BootCompletionService and ISaveParticipant
**Usage:**
- ✅ Uses anonymous `RegisterInitAction()` lambda in Awake
- ✅ Implements ISaveParticipant interface
- ✅ Manually calls `SaveLoadManager.Instance.RegisterParticipant(this)` in lambda
**Migration Plan:**
- Change base class to `ManagedBehaviour`
- Priority: `90` (apple machine - persistent game mechanic)
- Move anonymous lambda logic into `OnManagedAwake()` override
- **KEEP** manual ISaveParticipant registration (global save data)
- Remove `RegisterInitAction` call
---
## Category 4: Minigame-Specific Components (LOW PRIORITY)
These are diving minigame components that register with DivingGameManager (not global GameManager).
### 4.1 Diving Minigame IPausable Components
**Files:**
- `BottlePauser.cs` - `Assets/Scripts/Minigames/DivingForPictures/Utilities/`
- `RockPauser.cs` - `Assets/Scripts/Minigames/DivingForPictures/Utilities/`
- `ObstacleSpawner.cs` - `Assets/Scripts/Minigames/DivingForPictures/Obstacles/`
- `PlayerController.cs` - `Assets/Scripts/Minigames/DivingForPictures/Player/`
- `TrenchTileSpawner.cs` - `Assets/Scripts/Minigames/DivingForPictures/Tiles/`
- `BubbleSpawner.cs` - `Assets/Scripts/Minigames/DivingForPictures/Bubbles/`
**Current Pattern:**
- ✅ Implement IPausable interface
- ✅ Manually call `DivingGameManager.Instance.RegisterPausableComponent(this)` in Start/Awake
- ❌ No BootCompletionService usage
**Migration Plan (All):**
- Change base class to `ManagedBehaviour`
- Priority: `200+` (minigame components - scene-specific)
- Set `AutoRegisterPausable = false` (these register with DivingGameManager, not global GameManager)
- Move registration logic into `OnManagedAwake()` or `OnSceneReady()`
- **KEEP** manual registration with DivingGameManager (not global)
**Note:** These components are minigame-specific and register with DivingGameManager's local pause system, not the global GameManager. Auto-registration won't help here.
---
## Summary Statistics
### By Category
- **Core Services:** 6 components
- **UI Systems:** 6 components
- **Gameplay Systems:** 12 components
- **Minigame Components:** 6 components (low priority)
### By Pattern Usage
- **BootCompletionService.RegisterInitAction:** 19 components
- **SceneManagerService event subscriptions:** 7 components
- **ISaveParticipant manual registration:** 7 components
- **IPausable manual registration (GameManager):** 2 components
- **IPausable manual registration (DivingGameManager):** 6 components
### Priority Distribution
- **0-20 (Core Infrastructure):** 3 components (GameManager, SceneManagerService, SaveLoadManager)
- **21-50 (Managers & UI Infrastructure):** 6 components
- **51-100 (UI Features & Gameplay Support):** 7 components
- **101-150 (Gameplay Systems):** 5 components
- **151-200+ (Scene-Specific & Minigames):** 9 components
---
## Migration Order Recommendation
### Phase A: Foundation (Day 1)
1. GameManager
2. SceneManagerService (depends on LoadingScreenController existing)
3. SaveLoadManager
### Phase B: Infrastructure (Day 1-2)
4. LoadingScreenController (needed by SceneManagerService)
5. AudioManager (persistent service)
6. InputManager (persistent service)
7. CardSystemManager (persistent service)
### Phase C: UI Systems (Day 2)
8. UIPageController
9. PauseMenu
10. CardAlbumUI
11. CardSystemSceneVisibility
### Phase D: Gameplay Core (Day 2-3)
12. PlayerTouchController
13. FollowerController
14. DialogueComponent
15. PuzzleManager (complex - has scene lifecycle)
### Phase E: Level Systems (Day 3)
16. MinigameSwitch
17. DivingGameManager
18. ItemManager
19. QuickAccess
20. SceneOrientationEnforcer
21. DivingTutorial
### Phase F: Interactables & Details (Day 3)
22. Pickup
23. SaveableInteractable
24. AppleMachine
25. All 6 diving minigame pausable components
---
## Migration Validation Checklist
For each component migrated, verify:
- [ ] Base class changed to `ManagedBehaviour`
- [ ] Priority set appropriately
- [ ] Awake + InitializePostBoot logic moved to `OnManagedAwake()`
- [ ] All `RegisterInitAction()` calls removed
- [ ] `InitializePostBoot()` method deleted
- [ ] Scene event subscriptions replaced with lifecycle hooks
- [ ] Auto-registration enabled where appropriate (IPausable)
- [ ] Manual registrations kept where needed (ISaveParticipant for global data)
- [ ] Scene lifecycle hooks added if component is scene-specific
- [ ] Managed events used for any remaining subscriptions
- [ ] Component compiles without errors
- [ ] Component tested in play mode
- [ ] Functionality verified unchanged
---
## Key Migration Patterns
### Pattern 1: Simple BootCompletionService User
**Before:**
```csharp
void Awake()
{
// Setup
BootCompletionService.RegisterInitAction(InitializePostBoot);
}
private void InitializePostBoot()
{
// Post-boot initialization
}
```
**After:**
```csharp
protected override void OnManagedAwake()
{
// Setup + Post-boot initialization combined
}
```
---
### Pattern 2: Scene Event Subscriber
**Before:**
```csharp
private void InitializePostBoot()
{
SceneManagerService.Instance.SceneLoadCompleted += OnSceneLoaded;
}
void OnDestroy()
{
SceneManagerService.Instance.SceneLoadCompleted -= OnSceneLoaded;
}
private void OnSceneLoaded(string sceneName)
{
// Handle scene load
}
```
**After:**
```csharp
protected override void OnSceneReady()
{
// Handle scene load - no subscription needed!
}
```
---
### Pattern 3: IPausable Auto-Registration
**Before:**
```csharp
private void InitializePostBoot()
{
GameManager.Instance.RegisterPausableComponent(this);
}
void OnDestroy()
{
GameManager.Instance.UnregisterPausableComponent(this);
}
```
**After:**
```csharp
protected override bool AutoRegisterPausable => true;
// That's it! Auto-handled by ManagedBehaviour
```
---
### Pattern 4: ISaveParticipant (Keep Manual for Global Data)
**Before:**
```csharp
private void InitializePostBoot()
{
SaveLoadManager.Instance.RegisterParticipant(this);
}
```
**After:**
```csharp
protected override void OnManagedAwake()
{
// Keep manual registration for global persistent data
SaveLoadManager.Instance.RegisterParticipant(this);
}
```
**Note:** If data is level-specific instead, use `OnSaveRequested()` / `OnRestoreRequested()` hooks instead of ISaveParticipant.
---
## Questions to Answer During Migration
For each component with ISaveParticipant:
- Is this **global** persistent data (player inventory, settings, overall progress)?
- → Keep ISaveParticipant pattern
- Is this **level-specific** data (puzzle state in current level, enemy positions)?
- → Remove ISaveParticipant, use OnSaveRequested/OnRestoreRequested hooks
For each component subscribing to scene events:
- Does it need to run on **every scene load**?
- → Use `OnSceneReady()`
- Does it need to clean up **before scene unloads**?
- → Use `OnSceneUnloading()`
- Does it need to initialize when **component spawns** (even mid-game)?
- → Use `OnManagedAwake()`
---
**End of Migration Target List**