LogiXノードブラウザ探訪
この記事は Neos VR #2 Advent Calendar 2021 の20日目の記事です。
昨日の担当はe1ght3さんで今すぐ遊べるneos内ゲームの世界でした。いろんなゲームワールドも回ってみたいですね(それにしてもレースワールドが多かったですね)。
Neos VR #2 Advent Calendar 2021はまだスッカスカなので、今から記事とかを書いても間に合いますよ。アドカレは別に日付が過ぎてから公開しても構わないので、せっかくカレンダー用意してもらったので埋めていきませんか?
Neos で LogiX を触り始めた際に、「こういう値が取れるノードって無いのかな」となることが多く発生すると思います。
LogiX ではノードの存在を知っているかどうかで処理の作りやすさがかなり違うので、筆者は暇なときに Neos の公式 wiki の LogiX 一覧 を眺めていますが、未だ全てのノードを把握できていません。
ただ、ノードブラウザには同種のものがカテゴリ分けされているので、どういうノードが同じカテゴリに入っているかを知っているとある程度はノードを探しやすいと思います。筆者はカテゴリを開いて名前を見ながら、どんなノードなのか当たりをつけて機能を調べています。
この記事では、LogiX 開発でよく使われる(と思われる)ノードのカテゴリを紹介していきます。併せて、カテゴリ内のちょっとわかりづらい名前だけど便利なノードの紹介もします(ほぼ必ず使いそうなノードは情報がたくさんありそうなので、敢えて外しています)。
ノードブラウザを旅する手引き
LogiXTipのラベルによるヒント
ノードの名前から機能は推測できるけど、どこに何を繋いだらいいのかわからないノードに遭遇したときは、LogiXTipを装備して入力欄や出力欄にレーザーを合わせてみましょう。入力欄ならどんな値を入力される場所なのか、出力欄ならどんな値が出力されるのかが書いてあります。
検索機能
全てのノードを把握するのは無理なので、検索機能を活用しましょう。
JP Publics/個人 Individual/esnya public/TooltipAddonsにあるNodeBrowzer++には検索機能があります。
※追記: JP Public/個人 Individuals/yoshi1123_ public/Toolに検索機能を改良したNodeBrowzer++を置いてます。
Searchのタブを押すと検索窓があるので、そこに探しているノードの名前を入力するとノードブラウザ上の場所を検索してくれます。([T]のボタンを押すとコンポーネント検索にも切り替わります。)
欲しい機能っぽい単語を英語で入力すると検索に引っかかる可能性があります。
LogiX カテゴリ
Operators
https://wiki.neos.com/Category:LogiX:Operators
四則演算や大小比較など、簡単な計算や処理をするノードが集まっています。プログラミングでも頻出の基礎的な処理もたくさんあります。LogiXを触り始めたときに四則演算を探してMath/ばかり見てて見つからなかった悲しい記憶があります。
- Pack xyz, Unpack xyz: float3のような3次元の値を1次元のfloatに分解したり、あるいはfloatをfloat3に結合したりできます。
- 0 1: boolを入力してfalseなら0、trueなら1に変換します。
- Parsing/: stringを他の型にparseします。型ごとに別のノードがあります。
Math
https://wiki.neos.com/Category:LogiX:Math
Operators/にあるノードよりもすこし高度な数学っぽいノードが集まっています。乱数(Random/)や回転計算(Rotation/)、日時(DateTime/やTimeSpan/)などのノードもサブカテゴリに存在します。
- Remap, Remap -1..1 to 0..1: 入力と出力の範囲を指定して値を変換します。
Sin
のような[-1, 1]の範囲の値を[0, 1]の範囲に変更するときなどに使います。 - Clamp, Clamp01: 最大値と最小値を指定して、範囲から外れる値を最大値/最小値で抑え込みます。
- △: 1フレームでの入力値の変化量が取れます。微分みたいなイメージ。
String
https://wiki.neos.com/Category:LogiX:String
文字列操作周りのノードがまとまっています。テキストをこねくり回したいときに多用します。
- Format: いろんな値をstringに整形できます。C#のFormatの書式に従うらしいです。
- Index Of String: 特定の文字列が対象のstringのどこにあるかを検索できます。
- String Join: 複数の文字列をSeparatorで結合できます。カンマ区切りやスペース区切りでたくさん繋げたいときに便利です。
Flow
https://wiki.neos.com/Category:LogiX:Flow
Impulse(インパルス、パルス) の処理に関するノードが集まっています。条件分岐やループ処理などをするときに多用します。
- Boolean Latch: パルスを受けてboolをtrue/falseに設定したり、toggleさせたりすることができます。
- Sequence: 1つのパルスを複数のパルスに順次流していくことが出来ます。※パルスの処理は上から順に行われていきます。同時にはできません。
- Events/: ゲーム内でのイベントに応じてパルスを発生させることができるノードが集まっています。
Input
https://wiki.neos.com/Category:LogiX:Input 自由入力のノードや、時間を出力するノードなどが集まっています。主に時間経過に対して何かしたいときに使います。(自由入力のノードは、他のノードの入力のところから紐を引っ張ってセカンダリーで取り出せるので、あまり使ったことはないです。)
- T, T*10, T/10, T/2: セッションが建ってからの時間が出力されます。Math/Sinなどにつなぐと振動する値が作れます。
- UtcNow: プログラムでよく使われる協定世界時(UTC)の現在時刻が取得できます。日本時刻に変換する場合はMath/DateTime/To Local Timeなどに繋ぎます。
- Elapsed Time: 入力パルスが流れてからの時間を取得できます。
Actions
https://wiki.neos.com/Category:LogiX:Actions コンポーネントの要素や後述するVariables/Storage/ノードに値を書き込んだりするノードが集まっています。オブジェクトや変数に値を反映したいときに使います。
- Write Ref: 主にSlotやUserなどのような参照型をコンポーネントの値にWriteするときに使います。
- Drive: 通常のインターフェースノードに繋ぐDriveとは異なり、パルスによってドライブ開始/終了が制御できるノードです。
- Tween: 指定した開始~終了の値に一定時間で少しずつ変化していくように値を書き換えることができます。
Variables
https://wiki.neos.com/Category:LogiX:Variables
変数に関わるノードが集まっています。値を保持しておきたいときに使います。
- Storage/: Actions/Writeで書き込める一般的な変数です。
- Dynamic Variable Input, Read Dynamic Variable, Write Dynamic Variable: Dynamic Variableと呼ばれる名前を付けてアクセスするような変数の読み書きができます。詳しくはrheniumさんの記事を参照してください。
- Read Cloud Variable, Write Cloud Variable: Cloud Variableと呼ばれる、セッション間をまたいで値を持っておける変数の読み書きができます。Neow!やランキング機能などに使われています。
Slots
https://wiki.neos.com/Category:LogiX:Slots
ゲーム内オブジェクトのスロットを操作したりするノードが集まっています。スロットの情報を取得したり、スロットの階層を変えたりするときに使います。
- Index Of Child: そのスロットが、親スロットの何番目の子かを取得できます。
- Destroy Slot Children: スロットの子スロットを全て削除できます。
- Get Active User Self: このノードが入っているユーザーを取得できます。このノードが入ったオブジェクトをアバターに入れたり、グラブしたりしてユーザーを取得するときによく使います。(何故かUsers/に無いので注意。)
Users
https://wiki.neos.com/Category:LogiX:Users
ユーザーに関するノードが集まっています。ユーザー関連の型はUser
, User Root
, User Root Slot
などいろいろありますが、よくわかんないけど相互に変換するノードがあるので適当に変換したら多分使えます。
- Is Local User: ユーザーがローカルユーザー(≒自分自身)かどうかが取得できます。
- User From Username: ユーザーをユーザー名(Neosのアカウントの名前)で取得できます。
- Local User Space: ローカルユーザーがいる親スロットを取得できます。ユーザーの場所が移動されてるとRoot Slot直下にいないことになりますが、このノードを使えばある程度対応できます。
Transform
https://wiki.neos.com/Category:LogiX:Transform
スロットの位置(position)や回転(rotation)、拡大/縮小(scale)についてのノードが集まっています。スロットの位置を操作したり向きを調べたりするときに使います。
- Local Transform, Global Transform: スロットのローカル/グローバルのposition/rotation/scaleが取得できます。
- Right, Left, Up, Down, Forward, Backward: グローバル座標での、スロットからの左右上下前後の方向ベクトルを取得できます。
- Local Point To Global, Global Point To Local: ローカル座標やグローバル座標でのpositionを相互に変換できます。
Input Devices, Interaction, Tools
https://wiki.neos.com/Category:LogiX:Input_Devices
https://wiki.neos.com/Category:LogiX:Interaction
https://wiki.neos.com/Category:LogiX:Tools
3つ別のカテゴリですが、それぞれユーザーの入力やインタラクトに対して情報が取れるノードが集まっています。ボタンを押したり何かを持ったりなど、わかりやすい入力に対して処理を組みたい場合はよく使います。
- Input Devices/Controllers/Standard Controller: コントローラーの情報が取れます。グラブしてるかどうかやスティックをどのぐらい倒しているか、などが取得できます。
- Interaction/Grabbable/: GrabbableやSliderなど、グラブできるコンポーネントから情報を取得できるノードが集まってます。
- Raw Data Tooltip Events: 装備できるツールに付いているRawDataTooltipからトリガー押したかどうかなどのパルスが取得できます。
Network
https://wiki.neos.com/Category:LogiX:Network
外部のサーバーにリクエストを飛ばしたりするノードが集まっています。VR内でやりづらい処理を外部に処理を投げたり、あるいは外部のデータベースから情報を引っ張ってきたりすることができます。
- GET String: HTTP GETリクエストを飛ばせます。
- POST String: HTTP POSTリクエストを飛ばせます。
- Websocket/: Websocket関係のノードがあります。(筆者がWebsocketよくわからんので紹介できません……。)
終わり
他にもよくわからんノードはいっぱいあります。詳しそうな人に聞いてみたり、LogiXを組んでる横で知らないノードについて質問してみたり、みんなでこのノード何?って話ながらいろんな入力を入れてみて機能を推測してみたりするといいと思います。いろんなノードのことを知ってるとできることが増えていくでしょう。