バーチャル3Dクリエイター神部まゆみです(*^_^*)
この記事はUnityでオブジェクトのマテリアルを変更するスクリプトを書いたので、それについての記事です。
やりたいこと:キーを押したら指定したオブジェクトのマテリアルを切り替える
- スキンメッシュレンダラーのあるオブジェクト
- 変更先マテリアル
- 変更するマテリアルスロット番号
を指定して、ゲーム画面でキー入力したらマテリアルを切り替えたい。
ChatGPT氏に書いてもらった
ChatGPT氏ホント便利だな…。まぁちょくちょくおかしくなったりもするけど(;^_^A

マテリアルを変更するスクリプト MaterialSwitcher.cs
これをモデルにアタッチして、変更したいマテリアルのあるスキンメッシュレンダラー、変更後のマテリアル、変更したいマテリアルスロット番号を指定すればOK。

スペースキーでマテリアル変更、もう一度スペースキーを押すと最初のマテリアルに戻ります。
using UnityEngine;
public class MaterialSwitcher : MonoBehaviour
{
public SkinnedMeshRenderer skinnedMeshRenderer;
public Material newMaterial; // 変更後のマテリアル
private Material originalMaterial; // 変更前のマテリアルを保存
public int targetSlot = 3; // 変更したいスロット番号(手動指定)
private bool isOriginalMaterial = true;
void Start()
{
// 現在のマテリアルリストを取得
Material[] materials = skinnedMeshRenderer.materials;
// 指定したスロットが範囲内かチェック
if (targetSlot < 0 || targetSlot >= materials.Length)
{
Debug.LogError($"指定したスロット {targetSlot} は SkinnedMeshRenderer のマテリアル数 {materials.Length} を超えています。");
return;
}
// 変更前のマテリアルを保存
originalMaterial = materials[targetSlot];
Debug.Log($"スロット {targetSlot} のマテリアルを変更対象に設定: {originalMaterial.name}");
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
ToggleMaterial();
}
}
void ToggleMaterial()
{
Material[] materials = skinnedMeshRenderer.materials; // 現在のマテリアルリストを取得
// 指定スロットのマテリアルを切り替え
materials[targetSlot] = isOriginalMaterial ? newMaterial : originalMaterial;
skinnedMeshRenderer.materials = materials; // 更新
isOriginalMaterial = !isOriginalMaterial; // 状態を反転
}
}
最初は変更元のマテリアルを指定すれば自動で検索してマテリアルスロットを特定してくれる仕様にしようとしたけど、マテリアル名にInstanceがついていて上手くいかなかったので手動で指定する方式にしました。
マテリアルスロット番号の数え方
0から始まるので、↓の場合は4番目ではあるけどスロット番号は3です。左の要素番号を見ればOK。

スロット番号が指定できれば変更元のマテリアルを記録しておくので、もう一度キーを押すと戻せます。
これでマテリアル変更できた!
今回は赤面テクスチャを指定したマテリアルに切り替えてみたけど、良い感じにできましたね。
↑の動画はアニメーション変更スクリプトとブレンドシェイプ変更スクリプトを併用させていますが、これだとスクリプトだけで割と良い感じの動きが作れそう。
おわりに
案外簡単に動かせてよかった。
これならVRoidの服のメッシュが同じなら、マテリアルを変えるだけで着替えたりできそう。
マテリアルを任意のタイミングで変更できるだけで色々な使い方ができますね…。
また何かあれば追記します(*^_^*)