この記事は「Unity アセット真夏のアドベントカレンダー」の8/15の記事です。
前回はk1t(外神)さんの[unity]テレイン地形編集土木神ツールPathPainterII(アドカレ編)でした。
次回は澪rumさんのPanoply: Comics & Splitscreen for Unityでなにを作ってみるです。
#はじめに
皆さんは、Unityでゲームの状態管理をどういう風にしていますでしょうか?
この記事ではVisual Scriptingを使った分かりやすく簡単で汎用性のあるゲームの状態管理を紹介したいと思います。
この記事では以下のような流れで説明していきたいと思います。
1. 代表的な状態管理の方法をいくつか紹介
2. 次にBoltとPlaymakerについて軽く説明
3. それらを使った状態管理の方法の紹介
割と文章が多くなってしまったので状態管理の方法だけ知りたいって人は3まで飛ばしてください。
#代表的な状態管理の方法
###Sceneで管理する
Unityでゲームを作るときに、割と最初に学ぶ方法です。
Start画面、Game画面、Result画面とSceneを分ける方法です。
これは、Unityの基礎で大切なのですがゲームが大きくなるにつれ、Game画面のスクリプトの量がどんどん大きくなって、分かりにくいプログラムになります。
###自分でステートマシンを作る
ステートマシンとは、今の状態を保持していて別の状態に移動出来るようにした状態管理をするためのプログラムの事です。
ステートマシンを作ると、分かりやすいプログラムになる上、ゲームを改良したいときに改良しやすく汎用性が高まります。
しかし、ステートマシンを作るにはそこそこのプログラムの知識が必要でクラス継承周辺やデリケートなどを使いこなせる必要があります。
これは、初心者には結構大変だと思います。
###ネットに載っているステートマシンを使う
ネットで調べていると、すごい人達が作ったステートマシンが割と多く載っています。
自分もそれらを使おうとしましたが、結果から言うとダメでした。
Unityでアセットを使うのとは違い、すごい人達が作ったスクリプトをある程度読めないと自分でステート(状態)を作れないからです。
また、時々バグなどもあって、修正したりもしなければなりません。
そういうすごい人達がスクリプトは高度な文法やアドオンを駆使していて理解するのはとても難しいです。
#Visual Scripting
そこで、この記事ではVisual Scriptingを使って状態管理をしていきたいと思います。
その前にVisual Scriptingについて少し話したいと思います。
###Bolt
Boltは2020年7月に無償化されたVisual Scriptingアセットです。
もともと有料アセットだったので、機能は結構豊富でフリーなのでとても便利です
画像 Bolt
###Playmaker
PlaymakerはUnityの数あるVisual Scriptingアセットの中で、おそらく最も有名なVisual Scriptingアセットです。
その理由は様々なアセットがPlaymakerに対応しているからです。
他のVisual Scriptingアセットには対応してなくてもPlaymakerには対応しているなんてことは良くあります。
さらにアドオンも豊富で汎用性が高いVisual Scriptingアセットです。
71.5ドルと少し高いですが、とても有能なアセットです。
画像 Playmaker
###Visual Scriptingの利点と欠点
Visual Scriptingはすごく有能ですが、欠点もあります。それは以下のようなものです。
#####利点
- プログラムを書かなくてもプログラミングが出来る
- プログラムの内容を視覚化出来て、分かりやすく管理出来る
#####欠点
- 裏を返すとプログラムを書く力が身につかなくなる
- あまりにブロックが多くなると、逆に見づらいものになってしまう
#Visual Scriptingを使った状態管理
これらの利点と欠点を踏まえて、私が考えたのはVisual Scriptingを使う量を最小限に抑えるということです。
そうすれば視覚化されて分かりやすいし、プログラムを書く力が身につかなくなることはないと思います。
以下はPlaymakerでしていますが、Boltでも同じだと思います。
上の画像を見てください。これは私が作ったゲームの状態管理用のPlaymakerの状態遷移図です。
使うブロックの数は9個と最小限にとどめています。(waitはScene遷移の都合上入れました)
色でSceneで行う処理を分けていて、DontDestroyOnLoadでSceneが移動してもこのオブジェクトが残るようにしています。
各状態のアクションは、Call MethodとScene遷移、音楽系がほとんどを占めており、
具体的なプログラムはCall Methodで呼ぶことで動かしています。
こうすることでブロックの数を最小限にしています。
###この方法の利点と欠点
前述した代表的な状態管理の方法に比べると、状態遷移が視覚化されていて分かりやすく、簡単だと思います。
しかし、この方法だと(Playmakerだからかもしれませんが)
状態が終了した時の処理が書けません。そこは状態を増やすなどして対応すれば良いと思います。
#まとめ
- ゲーム状態管理はVisual Scriptingアセットを使おう!
- ブロック数は最小限に!
- 分かりやすい状態管理をしよう!
ありがとうございました!