Unity

【Unity】画像(テクスチャ)やマテリアルの変更方法【スクリプトによる処理】

本記事内には、アフィリエイトリンクを含む場合があります

ゲーム開発の中で、
ボタン1つで画像などを切り替えたいことがあるかと思います。

もう1つ別のオブジェクトを作り、
enabled = trueでそのImageを表示することも可能ですが、
オブジェクトを増やすことなく、
画像ファイルの差し替えでデザインを変更できるなら、越したことはありません。

本記事では、ソースの画像ファイルを差し替える方法を解説します。

2DのImageだけでなく、3Dオブジェクトのマテリアルによるデザインの
変更方法も合わせて、紹介していきます。

完成図↓

1.画像ファイルの準備【超基礎】

Imageオブジェクトを作成し、
そこに好みの画像を表示するには、
Inspector上でImageコンポーネントにある「Source Image」に、画像ファイルを紐付けます。

そのためには、.jpgや.pngなどの画像ファイルを、
Unityのプロジェクトに持ってきたときに、テクスチャタイプの変換を行う必要があります。

図のようにAssetsフォルダに(その配下にTexturesフォルダを作ったりして)入れた
ファイルをクリックし、
Texture Typeを「Default」からSprite「2D and UI」に変更して、Applyをクリックします。

この時、画像ファイルの品質設定も
オーバースペックにならないようにMax Sizeなど適宜設定しましょう(ファイル容量が大きくなる原因)。
ゲーム上に表示するImageサイズが小さいなら、解像度は低くて良いですね^^

参考:https://docs.unity3d.com/ja/2021.3/Manual/class-TextureImporter.html

上のファイルインポートの処理をしたら、
ImageオブジェクトのSource Imageに、それをドラッグ&ドロップで紐づけると、シーンで画像が表示されます。

Imageオブジェクトのサイズが画像ファイルのサイズと異なる場合、
図のように比率のおかしな画像になります。
これは「Set Native Size」をクリックすると、オリジナルサイズに変換できます。

つまり、同Imageオブジェクトで画像ファイルを差し替えるとき、
寸法が同じ画像ファイルを切り替えるようにしましょう。

もしくは、
差し替えたときに「Set Native Size」で補正するようにしましょう。

今回は、補正の例を示すために、
あえてサイズの違う2つの画像ファイルを、
スクリプトによって、差し替えてみます。

2.Source Imageをスクリプトから変更

スクリプトによる制御ですが、
ここでは1つのImageオブジェクトで、
画像ファイルを差し替えます。

スクリプトは以下の通り↓

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ChangeScript : MonoBehaviour
{
    [SerializeField] Image image;
    [SerializeField] Sprite[] sprites;
    int num = 0;

    void Update()
    {
        // Spaceキーが押したとき
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if(num == 0)
            {
                num = 1;
                image.sprite = sprites;
                image.SetNativeSize(); //画像サイズ変換
            }
            else
            {
                num = 0;
                image.sprite = sprites[0];
                image.SetNativeSize(); //画像サイズ変換
            }
        }
    }
}

このスクリプトはMainCameraにでもアタッチすればOKです。

処理内容は、SpaceキーでOnClickChange関数を呼ぶと、
ImageコンポーネントのSource Imageが切り替わるようになっています。

また、画像ごとにサイズ(解像度)を最適化するのに、
image.SetNativeSize()を記述しています。

スクリプトをアタッチしたら、
Inspector上で、Imageオブジェクトと切り替える2つの画像ファイルを紐付けます(配列の要素数2にして)。

これで変更処理は実装できました。

画像ごとの最適なサイズ(解像度)があまりにも違う場合は、
画像ごとにImageオブジェクトを作るのが、無難ですね^^;

3.スクリプトによるマテリアルのSource変更

続いて、3Dオブジェクトのデザイン変更をみてみましょう。

3Dオブジェクトにアタッチされているマテリアルは、
3Dオブジェクトのデザインを決めるものです。

そして、マテリアルも画像ファイル(テクスチャ)が、ソースとなっています。
(このテクスチャは、3D図形の展開図として描かれたパターンとなる)

マテリアルファイルのAlbedoの左(◎)をクリックして、
そこからテクスチャを選択すると、それをソースとしたデザインに変更されます。

 

はじめは、カスタム可能なマテリアルファイルはないので、まずは作成を。

Assetsフォルダ上で、
右クリックから、Create_Materialを選択して、マテリアルファイルを作成します。
前述のようにテクスチャをAlbedoに紐付けます。

次に3DオブジェクトのSphereを図のようなTransformで作成します。
そこにマテリアルファイルをアタッチします。

これで、オブジェクトの準備が整ったので、
Sphereのデザインをスクリプトで変更してみましょう。
先ほどのChangeScriptに追記します↓

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ChangeScript : MonoBehaviour
{
    [SerializeField] Image image;
    [SerializeField] Sprite[] sprites;
    [SerializeField] MeshRenderer meshRenderer; //追記
    [SerializeField] Texture[] textures; //追記
    int num = 0;

    void Update()
    {
        // Spaceキーが押したとき
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if(num == 0)
            {
                num = 1;
                image.sprite = sprites;
                image.SetNativeSize();

                meshRenderer.materials[0].mainTexture = textures; //追記
            }
            else
            {
                num = 0;
                image.sprite = sprites[0];
                image.SetNativeSize();

                meshRenderer.materials[0].mainTexture = textures[0]; //追記
            }
        }
    }
}

これもImageオブジェクトと似たようなもので、
一旦、画像ファイルの配列を作り、
SphereオブジェクトのMeshRendererの1つのマテリアルに対して、
そのテクスチャを切り替える処理を加えています。

スクリプトを更新したら、Sphereオブジェクトとテクスチャファイルを紐づけします。

これが1つのマテリアルでソースを変えて、デザイン変更したい場合でした。

4.スクリプトでマテリアルを切り替える

先ほどは、1つのマテリアルのソース(テクスチャ)を切り替えてデザインを変えました。

ただし、実際のところ、3Dオブジェクトはマテリアルごとに、
そのRendering Modeや
ノーマルマップ(凹凸があるかのように見せる情報ファイル)を
設定しているものです。

よって、3Dオブジェクトのデザイン変更は、
マテリアル単位で変更することが必要なケースが多いです。

では、その方法を示すために、
マテリアルファイルをもう1つ作成します。

1つ目のマテリアルと違いを出すために、
Emissionにチェックを入れて、Colorを調整し、発光性をもたせてみます。

シーン上にCubeを図のように作り、
まずは1つ目のマテリアルをアタッチしておきます。

オブジェクトの準備ができたので、
スクリプトによるマテリアルの変更を実装してみましょう。
ChangeScript.csに、以下のように追記します↓

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ChangeScript : MonoBehaviour
{
    [SerializeField] Image image;
    [SerializeField] Sprite[] sprites;
    [SerializeField] MeshRenderer meshRenderer;
    [SerializeField] Texture[] textures;
    [SerializeField] MeshRenderer meshRendererCube; //追記
    [SerializeField] Material[] mats; //追記
    int num = 0;

    void Update()
    {
        // Spaceキーが押したとき
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if(num == 0)
            {
                num = 1;
                image.sprite = sprites;
                image.SetNativeSize();

                meshRenderer.materials[0].mainTexture = textures;
                meshRendererCube.material = mats; //追記
            }
            else
            {
                num = 0;
                image.sprite = sprites[0];
                image.SetNativeSize();

                meshRenderer.materials[0].mainTexture = textures[0];
                meshRendererCube.material = mats[0]; //追記
            }
        }
    }
}

Textureではなく、Materialを配列に入れて、置き換えるだけですね^^;

スクリプトを更新したら、忘れないように紐づけます。

これでゲームを実行してみて、
Spaceキーでこれまで作ってきたオブジェクトたちのデザインが変わればOKです。
(マテリアルを変更した方は、発光性あるオブジェクトになってればOK)

 

以上、ゲーム開発時に知っておきたい画像やデザインを変更する方法でした!
こういったことを踏まえて、
テクスチャファイルなどなどを描けるようになると良いですね!^^

ABOUT ME
いなも@システマライフハッカー
”仙豆”を開発することを夢見て、健康食品会社で働いていたものの、2016年に出会ったロシアの武術”システマ”こそ、その糸口があると感銘し、勝手にシステマ普及活動を始める。 一方で、クリエイティブなモノ作りが好きで、DX社会で楽しみを見出せる"Unity”を活かして、”スマートかつ快適な暮らし”のヒントを発信している。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA