public static async Task Init(InitCallback initCallback, params Func <Task>[] initTasks) { if (null != Instance) { throw new ApplicationException("SystemManager already exsited, can't run Init more than once!"); } var go = new GameObject("Systems", typeof(SystemManager)); DontDestroyOnLoad(go); SystemInitLog.Log("----------Initialize Game----------"); for (int i = 0; i < initTasks.Length; ++i) { var func = initTasks[i]; string sysName = GetName(func); initCallback(0, sysName, (float)i / initTasks.Length); SystemInitLog.Log(sysName); await func(); Instance.AddSystem(func); initCallback(0, sysName, (float)(i + 1) / initTasks.Length); } SystemInitLog.Log("----------Initialize Finished----------"); }
void AddSystem(Func <Task> func) { try { var declaringType = func.Method.DeclaringType; if (declaringType.IsGenericType && declaringType.GenericTypeArguments[0].Name.Contains("System")) { var prop = declaringType.GetProperty( "Instance", BindingFlags.Public | BindingFlags.Static); systems.Add(new System(prop.GetValue(null))); } } catch (Exception e) { SystemInitLog.LogException(e); } }