Texture2Dが半透明ピクセルを持っているかどうか調べる

☆記事最後に追記あり

Twitterに書いたTextureが半透明ピクセルを持っているかどうか調べるコードを貼っておきます

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Textureが半透明ピクセルを含んでいるかどうかをスパッと調べる方法って、全ピクセル舐める以外に何か良い方法ないかなぁ…。</p>&mdash; MIYAKE (@ScreenPocket) <a href="https://twitter.com/ScreenPocket/status/1290532987650502657?ref_src=twsrc%5Etfw">August 4, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

いや、特に簡単に調べる方法は見つかっていないんだけれども…。
それでもまぁ再利用することを考えると、ピクセルを舐めるコードでも良いから記事化しておこうと思います。

```cs:TextureUtility.cs
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEditor;

namespace ScreenPocket
{
	public static class TextureUtility
	{
		//Texture2Dに半透明ピクセルがあるかどうか調べる
		public static bool ExistsTransparentPixel(Texture2D texture)
		{
			var path = AssetDatabase.GetAssetPath(texture);
			var importer = AssetImporter.GetAtPath(path) as TextureImporter;
			if (importer == null)
			{
				Debug.LogError("Not Found TextureImporter! : " + path);
				return false;
			}

			bool isExist = false;
			//readableでないとGetPixels()出来ないので変更
			var keepReadable = importer.isReadable;
			importer.isReadable = true;
			importer.SaveAndReimport();
			var pixels = texture.GetPixels32();
			for (int i = 0, count = pixels.Length; i < count; ++i)
			{
				if (pixels[i].a != 0xff)
				{
					isExist = true;
					break;
				}
			}

			//readableを戻す
			importer.isReadable = keepReadable;
			importer.SaveAndReimport();
			AssetDatabase.Refresh();
			return isExist;
		}

		[MenuItem("Assets/ScreenPocket/Texture/ExistsTransparentPixel")]
		static void CheckExistsTransparentPixel()
		{
			var texture = Selection.activeObject as Texture2D;
			if (texture == null)
			{
				Debug.LogError("No Texture.");
				return;
			}

			if (ExistsTransparentPixel(texture))
			{
				Debug.Log("Transparency Texture!");
			}
			else
			{
				Debug.Log("Opaque Texture!");
			}
		}
	}
}
```
Projectツリーでテクスチャを右クリック > ScreenPocket > Texture > ExistsTransparentPixel　で、
半透明ピクセルを持っているかどうかでLogが変わります。
もっとスマートな方法はないものか・・・。

☆追記
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Editor上で良ければ、TextureImporter.DoesSourceTextureHaveAlpha() で判別できますよ<a href="https://t.co/yO7n9EWRHO">https://t.co/yO7n9EWRHO</a></p>&mdash; 赤めがね (@redglasses67) <a href="https://twitter.com/redglasses67/status/1290681937963544577?ref_src=twsrc%5Etfw">August 4, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
とのことで、ピクセルを舐めている部分を**importer.DoesSourceTextureHaveAlpha()**に置き換えることで解決しました！
コレが欲しかったんや…！
修正後のコードはこちら↓

```cs:TextureUtility.cs
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEditor;

namespace ScreenPocket
{
    public static class TextureUtility
    {
        //Texture2Dに半透明ピクセルがあるかどうか調べる
        public static bool ExistsTransparentPixel(Texture2D texture)
        {
            var path = AssetDatabase.GetAssetPath(texture);
            var importer = AssetImporter.GetAtPath(path) as TextureImporter;
            if (importer == null)
            {
                Debug.LogError("Not Found TextureImporter! : " + path);
                return false;
            }
            
            return importer.DoesSourceTextureHaveAlpha();
        }

        [MenuItem("Assets/ScreenPocket/Texture/ExistsTransparentPixel")]
        static void CheckExistsTransparentPixel()
        {
            var texture = Selection.activeObject as Texture2D;
            if (texture == null)
            {
                Debug.LogError("No Texture.");
                return;
            }

            if (ExistsTransparentPixel(texture))
            {
                Debug.Log("Transparency Texture!");
            }
            else
            {
                Debug.Log("Opaque Texture!");
            }
        }
    }
}
```