Пример #1
0
    private IManager AcquireComponent(PropertyInfo p, ManagerAttribute attr)
    {
        IManager manager = null;

        if (!string.IsNullOrEmpty(attr.CustomHookup))
        {
            MethodInfo method = GetType().GetMethod(attr.CustomHookup, BindingFlags.Instance | BindingFlags.NonPublic);
            manager = method.Invoke(this, null) as IManager;
        }

        if (manager == null)
        {
            manager = gameObject.GetComponent(p.PropertyType) as IManager;
        }

        if (manager == null)
        {
            manager = gameObject.AddComponent(p.PropertyType) as IManager;
        }

        return(manager);
    }
Пример #2
0
    private void LoadProperties()
    {
        PropertyInfo[] props = this.GetType().GetProperties(BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy);

        allManagers = new List <IManager>();
        initOrder   = new List <List <IManager> >();
        List <IManager> finalStage = new List <IManager>();

        foreach (PropertyInfo p in props)
        {
            object[]         attributes = p.GetCustomAttributes(typeof(ManagerAttribute), true);
            ManagerAttribute attr       = attributes.Length > 0 ? attributes[0] as ManagerAttribute : null;
            if (attr != null)
            {
                numManagers++;
                IManager manager = AcquireComponent(p, attr);
                allManagers.Add(manager);

                p.SetValue(this, manager, null);
                if (attr.InitStage.HasValue)
                {
                    while (initOrder.Count <= attr.InitStage.Value)
                    {
                        initOrder.Add(new List <IManager>());
                    }
                    initOrder[attr.InitStage.Value].Add(manager);
                }
                else
                {
                    finalStage.Add(manager);
                }
            }
        }

        initOrder.Add(finalStage);

        // if you ever wanna pre init, call it here
    }