☆記事最後に追記あり
Twitterに書いたTextureが半透明ピクセルを持っているかどうか調べるコードを貼っておきます
Textureが半透明ピクセルを含んでいるかどうかをスパッと調べる方法って、全ピクセル舐める以外に何か良い方法ないかなぁ…。
— MIYAKE (@ScreenPocket) August 4, 2020
いや、特に簡単に調べる方法は見つかっていないんだけれども…。
それでもまぁ再利用することを考えると、ピクセルを舐めるコードでも良いから記事化しておこうと思います。
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が変わります。
もっとスマートな方法はないものか・・・。
☆追記
とのことで、ピクセルを舐めている部分を**importer.DoesSourceTextureHaveAlpha()**に置き換えることで解決しました! コレが欲しかったんや…! 修正後のコードはこちら↓Editor上で良ければ、TextureImporter.DoesSourceTextureHaveAlpha() で判別できますよhttps://t.co/yO7n9EWRHO
— 赤めがね (@redglasses67) August 4, 2020
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!");
}
}
}
}