/// <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);
    }
Exemple #2
0
        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;
            }
        }
Exemple #3
0
        /** 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;
                }
            }
        }