public T Resolve <T>(bool onlyExisting) where T : class { T result = default(T); Type concreteType = null; if (singletons.TryGetValue(typeof(T), out concreteType)) { object r = null; if (!singletonInstances.TryGetValue(typeof(T), out r) && !onlyExisting) { #if NETFX_CORE if (concreteType.GetTypeInfo().IsSubclassOf(typeof(MonoBehaviour))) #else if (concreteType.IsSubclassOf(typeof(MonoBehaviour))) #endif { GameObject singletonGameObject = new GameObject(); r = singletonGameObject.AddComponent(concreteType); singletonGameObject.name = typeof(T).ToString() + " (singleton)"; } else { r = Activator.CreateInstance(concreteType); } singletonInstances[typeof(T)] = r; IMultiSceneSingleton multi = r as IMultiSceneSingleton; if (multi != null) { multi.HandleNewSceneLoaded(); } } result = (T)r; } else if (transients.TryGetValue(typeof(T), out concreteType)) { object r = Activator.CreateInstance(concreteType); result = (T)r; } return(result); }
public void HandleNewSceneLoaded() { List <IMultiSceneSingleton> multis = new List <IMultiSceneSingleton>(); foreach (KeyValuePair <Type, object> pair in _singletonInstances) { IMultiSceneSingleton multi = pair.Value as IMultiSceneSingleton; if (multi != null) { multis.Add(multi); } } foreach (var multi in multis) { MonoBehaviour behavior = multi as MonoBehaviour; if (behavior != null) { behavior.StartCoroutine(multi.HandleNewSceneLoaded()); } } }