Selectノード(選択する)の使い方
妹「ぷちコンの締め切りが近づいてきて、困ったことが立て続けに出てきたんだけど、まずはSelectノードの使い方教えてくれ」
「セレクト? 数値に合わせて何を実行するか変わる、Branchの進化系みたいのじゃなかったっけ?」
妹「それはSwitchだよ。それとは別の、日本語だと"選択する"って名前のノードになってるやつがあるの。見た感じ役に立ちそーな気配があるんだけど、ピンの形が菱型だったりして使い方がよくわからない」
「えー、そんなのあったかなあ」
「……あるね。なるほど、これは純粋化したSwitchノードというか、分岐型GETノードというか、そんな感じの仕組み。使い方としては、indexのところにきた数字によって、ReturnValueピンから出てくる中身が変わる。indexにはByte、Int、Boolean、そして各種Enum型が設定出来て、Optionピンはそれぞれに数字毎に出力する内容を設定する」
妹「菱型のピンになってるのはなんで?」
「菱型の部分はどの型にしてもいいけど、全部同じ型にしないと行けない。例えば数字が0の時はActorを、数字が1の時は文字列を返すみたいな仕組みを許すと、その後の設計がめちゃくちゃになるから。Optionピン全部と出力ピンは同じ型でないと困る。C++で言うところのテンプレート関数として作ってある」
妹「なんか適当なノードを繋いだらその型になったけど、それでいいのかな?」
「それでいいよ。どれか一箇所設定したら菱型のやつ全部変わるから。ただ2回目以降はそれやっても繋がらなかったり、キャストしようとするから、ピンのところを右クリックして変数の種類を変えるようにする」
妹「Enumで分岐させたいんだけど、その場合はOptionもEnum型に設定するの?」
「いやそれはindexだけそのEnum型にする。そうするとそのEnumに対応した数のOptionピンが自動的に出来るから、必要なデータの型に合わせて変数の種類を変える。表示する文字を変える文字列とか、スポーンする物を変えるならクラス型とか」
妹「Enumに合わせてピンが出来るっていうけど、数字だと何万種類もあると思うんだけど」
「indexの型がEnumかBooleanの場合は現実的な数だから、必要な数のピンが全部出てくるけど、数字の場合は自分でピンを増やすんだよ。Selectノードのピンのないところを右クリックするとピンを増やしたり減らしたり出来る。最低は初期状態の0と1の2種類。3、4、5と増やせる。マイナスにしたりとか、途中を飛び飛びの数字にしたりはできない」
妹「もしそうじゃない数字が来たら? 10までしかピンがないのにindexに11が来た時とか?」
「その場合は、出力用の型の初期値になる。Intだったら0、Stringだったら空文字みたいな。ただ未定義の動作だから、そういう可能性がある時は、Selectノードの手前にBranchノードとか置いて、範囲外の値が来ないようにしておくのが良いと思う」
妹「結局のところどういう場合に使えばいいのかなこれ?」
「何を実行するかで分岐するんだったらBranchかSwicthを使えばいいけど、実行する処理自体は変わらなくて処理の中身を変えたい時はSelectノードが有効だと思う。これまでブログで紹介したノードの中にもSelectノードで良かったんじゃないかというのが沢山ある」
妹「Branchの代わりにもなるんだ」
「indexのところをBooleanにすると、同じ条件式で出力が2種類あるノードを作れるからね。Branchで分岐した先で別々の変数をSETするようなケースでは、Selectで書いた方がシンプルになる。Booleanで分岐するなら、SelectIntノードとかSelectStringノードとかを使ってもいい。原理的にSelectと同じだけど、最初から型が決まってるから手間が省ける」