Clusterでは、Player Local UIというコンポーネントを用いることで、カスタムなUIを表示することができます。ところが、ボタンやスライダーといったものへの入力を検知する機能はまだ提供されていません。UIボタンはプレイングの幅を大きく広げるものなので、遊びをデザインする上でぜひ使いたいところです。
では、どうやってもこのUIボタンは使うことができないのでしょうか?
実は、使えるようにできる裏技が存在します! 今回はこのUIボタンを強制的に有効化する方法について紹介します。
Contents
UIボタンを使用したワールドサンプル
Cluster GAMEJAM in winter 2020 に投稿したワールドに、このテクニックを使用しています。どのようなことができるのかは、このワールドで確かめていただけると幸いです。
https://cluster.mu/w/8cea4ccb-8fbd-4efc-a912-e0dd1c0225ae
ClusterでUIボタン押すには
UIボタンを押せるようにするには、以下の二点が必要です。
- Player Local UIにGraphic Raycasterを入れる
- CanvasのOrder in Layerを引き上げる
ヒエラルキーを右クリックして生成するテンプレートのPlayer Local UIには、Graphic Raycasterが含まれていません。これは忘れずにアタッチするようにしてください。テンプレートではなく、Unity標準のCanvasを生成した場合は、Graphic Raycasterがデフォルトで付いてるはずです。
次にOrder in Layerですが、これはPlayer Local UIをアタッチすると自動的に100か-100に設定されてしまいます。これはインスペクターでどれだけ変更しようとも、スクリプトの初期化処理でこの値にセットされます。
こういう仕様になっているのには理由があって、Player Local UIがワールド外UI(音量設定とかチャット欄とか)よりも前面に出てこないようにするためです。そして、Player Local UIよりも前面にワールド外UIが表示されていることによって、タップ入力がワールド外UIに吸われてしまっているわけです。
では、Order in Layerを手動で変更することはできないのでしょうか? 安心してください、Timelineを経由することで強制的に数値を書き換えることができます!
使用するコンポーネント
Order in Layerを変更するために使用するコンポーネントやアセットは以下のとおりです。
- Play Timeline Gimmick
- Signal
- Signal Receiver
以前紹介したSignalからトリガーを発火する方法を途中まで使用します。ご覧になられていない方はぜひ一読ください。
上の記事で紹介している方法は、Signal Receiverのコールバックにいろいろなスクリプトメソッドを登録する、というものでした。Order in Layerを変更するには、このコールバックに以下のようにメソッドを登録してください。
右側にある数値は変更後のLayer番号です。ワールド外UIは1000ぐらいに固定されている?ようなので、それ以上の数値を入れてあげましょう。2000ぐらいなら確実にワールド外UIよりも上側に表示されます。
※表示順に限れば、Sorting Orderでもいけそうな気がするのですが、サーバー上で動作するかは試してないです。Project Settingsに依存するのでダメかもしれません….だれが検証してほしい
Buttonの使い方
Unityに慣れていない方の中には、初めてButtonコンポーネントを使う方もいるかもしれません。簡単にUIボタンの使い方を紹介します。
Buttonを押した呼び出すアクションを登録するには、右下の+ボタンから必要な分だけアクションを追加します。そして、対象のオブジェクトをNone(Object)と表示されている欄にセットしましょう。オブジェクトがセットされると、No Functionとグレーアウトしている部分が選べるようになります。
UIボタンを使うデメリット
このようにUIボタンをClusterで使えるようにできるのですが、もちろんデメリットが存在します。
- VRコントローラから押せない
- PCは一旦Escを押して、マウスポインターを出す必要がある
- Logicなどにメッセージを飛ばすにはOn Join Player Triggerを経由する必要がある
VRではUIボタンを押せません。ですので、VR対応を考える場合は注意しましょう。いまのところ、VRからUIボタンを押す方法はないです。
PCでは、アイテムを掴んでいる間はポインターが固定されてしまいます。一旦Escを押してポインターロックを解除する必要があります。これはかなり操作性が悪いので、あまり心地よいプレイングにならないです。物を持ちながらUIボタンを押す、というかなり使いにくいので気を付けたほうがいいでしょう。
最後に、UIボタンを経由すると、Trigger系を強制的に発火することができるのですが、使えるTriggerコンポーネントは限られています。先に紹介した「強制Invokerという裏技」でも紹介しているのですが、そもそもPublicなInvokeメソッドはあまり多くありません。今のところ、On Join Player TriggerとOn Create Item TriggerがPublicなInvokeメソッドを持ちます。しかし、On Create Item Triggerはサーバー上で同期しないようで、強制Invokeには使えません。
必然的にOn Join Player Triggerを使うことになるのですが、これはルームに誰かが入室するたびに呼ばれてしまうので、ゲームプレイに大きな影響を与える可能性があります。これを回避するのは至難の業です。UIボタンからメッセージを送るようなシステムを考えている場合は、うまく実現できないかもしれませんので注意しましょう。
まとめ
そもそもこのUIボタンの有効化は、Clusterが想定してような気配がしており、今後のアップデートで完全に非推奨になる可能性が大です。なぜなら、ワールド外UIよりも全面にボタンが表示されることで、いろいろな機能が阻害されるためです。
Clusterの運営も、こういうアディショナルなボタン機能は欲しいと思っているはずなので、公認機能として追加されることを願います。
この他にも、Clusterに関する記事を公開しています。ぜひご覧になっていってもらえればと思います!