チリペヂィア

リンクフリー。サンプルコードなどは関連記事内でライセンスについて明示されない限り商用利用なども自由に行って構いませんが、自己責任でお願いします。またこれら日記内容の著作権自体は放棄していません。引用部分については引用元の権利に従ってください。

Texture2DをReadableに変更

Texture2D.ReadPixels()やGetPixels()するとき、テクスチャのインポート設定がReadableに設定されていないとエラーします(*1)。

Texture '...' is not readable, the texture memory can not be accessed from scripts. You can make the texture readable in the Texture Import Settings.

ただエディタスクリプトであれば、UnityEditor名前空間使ってスクリプトからインポート設定を読み書きできます(一応、インポート設定をスクリプトから書き換える時には確認ダイアログの表示が推奨だと思います。サンプルではやってませんけれど)。

Texture2D tex; // このtexは、元々Resources.Load<Texture>()したようなリソースだったとして…
System.String assetPath = UnityEditor.AssetDatabase.GetAssetPath(tex); // インポート元のパスを取得
UnityEditor.TextureImporter importer = UnityEditor.AssetImporter.GetAtPath(assetPath) as UnityEditor.TextureImporter; // パスからインポート設定にアクセス
if (importer.isReadable == false) importer.isReadable = true; // 設定の確認と書き換え

ゲーム実行時に読み書きする方法は見つかりませんでした。実行時の設定書き換えはまぁ要らないと思いますが確認くらいはしたいような。いまのところこれで確認するしかないかしら…。

bool isReadable = true;
try
{
    if (tex.width * tex.height <= 0) tex.GetPixels32(); else tex.GetPixel(0, 0);
}
catch (UnityException e)
{
    isReadable = false;
}

<追記>インスペクタから入力できる、非Readableなメモリテクスチャリソースがあるくさい。

  • "Default-Particle"とか
  • どうもファイルからインポートしたのではないTexture2D(画像ファイルではないっぽい…誰かが生成してるのかな)
  • 普通にファイルからインポートしたテクスチャのように設定できる
    • いわゆるShowObjectPicker()で、allowSceneObjects=falseでもリストアップ&選択できる。

結局のところ、インポート設定が取得できない時には例外キャッチで体当たり検査をしないとダメっぽいですねー…。

*1:テクスチャのインポート設定でTextureTypeをAdvancedにしてRead/Write EnabledをチェックするとReadableになります。