Control ノード
Note
バージョン 2019/2020 LTS を使用している場合は Unity Asset Store から Visual Scripting パッケージをダウンロードしてください。
Control ノードは、フローの分岐、ループ、結合を行います。
Branching
Branching (分岐) ノードは、制御フローを値に基づいて分割します。
If
一般的な If ノードはブール条件を使用します。"条件が true の場合に何かを実行し、そうでない場合は他の何かを実行する" ノードと考えてください。
Switch
enum (列挙型)、string (文字列)、あるいは integer (整数) の値から分岐します。こうしたノードは Switch ノードと呼ばれます。
enum に switch を使用する場合は、その enum の Type を指定してください。分岐出力ポートが表示されます。
string または数値に Switchを使用する場合は、各分岐オプションを Graph Inspector で作成してください。
ノードが、各出力ポートを持つ形に更新されます。
string の場合は、セレクターの大文字と小文字の別を無視することもできます。
Note
] Default ポートは常に追加されます。これは、入力セレクターが他のどのオプションにも対応しない場合に制御フローが通るパスです。
Select
Select ノードは Switch ノードの逆です。セレクターに基づく一式のオプションから 1 つの値を選択できます。
例えば、Select On Integer ノードは、プレイヤー番号に基づいて色を選択します。
Note
上の例では、playerNo が 1、2、3、4 の中にない場合に予測デバッグがクラッシュの警告を出します。これは Default ポートが接続されていないためです。
Looping
Loop (ループ) は、先に進む前に、ロジックを一定の回数繰り返します。
繰り返されるロジックはループのボディと呼ばれます。ループの終了後に Exit ポートが呼び出されます。
Note
全てのループのボディが (複数のフレームにわたってではなく) 同時に呼び出されます。更新イベントを手動でリッスンすることにより、コルーチン的な動作が実現されます。
While Loop
While Loop は最も単純なループです。条件が true である間中ループのボディが繰り返されます。条件が false になった時にのみループが終了されます。
例えば、以下のグラフは、結果が names Application 変数に含まれなくなるまで、ランダムな新しい名前を再生成し続けます。
Warning
無限ループを作成しないでください。条件が常に true だとエディターがハングアップします。ループのボディ同士は並列ではなく同期しているため、Visual Scripting では While Loop の用途はほとんどありません。
For Each Loop
For Each は、コレクションの各要素を反復処理します。現在のインデックスおよびループされているアイテムを返します。
例えば、以下のグラフは 3 つのメッセージをコンソールに出力します。
- I like cats
- I like dogs
- I like birds
ループ内のディクショナリからキーと値にアクセスするには、Dictionary ボックスをオンにしてください。
For Loop
For は数値ループで、3 つの整数 (開始インデックス、終了インデックス、ステップ) を必要とします。ループは First (最初) のインデックスから開始し、Last (最後) のインデックスまで Step (ステップ) の値ずつインクリメントします。現在のインデックスを出力します。
例えばこのグラフは、Step の設定値に基づいて奇数を飛ばして 10 までカウントします。つまり出力は 0、2、4、6、8 となります。
For Loop は、Get List Item および Count Items ノードと組み合わせても非常に役立ちます。
例えば以下は、コンソールへの出力が "I like {animal}s" になる、1 つ前のグラフと非常に類似したグラフです。
このグラフは、各アイテムを出力する For Each ノードを使用する代わりに、リスト内のインデックスによって各アイテムを手動で出力します。異なるインクリメント値 (この場合は 2) を指定して一部のアイテムを飛ばします。このグラフは以下の 2 つのメッセージを出力します。
- I like cats
- I like birds
Break Loop
Break Loop ノードを使用するとループを早期に終了することができます。このノードに入ると同時に、残りのイテレーション数に関わらず、ループの Exit ポートが呼び出されます。
例えば、このループは 10 までカウントするはずですが、Break のために 5 で停止します。出力は 0、1、2、3、4 となります。
Exception Handling (例外処理)
Try Catch
Try Catch ノードは、発生した 例外 を処理します。このノードは、失敗する可能性のあるコードが存在すると思われる場合に、ゲームがクラッシュするのを防ぎます。
Try ブランチ内で実行されるものは全て "安全" とみなされます。失敗したスクリプトは代わりに Catch ブランチから続行されます。Exception ポートは、発生した失敗に関する情報をキャッチします。これは一般的に、警告を例外メッセージとともにログに記録する方法で処理されます。
Note
デフォルトではこのノードは全ての例外をキャッチします。ドロップダウンメニューで例外の型を変更することで、処理を具体的に指定できます。
Finally ブランチはオプションです。これは、操作が成功したかどうかに関わらず、 Try または Catch の後に必ず呼び出されます。これは通常、解放されなければならないリソースを破棄あるいは破壊するために使用します。破壊する必要のあるリソースがないい場合は、このポートは切断できます。
Throw
Throw ノードを使用すると、独自の例外を発生させてフローを停止させることができます。この例外は Try Catch でキャッチされます。
予期せぬ事態が起こったらすぐにこれを投げて "早い時点で失敗する" ことをお勧めします。これは、バグがあるまま進行して後の時点で思わぬ二次的影響が発生しないように、チェーンの早期でバグを発見するのに役立ちます。
例えば、ダメージが正数であることを適用前に確認するには、以下のようにします。
Custom のチェックボックスをオンにすると、"簡単なメッセージ 1 つ" だけでなく、より大きなデータを含むカスタムの Exception オブジェクトを渡すことができます。ほとんどの場合、これは必要ありません。デフォルトで投げられる例外の型は System.Exception
です。
Toggles
Toggle (トグル) ノードは電気のスイッチに似た原理を持っており、オンとオフの切り替えによって、スクリプトと値のどちらかに影響を与えることができます。開いたり閉じたりできる "門" と考えてください。
Toggle Flow
Toggle Flow ノードは、制御のフローを開閉します。オンの場合はフローが通過し、オフの場合は通過しません。
ロジックを精密に制御できる入力や出力は多数あります。前の例では、Toggle を使用して、同じイベント (キー押下) がトグルのオンとオフを切り替えるのを示しています。これは、2 つの異なるイベントを通して On と Off を使用することで行えます。
ロジックを精密に制御できる入力や出力は多数あります。前の例では、Toggle を使用して、同じイベント (キー押下) がトグルのオンとオフを切り替えるのを示しています。2 つの異なるイベントを使用して同じ結果を得るには、代わりに On と Off を使用してください。
出力側では、Is On ブーリアンポートが、(オン/オフが切り替わる) トグルの状態を示しています。制御出力は以下のようにトリガーされます。
ポート | トリガーされるタイミング |
---|---|
On | マークされていない入力から (それがオンの時に) フローがトグルに入ります。 |
Off | マークされていない入力から (それがオフの時に) フローがトグルに入ります。 |
Turned On | On 入力または Toggle 入力を通して、トグルがオンになります。 |
Turned Off | Off 入力または Toggle 入力を通して、トグルがオフになります。 |
Toggle Value
Toggle Value ノードは、そのオン/オフによって、2 つの異なる入力値のどちらかを選択します。このノードのポートは Toggle Flow ノードと全く同様に機能します。
前の例と同じロジックを実装するもう一つの方法として、Space をクリックすると、上へ移動するようにオブジェクトを切り替えられます。ここでは垂直速度として 1 または 0 の値が提供されます。
Note
ツールバーで Relations オンにすると、トグルポート間のフローが視覚化されます。
Once
Once ノードは、初回のトラバーサル時に、それ以降のトラバーサルとは異なるロジックを実行します。
Reset ポートに入ることでリセットできます。
Cache
Cache ノードは、負荷の高い操作の結果を、必要になる度にフェッチし直すのではなく、保存して再使用します。
例えば、このグラフを使用すると、数式が 2 回計算されます。
Cache ノードを使用すると、結果が保存されて 1 度だけ計算されるので、パフォーマンスが最適化されます。
Note
キャッシュは現在のフローの範囲内でしか持続しないことに注意してください。キャッシュの値は別のイベントには共有されず、別のイベントから使用することはできません。