MRが楽しい

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

インタフェースを指定してSerializeFieldにコンポーネントの参照を設定する

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

SerializeFieldにインタフェースを指定する

インタフェースはシリアライズできないので、インタフェースを SerializeField に指定しても Inspector に表示されません。
・WorldItemAccesserExample01.cs

using UnityEngine;
namespace HoloMonApp.Content.Character.WorldItem.Common
{
    public class WorldItemAccesserExample01 : MonoBehaviour
    {
        // インタフェースをSerializeFieldに指定する
        [SerializeField]
        private WorldItemSharingModuleIF p_WorldItemSharingModuleIF;
    }
}

参照を同一インタフェースを実装したもので差し替えれる形で実装したかったので、代替策として以下の実装を試しました。
コンポーネントを取得し、指定のインタフェースを実装したものであれば参照に追加しています。
・WorldItemAccesserExample02.cs

using UnityEngine;
namespace HoloMonApp.Content.Character.WorldItem.Common
{
    public class WorldItemAccesserExample02 : MonoBehaviour
    {
        // ComponentなのでSerializeFieldに指定できる
        [SerializeField]
        private Component p_WorldItemSharingModuleIFComponent;

        private WorldItemSharingModuleIF p_WorldItemSharingModuleIF => p_WorldItemSharingModuleIFComponent as WorldItemSharingModuleIF;

        private void Reset()
        {
            Component[] components = GetComponents<Component>();
            foreach (Component component in components)
            {
                // WorldItemSharingModuleIFを実装しているComponentを登録する
                WorldItemSharingModuleIF control = component as WorldItemSharingModuleIF;
                if (control != null) p_WorldItemSharingModuleIFComponent = component;
            }
        }
    }
}

ただこのやり方だと後からドラッグ操作でインタフェースを実装していないコンポーネントには参照を差し替えたりできてしまいます。
他に良い手法がないか調査中です。