# PlayerLoopSystem

> The representation of a single system that updates as part of the Player loop in Unity.

## Definition

* **Type:** Struct
* **Namespace:** [UnityEngine.LowLevel](/engine/6000.6/script-reference/unityengine/lowlevel.md)
* **Assembly:** UnityEngine.CoreModule

```csharp
public struct PlayerLoopSystem
```

## Remarks

A Player loop system represents an engine component or subsystem that updates on each iteration of the Player loop. `PlayerLoopSystem` has a nested structure where each system contains a `subSystemList`, which is an array of other systems that update as part of the parent system.

The default loop consists of Unity's built-in native systems such as Input and Audio, but you can add new custom systems to the Player loop by using [PlayerLoop.SetPlayerLoop](/engine/6000.6/script-reference/unityengine/lowlevel/playerloop/setplayerloop.md) in your C# code. Native systems can only be retrieved by calling [PlayerLoop.GetDefaultPlayerLoop](/engine/6000.6/script-reference/unityengine/lowlevel/playerloop/getdefaultplayerloop.md), and their parameters must not be modified.

Additional Resources: [PlayerLoop](/engine/6000.6/script-reference/unityengine/lowlevel/playerloop.md).

## Examples

```csharp
using System.Text;
using UnityEngine.LowLevel;
using UnityEngine;

public static class PrintDefaultPlayerLoop
{
    //Retrieve the default Player loop system and iterate over its subsystems to print them.

    //Run this method on runtime initialization
    [RuntimeInitializeOnLoadMethod]
    private static void AppStart()
    {
        StringBuilder sb = new();
        // Pass the default Player loop to the recursive print function
        RecursivePlayerLoopPrint(PlayerLoop.GetDefaultPlayerLoop(), sb, 0);
        Debug.Log(sb.ToString());
    }
    // Loop through the Player loop tree structure and add the names of the systems to the StringBuilder
    private static void RecursivePlayerLoopPrint(PlayerLoopSystem playerLoopSystem, StringBuilder sb, int depth)
    {
        if (depth == 0)
        {
            sb.AppendLine("ROOT NODE");
        }
        else if (playerLoopSystem.type != null)
        {
            for (int i = 0; i < depth; i++)
            {
                sb.Append("\t");
            }
            sb.AppendLine(playerLoopSystem.type.Name);
        }
        if (playerLoopSystem.subSystemList != null)
        {
            depth++;
            foreach (var s in playerLoopSystem.subSystemList)
            {
                RecursivePlayerLoopPrint(s, sb, depth);
            }
            depth--;
        }
    }
}
```

## Fields

| Value                                                                                                                   | Description                                                                                                                                                                                                                                                                                                                                          |
| ----------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [loopConditionFunction](/engine/6000.6/script-reference/unityengine/lowlevel/playerloopsystem/loopconditionfunction.md) | The loop condition for a native engine system. To get a valid value for this, you must copy it from one of the [PlayerLoopSystem](/engine/6000.6/script-reference/unityengine/lowlevel/playerloopsystem.md)s returned by [PlayerLoop.GetDefaultPlayerLoop](/engine/6000.6/script-reference/unityengine/lowlevel/playerloop/getdefaultplayerloop.md). |
| [subSystemList](/engine/6000.6/script-reference/unityengine/lowlevel/playerloopsystem/subsystemlist.md)                 | An array of sub-systems, each of which is also a PlayerLoopSystem, which run as part of this system in the Player loop.                                                                                                                                                                                                                              |
| [type](/engine/6000.6/script-reference/unityengine/lowlevel/playerloopsystem/type.md)                                   | A System.Type used to identify a Player loop system and label it in the Profiler.                                                                                                                                                                                                                                                                    |
| [updateDelegate](/engine/6000.6/script-reference/unityengine/lowlevel/playerloopsystem/updatedelegate.md)               | A managed delegate to which you can assign a custom update method that should run as part of this system.                                                                                                                                                                                                                                            |
| [updateFunction](/engine/6000.6/script-reference/unityengine/lowlevel/playerloopsystem/updatefunction.md)               | A native engine system. To get a valid value for this, you must copy it from one of the PlayerLoopSystems returned by GetDefaultPlayerLoop.                                                                                                                                                                                                          |
