NeosVR
LogiX
入門
初心者
技術

LogiXを始めた時につまづいた5つのことと解決法

Neos VRの世界で様々なアイテムが作れるおもしろ機能のLogiX
無限に遊べるヤバい機能ですが、慣れるまでがちょっと大変なので、僕が始めた頃につまづいた箇所をピックアップして解説します。
最近LogiXはじめた人向け。
Image

ボタンを押したときにパルスを出したい

このボタン押した時になにかしたいな!
お、ButtonコンポーネントにIsPressedなんてのがあるじゃん!エイッ!
Image
とやってしまっていました。
FireOnTrueはBooleanがTrueになったときパルスが出るノードです。
これでも一応動くのですが、実はいろいろと問題があります。

「一人でテストすると動くのに複数人のセッションだとおかしい」
「押しても反応しない時がある」
などの現象が発生する可能性アリ。

かわりにInteractionの中にあるButtonEventsを使いましょう。
Image
これなら確実にパルスが出るし、複数人のセッションで挙動が変わる心配もありません。
さらにボタンの種類によっては「押した時」「押している時」「離した時」「カーソルが乗った時」「カーソルが乗っている時」「カーソルが離れた時」それぞれのパルスと各種情報も取得できる優れものです。

一人でテストしたときはうまく行くのに複数人だとバグる

一人で黙々と作ってさあできた!みんな見て~!
と喜び勇んで取り出したアイテムがバグってる!!!さっきは動いてたのに!!!
ということがありました。

原因はいろいろ考えられますが、よくあるのがこれです。
Image
BooleanがTrueになったときにSlotを複製するというLogiXですね。
何も間違っていないように見えますが…
これを複数人居るセッションで実行すると、その場にいる人数分複製されます。

問題はFireOnTrueの左下、Userの入力に何も繋がっていないことです。
ここで誰にとってTrueになった時かを指定することになっているのですが、何も繋がない場合、LocalUserを繋いだのと同じ効果があります。
LocalUserはそれぞれのユーザーにとっての自分です。
FireOnTrueにLocalUserをつなぐと各ユーザーから複数回パルスが出るという挙動になります。

これが上でも触れた、一人で作業していた時と複数人のセッションで動かした時に挙動が変わってしまう原因です。
パルスのDisplayをよく見るとユーザー名が書かれており、誰が処理をしたのかわかるようになっています。
パルスを使う処理は誰が処理するのかを考えることがとても重要です。

ではどうすればいいのか?
処理するユーザーを誰か一人に決めてあげればOKです。
例えばこう。
Image
これならHostUserは各セッションに一人だけなので、一回だけ複製されます。

ただしホストが処理するのでは都合が悪いこともありますので、状況に応じて誰が処理するべきかよく考える必要があります。

なお、それぞれのユーザーから見て値がTrueになったとき、各ユーザーが1回ずつパルスを出すようにするには、LocalFireOnTrueというノードを使用してください。

ボタンを押したユーザーを取りたい

ボタンを押した人に○○する。みたいなアイテムはまっさきに作りたくなるものの一つですよね!
ここまでの2つの知識を組み合わせれば、誰がボタンを押したのかを知るのは簡単です。
Image
これで押したユーザーを破壊するボタンが作れますね!

Impulseを受けて値を出力する系のノードの出力を見たい!

面白そうなノードを見つけたけど、出力から何も出ていないように見える・・・どうやって使うの?
例えばこちら。
Image
GETStringはWebにGetリクエストを送れます。
Googleにアクセスして、成功のパルスも出ていますが出力はnullです。

実はこの手ノードはパルスが出るその一瞬だけ値が出力されるようになっています。
1フレーム内で処理が終わっているので画面には表示されません。

出力の内容を見たいときは一度Writeしておきましょう。
Image
後のフレームでこの値を使いたいときも、この方法で使用できます。

コライダーにあたったものを知りたい

「武器にぶつかったら弾き飛ばしたい」「攻撃判定に当たったものを破壊したい」
など、コライダーに当たった相手になにかしたい場面はよくありますよね!

コライダーに当たった瞬間に処理をするにはPhysics/OnCollisionStartが使えます。
Image
まず、判定に使うコライダーのTypeをActiveにする必要があります。
Image
そしてOnCollisionStartを繋ぎました。
これでこのBoxに何かが当たったときにパルスが出ます。

さて、当たった相手を知りたいのですが、どうすればいいのでしょうか?
ノードの右下から取れそうな気がしますが、IColliderという型になっていて繋がりそうなノードが見つかりません。

ここでSlot/GetSlotを繋いでみます。
Image
するとこのように当たったコライダーが含まれているSlotを取ることができました!
これでSlotを操作するノードを組み合わせて好きな動きを作ることができます。

ちなみにこのOnCollisionStartも、先述のLocalUserを繋いだFireOnTrueのように全員分のパルスが出ます。
そのため1人分だけ処理するにはGetActiveUserで武器を持っているユーザーや当たったユーザーを取得するなど、少し工夫が必要です。
(画像は当たったユーザーに処理させる例)
Image

おわり

このあたりのテクニックは知ってしまえば些細なことですが、何も知らないところから調べようとするとピンポイントで見つけるのに苦労する情報だと思います。
LogiXは繋ぐだけで動く手軽さが本当に最高なので無限に遊びましょう!

コメント

まだコメントはありません

コメントをするにはログインしてください