Visual Scripting(Playmaker,Bolt)を使ってゲーム状態管理をする！

この記事は[「Unity アセット真夏のアドベントカレンダー」](https://assetstore.info/eventandcontest/adventcalendar/summer-advent-calendar-2021/)の8/15の記事です。
前回は[k1t(外神)](https://note.com/k1togami/)さんの[unity]テレイン地形編集土木神ツールPathPainterII(アドカレ編)でした。
次回は[澪rum](https://twitter.com/xxxxsue)さんのPanoply: Comics & Splitscreen for Unityでなにを作ってみるです。

#はじめに
皆さんは、Unityで<font color="red">**ゲームの状態管理**</font>をどういう風にしていますでしょうか？
この記事ではVisual Scriptingを使った<font color="red">**分かりやすく簡単で汎用性のある**</font>**ゲームの状態管理**を紹介したいと思います。
この記事では以下のような流れで説明していきたいと思います。

　　　1. 　**代表的な状態管理の方法**をいくつか紹介
　　　2. 　次に**Bolt**と**Playmaker**について軽く説明
　　　3. 　**それらを使った状態管理の方法**の紹介
　　　
割と文章が多くなってしまったので状態管理の方法だけ知りたいって人は**３まで飛ばしてください**。
#代表的な状態管理の方法
###Sceneで管理する
Unityでゲームを作るときに、割と最初に学ぶ方法です。
Start画面、Game画面、Result画面とSceneを分ける方法です。
これは、Unityの基礎で大切なのですがゲームが大きくなるにつれ、Game画面の**スクリプトの量がどんどん大きくなって**、<font color="red">**分かりにくいプログラム**</font>になります。

###自分でステートマシンを作る
ステートマシンとは、**今の状態を保持**していて**別の状態に移動出来る**ようにした状態管理をするためのプログラムの事です。
ステートマシンを作ると、<font color="red">**分かりやすいプログラム**</font>になる上、ゲームを改良したいときに改良しやすく**汎用性**が高まります。
しかし、ステートマシンを作るにはそこそこの**プログラムの知識**が必要でクラス継承周辺やデリケートなどを使いこなせる必要があります。
これは、初心者には<font color="red">**結構大変**</font>だと思います。

###ネットに載っているステートマシンを使う
ネットで調べていると、**すごい人達が作ったステートマシン**が割と多く載っています。
自分もそれらを使おうとしましたが、結果から言うと**ダメでした**。
Unityでアセットを使うのとは違い、すごい人達が作ったスクリプトを<font color="red">**ある程度読めないと**</font>自分でステート(状態)を作れないからです。
また、時々バグなどもあって、修正したりもしなければなりません。
そういうすごい人達がスクリプトは**高度な文法やアドオンを駆使**していて理解するのはとても難しいです。

#Visual Scripting
そこで、この記事ではVisual Scriptingを使って状態管理をしていきたいと思います。
その前にVisual Scriptingについて少し話したいと思います。
###Bolt
[Bolt](https://assetstore.unity.com/packages/tools/visual-scripting/bolt-163802?locale=ja-JP?utm_source=twitter&utm_medium=social&utm_campaign=jp-advent-calendar-summe)は2020年7月に**無償化**されたVisual Scriptingアセットです。
もともと有料アセットだったので、機能は結構豊富で<font color="red">**フリー**</font>なのでとても便利です
<img width="300" alt="bolt" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404889/3fb53797-72ad-5f52-8b77-c6e130b240ce.png">
画像　[Bolt](https://assetstore.unity.com/packages/tools/visual-scripting/bolt-163802?locale=ja-JP?utm_source=twitter&utm_medium=social&utm_campaign=jp-advent-calendar-summe)

###Playmaker
[Playmaker](https://assetstore.unity.com/packages/tools/visual-scripting/playmaker-368?locale=ja-JP?utm_source=twitter&utm_medium=social&utm_campaign=jp-advent-calendar-summe)はUnityの数あるVisual Scriptingアセットの中で、おそらく**最も有名な**Visual Scriptingアセットです。
その理由は様々なアセットが**Playmakerに対応**しているからです。
他のVisual Scriptingアセットには対応してなくてもPlaymakerには対応しているなんてことは良くあります。
さらに**アドオン**も豊富で**汎用性**が高いVisual Scriptingアセットです。
71.5ドルと少し高いですが、とても有能なアセットです。
<img width="300" alt="playmaker" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404889/47527675-1f89-ce7a-0fbc-6dc89c73964d.png">
画像　[Playmaker](https://assetstore.unity.com/packages/tools/visual-scripting/playmaker-368?locale=ja-JP?utm_source=twitter&utm_medium=social&utm_campaign=jp-advent-calendar-summe)

###Visual Scriptingの利点と欠点
Visual Scriptingはすごく有能ですが、欠点もあります。それは以下のようなものです。
#####利点
1.  **プログラムを書かなくてもプログラミングが出来る**
1.  プログラムの内容を<font color="red">**視覚化**</font>出来て、分かりやすく管理出来る

#####欠点
1.  裏を返すと**プログラムを書く力が身につかなくなる**
1.  あまりにブロックが多くなると、<font color="red">**逆に見づらいもの**</font>になってしまう

#Visual Scriptingを使った状態管理
これらの利点と欠点を踏まえて、私が考えたのは<font color="red">**Visual Scriptingを使う量を最小限に抑える**</font>ということです。
そうすれば<font color="red">**視覚化**</font>されて分かりやすいし、プログラムを書く力が身につかなくなることはないと思います。
以下はPlaymakerでしていますが、Boltでも同じだと思います。
<img width="700" alt="2021-08-13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404889/922ce2b9-6da8-eff9-af5f-0bac63dfbefc.png">
上の画像を見てください。これは私が作ったゲームの状態管理用のPlaymakerの状態遷移図です。
使うブロックの数は**9個**と最小限にとどめています。(waitはScene遷移の都合上入れました)
**色でSceneで行う処理を分けていて**、DontDestroyOnLoadでSceneが移動してもこのオブジェクトが残るようにしています。

各状態のアクションは、Call MethodとScene遷移、音楽系がほとんどを占めており、
具体的なプログラムは<font color="red">**Call Method**</font>**で呼ぶことで動かしています**。
**こうすることでブロックの数を最小限にしています。**

###この方法の利点と欠点
前述した代表的な状態管理の方法に比べると、状態遷移が<font color="red">**視覚化**</font>されていて**分かりやすく**、<font color="red">**簡単**</font>だと思います。
しかし、この方法だと(Playmakerだからかもしれませんが)
**状態が終了した時の処理が書けません**。そこは**状態を増やす**などして対応すれば良いと思います。

#まとめ
* ゲーム状態管理は**Visual Scriptingアセット**を使おう！
* ブロック数は**最小限**に！
* **分かりやすい**状態管理をしよう！

ありがとうございました！