はじめに
Unityアセット「Feel」の機能の一つである「MMRadio」の使い方を紹介します。
これを使うことで、あるGameObjectが持つプロパティ(パラメータ)の変化に連動させ、別なGameObject(複数でも)のプロパティを変化させる処理が簡単に実装できます。
UnityやFeelの基本的な使い方(フィードバックの作り方や実行方法)については把握していることを前提とします(Feelについては、わからないという方は公式ドキュメントを確認してください)。
試しに動かしてみる
新規にシーンを作り、何でもいいので形のあるGameObjectを2つ配置します。それぞれ「Emitter_Target」「Receiver_Target」と名付けておきます。
続いてEmitter_Targetに「MMRadioBroadcaster」コンポーネントをアタッチし、以下のようにパラメータを設定していきます。
- Target Object→Emitter_Target
- Component→0. Transform
- Property→position [Property - Vector3]
これら以外は初期設定のままで問題ないはずです。
さらにReceiver_Targetに「MMRadioReceiver」をアタッチして、以下のように設定。
- Target Object→Receiver_Target
- Component→0. Transform
- Property→position [Property - Vector3]
ここまでできたらシーンを再生し、Emitter_TargetのX座標をInspectorから直接動かしてみましょう。
0-1の範囲内で動かすとReceiver_Targetが連動して右上〜左下を行ったり来たりするはずです。
無事に動いたら、先ほどMMRadioBroadCasterで設定しなかったところを確認してみましょう。以下のような項目があります。いろいろ変えて動きの変化を確かめてみましょう。
- Target axis: X,Y,Zどの軸の動きに反応するか
- RemapToZero: 動きを連動させる範囲の下限。例えば-1にするとx座標が-1になるまでReceiver_Targetがついてくるようになります。
- RemapToOne: 同じく、動きを連動させる範囲の上限。
- ClampMin: チェックを外すと連動させる範囲の下限がなくなります。今回の場合なら左方向に動かすとどこまでもReceiverがついてくるようになります。
- ClampMax: 同じく、連動させる範囲の上限をなくします。
続いてReceiver_TargetにアタッチしたMMRadioReceiverも見てみましょう。先ほど設定した以外に以下のようなものがあるはずです。
- Relative Value: チェックを外すとあらかじめ配置した位置ではなく、原点(0, 0, 0)を中心に動くようになります。
- Modify X/Y/Z: チェックを入れた座標軸だけがEmitter_Targetの移動に連動して動きます。
- Remap Zero/One: Zeroの方は基本的に0で良いです。Oneの数値を1より大きくすると、その分だけEmitter_Targetの変化に対して倍率をかけて伝わります(今回の場合ならRemap One-Xを2にするとEmitterを1動かしたときにReceiverは2動くようになります)
連動するものをもっと増やしてみましょう。TextMeshProのテキストで「ReceiverText」を追加し、MMRadioReceiverをアタッチして以下のように設定します。
- Target Object→ReceiverText
- Component→TextMeshProUGUi
- Property→color [Property - Color]
シーンを再生し、先ほどと同様にEmitter_Targetを動かしてみてください。これまで通りReceiver_Targetが動くのに加えてReceiverTextの色も変化するはずです。
今回は例としてEmitter_Targetの位置に反応してReceiver_Targetが動くようにしましたが、例えばMMRadioBroadcasterのPropertyをRotationにすれば角度に応じて動かすようにもできますし、別なComponentのPropertyを参照することも可能です。
もちろん、Receiver_Target側でもMMRadioReceiverのComponentやPropertyを変更することで様々な値を連動させることができます。
簡単に応用例を挙げてみると、
- ここまでのEmitter_Targetにあたるものをプレイヤーキャラクターとして、ステータスを管理するComponentから残り体力を表す変数(Property)を指定。Remap Oneを体力の最大値に。
- 同じくReceiver_Targetの側として各種のUI要素を指定し、ComponentにImageやTextMeshProUGUI、Propertyにcolorを選択。Remap Zeroを赤、Remap Oneを普段の色に設定。
とすることで、残り体力が減るにつれてUIがだんだん赤くなりピンチを訴えてくる……というような演出を実装できます。
連動したいものを選ぶ
実際にゲームを作る場合、MMRadioBroadcasterもMMRadioReceiverも複数あり、すべてのReceiverがすべてのBroadcasterに反応すべきではないことのほうが多いでしょう。
ここからはBroadcasterごとに連動させたいReceiverを制限するための方法を解説します。
先ほどまでのシーンに戻ります。
ReceiverTextのインスペクタでMMRadioReceiverの設定を見ていくと、下の方に「Channel」という項目があります。デフォルトでは0になっていますが、1に変更してみましょう。
シーンを再生してEmitter_Targetを動かしてみると、先ほどと違ってReceiverTextが反応しなくなっているはずです。
同じく、Emitter_TargetにつけたMMRadioBroadcasterも下の方に「Channel」項目があるので見てみましょう。やはりデフォルトでは0が指定されています。
MMRadioBroadcasterは0というチャンネルに指定したPropertyの変化を通知し、同じく0チャンネルから受け取る設定にしているMMRadioReceiverはその通知を受信して反応しています。
ここでReceiverTextは0チャンネルではなく1チャンネルを受信する設定に切り替えたため、0チャンネルに変化を通知するBroadcasterにはもう反応しないのです。
ところでMMRadioBroadcasterのChannel欄の上に「Receiver」というリスト項目があるのを見たと思います。ここにはMMRadioReceiverをアタッチしたGameObjectを追加できます。試しにReceiverTextを追加して、シーン再生してみましょう。
今度はEmitter_Targetを動かすとReceiverTextが反応するはずです。この「Receiver」に追加したものについては、チャンネルとは無関係に反応するのです。
またMMRadioBroadcasterのChannel欄の上に「Broadcast on Channel」というチェックがありますが、これを外してまた動かしてみましょう。今度はReceiverTextしか反応しなくなります。
このチェックを外すとチャンネルを対象に変化の通知をすることがなくなり、Receiverに登録したものにだけ通知するようになるのです。
長くなってしまいましたが、ここまでを図にまとめると以下のようになります。
最後に
以上、Feelの機能「MMRadio」を用いて、プロパティの変化に連動する処理を仕込むやり方の解説でした。
この機能はコードをいじることなしに連動を仕込めるためとても手軽に使えるのが魅力です。ぜひ、様々な応用を考えてみてください。



