/// <summary> /// Inserts a new player loop system in the player loop, just before another system. /// </summary> /// <param name="newSystemMarker">Type marker for the new system.</param> /// <param name="newSystemUpdate">Callback that will be called each frame before insertBefore.</param> /// <param name="insertBefore">The subsystem to insert the system before.</param> /// <param name="runInFixedUpdate">Set the loop condition function to the same as the built-in FixedUpdate. NOTE: This doesn't work!</param> public static void InsertSystemBefore(Type newSystemMarker, UnityEngine.LowLevel.PlayerLoopSystem.UpdateFunction newSystemUpdate, Type insertBefore, bool runInFixedUpdate = false) { var playerLoopSystem = new UnityEngine.LowLevel.PlayerLoopSystem { type = newSystemMarker, updateDelegate = newSystemUpdate }; if (runInFixedUpdate) { playerLoopSystem.loopConditionFunction = fixedUpdateLoopCondition; } InsertSystemBefore(playerLoopSystem, insertBefore); }
private static void InstallCallback <T>(UnityEngine.LowLevel.PlayerLoopSystem playerLoop, Type subsystem, UnityEngine.LowLevel.PlayerLoopSystem.UpdateFunction callback) { for (var i = 0; i < playerLoop.subSystemList.Length; ++i) { int subsystemListLength = playerLoop.subSystemList[i].subSystemList.Length; if (playerLoop.subSystemList[i].type != subsystem) { continue; } // Create new subsystem list and add callback var newSubsystemList = new UnityEngine.LowLevel.PlayerLoopSystem[subsystemListLength + 1]; for (var j = 0; j < subsystemListLength; j++) { newSubsystemList[j] = playerLoop.subSystemList[i].subSystemList[j]; } newSubsystemList[subsystemListLength].type = typeof(UnityEngine.PlayerLoop.FixedUpdate); newSubsystemList[subsystemListLength].updateDelegate = callback; playerLoop.subSystemList[i].subSystemList = newSubsystemList; } }
/** Find * * a_playerloopsystem : プレイヤーループシステム。 * a_mode : モード。 * a_target_type : 追加場所。 * a_type : タイプ。 * a_function : 関数。 * */ public static void AddFromType(ref UnityEngine.LowLevel.PlayerLoopSystem a_playerloopsystem, Mode a_mode, System.Type a_target_type, System.Type a_type, UnityEngine.LowLevel.PlayerLoopSystem.UpdateFunction a_function) { int t_index_1; int t_index_2; int t_index_3; int t_index_count = Find.FindFromType(a_playerloopsystem, a_target_type, out t_index_1, out t_index_2, out t_index_3); UnityEngine.LowLevel.PlayerLoopSystem t_item = new UnityEngine.LowLevel.PlayerLoopSystem(); { t_item.subSystemList = null; t_item.type = a_type; t_item.updateDelegate = a_function; } int t_target_index; System.Collections.Generic.List <UnityEngine.LowLevel.PlayerLoopSystem> t_target_list; { switch (a_mode) { case Mode.AddFirst: case Mode.AddLast: { t_target_index = -1; switch (t_index_count) { case 1: { t_target_list = new System.Collections.Generic.List <UnityEngine.LowLevel.PlayerLoopSystem>(a_playerloopsystem.subSystemList[t_index_1].subSystemList); } break; case 2: { t_target_list = new System.Collections.Generic.List <UnityEngine.LowLevel.PlayerLoopSystem>(a_playerloopsystem.subSystemList[t_index_1].subSystemList[t_index_2].subSystemList); } break; case 3: { t_target_list = new System.Collections.Generic.List <UnityEngine.LowLevel.PlayerLoopSystem>(a_playerloopsystem.subSystemList[t_index_1].subSystemList[t_index_2].subSystemList[t_index_3].subSystemList); } break; default: { //未発見。 #if (DEF_BLUEBACK_UNITYPLAYERLOOP_ASSERT) DebugTool.Assert(false); #endif t_target_list = null; } break; } } break; case Mode.AddBefore: case Mode.AddAfter: { switch (t_index_count) { case 1: { t_target_list = new System.Collections.Generic.List <UnityEngine.LowLevel.PlayerLoopSystem>(a_playerloopsystem.subSystemList); t_target_index = t_index_1; } break; case 2: { t_target_list = new System.Collections.Generic.List <UnityEngine.LowLevel.PlayerLoopSystem>(a_playerloopsystem.subSystemList[t_index_1].subSystemList); t_target_index = t_index_2; } break; case 3: { t_target_list = new System.Collections.Generic.List <UnityEngine.LowLevel.PlayerLoopSystem>(a_playerloopsystem.subSystemList[t_index_1].subSystemList[t_index_2].subSystemList); t_target_index = t_index_3; } break; default: { //未発見。 #if (DEF_BLUEBACK_UNITYPLAYERLOOP_ASSERT) DebugTool.Assert(false); #endif t_target_list = null; t_target_index = -1; } break; } } break; default: { //不明なタイプ。 #if (DEF_BLUEBACK_UNITYPLAYERLOOP_ASSERT) DebugTool.Assert(false); #endif t_target_list = null; t_target_index = -1; } break; } } //追加。 { switch (a_mode) { case Mode.AddFirst: { t_target_list.Insert(0, t_item); } break; case Mode.AddLast: { t_target_list.Add(t_item); } break; case Mode.AddBefore: { t_target_list.Insert(t_target_index, t_item); } break; case Mode.AddAfter: { t_target_list.Insert(t_target_index + 1, t_item); } break; default: { //不明なタイプ。 #if (DEF_BLUEBACK_UNITYPLAYERLOOP_ASSERT) DebugTool.Assert(false); #endif } break; } } //適応。 { switch (a_mode) { case Mode.AddFirst: case Mode.AddLast: { switch (t_index_count) { case 1: { a_playerloopsystem.subSystemList[t_index_1].subSystemList = t_target_list.ToArray(); } break; case 2: { a_playerloopsystem.subSystemList[t_index_1].subSystemList[t_index_2].subSystemList = t_target_list.ToArray(); } break; case 3: { a_playerloopsystem.subSystemList[t_index_1].subSystemList[t_index_2].subSystemList[t_index_3].subSystemList = t_target_list.ToArray(); } break; default: { //未発見。 #if (DEF_BLUEBACK_UNITYPLAYERLOOP_ASSERT) DebugTool.Assert(false); #endif } break; } } break; case Mode.AddBefore: case Mode.AddAfter: { switch (t_index_count) { case 1: { a_playerloopsystem.subSystemList = t_target_list.ToArray(); } break; case 2: { a_playerloopsystem.subSystemList[t_index_1].subSystemList = t_target_list.ToArray(); } break; case 3: { a_playerloopsystem.subSystemList[t_index_1].subSystemList[t_index_2].subSystemList = t_target_list.ToArray(); } break; default: { //未発見。 #if (DEF_BLUEBACK_UNITYPLAYERLOOP_ASSERT) DebugTool.Assert(false); #endif } break; } } break; default: { //不明なタイプ。 #if (DEF_BLUEBACK_UNITYPLAYERLOOP_ASSERT) DebugTool.Assert(false); #endif } break; } } }