Files
AppleHillsProduction/docs/migration_target_list.md
2025-11-07 13:53:11 +01:00

24 KiB

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:

  • SceneLoadStartedOnSceneUnloading() (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:

  • SceneLoadCompletedOnSceneReady()

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:

  • SceneLoadCompletedOnSceneReady()

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:

  • SceneLoadCompletedOnSceneReady()

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:

  • SceneLoadCompletedOnSceneReady()

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:

  • SceneLoadStartedOnSceneUnloading() (cleanup before leaving level)
  • SceneLoadCompletedOnSceneReady() (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)

  1. LoadingScreenController (needed by SceneManagerService)
  2. AudioManager (persistent service)
  3. InputManager (persistent service)
  4. CardSystemManager (persistent service)

Phase C: UI Systems (Day 2)

  1. UIPageController
  2. PauseMenu
  3. CardAlbumUI
  4. CardSystemSceneVisibility

Phase D: Gameplay Core (Day 2-3)

  1. PlayerTouchController
  2. FollowerController
  3. DialogueComponent
  4. PuzzleManager (complex - has scene lifecycle)

Phase E: Level Systems (Day 3)

  1. MinigameSwitch
  2. DivingGameManager
  3. ItemManager
  4. QuickAccess
  5. SceneOrientationEnforcer
  6. DivingTutorial

Phase F: Interactables & Details (Day 3)

  1. Pickup
  2. SaveableInteractable
  3. AppleMachine
  4. 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:

void Awake()
{
    // Setup
    BootCompletionService.RegisterInitAction(InitializePostBoot);
}

private void InitializePostBoot()
{
    // Post-boot initialization
}

After:

protected override void OnManagedAwake()
{
    // Setup + Post-boot initialization combined
}

Pattern 2: Scene Event Subscriber

Before:

private void InitializePostBoot()
{
    SceneManagerService.Instance.SceneLoadCompleted += OnSceneLoaded;
}

void OnDestroy()
{
    SceneManagerService.Instance.SceneLoadCompleted -= OnSceneLoaded;
}

private void OnSceneLoaded(string sceneName)
{
    // Handle scene load
}

After:

protected override void OnSceneReady()
{
    // Handle scene load - no subscription needed!
}

Pattern 3: IPausable Auto-Registration

Before:

private void InitializePostBoot()
{
    GameManager.Instance.RegisterPausableComponent(this);
}

void OnDestroy()
{
    GameManager.Instance.UnregisterPausableComponent(this);
}

After:

protected override bool AutoRegisterPausable => true;

// That's it! Auto-handled by ManagedBehaviour

Pattern 4: ISaveParticipant (Keep Manual for Global Data)

Before:

private void InitializePostBoot()
{
    SaveLoadManager.Instance.RegisterParticipant(this);
}

After:

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