示例#1
0
        private (LayoutInfo, AssetsInfo) Create(XdArtboard xdArtboard, XdAssetHolder assetHolder, string name, Dictionary <string, string> userData)
        {
            var renderer = new XdRenderer(xdArtboard, assetHolder, _objectParsers, _groupParsers, _triggers);

            var layoutInfoForCalcHash = new LayoutInfo(
                name,
                0,
                renderer.Meta,
                new Dictionary <string, string>(),
                renderer.Root,
                renderer.Elements.ToArray()
                );
            var hash = FastHash.CalculateHash(JsonConvert.SerializeObject(AkyuiCompressor.ToSerializable(layoutInfoForCalcHash)));

            var layoutInfo = new LayoutInfo(
                name,
                hash,
                renderer.Meta,
                userData,
                renderer.Root,
                renderer.Elements.ToArray()
                );

            var assetsInfo = new AssetsInfo(
                renderer.Assets.ToArray()
                );

            return(layoutInfo, assetsInfo);
        }
示例#2
0
 public XdAkyuiLoader(XdFile xdFile, XdArtboard xdArtboard, string name, Dictionary <string, string> userData, AkyuiXdObjectParser[] objectParsers, AkyuiXdGroupParser[] groupParsers,
                      AkyuiXdImportTrigger[] triggers)
 {
     _xdFile                  = xdFile;
     _objectParsers           = objectParsers.Concat(DefaultObjectParsers).ToArray();
     _groupParsers            = groupParsers.Concat(DefaultGroupParsers).ToArray();
     _triggers                = triggers;
     _assetHolder             = new XdAssetHolder(_xdFile);
     (LayoutInfo, AssetsInfo) = Create(xdArtboard, _assetHolder, name, userData);
 }
示例#3
0
            public XdRenderer(XdArtboard xdArtboard, XdAssetHolder xdAssetHolder, IXdObjectParser[] objectParsers, IXdGroupParser[] groupParsers, AkyuiXdImportTrigger[] triggers)
            {
                var resources = xdArtboard.Resources;

                _xdAssetHolder = xdAssetHolder;
                _objectParsers = objectParsers;
                _groupParsers  = groupParsers;
                Elements       = new List <IElement>();
                Assets         = new List <IAsset>();
                _obbHolder     = new ObbHolder();

                CreateRefObjectMap(resources.Resources);

                var xdResourcesArtboardsJson = resources.Artboards[xdArtboard.Manifest.Path.Replace("artboard-", "")];
                var rootObb = new Obb {
                    Size = new Vector2(xdResourcesArtboardsJson.Width, xdResourcesArtboardsJson.Height)
                };

                var rootArtboard           = xdArtboard.Artboard.Children[0];
                var xdObjectJsons          = rootArtboard.Artboard.Children;
                var convertedXdObjectJsons = ConvertRefObject(xdObjectJsons, triggers);
                var childrenObbs           = CalcPosition(convertedXdObjectJsons, rootObb);

                foreach (var childObb in childrenObbs)
                {
                    childObb.LocalLeftTopPosition -= new Vector2(xdResourcesArtboardsJson.X, xdResourcesArtboardsJson.Y);
                }
                var children = Render(convertedXdObjectJsons, rootObb);

                var rootComponents = new List <IComponent>();

                if (rootArtboard.Style?.Fill != null && rootArtboard.Style.Fill.Type == "solid")
                {
                    var color = rootArtboard.GetFillUnityColor();
                    rootComponents.Add(new ImageComponent(null, color, Vector2Int.one));
                }

                var root = new ObjectElement(
                    0,
                    xdArtboard.Name,
                    Vector2.zero,
                    rootObb.Size,
                    AnchorXType.Center,
                    AnchorYType.Middle,
                    0f,
                    true,
                    rootComponents.ToArray(),
                    children.Select(x => x.Eid).ToArray()
                    );

                Elements.Add(root);
            }
示例#4
0
 public static bool HasParameter(this XdArtboard xdObjectJson, string name) => HasParameter(xdObjectJson.Name, name);
示例#5
0
 public static string GetSimpleName(this XdArtboard xdObjectJson) => GetSimpleName(xdObjectJson.Name);
示例#6
0
        private static (int Imported, int Skipped) ImportedArtboards(XdImportSettings xdSettings, AkyuiLogger logger, string xdFilePath, IAkyuiProgress progress, List <IAkyuiLoader> loaders)
        {
            var stopWatch = Stopwatch.StartNew();
            var file      = new XdFile(xdFilePath);

            XdFile = file;
            using (Disposable.Create(() => XdFile = null))
            {
                var imported = 0;
                var skipped  = 0;

                var targets = new List <XdArtboard>();
                foreach (var artwork in file.Artworks)
                {
                    if (artwork.Artboard.Children.Length == 0)
                    {
                        continue;
                    }
                    var markForExport = artwork.Artboard.Children[0].Meta?.Ux?.MarkedForExport ?? false;
                    if (!markForExport)
                    {
                        continue;
                    }
                    targets.Add(artwork);
                }

                progress.SetTotal(targets.Count);

                var akyuiXdObjectParsers = xdSettings.ObjectParsers ?? new AkyuiXdObjectParser[] { };
                var akyuiXdGroupParsers  = xdSettings.GroupParsers ?? new AkyuiXdGroupParser[] { };
                var triggers             = xdSettings.XdTriggers ?? new AkyuiXdImportTrigger[] { };

                var expandTargets = new List <XdArtboard>();
                foreach (var artwork in targets)
                {
                    if (!artwork.HasParameter("expand"))
                    {
                        expandTargets.Add(artwork);
                        continue;
                    }

                    foreach (var child in artwork.Artboard.Children.SelectMany(x => x.Artboard.Children))
                    {
                        var childArtboardJson = new XdArtboardJson
                        {
                            Version   = artwork.Artboard.Version,
                            Artboards = artwork.Artboard.Artboards,
                            Resources = artwork.Artboard.Resources,
                            Children  = new[]
                            {
                                new XdArtboardChildJson
                                {
                                    Artboard = new XdArtboardChildArtboardJson
                                    {
                                        Children = new[] { child }
                                    }
                                }
                            }
                        };

                        var childArtboard = new XdArtboard($"{artwork.GetSimpleName()}{child.GetSimpleName()}", artwork.Manifest, childArtboardJson, artwork.Resources, artwork.Hash);
                        expandTargets.Add(childArtboard);
                    }
                }

                foreach (var artwork in expandTargets)
                {
                    using (progress.TaskStart(artwork.Name))
                        using (var _ = logger.SetCategory(artwork.Name))
                        {
                            var name   = artwork.Name.ToSafeString();
                            var xdHash = artwork.Hash;

                            var userData = new Dictionary <string, string>
                            {
                                { "xd_hash", xdHash.ToString() }
                            };

                            var pathGetter         = new PathGetter(xdSettings, name);
                            var prevMetaGameObject = AssetDatabase.LoadAssetAtPath <GameObject>(pathGetter.MetaSavePath);
                            var prevMeta           = prevMetaGameObject != null?prevMetaGameObject.GetComponent <AkyuiMeta>() : null;

                            var prevMetaUserData = prevMeta != null?prevMeta.FindUserData("xd_hash") : null;

                            if (!xdSettings.ReimportLayout && !xdSettings.ReimportAsset && prevMetaUserData != null && prevMetaUserData.value == xdHash.ToString())
                            {
                                logger.Log("Skip", ("Name", artwork.Name), ("Hash", xdHash));
                                skipped++;
                                continue;
                            }

                            loaders.Add(new XdAkyuiLoader(file, artwork, name, userData, akyuiXdObjectParsers, akyuiXdGroupParsers, triggers));
                            imported++;
                        }
                }

                stopWatch.Stop();
                logger.Log($"Xd Parse Finish", ("ImportArtboard", imported), ("SkipArtboard", skipped), ("Time", $"{stopWatch.Elapsed.TotalSeconds:0.00}s"));
                return(imported, skipped);
            }
        }