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