Cysharp/UniTask · critical · Exception

Target PlayerLoopSystem does not found. Type:

Error message

Target PlayerLoopSystem does not found. Type:

What it means

Thrown by PlayerLoopHelper.FindLoopSystemIndex during initialization when scanning the Unity PlayerLoopSystem[] array for a subsystem type (e.g., UnityEngine.PlayerLoop.Update, LateUpdate, FixedUpdate) that is not present. UniTask injects its update/delay runners into these subsystems; if a required type is missing it cannot function and aborts initialization.

Source

Thrown at src/UniTask/Assets/Plugins/UniTask/Runtime/PlayerLoopHelper.cs:379

                }
            }

            UniTaskSynchronizationContext.Run();
        }

#endif

        private static int FindLoopSystemIndex(PlayerLoopSystem[] playerLoopList, Type systemType)
        {
            for (int i = 0; i < playerLoopList.Length; i++)
            {
                if (playerLoopList[i].type == systemType)
                {
                    return i;
                }
            }

            throw new Exception("Target PlayerLoopSystem does not found. Type:" + systemType.FullName);
        }

        static void InsertLoop(PlayerLoopSystem[] copyList, InjectPlayerLoopTimings injectTimings, Type loopType, InjectPlayerLoopTimings targetTimings,
            int index, bool injectOnFirst, Type loopRunnerYieldType, Type loopRunnerType, PlayerLoopTiming playerLoopTiming)
        {
            var i = FindLoopSystemIndex(copyList, loopType);
            if ((injectTimings & targetTimings) == targetTimings)
            {
                copyList[i].subSystemList = InsertRunner(copyList[i], injectOnFirst,
                    loopRunnerYieldType, yielders[index] = new ContinuationQueue(playerLoopTiming),
                    loopRunnerType, runners[index] = new PlayerLoopRunner(playerLoopTiming));
            }
            else
            {
                copyList[i].subSystemList = RemoveRunner(copyList[i], loopRunnerYieldType, loopRunnerType);
            }
        }

View on GitHub (pinned to ceac8d6946)

Solutions

  1. Call PlayerLoopHelper.Initialize() early at startup, before any other system modifies the player loop.
  2. Ensure no other plugin has stripped standard subsystem types (Update, LateUpdate, FixedUpdate, etc.) from PlayerLoop.GetCurrentPlayerLoop().
  3. Upgrade or downgrade UniTask to a version compatible with your Unity version.
  4. If you must use a custom player loop, merge UniTask's hooks into it rather than replacing it wholesale.

Example fix

// before (another plugin replaces player loop first)
CustomFramework.ReplacePlayerLoop();
PlayerLoopHelper.Initialize(); // throws: subsystem not found

// after (initialize UniTask first, then customize)
PlayerLoopHelper.Initialize();
CustomFramework.ModifyPlayerLoop(); // preserve existing subsystems
Defensive patterns

Strategy: validation

Validate before calling

// Verify standard subsystems exist before initializing UniTask
var loop = PlayerLoop.GetCurrentPlayerLoop();
var requiredTypes = new[] { typeof(PlayerLoop.Update), typeof(PlayerLoop.LateUpdate), typeof(PlayerLoop.FixedUpdate) };
foreach (var t in requiredTypes)
{
    bool found = false;
    foreach (var sys in loop.subSystemList)
        if (sys.type == t) { found = true; break; }
    if (!found)
        Debug.LogError($"Missing player loop subsystem: {t.FullName}");
}
PlayerLoopHelper.Initialize();

Try / catch

try
{
    PlayerLoopHelper.Initialize();
}
catch (Exception ex) when (ex.Message.Contains("PlayerLoopSystem does not found"))
{
    // A subsystem type is missing; check for conflicting plugins
    Debug.LogError("PlayerLoop initialization failed: " + ex.Message);
}

Prevention

When it happens

Trigger: Calling PlayerLoopHelper.Initialize() after another plugin or framework has modified or stripped the Unity player loop, removing standard subsystem types. Running on a Unity version whose internal player loop structure differs from what UniTask expects.

Common situations: Another asset (e.g., a custom game framework) rebuilds the player loop from scratch and omits standard subsystems. Unity beta/alpha versions with restructured player loop. A stripped or custom player runtime. Scripting define symbols or platform settings that alter the player loop.

Related errors


AI-assisted analysis of Cysharp/UniTask@ceac8d6946 (2026-08-13). Data as JSON: /api/errors/24f6eb953aa1270d. Report an issue: GitHub.