static UnityAssetParser() { // add a dummy object for "null" string emptyId = new UnityObjectKey(Guid.Empty, 0).ToString(); ObjectDatabase.AddObject(emptyId, new NullObject(emptyId)); }
static UnityMetaParser() { // add a dummy object for "null" string emptyGuid = Guid.Empty.ToString(); ObjectDatabase.AddObject(emptyGuid, new NullObject(emptyGuid)); }
/// <summary> /// Parses the specified file. /// </summary> public override void ParseFile(string absolutePath) { Guid guid = Guid.Empty; if (Path.GetExtension(absolutePath) != ".meta") { // find the meta file string metaFilePath = absolutePath + ".meta"; if (File.Exists(metaFilePath)) { guid = UnityMetaParser.ReadGuidFromMeta(metaFilePath); } } // create a project object for the document string uniqueId = guid != Guid.Empty ? guid.ToString() : absolutePath; ObjectDatabase.AddObject(uniqueId, new UnityAsset(absolutePath, uniqueId)); using (StreamReader fileReader = new StreamReader(new FileStream(absolutePath, FileMode.Open, FileAccess.Read))) { YamlStream stream = new YamlStream(); stream.Load(new UnityTextReader(fileReader)); // each document is one UnityEngine.Object foreach (YamlDocument document in stream.Documents) { YamlMappingNode documentNode = (YamlMappingNode)document.RootNode; if (documentNode.Anchor == null) { // might be a JSON file (XRSettings.asset), skip for now continue; } long fileId = long.Parse(documentNode.Anchor); UnityObjectKey key = new UnityObjectKey(guid, fileId); KeyValuePair <YamlNode, YamlNode> rootNode = documentNode.Children.First(); YamlScalarNode rootNodeScalar = (YamlScalarNode)rootNode.Key; if (rootNodeScalar.Value == "GameObject") { ObjectDatabase.AddObject(key, new UnityGameObject(uniqueId, document, key)); } else if (rootNodeScalar.Value == "Prefab") { ObjectDatabase.AddObject(key, new UnityPrefabInstance(uniqueId, document, key)); } else { ObjectDatabase.AddObject(key, new UnityComponent(uniqueId, document, key)); } } } }
/// <summary> /// Parses the specified file. /// </summary> public override void ParseFile(string absolutePath) { using (StreamReader fileReader = new StreamReader(new FileStream(absolutePath, FileMode.Open, FileAccess.Read))) { YamlStream stream = new YamlStream(); stream.Load(fileReader); YamlDocument document = stream.Documents[0]; YamlMappingNode rootNode = (YamlMappingNode)document.RootNode; YamlScalarNode guidNode = (YamlScalarNode)rootNode.Children["guid"]; Guid assetGuid = new Guid(guidNode.Value); string assetUniqueId = assetGuid.ToString(); // determine the asset's default file id int defaultFileId = 0; foreach (string key in rootNode.Children.Keys) { if (key.EndsWith("Importer", StringComparison.OrdinalIgnoreCase)) { int classId; if (UnityClassIds.TryGetClassIdByImporterName(key, out classId)) { defaultFileId = classId * 100000; break; } } } UnityObjectKey defaultAssetKey = new UnityObjectKey(assetGuid, defaultFileId); bool isFolderAsset = false; YamlNode folderAssetNode; if (rootNode.Children.TryGetValue("folderAsset", out folderAssetNode)) { YamlScalarNode folderAssetScalarNode = (YamlScalarNode)folderAssetNode; isFolderAsset = folderAssetScalarNode.Value == "yes"; } if (isFolderAsset) { string folderPath = Path.Combine(Path.GetDirectoryName(absolutePath), Path.GetFileNameWithoutExtension(absolutePath)); ObjectDatabase.MapFolderObject(folderPath, assetUniqueId); ObjectDatabase.AddObject(assetUniqueId, new UnityFolder(absolutePath, assetGuid)); } else { // metas shouldn't override assets we've already parsed ObjectDatabase.AddPlaceholderObject(assetUniqueId, new UnityAsset(absolutePath, assetUniqueId)); if (defaultAssetKey.FileId != 0) { ObjectDatabase.AddObject(defaultAssetKey.ToString(), new UnityDefaultAsset(assetUniqueId, defaultAssetKey)); } } // check for sprites YamlNode textureImporterNode; if (rootNode.Children.TryGetValue("TextureImporter", out textureImporterNode)) { YamlMappingNode textureImporterMappingNode = (YamlMappingNode)textureImporterNode; YamlNode fileIDToRecycleNameNode; if (textureImporterMappingNode.Children.TryGetValue("fileIDToRecycleName", out fileIDToRecycleNameNode)) { YamlMappingNode fileIDToRecycleNameMappingNode = (YamlMappingNode)fileIDToRecycleNameNode; foreach (var kv in fileIDToRecycleNameMappingNode.Children) { string fileIdStr = ((YamlScalarNode)kv.Key).Value; string name = ((YamlScalarNode)kv.Value).Value; long fileId = long.Parse(fileIdStr); UnityObjectKey spriteKey = new UnityObjectKey(assetGuid, fileId); ObjectDatabase.AddObject(spriteKey.ToString(), new UnitySprite(assetUniqueId, name, spriteKey)); } } YamlNode spriteModeNode; if (textureImporterMappingNode.Children.TryGetValue("spriteMode", out spriteModeNode)) { YamlScalarNode spriteModeScalarNode = (YamlScalarNode)spriteModeNode; if (spriteModeScalarNode.Value == "1") { // single sprite string name = Path.GetFileNameWithoutExtension(absolutePath); UnityObjectKey spriteKey = new UnityObjectKey(assetGuid, 21300000); ObjectDatabase.AddObject(spriteKey.ToString(), new UnitySprite(assetUniqueId, name, spriteKey)); } } } } }