public override IEnumerable <PPtr <Object> > FetchDependencies(DependencyContext context)
        {
            foreach (PPtr <Object> asset in base.FetchDependencies(context))
            {
                yield return(asset);
            }

#if UNIVERSAL
            EditorExtensionLayout layout = context.Layout.EditorExtension;
            if (layout.HasExtensionPtr)
            {
                yield return(context.FetchDependency(ExtensionPtr, layout.ExtensionPtrName));
            }
            if (layout.HasCorrespondingSourceObject)
            {
                yield return(context.FetchDependency(CorrespondingSourceObject, layout.CorrespondingSourceObjectInvariantName));

                yield return(context.FetchDependency(PrefabInstance, layout.PrefabInstanceInvariantName));
            }
            if (layout.HasPrefabAsset)
            {
                yield return(context.FetchDependency(PrefabAsset, layout.PrefabAssetName));
            }
#endif
        }
        public static void Convert(IExportContainer container, EditorExtension origin, EditorExtension instance)
        {
            EditorExtensionLayout layout   = container.Layout.EditorExtension;
            EditorExtensionLayout exlayout = container.ExportLayout.EditorExtension;

            ObjectConverter.Convert(container, origin, instance);
#if UNIVERSAL
            if (exlayout.HasCorrespondingSourceObjectInvariant)
            {
                if (layout.HasCorrespondingSourceObjectInvariant)
                {
                    instance.CorrespondingSourceObject = origin.CorrespondingSourceObject;
                    instance.PrefabInstance            = origin.PrefabInstance;
                }
                else
                {
#warning TODO: get values from ExtensionPtr
                }
            }
            else
            {
                instance.ExtensionPtr = origin.ExtensionPtr;
            }
            if (exlayout.HasPrefabAsset && layout.HasPrefabAsset)
            {
                instance.PrefabAsset = origin.PrefabAsset;
            }
#endif
        }
        protected override YAMLMappingNode ExportYAMLRoot(IExportContainer container)
        {
            YAMLMappingNode       node   = base.ExportYAMLRoot(container);
            EditorExtensionLayout layout = container.ExportLayout.EditorExtension;

            if (layout.HasExtensionPtr)
            {
                node.Add(layout.ExtensionPtrName, ExtensionPtr.ExportYAML(container));
            }
            if (layout.HasCorrespondingSourceObject)
            {
                node.Add(layout.CorrespondingSourceObjectInvariantName, CorrespondingSourceObject.ExportYAML(container));
                node.Add(layout.PrefabInstanceInvariantName, GetPrefabInstance(container).ExportYAML(container));
            }
            if (layout.HasPrefabAsset)
            {
                node.Add(layout.PrefabAssetName, PrefabAsset.ExportYAML(container));
            }
            return(node);
        }
        public override void Write(AssetWriter writer)
        {
            base.Write(writer);

#if UNIVERSAL
            EditorExtensionLayout layout = writer.Layout.EditorExtension;
            if (layout.HasExtensionPtr)
            {
                ExtensionPtr.Write(writer);
            }
            if (layout.HasCorrespondingSourceObject)
            {
                CorrespondingSourceObject.Write(writer);
                PrefabInstance.Write(writer);
            }
            if (layout.HasPrefabAsset)
            {
                PrefabAsset.Write(writer);
            }
#endif
        }
        public override void Read(AssetReader reader)
        {
            base.Read(reader);

#if UNIVERSAL
            EditorExtensionLayout layout = reader.Layout.EditorExtension;
            if (layout.HasExtensionPtr)
            {
                ExtensionPtr = reader.ReadAsset <PPtr <Object> >();
            }
            if (layout.HasCorrespondingSourceObject)
            {
                CorrespondingSourceObject.Read(reader);
                PrefabInstance.Read(reader);
            }
            if (layout.HasPrefabAsset)
            {
                PrefabAsset.Read(reader);
            }
#endif
        }