概要
夏の風物詩、というわけではないですが、
Unityのエディタ上のCanvas>Imageに画像を反映しようと色々と試していたところ、
謎現象に遭遇したので、個人的備忘録も兼ねたメモ。
再現流れ
まっさらなシーンを用意する。
適当な画像をResoursesフォルダ直下にimportし、画像名をtest_imgへ変更する。
Hierarchy > Create > UI > Image をクリックし、Hierarchy上に Canvas > Image が作成されるのを確認する。
-
上記Imageか、新たにGameObject等を作成し、そこに下記ScriptをAttachする。
ChangeImg.csusing UnityEngine; using UnityEngine.UI; public class ChangeImg : MonoBehaviour { void Start () { Texture texture = Resources.Load("test_img") as Texture; Image img = GameObject.Find("Image").GetComponent<Image>(); img.material.mainTexture = texture; } }
ここで、実行ボタンをクリックし、実行終了ボタンを押すと...
(お分かりいただけただろうか?)
なんと、Inspector上では None (Material) と表示されているにも関わらず、Gameでは先ほどTextureとして指定した画像が描画されています!
「透明の何か」だった None の代わりに、上記で読み込んだ画像が利用されるようになります。
None は「透明の何か」で良かったのですが、、と不便になってしまいます。
対策
Unityのエディタ自体を再起動すると、元の None が描画される状態へ戻ります。
結論として、
Unityのエディタ上のCanvas>Imageに画像を反映する方法は
以下にたどり着きました。
using UnityEngine;
using UnityEngine.UI;
public class ChangeImg : MonoBehaviour
{
void Start ()
{
Sprite sprite = Resources.Load("test_img", typeof(Sprite)) as Sprite;
GameObject.Find("Image").GetComponent<Image>().sprite = sprite;
}
}
これで、 None がいつもの None になりました。
一体なんだったのでしょうか。
謎は深まるばかりです。
(おそらく、メモリに乗ったものを None としているとか?)
そもそも、Sprite画像を扱うにも関わらず、Textureとして利用していたのもミスですが。