MRが楽しい

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

インタフェースを指定してSerializeFieldにコンポーネントの参照を設定する その2(OnValidateでチェックする)

本日は Unity の小ネタ枠です。
ホロモンアプリ実装時にインタフェースを指定してSerializeFieldにコンポーネントの参照を設定したいことがあったので実装を試してみました。
今回は OnValidate を利用して実装を試してみました。

前回記事

以下の記事の続きです。
bluebirdofoz.hatenablog.com

OnValidateを使ってSerializeFieldへの登録を制限する

以下のように OnValidate を使って Inspector ビューで値が更新されたタイミングでインタフェースが実装されているかチェックを行う実装にしてみました。
対象のオブジェクトに指定のインタフェースが実装されたコンポーネントがない場合は値を空にすることで登録させません。
・WorldItemAccesserExample03.cs

using UnityEngine;
namespace HoloMonApp.Content.Character.WorldItem.Common
{
    public class WorldItemAccesserExample03 : MonoBehaviour
    {
        [SerializeField]
        private Component p_WorldItemSharingModuleIFComponent;
        private WorldItemSharingModuleIF p_WorldItemSharingModuleIF => p_WorldItemSharingModuleIFComponent as WorldItemSharingModuleIF;

        /// <summary>
        /// インスペクター上でスクリプトが読み込まれたとき
        /// または値が変更されたときに呼び出される
        /// </summary>
        private void OnValidate()
        {
            bool IsFound = false;
            Component[] components = p_WorldItemSharingModuleIFComponent.GetComponents<Component>();
            foreach (Component component in components)
            {
                // 指定オブジェクトの中でWorldItemSharingModuleIFを実装しているComponentを登録する
                WorldItemSharingModuleIF control = component as WorldItemSharingModuleIF;
                if (control != null)
                {
                    p_WorldItemSharingModuleIFComponent = component;
                    IsFound = true;
                }
            }
            if (!IsFound)
            {
                // 見つからなければ値を外す
                p_WorldItemSharingModuleIFComponent = null;
            }
        }
    }
}

こちらの方法であればドラッグ操作で登録が行えますし、後からインタフェースが実装されていない値への差し替えもできません。
ただ登録に関する処理でコードが冗長になるのが悩みどころです。