private static string SliceSprite(string asset) { var directoryName = Path.GetFileName(Path.GetDirectoryName(asset)); var directoryPath = Path.Combine(EditorUtil.GetBaumSpritesPath(), directoryName); var fileName = Path.GetFileName(asset); var noSlice = fileName.EndsWith("-noslice.png", StringComparison.Ordinal); fileName = fileName.Replace("-noslice.png", ".png"); var newPath = Path.Combine(directoryPath, fileName); var texture = AssetDatabase.LoadAssetAtPath <Texture2D>(asset); var slicedTexture = new SlicedTexture(texture, new Boarder(0, 0, 0, 0)); if (!noSlice) { slicedTexture = TextureSlicer.Slice(texture); } if (PreprocessTexture.SlicedTextures == null) { PreprocessTexture.SlicedTextures = new Dictionary <string, SlicedTexture>(); } PreprocessTexture.SlicedTextures[fileName] = slicedTexture; byte[] pngData = slicedTexture.Texture.EncodeToPNG(); File.WriteAllBytes(newPath, pngData); if (!noSlice) { Object.DestroyImmediate(slicedTexture.Texture); } // Debug.LogFormat("[Baum2] Slice: {0} -> {1}", EditorUtil.ToUnityPath(asset), EditorUtil.ToUnityPath(newPath)); return(EditorUtil.ToUnityPath(newPath)); }
private static string CheckWriteSpriteFromTexture(string writeSpritePath, Texture2D texture, Boarder boarder) { if (texture == null) { Debug.LogError($"textureがNullです CheckWriteTexture({writeSpritePath})"); return($"error {writeSpritePath} is null"); } var pngHash = texture.imageContentsHash; var writeFolder = Path.GetDirectoryName(writeSpritePath); // HashMapキャッシュファイルを作成のために // - \を/にする // - 相対パスである writeSpritePath = writeSpritePath.Replace("\\", "/"); LoadCache(writeFolder); var hashStr = pngHash.ToString(); // ハッシュが同じテクスチャがある Shareする if (imageHashMap.ContainsKey(hashStr)) { var path = imageHashMap[hashStr]; if (File.Exists(path)) { // Debug.Log("shared texture " + Path.GetFileName(newPath) + "==" + Path.GetFileName(name)); imagePathMap[writeSpritePath] = path; SaveCache(writeFolder); return("Texture: Shared"); } // ファイルが存在しない imageHashMap.Remove(hashStr); // hashStrの登録を削除 var deleteList = imageHashMap .Where(kvp => kvp.Key == path || kvp.Value == path) // 存在しないファイルを参照している .Select(kvp => kvp.Key) .ToList(); foreach (var key in deleteList) { imagePathMap.Remove(key); } } // ハッシュからのパスを登録 imageHashMap[hashStr] = writeSpritePath; // 置き換え対象のパスを登録 imagePathMap[writeSpritePath] = writeSpritePath; // のちのUnity PreprocessTextureの処理への情報受け渡し // (PNGインポートでスプライトを作成するUnityのイベント) var slicedTexture = new SlicedTexture(texture, boarder); PreprocessTexture.SlicedTextures[writeSpritePath] = slicedTexture; try { // 本来はフォルダを作成しなくても良いはず EditorUtil.CreateFolder(Path.GetDirectoryName(writeSpritePath)); // PNG での保存 (多プラットフォームに対応しやすい) var pngData = ImageConversion.EncodeToPNG(texture); File.WriteAllBytes(writeSpritePath, pngData); // spriteでの保存 /* * var sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), * new Vector2(0.5f, 0.5f)); * AssetDatabase.CreateAsset(sprite, Path.ChangeExtension(writeSpritePath, "asset")); */ SaveCache(writeFolder); } catch (Exception ex) { Debug.LogAssertion($"Textureの書き込み中に例外が発生しました:{ex.Message}"); } return("Texture: Created"); }
public static string SliceSprite(string assetPath) { var directoryName = Path.GetFileName(Path.GetDirectoryName(assetPath)); var directoryPath = Path.Combine(EditorUtil.GetOutputSpritesPath(), directoryName); var fileName = Path.GetFileName(assetPath); // PNGを読み込み、同じサイズのTextureを作成する var texture = CreateReadableTexture2D(CreateTextureFromPng(assetPath)); // LoadAssetAtPathをつかったテクスチャ読み込み サイズが2のべき乗になる JPGも読める //var texture = CreateReadabeTexture2D(AssetDatabase.LoadAssetAtPath<Texture2D>(asset)); if (PreprocessTexture.SlicedTextures == null) { PreprocessTexture.SlicedTextures = new Dictionary <string, SlicedTexture>(); } var noSlice = fileName.EndsWith("-noslice.png", StringComparison.Ordinal); if (noSlice) { var slicedTexture = new SlicedTexture(texture, new Boarder(0, 0, 0, 0)); fileName = fileName.Replace("-noslice.png", ".png"); var newPath = Path.Combine(directoryPath, fileName); PreprocessTexture.SlicedTextures[fileName] = slicedTexture; var pngData = texture.EncodeToPNG(); var imageHash = texture.imageContentsHash; Object.DestroyImmediate(slicedTexture.Texture); return(CheckWrite(newPath, pngData, imageHash)); } const string pattern = "-9slice,([0-9]+)px,([0-9]+)px,([0-9]+)px,([0-9]+)px\\.png"; var matches = Regex.Match(fileName, pattern); if (matches.Length > 0) { // 上・右・下・左の端から内側へのオフセット量 var top = Int32.Parse(matches.Groups[1].Value); var right = Int32.Parse(matches.Groups[2].Value); var bottom = Int32.Parse(matches.Groups[3].Value); var left = Int32.Parse(matches.Groups[4].Value); var slicedTexture = new SlicedTexture(texture, new Boarder(left, bottom, right, top)); fileName = Regex.Replace(fileName, pattern, ".png"); var newPath = Path.Combine(directoryPath, fileName); PreprocessTexture.SlicedTextures[fileName] = slicedTexture; var pngData = texture.EncodeToPNG(); var imageHash = texture.imageContentsHash; Object.DestroyImmediate(slicedTexture.Texture); return(CheckWrite(newPath, pngData, imageHash)); } { var slicedTexture = TextureSlicer.Slice(texture); var newPath = Path.Combine(directoryPath, fileName); PreprocessTexture.SlicedTextures[fileName] = slicedTexture; var pngData = slicedTexture.Texture.EncodeToPNG(); var imageHash = texture.imageContentsHash; Object.DestroyImmediate(slicedTexture.Texture); return(CheckWrite(newPath, pngData, imageHash)); } // Debug.LogFormat("[XdUnityUI] Slice: {0} -> {1}", EditorUtil.ToUnityPath(asset), EditorUtil.ToUnityPath(newPath)); }