Unityでマテリアルを変更するスクリプトを書いた!キー入力でマテリアル切り替え

Unity マテリアル 変更 スクリプト unityスクリプト
※記事内に広告が含まれています。

バーチャル3Dクリエイター神部まゆみです(*^_^*)

この記事はUnityでオブジェクトのマテリアルを変更するスクリプトを書いたので、それについての記事です。

●PRスペース●
■PR■

現在、3D自然環境系アセットが50%オフで買える Unityパブリッシャーセール をやってるみたいです(2025/09/25 23:59まで)。

Unity パブリッシャーセール 50%オフ

クーポンコード JASONBOOTH を使うと、↓3D自然環境を手軽に作れるMicro Verseアセットがタダで貰えます(決済時にクーポンコード入力適用で0円に)。

unity MicroVerse asset

無料アセットだけでも貰っておくと良いかも。

〇まゆみマート|BOOTH

BOOTHでVRoidテクスチャやVRChat向けオブジェクトなどを販売しています。いいねしてくれると励みになります(*^-^*)

やりたいこと:キーを押したら指定したオブジェクトのマテリアルを切り替える

  • スキンメッシュレンダラーのあるオブジェクト
  • 変更先マテリアル
  • 変更するマテリアルスロット番号

を指定して、ゲーム画面でキー入力したらマテリアルを切り替えたい。

ChatGPT氏に書いてもらった

ChatGPT氏ホント便利だな…。まぁちょくちょくおかしくなったりもするけど(;^_^A

Unity マテリアル 変更 スクリプト

マテリアルを変更するスクリプト MaterialSwitcher.cs

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

Unity マテリアル 変更 スクリプト

スペースキーでマテリアル変更、もう一度スペースキーを押すと最初のマテリアルに戻ります。

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。

Unity マテリアル 変更 スクリプト

スロット番号が指定できれば変更元のマテリアルを記録しておくので、もう一度キーを押すと戻せます。

これでマテリアル変更できた!

今回は赤面テクスチャを指定したマテリアルに切り替えてみたけど、良い感じにできましたね。

↑の動画はアニメーション変更スクリプトとブレンドシェイプ変更スクリプトを併用させていますが、これだとスクリプトだけで割と良い感じの動きが作れそう。

おわりに

案外簡単に動かせてよかった。

これならVRoidの服のメッシュが同じなら、マテリアルを変えるだけで着替えたりできそう。

マテリアルを任意のタイミングで変更できるだけで色々な使い方ができますね…。

また何かあれば追記します(*^_^*)

タイトルとURLをコピーしました