예제 #1
0
    void InitContainer()
    {
        var sortedManagers = GetSortedManagers();

        for (int i = 0; i < sortedManagers.Count; ++i)
        {
            if (sortedManagers[i] == null)
            {
                continue;
            }
            if (!isGlobalContainer && ManagerAttributeCache.IsManagerAlwaysGlobal(sortedManagers[i].GetType()))
            {
                Debug.LogError("Cannot add [ManagerAlwaysGlobal] manager prefab \""
                               + sortedManagers[i].name
                               + "\"(" + sortedManagers[i].GetType().Name
                               + ") to non-global container!"
                               + name
                               + ".");
                continue;
            }
            var manager = Instantiate(sortedManagers[i]);
            AddNewManager(manager);
        }

        StartNewManagers();
    }
    public static T GetManager <T>(Scene scene) where T : Manager
    {
        T manager = null;
        ManagerContainer sceneContainer = null;

        if (ManagerAttributeCache.IsManagerAlwaysGlobal(typeof(T)))
        {
            return(GetGlobalManager <T>());
        }

        if (!s_managerContainers.TryGetValue(scene, out sceneContainer))
        {
            // if a a global container exists, check it before creating a scene one
            // while creating a blank scene manager would be valid, it is unexpected beahaviour.
            if (s_globalContainer != null)
            {
                manager = s_globalContainer.LookupManager(typeof(T)) as T;
                if (manager != null)
                {
                    return(manager);
                }
            }

            var gameObject = new GameObject(scene.name + " ManagerContainer (autogenerated)");
            sceneContainer = gameObject.AddComponent <ManagerContainer>();
        }

        manager = sceneContainer.LookupManager(typeof(T)) as T;
        if (manager != null)
        {
            return(manager);
        }

        if (s_globalContainer != null)
        {
            manager = s_globalContainer.LookupManager(typeof(T)) as T;
            if (manager != null)
            {
                return(manager);
            }
        }

        if (sceneContainer != null)
        {
            manager = sceneContainer.AutoconstructManager(typeof(T)) as T;
            if (manager != null)
            {
                return(manager);
            }
        }

        return(null);
    }
예제 #3
0
    public T GetManager <T>() where T : Manager
    {
        if (!ManagerAttributeCache.DoesManagerDependOn(GetType(), typeof(T)))
        {
            Debug.LogError(string.Format("{0} Doesn't depend on {1}, it must have the attribute [ManagerDependency(typeof({1}))]", GetType().Name, typeof(T).Name));
            return(null);
        }

        var result = container.GetManager <T>();

        if (result == null)
        {
            Debug.LogError(string.Format("{0} wasn't able to acquire manager of type {1} (a registered dependency).", GetType().Name, typeof(T).Name));
            return(null);
        }

        return(result);
    }
예제 #4
0
 public System.Type[] GetDependencies()
 {
     return(ManagerAttributeCache.GetManagerDependencies(GetType()));
 }
예제 #5
0
 public static System.Type[] GetDependencies(System.Type type)
 {
     return(ManagerAttributeCache.GetManagerDependencies(type));
 }