こんにちは、Unityエンジニアの黒板です。
今回は、Unityで制作しているゲームの画面遷移をstring型のパスによって管理したときのTipsを紹介したいと思います。
背景
今回の記事で紹介する「画面遷移をstringのパスで指定する」という仕組みを導入した背景は、以下のような要望があったためです。
- 画面遷移やポップアップ展開を行う際の挙動を動的に設定したい
- エンジニアを介することなくプランナー側で上記設定を行いたい
プランナーによる設定を可能にするためには、設定方法を「簡単に」かつ「汎用的に」設計する必要がありました。
前提
例として紹介するプロジェクトでは大まかに以下の図のようなクラス構造になっている前提とします。
Windowクラスはゲーム内一機能を管理します。一機能には複数の画面が存在することもあり、画面遷移時にはWindowを切り替える場合と、同じWindow内で表示しているScreenを切り替える場合があります。画面遷移するにはManagerにどの画面をどういう状態で表示したいかを渡す必要があります。その場合、Windowの種類と、そのWindow内の画面表示に使うDataを渡す必要があるのですが、必要なDataの構造はWindow毎に異なります。
実装方針
背景に挙げた要件を満たすため、画面遷移時に必要な情報をstring型のひとつのパスに集約することにしました。stringの内容は、Windowの種類を指定し、続けて”/”で区切って引数を指定します。
例えば、ホーム画面からクエスト選択機能のトップ画面に遷移するためのパスは引数が特に必要ないため
"QuestSelect"
というstringになります。
クエスト選択トップから遷移できるメインストーリークエスト画面に遷移するためのパスは
"QuestSelect/Main/{ChapterId}"
というstringになります。ChapterIdが存在していた場合は、そのChapterを選択した状態で画面を生成します。これらの画面はQuestSelectWindowによって管理されています。QuestSelectWindowで管理される画面は他に出撃画面があり、そこへの遷移パスは
"QuestSelect/QuestKind/ChapterId/StageId/{Difficulty}"
というようになります。クエスト終了時に「次のステージへ」や「もう一度」ボタンを押下したときには、この遷移パスをサーバから受け取ることで出撃画面を生成します。
実装方法
今回は解決方法を提示することを目的としているため、実装した内容の一部を簡単に紹介させていただきます。
まず、サーバから受け取ったりクライアントで管理していた遷移パスを使い勝手のいいクラスにパースします。
// Windowの種類
public WindowKind WindowKind;
// Windowを追加する形で表示するかどうか
public bool AddingWindow;
// 画面データ用パラメータ
public string[] Params;
// 生のトランジションコード
public string Raw;
public TransitionCode(string path)
{
// pathがなかったら、とりあえずホームに飛ばす
if (path.IsNullOrEmpty())
{
path= @"Home";
}
var paramArray = path.Split('/');
var windowParam = paramArray[0];
Raw = path;
Params = paramArray.Skip(1).ToArray();
// WindowKindを取得する
WindowKind = GetWindowKind(windowParam);
// WindowをAddするのかどうか判定する
AddingWindow = GetAddingWindow(WindowKind);
}
Windowを管理するManager経由で、パースしたTransitionCodeからWindowの種類を判定して必要なWindowクラスを生成、表示します。
public class WindowBase : ScreenBase
{
public virtual void SetTransitionCode(TransitionCode transitionCode)
{
}
}
Windowクラスでは、上記のSetTransitionCodeのような関数をオーバーライドしてDataクラスに必要な情報をセットし、viewに反映してから画面を表示します。
注意事項
今回紹介した例では複数のstringをParamsに格納することで必要なデータをやりとりしています。この時、各Windowで何番目のデータがどんな情報を管理しているのかを正確に認識しなければなりません。
"QuestSelect/QuestKind/ChapterId/StageId/{Difficulty}"
出撃画面での例である遷移パスをみると、QuestKindやChapterId、StageIdは整数で管理することもあると思います。もちろんDifficultyの表現においてもそうです。その場合、”QuestSelect/1/1/1/2″のようなパスを扱うことになるので、どんな画面用の情報なのかが直感的にわかりづらくなってしまいます。また、プランナーの方にこのような情報を入力、管理してもらう場合、設定ミスも発生しやすくなるというリスクがあります。このようなリスクをうまく回避できる仕組みを導入することが、データ管理において重要になってきます。
まとめ
今回はゲーム制作における画面遷移の仕組みを紹介させていただきました。紹介したTipsが読んでくださった方の画面遷移設計に少しでも役立てば幸いです。
読んでいただきありがとうございました。