protected void InitTypes()
    {
        m_setTypes = new HashSet <string>();
        var assemblies = AppDomain.CurrentDomain.GetAssemblies();

        foreach (var assembly in assemblies)
        {
            try
            {
                if (assembly is System.Reflection.Emit.AssemblyBuilder)
                {
                    continue;
                }

                var takeAllTypes  = SD_Assembly.IsScriptAssemblyName(assembly.GetName().Name);
                var assemblyTypes = takeAllTypes ? assembly.GetTypes() : assembly.GetExportedTypes();
                foreach (var type in assemblyTypes)
                {
                    var name  = type.Name;
                    var index = name.IndexOf('`');
                    if (index >= 0)
                    {
                        name = name.Remove(index);
                    }
                    m_setTypes.Add(name);
                    if (type.IsSubclassOf(typeof(Attribute)) && name.EndsWith("Attribute", StringComparison.Ordinal))
                    {
                        m_setTypes.Add(type.Name.Substring(0, type.Name.Length - "Attribute".Length));
                    }
                }
            }
            catch (ReflectionTypeLoadException)
            {
                Debug.LogWarning("Error reading types from assembly " + assembly.FullName);
            }
        }
    }