using System.IO; using AkyuiUnity.Editor.Extensions; using Unity.VectorGraphics.Editor; using UnityEditor; using UnityEngine; namespace Sandbox { public static class SvgToPng { public static byte[] Convert(string svg, Vector2Int size) { var unityAssetsParentPath = Path.GetDirectoryName(Application.dataPath) ?? ""; var savePath = Path.Combine("Assets", "Temp.svg"); var saveFullPath = Path.Combine(unityAssetsParentPath, savePath); SvgImportTrigger.ProcessingFile = savePath; SvgImportTrigger.Size = size; using (Disposable.Create(() => { SvgImportTrigger.ProcessingFile = null; SvgImportTrigger.Size = Vector2Int.zero; AssetDatabase.DeleteAsset(savePath); })) { File.WriteAllBytes(saveFullPath, System.Text.Encoding.UTF8.GetBytes(svg)); AssetDatabase.ImportAsset(savePath); var texture = AssetDatabase.LoadAssetAtPath<Texture2D>(savePath); return texture.EncodeToPNG(); } } } public class SvgImportTrigger : AssetPostprocessor { public static string ProcessingFile { get; set; } public static Vector2Int Size { get; set; } public void OnPreprocessAsset() { if (ProcessingFile != assetPath) return; if (!(assetImporter is SVGImporter svgImporter)) return; svgImporter.SvgType = SVGType.TexturedSprite; svgImporter.KeepTextureAspectRatio = false; svgImporter.TextureWidth = Size.x; svgImporter.TextureHeight = Size.y; } } }
Unity.VectorGraphicsと、Disposable.Create(UniRxとか)が必要です。
本当はUnityのインポートプロセスを挟みたくなかったのですが、VectorUtils.BuildSpriteを呼ぶとEditorごと死ぬので諦めました。
呼べた方、教えて下さい。