こんにちは。
プログラマの中村です。
前回の記事は2024年1月9日に書いていますので、約1年越しになります。
1年というのはあっという間に過ぎてしまいますね。
今回はUnityのVisual Scriptingという機能を使ってみたいと思います。
Visual Scriptingとは
Visual Scriptingはノードベースエディターを使用してノーコードでゲームの挙動を制御するツールになります。
ノーコードとは、言い換えれば「プログラミングをしない」ということになります。
一般的にプログラミングは習得難易度が高いと考えられており、プログラミングをしないで良いのならば、より幅広いクリエイターがゲームを開発することができます。
実際『RPGツクール』などのツールを使用して多くのゲームがリリースされています。
ノードベースエディターについて
前述した通り、Visual Scriptingはノードベースのエディターを使用します。
ノードベースエディターはノードと呼ばれる「箱」をエッジと呼ばれる「線」で接続して表現します。
ノードベースエディターはVisual Scripting専用の用語ではなく様々なツールで使用されています。
有名どころではMayaやBlenderのノードエディター、Unreal EngineのBlueprint、UnityではShader Graphなどがあります。
GUIを使用して直観的にデータの流れを決定できるため、多くのツールで採用されています。
反射神経測定ゲームを作る
習作として反射神経を測定するゲームを制作してみます。
具体的にはオブジェクトの色が変わった瞬間にクリックすることで、それにかかった時間を計測します。
以降Unityやプログラミングの専門用語が多く登場します。
ですので記事を読むためにはある程度のUnityやプログラミングの知識が必要となります。
シーンの作成
シーンにはゲームの制御をするGameController
を配置します。
GameController
にはVisual Scriptingを動作させるScript Machineを追加し、Script Graphも作成しておきます。
またクリックするオブジェクトとして球の3DオブジェクトSphere
を配置します。
Sphere
はマテリアルを変更して赤色に色を替えておきます。
さらにゲームの状態や測定結果を表示するテキストオブジェクトText
も配置しておきます。
ステートによる処理の振り分け
反射神経測定ゲームを作るにあたって、ゲームの要素を列挙します。
- 画面がクリックされたら2~3秒後にオブジェクトの色を別の色に変化させる。
変化させると同時に測定を開始する。 - 画面がクリックされたら測定結果を表示する。
- 画面がクリックされたらオブジェクトの色を元の色に戻し、再度測定を開始する。
今回は処理が単純なため、それぞれの状態(ステート)をSwitchノードを使って分岐させます。
On UpdateノードにSwitchノードを接続し、オプションは状態数分用意しておきます。
状態1の実装
まず「2~3秒後にオブジェクトの色を別の色に変化させる。変化させると同時に測定を開始する」という処理を実装します。
処理を遅延させるため、コルーチンが必要となります。
コルーチンを使用するにはCustom EventノードのCoroutineにチェックを付けます。
そしてRandom: Rangeノードで遅延する秒数を決定します。
Wait For Secondsノードで遅延させた後、Material: Set Colorノードで球の色を変化させます。
球はGet Object Vairableノードでシーン上の球をアタッチしたObject変数から取得します。
さらにSet Graph Variableノードで現在の時間を記録する処理を追加しておきます。
次に「画面がクリックされたら」という部分を作成します。
Input: Get Mouse Button Downノードでクリックされたかどうかが取得できます。
クリックされた場合はIfノードを介して、テキストの内容を「Click on green.」に変更します。
テキストの変更にはTextMeshProUGUI: Set Textノードを使用しています。
加えてTrigger Custom Eventノードで先程作成したコルーチンを起動します。
最後にSet Graph Variableノードでステートを次に進めます。
状態2の実装
次は「画面がクリックされたら測定結果を表示する」という処理を実装します。
一番初めに球が緑になっているか(=測定が開始されているか)をチェックする必要があります。
これにはGreaterノードを使用して、StartTime変数が0以上であるかを確認します。
続いて状態1と同じようにInput: Get Mouse Button DownノードおよびIfノードでクリックされたかどうかを取得します。
最初にクリックされた時間はStartTime変数に格納されています。
その時間と今回クリックされた時間との差分とることで反応速度を測定します。
差分はSubtractノードを使って計算します。
またミリ秒に変換するためMultiplyノードで1000倍します。
StartTimeはfloat型の変数なので、String: Formatノードを使って文字列に変換し、その文字列はText
にセットします。
最後にステートを次に進めます。
状態3の実装
「画面がクリックされたらオブジェクトの色を元の色に戻し、再度測定を開始する」の実装を行います。
マウスの入力取得はこれまでと同様です。
Set Graph VariableノードでStartTimeのリセットを、Material: Set Colorノードで球の色を赤にリセットします。
残りの処理は状態1の処理と同じですので、後続処理として状態1の処理へエッジを接続します。
グラフが見にくくなるため、本来はSubgraphを使用するべきですが今回は省略します。
挙動の確認
最後に実際に遊んでみて想定の挙動になっているか確認します。
私の反射神経はさておき挙動自体は正しそうです。
まとめと感想
今回はVisual Scriptingを使用して反射神経測定ゲームを作成しました。
エディターの操作自体は単純で、つまずくことなく使用することができました。
また、プログラミングは一切していませんので開発の心理的ハードルは低くなりそうです。
一方で、Unityを使用したことが無い初心者向けであるかは少し疑問が残ります。
というのもVisual Scriptingを使用するためには、Unityやプログラミングの知識が必要になります。
Web上に情報も少ないため、全くの初心者がVisual Scriptingを使用してゲーム開発というのはハードルが高いと感じました。
昨今では生成AIが登場し、プログラミングをある程度代替してくれますので、それらを活用してプログラミングを習得する方がゲーム開発の難易度は低いかもしれません。
使用用途などを適切に使い分けていきたいですね。