83 lines
2.2 KiB
C#
83 lines
2.2 KiB
C#
![]() |
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.Events;
|
||
|
|
||
|
|
||
|
namespace HP.Generics
|
||
|
{
|
||
|
public class InitManager : MonoBehaviour
|
||
|
{
|
||
|
public bool autoStart = true;
|
||
|
|
||
|
public List<UnityEvent> ActionWhenSceneStarts = new List<UnityEvent>();
|
||
|
[Space]
|
||
|
public List<GameObject> waitUntilList = new List<GameObject>();
|
||
|
[Space]
|
||
|
public List<UnityEvent> ActionWhenInitProcessDone = new List<UnityEvent>();
|
||
|
|
||
|
List<IInitable> interfaceList = new List<IInitable>();
|
||
|
|
||
|
|
||
|
void Start()
|
||
|
{
|
||
|
#region
|
||
|
if (autoStart)
|
||
|
SceneStarts();
|
||
|
#endregion
|
||
|
}
|
||
|
|
||
|
public void SceneStarts()
|
||
|
{
|
||
|
#region Do something when scene starts
|
||
|
for (var i = 0; i < waitUntilList.Count; i++)
|
||
|
{
|
||
|
if (waitUntilList[i])
|
||
|
interfaceList.Add(waitUntilList[i].GetComponent<IInitable>());
|
||
|
}
|
||
|
|
||
|
for (var i = 0; i < ActionWhenSceneStarts.Count; i++)
|
||
|
ActionWhenSceneStarts[i].Invoke();
|
||
|
|
||
|
StartCoroutine(WaitUntilSceneIsInitialized());
|
||
|
#endregion
|
||
|
}
|
||
|
|
||
|
IEnumerator WaitUntilSceneIsInitialized()
|
||
|
{
|
||
|
#region Wait until all the tested methods returned true
|
||
|
bool allConditionsTrue = false;
|
||
|
|
||
|
while (!allConditionsTrue)
|
||
|
{
|
||
|
allConditionsTrue = true;
|
||
|
|
||
|
for (var i = 0; i < interfaceList.Count; i++)
|
||
|
{
|
||
|
if (!interfaceList[i].IsInitDone())
|
||
|
{
|
||
|
allConditionsTrue = false;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
yield return null;
|
||
|
}
|
||
|
|
||
|
StartCoroutine(InitProcessDoneRoutine());
|
||
|
|
||
|
yield return null;
|
||
|
#endregion
|
||
|
}
|
||
|
|
||
|
IEnumerator InitProcessDoneRoutine()
|
||
|
{
|
||
|
#region Do something after initialization
|
||
|
for (var i = 0; i < ActionWhenInitProcessDone.Count; i++)
|
||
|
ActionWhenInitProcessDone[i].Invoke();
|
||
|
|
||
|
yield return null;
|
||
|
#endregion
|
||
|
}
|
||
|
}
|
||
|
}
|