
PhysicalButtonでクリックされたことを検出する
2023年7月30日の第168回目のCreator JamのテーマはSeacretでした。それで私はいろいろと果物を置いておいて、どれかをクリックするとオレンジさん人形が出てくるものを考えました。秘密の果実ですね。その機能をGreaseMonkeyさんとkontoさんがコンポーネントだけで実現して下さいました。
ここではkontoさんが考えたPhysicalButtonによりクリックを検出して、クリックされたら物が変わるというギミックを解説しましょう。ここでは上の写真のようなおにぎりとlitalita人形があって、おにぎりをクリックしたら、litalita人形が出てくるようにします。
全体の様子

このインスペクターを見てください。
おにぎり(Rice ball)とlitalita人形(litalitadoll)があり、それらはlitalitadoll – Parentの下に入っています。またここではctrl(コントロール)というスロットを作っています。このスロットに必要なコンポーネントが入っています。念のために細かく書くとlitalitadollをインスペクターで開いて、親を作り、そこにRice ballを入れます。またlitalitadoll – Parentに子供を作りその名前をctrlにします。
まずctrlスロットにBoxCollider(Physics→Colliders→BoxCollider)コンポーネントをいれます。サイズを調整してクリックされるようにします。
さらに、PhysicalButton(Interaction→PhysicalButton)を入れます。これでBoxColliderが入っているので、おにぎり、litalita人形をクリックすればIsPressd:がチカチカするはすです。

そしたら、このIsPressedを受けてアクションを開始できるようにしましょう。そのために上の図にあるようにまずValueCopy<bool>(Transform→Drivers→ValueCopy<T>の下)コンポーネント、ValueMultiDriver<bool>(Relations→ValueMultiDriver<T>の下)コンポーネント、BooleanVlueDriver<bool>(Transform→Drivers→BooleanValueDriver<T>)コンポーネントの3つを入れます。
そして、Source:にPhysicalButtonのIsPressedを入れます。そしてTarget:に次のValueMultiDriverのValue:を入れます。これでPhysicalButtonでクリックを検出するとValueMultiDriverがアクティブになります。
ValueMultiDriver<bool>ではDrivers(list)を2つ作り、litalitadollのスロットの一番上の方にあるActiveを選択しましょう。これで、litalitadollはクリックされるとActiveになり、見えるようになります。そしてもう一つは、BooleanValueDriver<bool>のState:に接続します。これで、同時にBooleanValueDriver<bool>がアクティブになります。
BooleanValueDriver<bool>では、TargetField:をRice ballのスロットの一番上の方にあるActiveに繋ぎます。そして、BooleanValueDriver<bool>FalseValue:にチェックを入れます。これにより、Falseになったときに、Rice ballが表示されます。つまり、litalitadallがクリックされてActiveになり表示されているときにはRice ballは表示されず、逆の時にはRice ballは表示されます。
これでOKそうなのですが、kontoさんは、さらにlitalitadoll – Parentに細工をしておりました。

つまり、Grabbableを入れて掴めるようにして、さらにObjectRootコンポーネントからRemove all children object rootsをクリックしていました。何かと子にあるObject Rootが悪さをするからだそうです。
最後に

kontoさんが作って、それをまねして私も作ってみていたら、kontoさんが途中でValueMultiDriver<bool>を一つ消しました。オリジナルでは2つあったのですが、改良できたようです。たぶんもっと上手な方法もあるのだろうと思います。
とにかくLogiXを使わなくても、いろいろなことが実現できるコンポーネントは便利ですよね。これからもいろいろと紹介して行きたいと思います。