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);
        }
示例#2
0
        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());
                }
            }
        }