Ejemplo n.º 1
0
        public IEnumerator ScanAssembliesAsync(Action <float, string> inOnProgress = null)
        {
            if (m_IsLoaded)
            {
                yield break;
            }

            m_IsLoading = true;
            m_IsLoaded  = false;

            List <Assembly> allowedAssemblies = new List <Assembly>(GetAssembliesToScan());
            List <RSInfo>   toLink            = new List <RSInfo>();

            inOnProgress?.Invoke(0, "Loading groups");

            foreach (var groupInfo in Reflect.FindFields <RSGroupAttribute>(allowedAssemblies, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly))
            {
                RSGroupInfo groupMeta = new RSGroupInfo(groupInfo.Attribute, groupInfo.Info);
                m_Groups.Add(groupMeta.IdHash, groupMeta);
                groupInfo.Info.SetValue(null, groupMeta.GroupId);
                yield return(null);
            }

            inOnProgress?.Invoke(1f / 6, "Loading components");

            foreach (var componentInfo in Reflect.FindTypes <RSComponentAttribute>(allowedAssemblies))
            {
                RSComponentInfo componentMeta = new RSComponentInfo(componentInfo.Attribute, componentInfo.Info);
                m_Components.Add(componentMeta.IdHash, componentMeta);
                m_ComponentTypeMap.Add(componentInfo.Info, componentMeta);
                toLink.Add(componentMeta);
                yield return(null);
            }

            inOnProgress?.Invoke(2f / 6, "Loading queries");

            foreach (var queryInfo in Reflect.FindMethods <RSQueryAttribute>(allowedAssemblies, BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly))
            {
                RSQueryInfo queryMeta = new RSQueryInfo(queryInfo.Attribute, queryInfo.Info);
                m_Queries.Add(queryMeta.IdHash, queryMeta);
                toLink.Add(queryMeta);
                yield return(null);
            }

            inOnProgress?.Invoke(3f / 6, "Loading actions");

            foreach (var actionInfo in Reflect.FindMethods <RSActionAttribute>(allowedAssemblies, BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly))
            {
                RSActionInfo actionMeta = new RSActionInfo(actionInfo.Attribute, actionInfo.Info);
                m_Actions.Add(actionMeta.IdHash, actionMeta);
                toLink.Add(actionMeta);
                yield return(null);
            }

            inOnProgress?.Invoke(4f / 6, "Loading triggers");

            foreach (var triggerInfo in Reflect.FindFields <RSTriggerAttribute>(allowedAssemblies, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly))
            {
                RSTriggerInfo triggerMeta = new RSTriggerInfo(triggerInfo.Attribute, triggerInfo.Info);
                m_Triggers.Add(triggerMeta.IdHash, triggerMeta);
                triggerInfo.Info.SetValue(null, triggerMeta.TriggerId);
                toLink.Add(triggerMeta);
                yield return(null);
            }

            inOnProgress?.Invoke(5f / 6, "Linking elements");

            foreach (var meta in toLink)
            {
                meta.Link(TypeAssembly);
                yield return(null);
            }

            toLink.Clear();

            m_IsLoading = false;
            m_IsLoaded  = true;

            inOnProgress?.Invoke(1, "Done");
        }