スクリプトで複数のマテリアルを一括で変更する

投稿者: | 2020-04-18

スクリプトで、一つのメッシュにつけた複数のマテリアルを一括で変更してみます。

まず、複数のマテリアルが付いたモデルをBlenderで作ります。

マテリアルのプロパティで3つのマテリアルを作りました。

編集モードでCubeのどれかの面を選択して、マテリアルを選択し「Assign」ボタンを押します。

すると、この面にこのマテリアルが適用されます。

他のマテリアルを別の面に適用します。

Viewport Shadingをマテリアルにすると、面ごとに色が違うのがわかります。

このCubeをUnityに持っていくと、MeshRendererに3つのマテリアルがアタッチされています。

Blenderで作ったのと同じ設定のマテリアルを作り、新しく4つ目のマテリアルも用意します。

Cubeにスクリプトを追加し、2つのMaterialの配列にデフォルトの3つのマテリアルと、4つ目のマテリアルを分けてアタッチします。

デフォルトの3つは順番をメッシュレンダラーのものと合わせます。

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

public class MaterialsTest : MonoBehaviour
{
    MeshRenderer meshRenderer;
    bool changeMat = false;
    [SerializeField] Material[] materials1;
    [SerializeField] Material[] materials2;

    // Start is called before the first frame update
    void Start()
    {
        meshRenderer = GetComponent<MeshRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.E))
        {
            changeMat = !changeMat;
            meshRenderer.materials = changeMat ? materials2 : materials1;

            //meshRenderer.materials[0] = materials2[0];
        }      
    }
}

レンダラーのmaterialsはマテリアル型の配列なので、用意したマテリアルの配列を代入することで複数のマテリアルが一括で変更されます。

配列の要素にマテリアルを入れても、Material(Instance)と表示されて、マテリアルが変更されません。

meshRenderer.materials[0] = materials2[0];

マテリアルの切り替えを使って、ペンキ塗りたてのベンチに座るNPCを作ってみました。

歩く途中で、スカートとベンチのマテリアルが元に戻ります。

コメントを残す

メールアドレスが公開されることはありません。