Unityのビジュアルスクリプティングを使ったゲーム制作を始めて1年経ったので、私自身が1年前に知りたかった、実際にゲームを作るために使っているノードを少しまとめてみました。

個人的によく使うというだけで、説明の正確さには自信がありません。まあそのあたりは見かねたUnity上級者の方がちゃんとした記事をいっぱい出してくれることに期待しましょう。

Unityバージョンは大体2022.3.11f1(LTS)です。

2024/9追記:最近はChatGPTなどのAIがコードを提案してくれます。Unityのビジュアルスクリプティングでのやり方を聞けば流れを教えてくれます。以前は「マニュアルを参照してください」の一点張りでしたが改善されていました。すごい!

はじめに

始めたばかりの方はまずUnity公式のチュートリアルを一通り終えることをおすすめします。私も初めてUnityの使い方を覚えるときお世話になりました。

やりたい処理が明確な場合は、Unityスクリプトリファレンスで検索すると、どんなキーワードでノード検索すればいいか出てきます。

ただ初心者のうちはそもそも何と検索すればいいのか、どれを選んだらいいのかが分かりにくいと思います。

以下は自己流のノード検索と使用例です。


ノードの検索例

知りたい要素でノード検索すると大体それっぽいものが出てくるので、そこからどれが合っているか試しながら使っています。

  • 何かに何かをセットしたい→ Set
    • 画像を変えたい(Set Image, Set Sprite
    • 色を変えたい(Set Color
    • テキストを変更したい(Set Text ~)
    • 変数に代入したい(Set Variables
    • アクティブにしたい・非アクティブにしたい(Set Active
      • Set Activeは負荷がかかりやすいので、Set enableでコンポーネントごとにOn Offするほうがいいらしいです。
  • 何が入っているか取り出す→ Get
    • 何の数値が変数に入っているか(Get Variables
    • 今表示されているテキストの内容(Get Text ~)
  • プレイヤーが入力すること→ OnButtonKeybordClickInput
    • ボタンをクリックしたら……(On button Click)
    • 特定のキーが押されたら……(On Keybord Input)
  • サウンド関係→Audio
    • ボリューム変更(Set Volume)
    • 効果音を1回鳴らす(Play One Shot
  • テキスト関係→Text、Text Mesh Pro、Text Mesh Pro UGLString
  • 画像関係→ Sprite、Image、Color
  • 時間操作→Time
    • 何秒か待つ(Wait for second
    • 時間の流れを変更(Set Time scale
  • 生成したい→ Instance
  • 破壊したい→ Destroy
  • 移動・回転・変形したい→ Transform
    • 回転(Rotate)
  • 計算→ Formula
    • 足す(Add
  • 型を変更→To
    • Int型の数字などをStringに変更(To String)
  • 分岐→ If SwitchControl
  • 繰り返し→Loop
  • シークエンス(上から実行)→Sequence
  • リスト→List
    • 編集→プレイヤー設定→ビジュアルスクリプティングのAOT Safe ModeがOnになっているとノードが出てきません
  • シーン読み込み → Load Scene

あとはなんかStartとかPlayとか適当に検索すると出てくると思います。その他、変更したいものの名前で検索すると良さそうです。”Slider”とか”GameObject”とかそういう感じです。

使用例

ボタンを押す

ボタンを押すと3秒後に別のシーンに移動する簡単な内容です。Load Sceneでは別のシーンに限らず、今表示しているシーンを再読み込みすることもできます。リロードに便利なのでは。

On Button Clickのグラフインスペクターで、Coroutineの項目にチェックを入れておかないと、Wait出来ずにグラフが止まってしまいます。チェックを入れるとノードの右上の矢印が2本になります。

テキストを変更する

拙作「ラーメンライスは大罪」のアドベンチャーパートの一部です。DotweenProのDo Textで0.2秒かけて1文字ずつ文字を表示しています。事前にSet Textでテキスト欄を空欄にしています(すでに文字が入ったままDo Textをするとなんかバグったみたいな表示になってしまうので。もっといい方法があると思います……)。

ただ単にテキストを入れ替えたいだけなら、Set Textのオレンジの部分に表示したいコメントを入れればいいのでは。Text関係はレガシー?のTextやText Mesh Proなどがありますが、私はText Mesh Proしか使ったことが無いのでその他の使い勝手は分かりません。(TextMeshProを使っているはずなのに、TextMeshPro UGLという項目を選択しないと反映されないのはなぜなのかは未だによく分かりません……。)

補足

Listの内容

この作品の場合は、入れるテキストを画面左から引っ張ってきています。このListの前にSplit(String)→Get Item→Split(String)があります。エクセルで作った台本(イベント番号,セリフ|イベント番号,セリフ| ……のようにイベント番号とセリフとを区切ったもの)を、”|”部分でSplitを使い切り分けます。それを何番目に再生されたかの変数をつなげてあるGet Listで取り出します。そのあと更にSplitで、”,”で切り分け、Index0個目のイベント番号は他のイベント用に使います(BGMを変えたり、キャラクターの表情を変えたりなどの処理です)。Get ItemのIndexが1なので、ここではセリフの部分が再生されます。説明が下手。

アセットについて

文字送りが出来るアセットはいくつかありますが、Dotweenは便利だし資料も多いのでおすすめです。一番使っている有料アセットです。

アドベンチャーゲームやノベルゲームをメインで作る場合、NaniNovelや宴などの有料アセットに頼るのもいいかもしれません。文字送り機能も標準で入っているようです。また、Fungusという無料ツールも根強い支持があるようです。

スライダーで音量を変更する

BGMと効果音の音量を変更するスライダーです。プレイヤーがスライダーの数値を変えると、AudioSouceの音量が変更されます。また、その数値を別のシーンでも使えるようにアプリケーション変数に保存しています(このグラフやオーディオソースをつけたオブジェクトがシーンを超えても破棄されない仕様にしていれば、保存する必要はないかも)。

音量が変更されたときに効果音を鳴らしたほうがプレイヤーに優しいと思います。このままグラフの後に効果音(Play One Shot)をつけると、すごい勢いで連続再生されてしまいます。色々方法がありますが、Ifをつなげて、AudioSouceのIs Playingで効果音が再生されているか確認して、FalseのときだけPlay One Shotで鳴らすのが楽なのかなと思っています。

オーディオミキサーの使い方はまだよく分かっていないのですが、絶対便利なので出来ればそちらのほうが良さそうです。一度に再生できる音の上限を設定できるので、上記のような対策は必要なくなるのでは。

画像を移動させる

これは拙作「実録 ハイスコア刑務所」の目押しするゲームの一部です。ボタンを押してからの処理の最後の部分です。カーソル画像が次の場所へ移動し、それぞれの位置に配置してあるパーティクル(キラキラ)が飛び散ります。

Transformで位置を指定しています。指定する位置はボタンが1~4回目のいつ押されたかという変数(”this”という何も考えていない名前の変数)によって決定しています。ボタンが1回目ならListの1の項目(2番目)が選ばれます。5回目は別のところで処理しています。座標は今回手作業でリストに数値を入れていますが、本来であれば計算していい感じにするほうがスマートなのでは。

このグラフの範囲外で、ボタンが押されるたびにthisの数値がAddで1増えるようになっています。

同じ処理を使いまわす

Sequenceで同じ処理を使いまわせます。すごく便利!! 上から順番に再生されます。Step数はデフォルトでは10までしか増やせないようです。

これは上で解説したボタンを押すとシーン遷移するのとほぼ同じです。効果音が鳴り、画面に暗転するオブジェクト(Dotweenで0.2秒かけて真っ暗になるImage)を表示させ、0.3秒だけ待ち、シーンを移動します。

(グラフごと使いまわす方法は公式チュートリアルで少し学びましたが、私はあまり使いこなせていません……。)

作例

作ったゲームのグラフの中身を解説しました。半年くらい前に書いた記事で、1日で作ったゲームなので色々がばがばです。勢いで作っています。

その他、2023年10月現在までにUnityで制作したゲームは全てビジュアルスクリプティングで作っています。参考になるかもしれません。ならなかったら許してください。


お気持ち

Unityはビジュアルスクリプティングを使う以外にも、コードを書かずにゲームを作る手段が多いので、プログラミングが出来なくてもあまり気にすることはないと思います。ただしそのためのアセット(ツールなど)の置き場がGitHubで導入方法が分からなかったり、別途使い方を覚えなきゃならなかったりで、初心者にはやっぱりハードルが高いかもしれません。

プログラミングの手段よりも、初心者でゲームを完成させたことが無い方は、まずUnityの操作に慣れてミニゲームを一つ完成させることを目標にするといいと思います。私も初心者なので偉そうなことは言えませんが……。

ゲーム制作を始めて1年経ち、少しVisual Scriptingで出来ないことにぶつかりつつあります。大体のことは、やってみたいことをネット検索 → C#のコードで教えてくれる記事が見つかる → 必要なところをノード検索する → それっぽいノードを見つけて動かす で乗り切れました。しかしビジュアルスクリプティングでは、検索して出て来るノードが最初は限定されていて、その他のノードはその都度、自分で追加しなければ出てきません(プロジェクト設定→ビジュアルスクリプティングの項目から追加)。そこで追加出来ればいいのですが、中には何と入れれば出て来るのか全然分からないものもあります。それがビジュアルスクリプティングの限界なのか、別の方法があるのかすら資料不足で分からないという……。

また、グラフの中で、特定のノードがどこにあるか検索できなかったり、C#向けの色々な便利ツールを使用できないのはデメリットかなあと思いました。でも今の私にとってはメリットのほうが断然多いです。

追記:ノード検索やエラー確認ができるVisual Scriptingの拡張機能が配布されています。便利!

余裕があればC#を勉強して、ビジュアルスクリプティングで出来ないところだけC#にすることが理想かなあと思います。最近はChatGPTさんなどのAIがコードを提案してくれるので、頼りになりそうです。

時代は人工知能……

おわりに

この記事を書くにあたり公式ドキュメントを見直しました。1年前は「全然分からないし不親切!」という印象でした。しかし今になってやっと、その謎の単語たちをノード検索することが最短経路だと気づきました。スクリプトリファレンスすごい!!

ビジュアルスクリプティングは初心者向けを謳いつつ資料が少ないので、各々が開拓者としての矜持や孤独を抱えてゲーム制作に臨んでいるのではないでしょうか。そんなことはないか。確実に人口は増えていると思います。今後、もっと面白いゲームが増えることに期待しています。

Categories: