예제 #1
0
        public ActionResult Create(AssetDocumentViewModel vm)
        {
            if (ModelState.IsValid)
            {
                var newDocument = new AssetDocument
                {
                    AssetId      = vm.AssetId,
                    DocumentType = vm.DocumentType,
                    FileSize     = 0.0
                };

                if (vm.Document != null)
                {
                    var siteSettings      = _settingsService.GetSiteSettings();
                    var blobUploadService = new BlobUploadService(siteSettings.BlobSettings);
                    var blobPath          = blobUploadService.UploadITDocument(vm.Document);
                    newDocument.DocumentPath = blobPath;
                    newDocument.FileName     = vm.Document.FileName;
                }

                _assetDocumentRepository.Create(newDocument);
                _unitOfWork.Commit();

                return(RedirectToAction("Details", "Assets", new { id = vm.AssetId }));
            }

            return(View(vm));
        }
예제 #2
0
        public static void CreateIndex()
        {
            var connectionToEs = ElasticSearchConnectionSettings.connection();

            if (connectionToEs.IndexExists(assetIndexName).Exists)
            {
                var response = connectionToEs.DeleteIndex(assetIndexName);
            }
            var createIndexResponse = connectionToEs.CreateIndex(assetIndexName,
                                                                 c => c.Map <AssetDocument>(m => m.AutoMap()));


            using (DB.DOAMEntities db = new MyApp.Infrastructure.DB.DOAMEntities())
            {
                foreach (var asset in db.Assets)
                {
                    var assetDocument = new AssetDocument()
                    {
                        AssetID       = asset.AssetID,
                        TypeAssetName = GetNameAssetParTypeId(asset.AssetID),
                        Name          = asset.Name,
                        Url           = asset.Url,
                        ThumbnailUrl  = asset.ThumbnailUrl,
                        Description   = asset.Description,
                        Compteur      = asset.Compteur
                    };

                    var assetMetadata = asset.AssetMetaDatas.Select(t => t).Distinct();
                    foreach (var assets in assetMetadata)
                    {
                        assetDocument.AssetMetadatas.Add(new IndexDocuments.AssetMetaData
                        {
                            AssetMetaDataID = assets.AssetMetaDataID,
                            AssetName       = assets.MetaData.Title,
                            Value           = assets.Value,
                        });
                    }

                    var assetTag = asset.AssetTags.Select(t => t.Tag).Distinct();
                    foreach (var assetTags in assetTag)
                    {
                        assetDocument.Tags.Add(new IndexDocuments.Tag
                        {
                            TagID = assetTags.TagID,
                            Label = assetTags.Label,
                        });
                    }

                    var indexResponse = connectionToEs.Index(assetDocument, c => c.Index(assetIndexName));
                }
            }
        }
        public object Build(SeldomInterruptChecker checker, IPsiSourceFile file, AssetDocument document)
        {
            if (AssetUtils.IsMonoBehaviourDocument(document.Buffer))
            {
                return(ExtractStateMachineBehaviour(document, file));
            }
            var animatorExtractor = new AnimatorExtractor(file, document);

            if (AssetUtils.IsAnimatorStateMachine(document.Buffer))
            {
                return(animatorExtractor.TryExtractStateMachine());
            }
            return(AssetUtils.IsAnimatorState(document.Buffer) ? animatorExtractor.TryExtractUsage() : null);
        }
        private static AnimatorScript?ExtractStateMachineBehaviour([NotNull] AssetDocument document,
                                                                   [NotNull] IPsiSourceFile file)
        {
            var anchorRaw = AssetUtils.GetAnchorFromBuffer(document.Buffer);

            if (!anchorRaw.HasValue)
            {
                return(null);
            }
            var guid = (document.Document.FindRootBlockMapEntries()?.Entries)?
                       .Cast <IBlockMappingEntry>()
                       .Where(entry => entry != null && entry.Key.MatchesPlainScalarText("m_Script") && entry.Content != null)
                       .Select(entry => entry.Content.Value.ToHierarchyReference(file) as ExternalReference?)
                       .FirstOrDefault()?
                       .ExternalAssetGuid;

            return(guid != null ? new AnimatorScript(guid.Value, anchorRaw.Value) : (AnimatorScript?)null);
        }
        public IHttpActionResult FileUpload(long entityTypeId, int CreatedBy)
        {
            //long entityTypeId;
            string entityName = string.Empty;

            var httpRequest = HttpContext.Current.Request;

            //entityTypeId = Convert.ToInt64(httpRequest.Form["EntityTypeId"]);
            entityName = httpRequest.Form["Entity"];
            if (httpRequest.Files.Count > 0 && httpRequest.Form.Keys.Count > 0)
            {
                var entityId = db.Entities.Where(x => x.EntityName == entityName).Select(y => y.EntityId).FirstOrDefault();
                fileLocation = fileLocation + "/" + entityId + "/" + entityTypeId + "/";
                if (!Directory.Exists(fileLocation))
                {
                    Directory.CreateDirectory(fileLocation);
                }

                foreach (string file in httpRequest.Files)
                {
                    var postedFile = httpRequest.Files[file];
                    var filePath   = fileLocation + postedFile.FileName;
                    postedFile.SaveAs(filePath);

                    var assetDocument = new AssetDocument();
                    assetDocument.EntityId     = entityId;
                    assetDocument.EntityTypeId = entityTypeId;
                    assetDocument.FilePath     = fileLocation;
                    assetDocument.FileName     = postedFile.FileName;
                    assetDocument.IsActive     = true;
                    assetDocument.CreatedOn    = System.DateTime.Now;
                    assetDocument.CreatedBy    = CreatedBy;
                    //assetDocument.FileUpload = FileUpload;
                    db.AssetDocuments.Add(assetDocument);
                }
                db.SaveChanges();
            }
            return(Ok("success"));
        }
예제 #6
0
        static SearchItem CreateItem(SearchContext context, SearchProvider provider, AssetDocument doc, int score)
        {
            var label = doc.name_en_US;

            if (purchasePackageIds != null && purchasePackageIds.Contains(doc.id))
            {
                label += " (Owned)";
            }
            else if (doc.price_USD == 0)
            {
                label += " (Free)";
            }

            var description = $"{doc.publisher} - {doc.category_slug}";
            var item        = provider.CreateItem(context, doc.id, score, label, description, null, doc);

            item.options &= ~SearchItemOptions.FuzzyHighlight;
            item.options &= ~SearchItemOptions.Highlight;

            doc.productDetail = null;
            doc.url           = $"https://assetstore.unity.com/packages/{doc.category_slug}/{doc.id}";
            return(item);
        }
        static SearchItem CreateItem(SearchContext context, SearchProvider provider, AssetDocument doc, int score)
        {
            var priceStr = "";

            if (purchasePackageIds != null && purchasePackageIds.Contains(doc.id))
            {
                priceStr = "Owned";
            }
            else
            {
                priceStr = doc.price_USD == 0 ? "Free" : $"{doc.price_USD:0.00}$";
            }

            var description = $"{doc.publisher} - {doc.category_slug} - <color=#F6B93F>{priceStr}</color>";

            #if QUICKSEARCH_DEBUG
            description += $" id: {doc.id}";
            #endif
            var item = provider.CreateItem(context, doc.id, score, doc.name_en_US, description, null, doc);

            doc.productDetail = null;
            doc.url           = $"https://assetstore.unity.com/packages/{doc.category_slug}/{doc.id}";
            return(item);
        }
        public object Build(SeldomInterruptChecker seldomInterruptChecker, IPsiSourceFile currentAssetSourceFile, AssetDocument assetDocument)
        {
            var modifications = ProcessPrefabModifications(currentAssetSourceFile, assetDocument);

            if (AssetUtils.IsMonoBehaviourDocument(assetDocument.Buffer))
            {
                var anchor = AssetUtils.GetAnchorFromBuffer(assetDocument.Buffer);
                if (!anchor.HasValue)
                {
                    return(new InspectorValuesBuildResult(new LocalList <InspectorVariableUsage>(), modifications));
                }

                var dictionary = new Dictionary <string, IAssetValue>();
                var entries    = assetDocument.Document.FindRootBlockMapEntries()?.Entries;
                if (entries == null)
                {
                    return(new InspectorValuesBuildResult(new LocalList <InspectorVariableUsage>(), modifications));
                }

                foreach (var entry in entries)
                {
                    var key = entry.Key.GetPlainScalarText();
                    if (key == null || ourIgnoredMonoBehaviourEntries.Contains(key))
                    {
                        continue;
                    }

                    foreach (var deserializer in myDeserializers)
                    {
                        try
                        {
                            if (deserializer.TryGetInspectorValue(currentAssetSourceFile, entry.Content, out var resultValue))
                            {
                                dictionary[key] = resultValue;
                                break;
                            }
                        }
                        catch (Exception e)
                        {
                            myLogger.Error(e, "An error occurred while deserializing value {0}", deserializer.GetType().Name);
                        }
                    }
                }

                if (dictionary.TryGetValue(UnityYamlConstants.ScriptProperty, out var scriptValue) && scriptValue is AssetReferenceValue referenceValue &&
                    referenceValue.Reference is ExternalReference script)
                {
                    var location = new LocalReference(currentAssetSourceFile.PsiStorage.PersistentIndex.NotNull("owningPsiPersistentIndex != null"), anchor.Value);
                    var result   = new LocalList <InspectorVariableUsage>();

                    foreach (var(key, value) in dictionary)
                    {
                        if (key.Equals(UnityYamlConstants.ScriptProperty) || key.Equals(UnityYamlConstants.GameObjectProperty))
                        {
                            continue;
                        }

                        result.Add(new InspectorVariableUsage(location, script, key, value));
                    }

                    return(new InspectorValuesBuildResult(result, modifications));
                }
            }

            return(new InspectorValuesBuildResult(new LocalList <InspectorVariableUsage>(), modifications));
        }
        private ImportedInspectorValues ProcessPrefabModifications(IPsiSourceFile currentSourceFile, AssetDocument assetDocument)
        {
            var result = new ImportedInspectorValues();

            if (assetDocument.HierarchyElement is IPrefabInstanceHierarchy prefabInstanceHierarchy)
            {
                foreach (var modification in prefabInstanceHierarchy.PrefabModifications)
                {
                    if (!(modification.Target is ExternalReference externalReference))
                    {
                        continue;
                    }

                    if (modification.PropertyPath.Contains("."))
                    {
                        continue;
                    }

                    var location = new LocalReference(currentSourceFile.PsiStorage.PersistentIndex.NotNull("owningPsiPersistentIndex != null"), PrefabsUtil.GetImportedDocumentAnchor(prefabInstanceHierarchy.Location.LocalDocumentAnchor, externalReference.LocalDocumentAnchor));
                    result.Modifications[new ImportedValueReference(location, modification.PropertyPath)] = (modification.Value, new AssetReferenceValue(modification.ObjectReference));
                }
            }

            return(result);
        }
예제 #10
0
 public AnimatorExtractor([NotNull] IPsiSourceFile file,
                          [NotNull] AssetDocument document)
 {
     myFile     = file;
     myDocument = document;
 }
        public IUnityAssetDataElement Build(SeldomInterruptChecker checker, IPsiSourceFile currentSourceFile, AssetDocument assetDocument)
        {
            var anchorRaw = AssetUtils.GetAnchorFromBuffer(assetDocument.Buffer);

            if (!anchorRaw.HasValue)
            {
                return(null);
            }

            var anchor = anchorRaw.Value;

            var isStripped                = AssetUtils.IsStripped(assetDocument.Buffer);
            var gameObject                = AssetUtils.GetGameObject(assetDocument.Buffer)?.ToReference(currentSourceFile) as LocalReference;
            var prefabInstance            = AssetUtils.GetPrefabInstance(assetDocument.Buffer)?.ToReference(currentSourceFile) as LocalReference;
            var correspondingSourceObject = AssetUtils.GetCorrespondingSourceObject(assetDocument.Buffer)?.ToReference(currentSourceFile) as ExternalReference;
            var location = new LocalReference(currentSourceFile.PsiStorage.PersistentIndex, anchor);

            if (AssetUtils.IsMonoBehaviourDocument(assetDocument.Buffer))
            {
                var entries = assetDocument.Document.FindRootBlockMapEntries()?.Entries;
                if (entries == null)
                {
                    return(null);
                }

                AssetDocumentReference documentReference = null;

                foreach (var entry in entries)
                {
                    if (entry.Key.MatchesPlainScalarText(UnityYamlConstants.ScriptProperty))
                    {
                        documentReference = entry.Content.Value.AsFileID();
                        break;
                    }
                }

                var scriptAnchor = documentReference?.AnchorLong;
                var scriptGuid   = documentReference?.ExternalAssetGuid;
                if (isStripped || scriptAnchor != null && scriptGuid != null)
                {
                    return(new AssetDocumentHierarchyElement(
                               new ScriptComponentHierarchy(location,
                                                            isStripped ? null : new ExternalReference(scriptGuid, scriptAnchor.Value),
                                                            gameObject,
                                                            prefabInstance,
                                                            correspondingSourceObject,
                                                            isStripped
                                                            )));
                }
            }
            else if (AssetUtils.IsTransform(assetDocument.Buffer))
            {
                var father    = AssetUtils.GetTransformFather(assetDocument.Buffer)?.ToReference(currentSourceFile) as LocalReference;
                var rootIndex = AssetUtils.GetRootIndex(assetDocument.Buffer);
                return(new AssetDocumentHierarchyElement(
                           new TransformHierarchy(location, gameObject, father, rootIndex, prefabInstance, correspondingSourceObject, isStripped)));
            }
            else if (AssetUtils.IsGameObject(assetDocument.Buffer))
            {
                var name = AssetUtils.GetGameObjectName(assetDocument.Buffer);
                if (isStripped || name != null)
                {
                    return(new AssetDocumentHierarchyElement(new GameObjectHierarchy(location, name, prefabInstance, correspondingSourceObject, isStripped)));
                }
            }
            else if (AssetUtils.IsPrefabModification(assetDocument.Buffer))
            {
                var modification    = AssetUtils.GetPrefabModification(assetDocument.Document);
                var parentTransform = modification?.GetValue("m_TransformParent")?.AsFileID()?.ToReference(currentSourceFile) as LocalReference;
                var modifications   = modification?.GetValue("m_Modifications") as IBlockSequenceNode;
                var result          = new List <PrefabModification>();
                if (modifications != null)
                {
                    foreach (var entry in modifications.Entries)
                    {
                        var map = entry.Value as IBlockMappingNode;
                        if (map == null)
                        {
                            continue;
                        }

                        var target = map.GetValue("target").AsFileID()?.ToReference(currentSourceFile);
                        if (target == null)
                        {
                            continue;
                        }

                        var name = map.GetValue("propertyPath").GetPlainScalarText();
                        if (name == null)
                        {
                            continue;
                        }

                        var valueNode = map.FindMapEntryBySimpleKey("value")?.Content;
                        if (valueNode == null)
                        {
                            continue;
                        }

                        IAssetValue value = null;
                        foreach (var assetInspectorValueDeserializer in myAssetInspectorValueDeserializers)
                        {
                            if (assetInspectorValueDeserializer.TryGetInspectorValue(currentSourceFile, valueNode, out value))
                            {
                                break;
                            }
                        }
                        if (value == null)
                        {
                            continue;
                        }

                        result.Add(new PrefabModification(target, name, value));
                    }
                }

                var sourcePrefabGuid = AssetUtils.GetSourcePrefab(assetDocument.Buffer)?.ToReference(currentSourceFile) as ExternalReference;
                if (sourcePrefabGuid == null)
                {
                    return(null);
                }
                return(new AssetDocumentHierarchyElement(new PrefabInstanceHierarchy(location, sourcePrefabGuid.ExternalAssetGuid, parentTransform, result)));
            }
            else // regular component
            {
                var name = AssetUtils.GetRawComponentName(assetDocument.Buffer);
                if (name == null)
                {
                    return(null);
                }

                return(new AssetDocumentHierarchyElement(
                           new ComponentHierarchy(name, location, gameObject, prefabInstance, correspondingSourceObject, isStripped)));
            }
            return(null);
        }
        public IUnityAssetDataElement Build(SeldomInterruptChecker checker, IPsiSourceFile currentSourceFile, AssetDocument assetDocument)
        {
            // TODO: deps for other assets
            if (AssetUtils.IsMonoBehaviourDocument(assetDocument.Buffer))
            {
                var  anchorRaw = AssetUtils.GetAnchorFromBuffer(assetDocument.Buffer);
                bool stripped  = AssetUtils.IsStripped(assetDocument.Buffer);
                if (stripped) // we will handle it in prefabs
                {
                    return(null);
                }

                if (!anchorRaw.HasValue)
                {
                    return(null);
                }

                var anchor = anchorRaw.Value;

                var entries = assetDocument.Document.FindRootBlockMapEntries()?.Entries;
                if (entries == null)
                {
                    return(null);
                }
                foreach (var entry in entries)
                {
                    if (!entry.Key.MatchesPlainScalarText("m_Script"))
                    {
                        continue;
                    }

                    var deps = entry.Content.Value.AsFileID()?.ToReference(currentSourceFile);
                    if (deps == null)
                    {
                        continue;
                    }

                    return(new AssetUsagesDataElement(
                               new AssetUsage(
                                   new LocalReference(currentSourceFile.PsiStorage.PersistentIndex, anchor), new [] { deps })));
                }
            }

            return(null);
        }
예제 #13
0
        public object Build(SeldomInterruptChecker checker, IPsiSourceFile currentAssetSourceFile, AssetDocument assetDocument)
        {
            // TODO: deps for other assets
            if (AssetUtils.IsMonoBehaviourDocument(assetDocument.Buffer))
            {
                var  anchorRaw = AssetUtils.GetAnchorFromBuffer(assetDocument.Buffer);
                bool stripped  = AssetUtils.IsStripped(assetDocument.Buffer);
                if (stripped) // we will handle it in prefabs
                {
                    return(null);
                }

                if (!anchorRaw.HasValue)
                {
                    return(null);
                }

                var anchor = anchorRaw.Value;

                var entries = assetDocument.Document.FindRootBlockMapEntries()?.Entries;
                if (entries == null)
                {
                    return(null);
                }

                var result = new LocalList <AssetScriptUsage>();
                foreach (var entry in entries)
                {
                    if (!entry.Key.MatchesPlainScalarText("m_Script"))
                    {
                        continue;
                    }

                    var deps = entry.Content.Value.ToHierarchyReference(currentAssetSourceFile);
                    if (deps is ExternalReference externalReference)
                    {
                        result.Add(new AssetScriptUsage(new LocalReference(currentAssetSourceFile.Ptr().Id, anchor), externalReference));
                    }
                }

                return(result);
            }

            return(null);
        }
예제 #14
0
        private ImportedUnityEventData ProcessPrefabModifications(IPsiSourceFile currentFile, AssetDocument document)
        {
            var result = new ImportedUnityEventData();

            if (document.HierarchyElement is IPrefabInstanceHierarchy prefabInstanceHierarchy)
            {
                var assetMethodDataToModifiedFields = new OneToSetMap <(LocalReference, string, int), string>();
                foreach (var modification in prefabInstanceHierarchy.PrefabModifications)
                {
                    if (!(modification.Target is ExternalReference externalReference))
                    {
                        continue;
                    }

                    if (!modification.PropertyPath.Contains("m_PersistentCalls"))
                    {
                        continue;
                    }

                    var location       = new LocalReference(currentFile.PsiStorage.PersistentIndex, PrefabsUtil.GetImportedDocumentAnchor(prefabInstanceHierarchy.Location.LocalDocumentAnchor, externalReference.LocalDocumentAnchor));
                    var parts          = modification.PropertyPath.Split('.');
                    var unityEventName = parts[0];


                    var dataPart = parts.FirstOrDefault(t => t.StartsWith("data"));
                    if (dataPart == null)
                    {
                        continue;
                    }

                    if (!int.TryParse(dataPart.RemoveStart("data[").RemoveEnd("]"), out var index))
                    {
                        continue;
                    }

                    result.UnityEventToModifiedIndex.Add((location, unityEventName), index);
                    var last = parts.Last();
                    if (last.Equals("m_MethodName") && modification.Value is AssetSimpleValue assetSimpleValue)
                    {
                        result.AssetMethodNameInModifications.Add(assetSimpleValue.SimpleValue);
                    }

                    assetMethodDataToModifiedFields.Add((location, unityEventName, index), last);
                }

                foreach (var(_, set) in assetMethodDataToModifiedFields)
                {
                    if (!set.Contains("m_MethodName"))
                    {
                        result.HasEventModificationWithoutMethodName = true;
                    }
                }
            }

            return(result);
        }
        public IUnityAssetDataElement Build(SeldomInterruptChecker checker, IPsiSourceFile currentSourceFile, AssetDocument assetDocument)
        {
            var buffer = assetDocument.Buffer;

            if (ourMethodNameSearcher.Find(buffer) < 0)
            {
                return(null);
            }

            var anchorRaw = AssetUtils.GetAnchorFromBuffer(assetDocument.Buffer);

            if (!anchorRaw.HasValue)
            {
                return(null);
            }

            var anchor = anchorRaw.Value;

            var entries = assetDocument.Document.FindRootBlockMapEntries()?.Entries;

            if (entries == null)
            {
                return(null);
            }

            var result = new List <AssetMethodData>();

            foreach (var entry in entries)
            {
                if (ourMethodNameSearcher.Find(entry.Content.GetTextAsBuffer()) >= 0)
                {
                    var rootMap            = entry.Content.Value as IBlockMappingNode;
                    var persistentCallsMap = rootMap.GetValue("m_PersistentCalls") as IBlockMappingNode;
                    var mCalls             = persistentCallsMap.GetValue("m_Calls") as IBlockSequenceNode;
                    if (mCalls == null)
                    {
                        return(null);
                    }

                    var eventTypeName = rootMap.GetValue("m_TypeName").GetPlainScalarText();

                    foreach (var call in mCalls.Entries)
                    {
                        var methodDescription = call.Value as IBlockMappingNode;
                        if (methodDescription == null)
                        {
                            continue;
                        }

                        var fileID = methodDescription.FindMapEntryBySimpleKey("m_Target")?.Content.Value.AsFileID();
                        if (fileID == null || fileID.IsNullReference)
                        {
                            continue;
                        }

                        var methodNameNode = methodDescription.GetValue("m_MethodName");
                        var methodName     = methodNameNode?.GetPlainScalarText();
                        if (methodName == null)
                        {
                            continue;
                        }

                        var methodNameRange = methodNameNode.GetTreeTextRange();

                        var arguments = methodDescription.GetValue("m_Arguments") as IBlockMappingNode;
                        var modeText  = methodDescription.GetValue("m_Mode")?.GetPlainScalarText();
                        var argMode   = EventHandlerArgumentMode.EventDefined;
                        if (int.TryParse(modeText, out var mode))
                        {
                            if (1 <= mode && mode <= 6)
                            {
                                argMode = (EventHandlerArgumentMode)mode;
                            }
                        }

                        var argumentTypeName = arguments.GetValue("m_ObjectArgumentAssemblyTypeName")?.GetPlainScalarText();

                        var type = argumentTypeName?.Split(',').FirstOrDefault();
                        if (argMode == EventHandlerArgumentMode.EventDefined)
                        {
                            type = eventTypeName?.Split(',').FirstOrDefault();
                        }
                        else if (argMode == EventHandlerArgumentMode.Void)
                        {
                            type = null;
                        }

                        var range = new TextRange(assetDocument.StartOffset + methodNameRange.StartOffset.Offset,
                                                  assetDocument.StartOffset + methodNameRange.EndOffset.Offset);

                        var target = fileID.ToReference(currentSourceFile);
                        if (target != null)
                        {
                            result.Add(new AssetMethodData(
                                           new LocalReference(currentSourceFile.PsiStorage.PersistentIndex, anchor), methodName,
                                           range,
                                           argMode, type, target));
                        }
                    }
                }
            }

            if (result.Count > 0)
            {
                return(new AssetMethodsDataElement(result));
            }
            return(null);
        }
예제 #16
0
        public object Build(SeldomInterruptChecker checker, IPsiSourceFile currentAssetSourceFile, AssetDocument assetDocument)
        {
            var anchorRaw = AssetUtils.GetAnchorFromBuffer(assetDocument.Buffer);

            if (!anchorRaw.HasValue)
            {
                return(null);
            }

            var anchor     = anchorRaw.Value;
            var isStripped = AssetUtils.IsStripped(assetDocument.Buffer);
            var location   = new LocalReference(currentAssetSourceFile.PsiStorage.PersistentIndex.NotNull("owningPsiPersistentIndex != null"), anchor);

            if (isStripped)
            {
                var prefabInstance            = AssetUtils.GetPrefabInstance(currentAssetSourceFile, assetDocument.Buffer) as LocalReference?;
                var correspondingSourceObject = AssetUtils.GetCorrespondingSourceObject(currentAssetSourceFile, assetDocument.Buffer) as ExternalReference?;

                if (prefabInstance != null && correspondingSourceObject != null)
                {
                    return(new StrippedHierarchyElement(location, prefabInstance.Value, correspondingSourceObject.Value));
                }

                return(null);
            }

            var gameObject = AssetUtils.GetGameObjectReference(currentAssetSourceFile, assetDocument.Buffer) as LocalReference?;

            if (gameObject != null && AssetUtils.IsMonoBehaviourDocument(assetDocument.Buffer))
            {
                var entries = assetDocument.Document.FindRootBlockMapEntries()?.Entries;
                if (entries == null)
                {
                    return(null);
                }

                IHierarchyReference documentReference = null;

                foreach (var entry in entries)
                {
                    if (entry.Key.MatchesPlainScalarText(UnityYamlConstants.ScriptProperty))
                    {
                        documentReference = entry.Content.Value.ToHierarchyReference(currentAssetSourceFile);
                        break;
                    }
                }

                if (documentReference is ExternalReference scriptReference)
                {
                    return(new ScriptComponentHierarchy(location, gameObject.Value, scriptReference));
                }
            }
            else if (gameObject != null && AssetUtils.IsTransform(assetDocument.Buffer))
            {
                var father = AssetUtils.GetTransformFather(currentAssetSourceFile, assetDocument.Buffer) as LocalReference?;
                if (father == null)
                {
                    return(null);
                }

                var rootIndex = AssetUtils.GetRootIndex(assetDocument.Buffer);
                return(new TransformHierarchy(location, gameObject.Value, father.Value, rootIndex));
            }
            else if (AssetUtils.IsGameObject(assetDocument.Buffer))
            {
                var name = AssetUtils.GetGameObjectName(assetDocument.Buffer);
                if (name != null)
                {
                    return(new GameObjectHierarchy(location, name));
                }
            }
            else if (AssetUtils.IsPrefabModification(assetDocument.Buffer))
            {
                var modification    = AssetUtils.GetPrefabModification(assetDocument.Document);
                var parentTransform = modification?.GetValue("m_TransformParent")?.ToHierarchyReference(currentAssetSourceFile) as LocalReference? ?? LocalReference.Null;
                var modifications   = modification?.GetValue("m_Modifications") as IBlockSequenceNode;
                var result          = new List <PrefabModification>();
                if (modifications != null)
                {
                    foreach (var entry in modifications.Entries)
                    {
                        var map = entry.Value as IBlockMappingNode;

                        var target = map?.GetValue("target").ToHierarchyReference(currentAssetSourceFile);
                        if (target == null)
                        {
                            continue;
                        }

                        var name = map.GetValue("propertyPath").GetPlainScalarText();
                        if (name == null)
                        {
                            continue;
                        }

                        var valueNode = map.FindMapEntryBySimpleKey("value")?.Content;
                        if (valueNode == null)
                        {
                            continue;
                        }

                        IAssetValue value = null;
                        foreach (var assetInspectorValueDeserializer in myAssetInspectorValueDeserializers)
                        {
                            if (assetInspectorValueDeserializer.TryGetInspectorValue(currentAssetSourceFile, valueNode, out value))
                            {
                                break;
                            }
                        }

                        var objectReference = map.FindMapEntryBySimpleKey("objectReference")?.Content.Value.ToHierarchyReference(currentAssetSourceFile);

                        var valueRange = valueNode.GetTreeTextRange();

                        result.Add(new PrefabModification(target, name, value,
                                                          new TextRange(assetDocument.StartOffset + valueRange.StartOffset.Offset,
                                                                        assetDocument.StartOffset + valueRange.EndOffset.Offset), objectReference));
                    }
                }

                var sourcePrefabGuid = AssetUtils.GetSourcePrefab(currentAssetSourceFile, assetDocument.Buffer) as ExternalReference?;
                if (sourcePrefabGuid == null)
                {
                    return(null);
                }

                return(new PrefabInstanceHierarchy(location, parentTransform, result, sourcePrefabGuid.Value.ExternalAssetGuid));
            }
            else if (gameObject != null)// regular component
            {
                var name = AssetUtils.GetRawComponentName(assetDocument.Buffer);
                if (name == null)
                {
                    return(null);
                }

                return(new ComponentHierarchy(location, gameObject.Value, name));
            }
            return(null);
        }
예제 #17
0
 public object Build(SeldomInterruptChecker checker,
                     IPsiSourceFile file,
                     AssetDocument assetDocument)
 {
     return(new AnimationExtractor(file, assetDocument).TryExtractEventUsage());
 }