#はじめに
「QRコードをLogiXで読む」という記事を書こうとしたら記事ひとつでは収まりきらないことに気づいたのでそっちは後で分けて公開して今回は別のことについて書くことにししました。
今回はLogiXを組む上で重要となるImpulse(及びFlow)に関連する話をいくつか書いきました。
ローカルとグローバルについての理解が必要であるため、同アドベントカレンダーの見ている人によって値が違う???を先に読むことをおすすめします。
また、この記事はLogiXをある程度触っている人向けです。
#FireOnTrueとLocalUser
入力されたBooleanがTrueになった時にPulseを出すノードには、FireOnTrueとLocalFireOnTrueがあります。FireOnTrueは入力されたUserを元にしてBooleanの評価を行い、LocalFireOnTrueは全てのUserがそれぞれでBooleanの評価を行います。
FireOnTrueにLocalUserを繋げるた場合、一見LocalFireOnTrueと同じ挙動をしそうですが、繋げてUserによって値の違うBooleanを入力するとBooleanが変わっている訳でもないのにPulseが何度もでてしまいます。
その原因はFireOnTrueはBooleanが変わったかどうか実際に評価する時にUserの区別をしていないということです。
このためUserが切り替わった時にそのUserから見たBooleanがTrueだった時、FireOnTrueは「BooleanがFalseからTrueに変わった!」と誤解してしまいます。
また、FireOnTrueは一度に複数のUser分のBooleanを評価することは出来ません。前回の値を保存しておく入れ物が1つしか無いような感じです。そのためA→B→C→A...という風に順番に評価することになり、何度もPulseが出てしまいます。
LocalFireOnTrueの場合はUserごとに評価している(User分の入れ物がある)ため、Pulseが何度も出るということは起こりません。
#LocalFireOnTrue
ゲーム等を作っていると、User全員分のPulseを出したい時が多々あります。そこで便利なのがLocalFireOnTrueです。本来LocalFireOnTrueはUserごとに値の違うBooleanを入れて使いますが、ここにBooleanLatchなどのグローバルで変わるBooleanを入れることで全員が各々で評価を行い、全員分のPulseを出すことができます。UserListの取得等に使えるので覚えておきましょう。
#長いループ処理とセーフティ
赤くなったLogiXノードを見たことがありますか?純粋にノードが壊れた時も赤くなりますが、大抵の場合はセーフティによってノードのEnableが切られることが原因です。誤ってPulseの入力と出力を繋いでしまったりループから抜けるためのIfを間違ってしまい永遠にループしてしまった時などに良く起こります。
しかしどうしても数千、数万回の処理を走らせたいということもありますよね?そんな時に使うのがUpdatesDelayノードです。UpdatesDelayは入力されたintフレームだけPulseを遅らせることが出来ます。これを1度の処理の最後に入れることで意図的に1フレームの遅延を発生させ、1フレームで全ての処理を行おうとするのを防ぐことが出来ます。数が少なくても1度の処理が重い時等にも使えます。
ただし、Forノードは処理が終わったタイミングで次のPulseを出しているのではなく単純に順番にPulseを出しているだけなので、UpdatesDelayで遅延を入れることができません。そのためUpdatesDelayを使う場合はIfとVariableIntを用いたループ処理を使いましょう。
#LogiXの並行処理
どのノードも基本的に1つのノードから同時に複数のPulseが出ることはありません。LocalFireOnTrueは全員分が微妙にずれて出てきますし、Sequenceは上から順番に出てきます。このため、繋ぐ順番によって処理が変わってしまいます。
ForもSequenceはその全ての処理を1フレーム内で完結させようとするため、一見並行処理をしているように見えますが、実際は順番に処理を行っているのだということを理解しておきましょう。
#終わりに
今回の記事ではImpulseを扱うにあたってつまずきやすいこと、思いつきづらいことを中心にまとめました。
アドベントカレンダーというものを知って前回、今回と人生で始めて記事を書いてみました。私は文章化するのがあまり得意ではないのでだいぶゆっくりになってしまいますが、わりと楽しかったので記事を書いてちょっとずつ自分の持ってる知識を広めていきたいと思います。