33#if UNITY_2019_3_OR_NEWER
34using UnityEngine.LowLevel;
35using UnityEngine.PlayerLoop;
37using UnityEngine.Experimental.LowLevel;
38using UnityEngine.Experimental.PlayerLoop;
46 internal enum AddMode { Beginning, End }
49 public static Action OnEarlyUpdate;
50 public static Action OnLateUpdate;
53 [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
54 static void ResetStatics()
63 internal static int FindPlayerLoopEntryIndex(PlayerLoopSystem.UpdateFunction
function, PlayerLoopSystem playerLoop, Type playerLoopSystemType)
66 if (playerLoop.type == playerLoopSystemType)
67 return Array.FindIndex(playerLoop.subSystemList, (elem => elem.updateDelegate ==
function));
70 if (playerLoop.subSystemList !=
null)
72 for(
int i = 0; i < playerLoop.subSystemList.Length; ++i)
74 int index = FindPlayerLoopEntryIndex(
function, playerLoop.subSystemList[i], playerLoopSystemType);
75 if (index != -1)
return index;
101 internal static bool AddToPlayerLoop(PlayerLoopSystem.UpdateFunction
function, Type ownerType, ref PlayerLoopSystem playerLoop, Type playerLoopSystemType, AddMode addMode)
104 if (playerLoop.type == playerLoopSystemType)
112 int oldListLength = (playerLoop.subSystemList !=
null) ? playerLoop.subSystemList.Length : 0;
113 Array.Resize(ref playerLoop.subSystemList, oldListLength + 1);
120 PlayerLoopSystem system =
new PlayerLoopSystem {
122 updateDelegate =
function
126 if (addMode == AddMode.Beginning)
129 Array.Copy(playerLoop.subSystemList, 0, playerLoop.subSystemList, 1, playerLoop.subSystemList.Length - 1);
130 playerLoop.subSystemList[0] = system;
134 else if (addMode == AddMode.End)
137 playerLoop.subSystemList[oldListLength] = system;
149 if (playerLoop.subSystemList !=
null)
151 for(
int i = 0; i < playerLoop.subSystemList.Length; ++i)
153 if (AddToPlayerLoop(
function, ownerType, ref playerLoop.subSystemList[i], playerLoopSystemType, addMode))
161 [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
162 static void RuntimeInitializeOnLoad()
170 PlayerLoopSystem playerLoop =
171#if UNITY_2019_3_OR_NEWER
172 PlayerLoop.GetCurrentPlayerLoop();
174 PlayerLoop.GetDefaultPlayerLoop();
179 AddToPlayerLoop(NetworkEarlyUpdate, typeof(
NetworkLoop), ref playerLoop, typeof(EarlyUpdate), AddMode.End);
184 AddToPlayerLoop(NetworkLateUpdate, typeof(
NetworkLoop), ref playerLoop, typeof(PreLateUpdate), AddMode.End);
187 PlayerLoop.SetPlayerLoop(playerLoop);
190 static void NetworkEarlyUpdate()
196 OnEarlyUpdate?.Invoke();
199 static void NetworkLateUpdate()
203 OnLateUpdate?.Invoke();
NetworkClient with connection to server.
NetworkServer handles remote connections and has a local connection for a local client.