C#
Unity

None (Material) の怪

More than 1 year has passed since last update.

概要

夏の風物詩、というわけではないですが、
Unityのエディタ上のCanvas>Imageに画像を反映しようと色々と試していたところ、
謎現象に遭遇したので、個人的備忘録も兼ねたメモ。

再現流れ

  1. まっさらなシーンを用意する。

  2. 適当な画像をResoursesフォルダ直下にimportし、画像名をtest_imgへ変更する。

  3. Hierarchy > Create > UI > Image をクリックし、Hierarchy上に Canvas > Image が作成されるのを確認する。
    スクリーンショット 2017-08-15 3.00.33.png
     

  4. 上記Imageか、新たにGameObject等を作成し、そこに下記ScriptをAttachする。

    ChangeImg.cs
    using 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;
        }
    }
    

    スクリーンショット 2017-08-15 3.19.53.png
     

  5. ここで、実行ボタンをクリックし、実行終了ボタンを押すと...
    (お分かりいただけただろうか?)

なんと、Inspector上では None (Material) と表示されているにも関わらず、Gameでは先ほどTextureとして指定した画像が描画されています!

「透明の何か」だった None の代わりに、上記で読み込んだ画像が利用されるようになります。
None は「透明の何か」で良かったのですが、、と不便になってしまいます。

対策

Unityのエディタ自体を再起動すると、元の None が描画される状態へ戻ります。

結論として、
Unityのエディタ上のCanvas>Imageに画像を反映する方法は
以下にたどり着きました。

ChangeImg.cs
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として利用していたのもミスですが。