【Odin Inspector】NPCの振る舞いをインスペクターで設定する
はじめに
こんにちは、学部3年の木村です。
タイトルの通り、ゲームに登場するNPCの行動をインスペクターで設定できるようにします。
想定するゲームにはNPCとしてMonster(獅子舞や仏像)が存在し、 各NPCは現在の状態に応じて探索や追跡などの行動をとることができます。
この場合、Dictionary
を使って状態と行動を対応付けたいのですがUnityのInspectorではGenericsを扱えないため、アクセス修飾子をpublic
にしたり属性にSerializeFieled
を付けたりしてもInspectorには表示されません。抽象クラスやインターフェースも同様です。
そこで、Odin - Inspector and Serializerというアセットを使用しました。
Odinとは
OdinはUnityのInspectorを使いやすくするプラグインです。
導入するだけでList等の表示がいい感じになったり、 (多分)何でもシリアライズできるようになったり、便利な属性が80以上使えるようになります。odininspector.comではどんなことができるようになるかがアニメーション付きで紹介されています。
$55の有料アセットですが、ゲーム制作中のパラメータ調整などが圧倒的に快適になるとても便利なアセットです。
本編
一部省略していますが、 大体以下のような構成です。
Monster
が継承しているSerializedMonoBehaviour
は、Dictionary
等もシリアライズできる(Inspectorで設定できる)MonoBehaviour
です。元のMonoBehaviour
の機能はそのまま使えます。
Inspectorでは次のように表示されます。(クラス図ではMonster
に定義しているActionsTable
がMonsterActionRepository
で定義されています。)
Dictionary
がInspectorに表示されており、Keyに状態(MonsterState
)、Valueにその状態のときにとる行動(抽象クラスNpcAction
の実装)を指定することでNPCの振る舞いを設定できます。
ついでに
OdinのButton
属性を使って、InspectorのボタンからMonsterの状態を変更できるようにしています。
public bool _enableDebug; [Button, ShowIf(nameof(_enableDebug)), EnableIf(nameof(_enableDebug))] private void ChangeState(MonsterState state) { // 状態をstateに変更 }
終わり
Odinの紹介と活用例でした。
ゲーム制作中にUnityのインスペクターを使っていると微妙に手の届かないかゆいところがあり、自分でエディタ拡張を書いていたら沼にハマり肝心のゲーム制作が進まないということがあるかもしれません。そんなときにOdinはかゆいところをいい感じにかいてくれます。
ちょっと高めのアセットですがUnityがとても快適になるので、よかったら導入してみてはいかがでしょうか。