Rework of base interactables and managed behaviors
This commit is contained in:
732
docs/migration_target_list.md
Normal file
732
docs/migration_target_list.md
Normal file
@@ -0,0 +1,732 @@
|
||||
# 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**
|
||||
|
||||
Reference in New Issue
Block a user