Ejemplo n.º 1
0
        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");
        }
Ejemplo n.º 3
0
        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));
        }