MRが楽しい

MRやVRについて学習したことを書き残す

Inspectorのフィールド変更をスクリプトで検知して処理を行う

本日は Unity の小ネタ枠です。
Inspectorのフィールド変更をスクリプトで検知して処理を行う例を記事にします。

OnValidate

スクリプトがロードされたとき、または Inspector で値が変更されたときに呼び出される Editor 専用の関数です。
docs.unity3d.com

テクスチャを切り替える

Inspector のフィールドからホロモンで利用するテクスチャを切り替える以下のサンプルスクリプトを作成しました。
・TextureChange.cs

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

public class TextureChange : MonoBehaviour
{
    public enum TextureType
    {
        Normal,
        Special,
    }

    [SerializeField]
    private TextureType p_TextureType;

    [SerializeField]
    private Texture2D p_NormalTexture;

    [SerializeField]
    private Texture2D p_SpecialTexture;

    [SerializeField]
    private List<GameObject> p_TargetObjects;

    private void OnValidate()
    {
        foreach(GameObject targetObj in p_TargetObjects)
        {
            Material targetMat = targetObj.GetComponent<Renderer>().material;
            if (targetMat == null) continue;
            switch (p_TextureType)
            {
                case TextureType.Normal:
                    targetMat.mainTexture = p_NormalTexture;
                    break;
                case TextureType.Special:
                    targetMat.mainTexture = p_SpecialTexture;
                    break;
            }
        }
    }
}

f:id:bluebirdofoz:20220410233227j:plain

スクリプトを設定して差し替えるテクスチャを対象オブジェクトを指定します。
f:id:bluebirdofoz:20220410233237j:plain

動作確認

Inspector の[p_TextureType]を変更してみます。
f:id:bluebirdofoz:20220410233246j:plain

以下の通り、フィールド値の変更と共に参照テクスチャが切り替わりました。
f:id:bluebirdofoz:20220410233257j:plain

注意事項

上記のスクリプトでは GetComponent().material でマテリアルを参照した際に、マテリアルが複製されている点に注意してください。
このため、スクリプトの処理が走った後は Asset 内の元マテリアルを編集しても変更が反映されなくなります。
f:id:bluebirdofoz:20220410233309j:plain

マテリアルを複製せず、参照している元マテリアルをそのまま編集したい場合は GetComponent().sharedMaterial でマテリアルを参照してください。