Ejemplo n.º 1
0
        private void BuildBundleContent(ref List <string> result, string fileUrl, AssetFile file, AssetToolUtils assetToolUtils)
        {
            foreach (AssetFileInfoEx info in file.fileInstance.table.assetFileInfo)
            {
                ClassDatabaseType type = AssetHelper.FindAssetClassByID(file.classDBFile, info.curFileType);
                if (type == null)
                {
                    continue;
                }

                string typeName = type.name.GetString(file.classDBFile);
                if (typeName != "MonoBehaviour")
                {
                    continue;
                }

                AssetTypeValueField        baseField    = AssetToolUtils.GetATI(file, info).GetBaseField();
                List <AssetTypeValueField> targetFields = AssetToolUtils.GetFieldAtPath(file, baseField, configPath.Split(':'));
                if (targetFields.Count == 0)
                {
                    continue;
                }

                if (!AssetToolUtils.IsMatchingPathConstraints(file, baseField, pathConstraints))
                {
                    continue;
                }

                Console.WriteLine("found " + targetFields.Count + " matches in mono-behaviour at path: " + configPath);

                foreach (AssetTypeValueField targetField in targetFields)
                {
                    List <AssetTypeValueField> fileNameFields = AssetToolUtils.GetFieldAtPath(file, targetField, fileNamePath.Split(':'));
                    Console.WriteLine("found " + fileNameFields.Count + " fileNameFields in targetField at path: " + fileNamePath);

                    foreach (string value in fileNameFields
                             .Select(fileNameField => fileNameField.GetValue().AsString().Trim())
                             .Where(fileName => CustomRegex.AllMatching(fileName, fileNameRegexFilters))
                             .SelectMany(fileName => ApplySubFilters(fileName, baseField, targetField, file, assetToolUtils)))
                    {
                        if (!result.Contains(value))
                        {
                            result.Add(value);
                        }
                    }
                }
            }
        }
        private void BuildBundleContent(ref Dictionary <string, Dictionary <string, List <string> > > result, string fileUrl, AssetFile file,
                                        AssetToolUtils assetToolUtils)
        {
            Console.WriteLine("building bundle content!");
            foreach (AssetFileInfoEx info in file.fileInstance.table.assetFileInfo)
            {
                ClassDatabaseType type = AssetHelper.FindAssetClassByID(file.classDBFile, info.curFileType);
                if (type == null)
                {
                    continue;
                }

                string typeName = type.name.GetString(file.classDBFile);
                if (typeName != "MonoBehaviour")
                {
                    continue;
                }

                AssetTypeValueField baseField = AssetToolUtils.GetATI(file, info).GetBaseField();

                List <AssetTypeValueField> targetFields = AssetToolUtils.GetFieldAtPath(file, baseField, configPath.Split(':'));
                if (targetFields.Count == 0)
                {
                    continue;
                }

                if (!AssetToolUtils.IsMatchingPathConstraints(file, baseField, pathConstraints))
                {
                    continue;
                }

                Console.WriteLine("found " + targetFields.Count + " matches in mono-behaviour at path " + configPath);

                foreach (AssetTypeValueField targetField in targetFields)
                {
                    List <string> mapByField = mapConfigBy.GetMapValues(fileUrl, file, baseField, targetField, assetToolUtils);
                    Console.WriteLine("found " + mapByField.Count + " mapFields in targetField at mapConfigBy.path");

                    foreach (string mapValue in mapByField)
                    {
                        Dictionary <string, List <string> > secondaryValues = new Dictionary <string, List <string> >();

                        foreach (OnlineInterpreterFilter filter in configFilter)
                        {
                            List <string> filterValues = new List <string>();

                            List <AssetTypeValueField> filterFields = filter.pathType switch {
                                EOnlineInterpreterPathType.relative => AssetToolUtils.GetFieldAtPath(file, targetField, filter.path.Split(':')),
                                EOnlineInterpreterPathType.absolute => AssetToolUtils.GetFieldAtPath(file, baseField, filter.path.Split(':')),
                                _ => throw new InvalidOperationException("pathType " + filter.pathType +
                                                                         " is not supported by OnlineSourceInterpreterConfig.cs")
                            };

                            Console.WriteLine("found " + filterFields.Count + " fields at path: " + filter.path);
                            filterValues.AddRange(filterFields
                                                  .Where(field => field.GetValue() != null)
                                                  .Select(field => ResolveTranslationValue(field.GetValue().AsString().Trim(), filter.outputName)));

                            secondaryValues[filter.outputName] = filterValues;
                        }

                        if (result.ContainsKey(mapValue))
                        {
                            foreach (string key in secondaryValues.Keys)
                            {
                                if (result[mapValue].ContainsKey(key))
                                {
                                    result[mapValue][key].AddRange(secondaryValues[key]);
                                }
                                else
                                {
                                    result[mapValue][key] = secondaryValues[key];
                                }
                            }
                        }
                        else
                        {
                            result[mapValue] = secondaryValues;
                        }

                        LevelMappingResult(ref result, mapValue);
                    }
                }
            }
        }
        private void Run()
        {
            EOnlineDataType onlineDataType = materialExtractor.onlineSourcesConfig.GetValue().dataType.GetValue();

            switch (onlineDataType)
            {
            case EOnlineDataType.bundleFile:
                Dictionary <string, List <string> > materialToColorList = new Dictionary <string, List <string> >();
                foreach (string dataFileUrL in materialExtractor.onlineSourcesConfig.GetValue().GetDataFileURLs())
                {
                    if (!materialExtractor.downloadSettings.GetValue().doDownload.GetValue())
                    {
                        Console.WriteLine("would download: " + dataFileUrL);
                        continue;
                    }

                    List <string> pathConstraints = new List <string> {
                        "m_SavedProperties:m_Colors:Array:data:first=_PrimaryColor",
                        "m_SavedProperties:m_Colors:Array:data:first=_SecondaryColor",
                        "m_SavedProperties:m_Colors:Array:data:first=_TertiaryColor"
                    };

                    try {
                        Console.WriteLine("loading bundle data from url: " + dataFileUrL);
                        using var client = new WebClient();
                        using var stream = new MemoryStream(client.DownloadData(dataFileUrL));
                        var assetToolUtils = new AssetToolUtils();
                        Console.WriteLine("Download done, building AssetsFileInstance...");
                        foreach (AssetFile file in assetToolUtils.BuildAssetsFileInstance(stream))
                        {
                            foreach (AssetFileInfoEx info in file.fileInstance.table.assetFileInfo)
                            {
                                ClassDatabaseType type = AssetHelper.FindAssetClassByID(file.classDBFile, info.curFileType);
                                if (type == null)
                                {
                                    continue;
                                }

                                string typeName = type.name.GetString(file.classDBFile);
                                if (typeName != "Material")
                                {
                                    continue;
                                }

                                AssetTypeValueField baseField = AssetToolUtils.GetATI(file, info).GetBaseField();
                                string materialName           = AssetToolUtils.GetFieldAtPath(file, baseField, "m_Name".Split(":")).FirstOrDefault()?.GetValue()?.AsString();
                                if (materialName == null)
                                {
                                    continue;
                                }

                                Console.WriteLine($"\tchecking Material '{materialName}'");

                                if (!AssetToolUtils.IsMatchingPathConstraints(file, baseField, pathConstraints))
                                {
                                    Console.WriteLine("\t\tMaterial did not match path constraints!");
                                    continue;
                                }

                                List <string> colors = new List <string> {
                                    "", "", ""
                                };
                                foreach (AssetTypeValueField colorDataField in AssetToolUtils.GetFieldAtPath(file, baseField, "m_SavedProperties:m_Colors:Array:data".Split(":")))
                                {
                                    string red   = AssetToolUtils.GetFieldAtPath(file, colorDataField, "second:r".Split(":")).FirstOrDefault()?.GetValue()?.AsString();
                                    string green = AssetToolUtils.GetFieldAtPath(file, colorDataField, "second:g".Split(":")).FirstOrDefault()?.GetValue()?.AsString();
                                    string blue  = AssetToolUtils.GetFieldAtPath(file, colorDataField, "second:b".Split(":")).FirstOrDefault()?.GetValue()?.AsString();
                                    string alpha = AssetToolUtils.GetFieldAtPath(file, colorDataField, "second:a".Split(":")).FirstOrDefault()?.GetValue()?.AsString();
                                    if (red == null || green == null || blue == null || alpha == null)
                                    {
                                        Console.WriteLine("\t\trgba was null!");
                                        continue;
                                    }
                                    string colorString = $"r={red};g={green};b={blue};a={alpha}";

                                    if (AssetToolUtils.IsMatchingPathConstraints(file, colorDataField, "first=_PrimaryColor"))
                                    {
                                        colors[0] = colorString;
                                    }
                                    else if (AssetToolUtils.IsMatchingPathConstraints(file, colorDataField, "first=_SecondaryColor"))
                                    {
                                        colors[1] = colorString;
                                    }
                                    else if (AssetToolUtils.IsMatchingPathConstraints(file, colorDataField, "first=_TertiaryColor"))
                                    {
                                        colors[2] = colorString;
                                    }
                                }
                                materialToColorList[materialName] = colors;
                            }
                        }
                    } catch (Exception e) {
                        Console.WriteLine($"\tEncountered an exception! {e}");
                        if (materialExtractor.downloadSettings.GetValue().pauseDownloadOnError.GetValue())
                        {
                            Console.WriteLine("\twaiting for user acknowledgement. Press any key to continue...");
                            Console.ReadKey(true);
                        }
                    }
                }

                string targetFile      = materialExtractor.GetResultFile("extraction");
                string targetDirectory = Path.GetDirectoryName(targetFile);
                if (!Directory.Exists(targetDirectory))
                {
                    Console.WriteLine("Had to create directory: " + targetDirectory);
                    Directory.CreateDirectory(targetDirectory);
                }

                using (StreamWriter writer = new StreamWriter(targetFile, false)) {
                    List <string> header = new List <string> {
                        "MaterialName", "Primary", "Secondary", "Tertiary"
                    };
                    Console.WriteLine(string.Join("\t", header));
                    writer.WriteLine(string.Join("\t", header));
                    foreach ((string materialName, List <string> colorsInOrder) in materialToColorList)
                    {
                        Console.WriteLine(materialName + "\t" + string.Join("\t", colorsInOrder));
                        writer.WriteLine(materialName + "\t" + string.Join("\t", colorsInOrder));
                    }
                }

                break;

            case EOnlineDataType.xmlFile:
            default:
                throw new InvalidOperationException("OnlineDataType " + onlineDataType + " not supported by MaterialExtractor!");
            }

            Console.WriteLine("Press any key to continue.");
            Console.ReadKey(true);
        }