aboutsummaryrefslogtreecommitdiff
path: root/JamHelper/Assets/JamHelper/JamUtils/Scripts/Utils/CustomExecutionOrder.cs
blob: c0a8b6080b048cd705c1b39ddcb6a032fce38979 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace JamUtils
{
    [DefaultExecutionOrder(ORDER_EXECUTION)]
    public class CustomExecutionOrder : MonoBehaviour
    {
        private const int ORDER_EXECUTION = -98;

        static CustomExecutionOrder _instance;

        public static CustomExecutionOrder Instance
        {
            get
            {
                if (_instance == null)
                {
                    GameObject inst = new GameObject("CustomExecutionOrder");
                    inst.hideFlags = HideFlags.DontSave;
                    DontDestroyOnLoad(inst);

                    _instance = inst.AddComponent<CustomExecutionOrder>();
                }
                return _instance;
            }
        }

        public event Action beforeFixedUpdate;
        public event Action afterFixedUpdate;

        public event Action beforeUpdate;
        public event Action afterUpdate;

        private void Awake()
        {
            StartCoroutine(WaitForEndOfFrame());
            StartCoroutine(WaitForFixedUpdate());
        }

        private IEnumerator WaitForEndOfFrame()
        {
            while (true)
            {
                yield return new WaitForEndOfFrame();
                if (afterUpdate != null)
                    afterUpdate();
                if (beforeFixedUpdate != null)
                    beforeFixedUpdate();
            }
        }

        private IEnumerator WaitForFixedUpdate()
        {
            while (true)
            {
                yield return new WaitForFixedUpdate();
                if (afterFixedUpdate != null)
                    afterFixedUpdate();
            }
        }

        private void Update()
        {
            if (beforeUpdate != null)
                beforeUpdate();
        }

    }
}