Neos VRの世界で様々なアイテムが作れるおもしろ機能のLogiX。
無限に遊べるヤバい機能ですが、慣れるまでがちょっと大変なので、僕が始めた頃につまづいた箇所をピックアップして解説します。
最近LogiXはじめた人向け。
ボタンを押したときにパルスを出したい
このボタン押した時になにかしたいな!
お、ButtonコンポーネントにIsPressedなんてのがあるじゃん!エイッ!
とやってしまっていました。
FireOnTrueはBooleanがTrueになったときパルスが出るノードです。
これでも一応動くのですが、実はいろいろと問題があります。
「一人でテストすると動くのに複数人のセッションだとおかしい」
「押しても反応しない時がある」
などの現象が発生する可能性アリ。
かわりにInteractionの中にあるButtonEventsを使いましょう。
これなら確実にパルスが出るし、複数人のセッションで挙動が変わる心配もありません。
さらにボタンの種類によっては「押した時」「押している時」「離した時」「カーソルが乗った時」「カーソルが乗っている時」「カーソルが離れた時」それぞれのパルスと各種情報も取得できる優れものです。
一人でテストしたときはうまく行くのに複数人だとバグる
一人で黙々と作ってさあできた!みんな見て~!
と喜び勇んで取り出したアイテムがバグってる!!!さっきは動いてたのに!!!
ということがありました。
原因はいろいろ考えられますが、よくあるのがこれです。
BooleanがTrueになったときにSlotを複製するというLogiXですね。
何も間違っていないように見えますが…
これを複数人居るセッションで実行すると、その場にいる人数分複製されます。
問題はFireOnTrueの左下、Userの入力に何も繋がっていないことです。
ここで誰にとってTrueになった時かを指定することになっているのですが、何も繋がない場合、LocalUserを繋いだのと同じ効果があります。
LocalUserはそれぞれのユーザーにとっての自分です。
つまりその場にいるそれぞれのユーザーから見て値がTrueになったときにパルスが出てしまいます。
FireOnTrueにLocalUserをつなぐと各ユーザーから複数回パルスが出るという挙動になります。
これが上でも触れた、一人で作業していた時と複数人のセッションで動かした時に挙動が変わってしまう原因です。
パルスのDisplayをよく見るとユーザー名が書かれており、誰が処理をしたのかわかるようになっています。
パルスを使う処理は誰が処理するのかを考えることがとても重要です。
ではどうすればいいのか?
処理するユーザーを誰か一人に決めてあげればOKです。
例えばこう。
これならHostUserは各セッションに一人だけなので、一回だけ複製されます。
ただしホストが別のセッションに行っている場合は動かなくなるので、それを回避するにはまた別の方法があります。
- 最も近くにいるユーザーを取得するノードを使用する。
- 掴む、ボタンを押すなどの操作をきっかけにユーザーを記録しておく。
などなど状況によって使い分けることが重要です。
なお、それぞれのユーザーから見て値がTrueになったとき、各ユーザーが1回ずつパルスを出すようにするには、LocalFireOnTrueというノードを使用してください。
ボタンを押したユーザーを取りたい
ボタンを押した人に○○する。みたいなアイテムはまっさきに作りたくなるものの一つですよね!
ここまでの2つの知識を組み合わせれば、誰がボタンを押したのかを知るのは簡単です。
これで押したユーザーを破壊するボタンが作れますね!
Impulseを受けて値を出力する系のノードの出力を見たい!
面白そうなノードを見つけたけど、出力から何も出ていないように見える・・・どうやって使うの?
例えばこちら。
GETStringはWebにGetリクエストを送れます。
Googleにアクセスして、成功のパルスも出ていますが出力はnullです。
実はこの手ノードはパルスが出るその一瞬だけ値が出力されるようになっています。
1フレーム内で処理が終わっているので画面には表示されません。
出力の内容を見たいときは一度Writeしておきましょう。
後からこの値を使いたいときも、この方法で使用できます。
コライダーにあたったものを知りたい
「武器にぶつかったら弾き飛ばしたい」「攻撃判定に当たったものを破壊したい」
など、コライダーに当たった相手になにかしたい場面はよくありますよね!
コライダーに当たった瞬間に処理をするにはPhysics/OnCollisionStartが使えます。
まず、判定に使うコライダーのTypeをActiveにする必要があります。
そしてOnCollisionStartを繋ぎました。
これでこのBoxに何かが当たったときにパルスが出ます。
さて、当たった相手を知りたいのですが、どうすればいいのでしょうか?
ノードの右下から取れそうな気がしますが、IColliderという型になっていて繋がりそうなノードが見つかりません。
ここでSlot/GetSlotを繋いでみます。
するとこのように当たったコライダーが含まれているSlotを取ることができました!
これでSlotを操作するノードを組み合わせて好きな動きを作ることができます。
ちなみにこのOnCollisionStartも、先述のLocalUserを繋いだFireOnTrueのように全員分のパルスが出ます。
そのため1人分だけ処理するにはGetActiveUserで武器を持っているユーザーや当たったユーザーを取得するなど、少し工夫が必要です。
(画像は当たったユーザーに処理させる例)
おわり
このあたりのテクニックは知ってしまえば些細なことですが、何も知らないところから調べようとするとピンポイントで見つけるのに苦労する情報だと思います。
LogiXは繋ぐだけで動く手軽さが本当に最高なので無限に遊びましょう!