これを作った時の話
Unityroom の1week GameJam 参加してみました!
— GoldenDuck (@Duck2Golden) December 30, 2020
まだまだ完成度は上げられる状態ですが、一週間ではここまででした…
とあるESPの異界録(ラノベ感) | フリーゲーム投稿サイト #unityroom https://t.co/HnCWQKKcVa #unity1week
特に理由もなかったがシーン読み込みするならマルチシーンでしょ!みたいなノリで
ちょっとやってみたら無駄に時間をロスしたという反省会
まずこれを読め
過去の自分にまず言いたい。
- これを読め。必要なことは大体書かれている。
- 簡単にやるならこれがイケてる
そもそも全くコード書きたくない人
車輪はもう作らない! 絶対にだ! という人は、
マルチシーンでググれば色々出てくるのでコピペすればいいと思うよ!
フルスペックを目指したシーンマネージャーみたいなものが沢山出てくるので。
マルチシーンを設計するうえで
よくある要件を考えてみる。これらは網羅したうえで設計するのがいいだろう。
- シーン間でデータを渡したい。(シーン遷移あるある)
- シーンが閉じるまで待ちたい。(ダイアログ系追加シーンの必須要件)
- シーン遷移用アニメーションを入れたい (シングルシーンだと実質出来ないようなもの)
これプラス、公式ドキュメントに書かれている以下を忘れずに踏襲する。
シーンの読み込みで、マネージャーオブジェクトの役割を持つゲームオブジェクトを残したいときに
DontDestroyOnLoad を使用するのは避けてください。
代わりに、マネージャーオブジェクトを持つシーンを作成し、
ゲームの進行を管理するSceneManager.LoadScene(<path>,LoadSceneMode.Additive) と SceneManager.UnloadScene を使用します。
これな。
ネットにシーン遷移の仕組み公開している人でも、DontDestroyOnLoad している人はちょいちょい見る。
これをやると、同じシーンを開きなおしたいときに詰む。
1weekの時にこれをやって結構な時間をロスしてしまった。
こういう公式の言っている事を無視して実装すると痛い目を見るものなのです(俺のこと)
ツールは正しく使うことが大切!
シーンが閉じるまで待ちたいとかよくあるやつ
モーダルのダイアログ(〇〇しますか? はい/いいえ みたいなの)をシーンで作った場合や、サブシーンに必要とされることが多い。
これが仕組みとして存在していると、緊急で新しい実装を要求されてもどうにかできることが多い。
つぶしが効きやすい。(急にログインボーナス入れるとか湧いてきても大丈夫)
メインシーン
↓
ダイアログ
↓
メインシーンの続き
みたいな動き。
メインシーンは停止しておいて、全く別の演出がしたい場合に有効な手法だ。
ダイアログの用途だと画面の決まった位置に上書きで出したい、みたいな挙動なので、
シーン上にカメラやキャンバスを設定しておけば、どこから呼び出しても一律の表示設定にすることができる。
var dialog = new UserDialog<T>(dialogParam);
await dialog.OpenAsync();
Debug.Log(dialog.Result); // なんか処理
みたいな形でちゃんと await できるように実装しておく!
反省まとめ
GameJamなど時間が厳しい場合は、はっきりいってシングルシーンでいいわけだが(自戒)
タイトル
⇒ インゲーム
* (繰り返しn回) ⇒ リザルト
⇒ タイトル
(ループ)
みたいな構造だと、殆どデメリットはない。(演出懲りたい場合は別)
シングルトンに必要なデータ保持しておいてシングルシーン読み込みでいいだろう。
実際、gamejam では、時間が無くてレベルデザイン部分は殆ど着手できなかった。
特にメモリリークをほぼ気にしなくていいのはでかい。
タイトルに戻るときなど、インゲームに関係しない場所に移動するときはシングルシーンで読み込むのは全然アリ。
(業務でもシングルシーン読み込みで一気にすっきりしてるアプリがあって驚いたことがあったが、
割とガチで綺麗になるので、脳死で安定しやすい。)
そして、
マルチシーンにしたければ、まずマネージャーシーンを作れ
忘れずに心に刻み込もう(-人-)
こういった汎用的な機能はテンプレにしておいた方がいい。
自分で作るか、誰かのテンプレを借りるか、あらかじめ決めておこう。
準備大切。
以上