internal static bool GenerateMetadataEntityScripts()
        {
            var result   = false;
            var settings = MetadataAssetSettings.Load();

            MetadataAssetSettings.CreateEntityScriptsStoreFolder(settings);

            if (string.IsNullOrEmpty(settings.ExcelWorkbookFilesFolderPath))
            {
                if (UnityEditorUtility.DisplayDialog("Error", "'Excel Workbook Files Folder Path' is not valid path!", "OK"))
                {
                    UnityEditorUtility.ClearProgressBar();
                }
            }
            else
            {
                ForEachExcelFile(settings.ExcelWorkbookFilesFolderPath, (table, fileName, index, length) =>
                {
                    if (table == null)
                    {
                        return;
                    }

                    var info     = $"Generating Metadata Entity Script: {fileName}.cs... {index + 1}/{length}";
                    var progress = (float)(index + 1) / length;
                    UnityEditorUtility.DisplayProgressBar("Hold on...", info, progress);
                    var rawInfoList = CreateMetadataEntityRawInfoList(settings, table);
                    result          = GenerateMetadataEntityScript(settings, fileName, rawInfoList);
                });
            }

            UnityEditorUtility.ClearProgressBar();
            return(result);
        }
        private static Type GetEntityClassType(MetadataAssetSettings settings, string entityClassName)
        {
            var scriptAssetPath = PathUtility.UnifyToAltDirectorySeparatorChar(Path.Combine(settings.EntityScriptsStorePath, $"{entityClassName}.cs"));
            var scriptObject    = AssetDatabase.LoadAssetAtPath <MonoScript>(scriptAssetPath);

            return(scriptObject ? scriptObject.GetClass() : null);
        }
        private static void EncryptFileRawData(string filePath)
        {
            var settings           = MetadataAssetSettings.Load();
            var rawData            = File.ReadAllBytes(filePath);
            var dataEncryptionFlag = BitConverter.GetBytes(settings.DataEncryptionAndDecryption);

            using var writer = new BinaryWriter(new MemoryStream());
            // Write flag to judge if data need to decryption
            writer.Write(dataEncryptionFlag);

            if (settings.DataEncryptionAndDecryption)
            {
                // Write key and cipher data
                var key        = CryptoUtility.GenerateRandomKey(MetadataManager.EncryptionKeyLength);
                var cipherData = CryptoUtility.AesEncrypt(rawData, key);
                writer.Write(key);
                writer.Write(cipherData);
            }
            else
            {
                // Write raw data
                writer.Write(rawData);
            }

            var bufferData = ((MemoryStream)writer.BaseStream).GetBuffer();

            File.WriteAllBytes(filePath, bufferData);
        }
        private static List <MetadataEntity> CreateEntityDataList(MetadataAssetSettings settings, DataTable table, Type entityClassType, List <MetadataEntityRawInfo> rawInfoList)
        {
            var list     = new List <MetadataEntity>();
            var rowCount = table.Rows.Count;

            for (var i = settings.EntityDataStartingRowIndex; i < rowCount; ++i)
            {
                var entityData = (MetadataEntity)entityClassType.InvokeConstructor();

                for (int j = 0, propertiesCount = rawInfoList.Count; j < propertiesCount; ++j)
                {
                    var cellValue  = table.Rows[i][j].ToString();
                    var rowInfo    = rawInfoList[j];
                    var typeParser = PropertyTypeConverterFactory.GetTypeConverter(rowInfo.PropertyType, rowInfo.PropertyName);

                    if (typeParser != null)
                    {
                        var value = typeParser.Parse(cellValue.Trim(), rowInfo.Parameters);
                        entityData.SetPropertyValue(rowInfo.PropertyName, value);
                    }
                    else
                    {
                        UnityDebug.LogWarningFormat("Type '{0}' is not supported!", rowInfo.PropertyType);
                    }
                }

                list.Add(entityData);
            }

            return(list);
        }
        private static List <MetadataEntityRawInfo> CreateMetadataEntityRawInfoList(MetadataAssetSettings settings, DataTable table)
        {
            var columns     = table.Columns;
            var rows        = table.Rows;
            var columnCount = columns.Count;
            var list        = new List <MetadataEntityRawInfo>();

            for (var i = 0; i < columnCount; i++)
            {
                var propertyName = rows[settings.EntityPropertyNameRowIndex][i].ToString();
                var propertyType = rows[settings.EntityPropertyTypeRowIndex][i].ToString();
                var comment      = rows[settings.EntityPropertyCommentRowIndex][i].ToString();

                if (string.IsNullOrEmpty(propertyName) || string.IsNullOrEmpty(propertyType))
                {
                    continue;
                }

                propertyName = propertyName.Trim().ToTitleCase();
                propertyType = propertyType.Trim().ToLower();
                comment      = FormatCommentString(comment.Trim());

                object[] arguments = null;

                if (propertyType.Equals("enum"))
                {
                    arguments    = new object[3];
                    arguments[0] = propertyName;
                    arguments[1] = $"{propertyName}Enum";

                    var enumValues = new List <string> {
                        "None"
                    };
                    for (var j = settings.EntityDataStartingRowIndex; j < rows.Count; j++)
                    {
                        var enumValue = rows[j][i].ToString().Trim();

                        if (!string.IsNullOrEmpty(enumValue))
                        {
                            enumValues.AddUnique(enumValue);
                        }
                    }

                    arguments[2] = enumValues.ToArray();
                    propertyName = $"{propertyName}IntValue";
                }

                list.Add(new MetadataEntityRawInfo(comment, propertyType, propertyName, arguments));
            }

            return(list);
        }
Пример #6
0
 protected virtual void DrawGUIWithoutSettings()
 {
     GUILayout.Space(50);
     if (GUILayout.Button("Create Metadata Settings"))
     {
         settings = MetadataAssetSettings.Create();
     }
     GUILayout.Space(20);
     GUILayout.BeginHorizontal();
     GUILayout.Space(50);
     GUI.skin.label.wordWrap = true;
     GUILayout.Label("Click the \"Create\" button above to start using Metadata.  Once you begin, the Metadata system will save some assets to your project to keep up with its data");
     GUILayout.Space(50);
     GUILayout.EndHorizontal();
 }
        internal static bool CreateMetadataDatabaseFiles()
        {
            var result   = false;
            var settings = MetadataAssetSettings.Load();

            MetadataAssetSettings.CreateMetadataPersistentStoreFolder(settings);
            DeleteTempDbFiles();

            var dbFolderPath = EditorPath.ConvertToAbsolutePath(settings.MetadataPersistentStorePath);

            ForEachExcelFile(settings.ExcelWorkbookFilesFolderPath, (table, fileName, index, length) =>
            {
                if (table == null)
                {
                    return;
                }

                var entityClassName = fileName.ToTitleCase();
                var info            = $"Creating Database File for Entity {entityClassName}... {index + 1}/{length}";
                var progress        = (float)(index + 1) / length;
                UnityEditorUtility.DisplayProgressBar("Hold on...", info, progress);

                var rawInfoList     = CreateMetadataEntityRawInfoList(settings, table);
                var entityClassType = GetEntityClassType(settings, entityClassName);

                if (entityClassType != null)
                {
                    var entityDataList = CreateEntityDataList(settings, table, entityClassType, rawInfoList);
                    typeof(MetadataAssetUtility).InvokeGenericStaticMethod("InsertEntityData", new[] { entityClassType }, new object[] { dbFolderPath, entityClassName, rawInfoList, entityDataList, index });
                    result = true;
                }
                else
                {
                    UnityDebug.LogErrorFormat(null, "Can not find the entity class: {0}.cs!", entityClassName);
                    result = false;
                }
            });

            // Copy MetadataEntityDBConfig database file.
            if (result)
            {
                CopyDatabaseFile(dbFolderPath, MetadataEntityDBConfig.DatabaseLocalAddress);
            }

            UnityEditorUtility.ClearProgressBar();
            return(result);
        }
        private static bool GenerateMetadataEntityScript(MetadataAssetSettings settings, string entityScriptName, List <MetadataEntityRawInfo> rawInfoList)
        {
            try
            {
                entityScriptName = entityScriptName.ToTitleCase();
                var scriptTextContent = ScriptTemplate.LoadScriptTemplateFile("NewMetadataEntityScriptTemplate.txt", UnityPackageName);
                scriptTextContent = scriptTextContent.Replace(ScriptTemplate.Placeholders.Namespace, settings.EntityScriptNamespace);
                scriptTextContent = scriptTextContent.Replace(ScriptTemplate.Placeholders.ScriptName, entityScriptName);
                scriptTextContent = scriptTextContent.Replace(ScriptTemplate.Placeholders.EnumInsideOfClass, GenerateEntityScriptEnumString(rawInfoList));
                scriptTextContent = scriptTextContent.Replace(ScriptTemplate.Placeholders.Properties, GenerateEntityScriptPropertiesString(rawInfoList));

                var scriptStorePath = EditorPath.ConvertToAbsolutePath(settings.EntityScriptsStorePath, $"{entityScriptName}.cs");
                var assetPath       = EditorPath.ConvertToAssetPath(scriptStorePath);
                File.WriteAllText(scriptStorePath, scriptTextContent, new UTF8Encoding(true));
                AssetDatabase.ImportAsset(assetPath);
                return(true);
            }
            catch (Exception ex)
            {
                UnityDebug.LogError(ex.ToString());
                return(false);
            }
        }
 internal MetadataImporter(MetadataAssetSettings settings)
 {
     this.settings = settings;
 }