Ejemplo n.º 1
0
        /// <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));
                    }
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Gets the absolute path of the file this object belongs to.
        /// </summary>
        public override string GetFilePath()
        {
            ProjectObject document;

            if (ObjectDatabase.TryGetObject(DocumentId, out document))
            {
                return(document.GetFilePath());
            }
            else
            {
                return("");
            }
        }
Ejemplo n.º 3
0
        public override string ToString()
        {
            ProjectObject scriptObject;

            if (ObjectDatabase.TryGetObject(m_scriptKey, out scriptObject) &&
                !(scriptObject is NullObject))
            {
                return(scriptObject.ToString());
            }
            else
            {
                return(TypeName);
            }
        }
        /// <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));
                        }
                    }
                }
            }
        }
Ejemplo n.º 5
0
 /// <summary>
 /// Adds a new relationship to this object.
 /// </summary>
 public void AddRelationship(ObjectRelationship relationship)
 {
     ObjectDatabase.AddRelationship(UniqueId, relationship);
 }
Ejemplo n.º 6
0
        /// <summary>
        /// Sets the root directory of the project to load.
        /// </summary>
        public static void SetProjectPath(string projectPath)
        {
            //TODO: path compare
            if (string.Equals(ProjectPath, projectPath, StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            // check that the target path is a Unity project
            if (!IsUnityProject(projectPath))
            {
                throw new NotAUnityProjectException(projectPath);
            }

            // check that assets are text serialized
            {
                string projectSettings = Path.Combine(projectPath, "ProjectSettings", "ProjectSettings.asset");
                using (StreamReader fileReader = new StreamReader(new FileStream(projectSettings, FileMode.Open, FileAccess.Read)))
                {
                    try
                    {
                        YamlStream stream = new YamlStream();
                        stream.Load(new UnityTextReader(fileReader));
                    }
                    catch (YamlDotNet.Core.SyntaxErrorException)
                    {
                        throw new UnityProjectNotTextException(projectPath);
                    }
                }
            }

            // kill feeders
            foreach (IParserFeeder feeder in s_feeders)
            {
                feeder.Dispose();
            }
            s_feeders.Clear();

            // empty queue
            s_queuedFiles.Clear();

            // stop parsers
            foreach (IParserPool parserPool in s_parsers.Values)
            {
                parserPool.Stop();
            }

            // wait for all parsers to stop
            bool isParserActive = false;

            do
            {
                if (isParserActive)
                {
                    Thread.Sleep(100);
                }
                isParserActive = false;
                foreach (IParserPool parserPool in s_parsers.Values)
                {
                    if (parserPool.GetOutstandingFileCount() > 0)
                    {
                        isParserActive = true;
                        break;
                    }
                }
            } while (isParserActive);

            // unload database
            ObjectDatabase.Clear();

            ProjectPath = projectPath;

            // start up new feeders
            AddFeederType <UnityAssetParser>(
                Path.Combine(ProjectPath, "Assets"),
                new string[] { "*.unity", "*.prefab", "*.asset", "*.anim", "*.controller", "*.overridecontroller", "*.mat" });
            AddFeederType <UnityAssetParser>(
                Path.Combine(ProjectPath, "ProjectSettings"),
                new string[] { "*.asset" });
            AddFeederType <UnityMetaParser>(
                Path.Combine(ProjectPath, "Assets"),
                new string[] { "*.meta" });

            // start up new parsers
            AddParserType <UnityAssetParser>(4);
            AddParserType <UnityMetaParser>(4);

            //TODO: detect if there are no parsers for added feeders
        }