LoginSignup
3
2

More than 5 years have passed since last update.

None (Material) の怪

Last updated at Posted at 2017-08-15

概要

夏の風物詩、というわけではないですが、
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として利用していたのもミスですが。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2