はじめに
Unity開発中、「特定の動作でオブジェクトのテクスチャを変更したい」といった要望はよくありますよね。本記事ではC#スクリプトを使って、キー操作でマテリアルのテクスチャを切り替える具体的手順を、初心者向けにわかりやすく解説します。
1. MaterialとTextureの違いを理解する
まずは基礎知識から整理しましょう。
Material(マテリアル)
オブジェクトの「材質」のことです。色、光沢、透過、反射などの見た目をコントロールします。マテリアルはシェーダーと組み合わせて機能します。
Texture(テクスチャ)
マテリアルに貼り付ける「画像」のことです。木目やレンガの模様などを表現できます。
つまり、Materialは入れ物、Textureは中に入れる画像というイメージを持つと分かりやすいです。
2. C#スクリプトでテクスチャを変更するコード例
以下のスクリプトをオブジェクトにアタッチすると、スペースキーを押すとテクスチャが切り替わるようになります。
using UnityEngine;
public class ChangeTexture : MonoBehaviour
{
[SerializeField] Texture tex = default;
Texture texture;
Material material;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
material = this.GetComponent<MeshRenderer>().material;
// テクスチャの取得
texture = material.GetTexture("_MainTex");
// テクスチャの変更
material.SetTexture("_MainTex",tex);
}
}
}
3. コードのポイント解説
・GetComponent<MeshRenderer>().material
オブジェクトにアタッチされている MeshRenderer からマテリアルを取得します。 .material を使うと、内部でマテリアルのコピー(インスタンス)が作成されます。
・ GetTexture(“_MainTex”)
既存のメインテクスチャ(アルベドの画像)を取得します。
・SetTexture(“_MainTex”, newTexture)
新しいテクスチャに差し替えます。
“_MainTex”は、参照するマテリアルのテクスチャプロパティを指しています。マテリアルのインスペクターの右上の設定をクリックして、Edit Shader…を開くと、確認することができます。
テクスチャに限らず、他の色々なプロパティも参照できるよ!
4. 実行方法と確認手順
上記のスクリプトをオブジェクトにアタッチして、変更後の画像もドラッグ&ドロップ入れます。
実行してスペースキーを押すと、テクスチャが変わりました
5. 注意点:.materialと.sharedMaterialの違い
ここで重要な注意点があります。
- .material 呼び出すたびに新しいマテリアルのコピーが作成されます。大量に使うとメモリがどんどん増え、パフォーマンス低下やメモリリークの原因になります。
- .sharedMaterial すべてのオブジェクトで共有しているマテリアルを直接参照します。変更するとシーン内の全オブジェクトに反映されます。
用途に応じて使い分けることが大切です。個別にテクスチャを変えたいなら .material、全体を一括で変えたいなら .sharedMaterial を使いましょう。
対策方法は、以下の記事もご覧ください。
6. よくある質問(FAQ)
Q1. 他のプロパティ(色や光沢)も同じように変更できますか?
はい。SetColor や SetFloat を使えば、マテリアルの色やパラメータを変更できます。
Q3. ゲーム実行中に頻繁に変更しても問題ない?
基本的には問題ありませんが、大量にインスタンスが生成されるとパフォーマンスが落ちるため注意が必要です。
7. まとめ
- Material は見た目を決める設定、Texture はその表面に貼る画像。
- GetTexture と SetTexture を使うことで、スクリプトからテクスチャを切り替え可能。
- .material と .sharedMaterial の違いを理解し、適切に使い分けることが大切。