パスワードを忘れた? アカウント作成
14975234 journal
日記

yumeの日記: Unity制作 メデューサ・ゲーム #34

日記 by yume

メデューサ・ゲーム(仮)

ステージセレクト追加。

DOTween入れてみます。

--

Unityのインスペクタから何か(GameObjectとかRigidBody2DとかC#scriptコンポーネント)を指定するとき、
public修飾子をつけていればOK、と覚えていたのでそのようにしていた。
しかし別にpublicおとして使いたいわけでもないのにpublicまみれになるのもちょっと気持ち悪い。
自分一人でいじっているわけだから、どこがいじっていいpublicで、どこがそうでないかは(忘れないかぎりは)大丈夫ではあるが……。

調べると、[SerializeField] privateとすることでprivate修飾子を使ったままインスペクタで指定できるようになるそうだ。
ただ、少し古めの文献(といっても2018年とか)では問題はないようだが、今のUnityでこれをやると警告が出る(初期値が無いぞみたいなやつ)
これは
[SerializeField] private GameObject hoge = default;
このようにdefaultを代入しておくことで消えるようだ。
あるいは警告自体を抑制する強引なやり方もあるようだが、まぁ別にこれくらいの入力は手間でもない。
といってもすでにかなりの部分がpublicになっているが、せめてこれから入れる分はSerializeFieldで入れていこう。

●タイトル画面・ステージリスト・ステージセレクト
今、プレイするステージの順番は結構適当になっているし、ステージ番号のつけ方もあまりルールが一貫していない。
ステージから次のステージへの偏移は、各ステージのマネージャーオブジェクトが変数として持っている(nextStage = "Stage1_2"; という具合に)
これはちょっと賢いやり方ではないから、ゲーム全体を通して動いているゲームマネージャー自身がステージのリストを持つという仕組みにしておこう。

その前に、多分必要になるであろう、ステージセレクトという概念を考えておこう。
タイトル画面から選択すればステージセレクト画面に偏移できる。
ステージセレクト画面には、各ステージが一覧になっている。

■ ■ ■ ■ ■ □ 
□ □ □ □ □ □ 
□ □ □ □ □ □ 

たぶんこんな感じ(■はクリア済み、□は未クリア的な)に。
ただ、これはパズルゲームだから、すべてのステージを一本道で攻略する以外の選択肢は欲しい。どこかで詰まってしまっても、まだ遊べるようにしておくためだ。
例えばbaba is youはスーパーマリオワールドみたいなワールドマップ式になっていて、苦手なステージを無視しても他のステージをいくつかクリアすれば新たなワールドへ行けるという仕組みになっている。
The Talos Principleはワールド(大別して4つ)に散らばる課題をだいたい好きな順で解けるが、ギミックの解放が必要なステージもある。これも一種のワールドマップだ。
Portalは……Portalは一本道だな。2もそうだっけ。
Human Resorce Machineの場合、簡単なステージは一直線で、応用のある難しい問題は脇道にあって、それはクリアしなくてもよい。
また一本道のステージもスキップすることができる。

このゲームはワールドマップが必要なほど複雑なゲームではない。ステージセレクトは一目で一覧できるのが理想的だ。

いわゆる「応用問題」的な部分は猫でどうにかなるだろうし、適切な難易度と概念順でステージを並べることができれば、分岐は必要ないか。
スキップ機能も作っておけばいい。

必要そうな仕様をまとめると:
・ステージセレクトでは、実装されたすべてのステージと、「解決したか」「猫を全部助け出したか」が一覧で見える。
・ステージセレクトでは、「解決済みステージ」「未解決の最新のステージ」「スキップしたステージ」(=最後に挑戦したステージまですべて)を選択し、プレイできる。
・各ステージはスキップすることができる。またステージセレクトやタイトルに戻ることもできる。
・各ステージをクリアまたはスキップすると、自動的に次の番号のステージに偏移する。

UnityのSceneクラスからはSceneの名前やビルドインデックスは読み取れるものの、自分で設定したステージタイトルや猫の数をとるのはちょっと難しい。
なら、ステージリストを自分でCSVで作っておいて、そこから読み込めばいいかな。
CSVには:
StageName(Unity上のシーンの名前。Stage0_1など)
Title(『封印された扉』など)
MaxCats(助け出せる猫の最大数)
をずら~~~~~っと記録しておく。
後からステージの順番を変えたいと思ったら、このCSVを直接編集する。

ステージを足すたびにここをいじる、ってことを忘れそうだな……。でもこれでいこう。

そんで、えーと、
・Levelというクラスを作る。Levelは各ステージに必要な情報をすべて記録しておく。
・ステージセレクトを管理する何かが、そのLevelを配列で持つ。
・各ステージをクリアしたりしたら、その配列の該当する番号のLevelの情報を書き換える。

--

なんやかんやあって、ステージ偏移のIDなんかをそっちに引っ越すところまではできた。

次はステージセレクト画面を作る。まずタイトルはいままでは「なんか押したらスタート」だったのを、クリックするタイプのボタン二つ(start game、stage select)にしておく。
で、stage selectを押すとステージセレクトUIが開く。UI画面左側には各ステージボタンがずらっと並び、右側にはそのステージのサムネイルとタイトル、「ステージスタート」ボタンを置く。
各ステージボタンをいちいち手で配置するのではなくて、ランタイムで生成しよう。ステージ順とか並び替えるときも手でやってたら脳が死ぬ。

公式曰く、
・UI要素をプレハブ化しておいて、インスタンスで生成すればOK

やっていこう。
プレハブを作るのは良いとして、動的生成でうまくレイアウトさせるのはちょっと大変だな、と思ったら
Unityには自動的にレイアウトする都合のいいやつがすでにあるらしい。
なんかスクロールビューなんかもビルトインであるっぽいぞ。恐るべしUnity。

--

ひぃ~。なんとかできたのでItch.io上のファイルを更新した。
ボタンのデザインなんかはまだUnityのビルトインボタンのまんまだけど、とりあえず動くようにはなった。通しでテストプレイしなきゃだけど、それも明日にしよう。
今のところクリアしていないどのステージでもいきなり選べるけど、それも明日。
ステージの順序も変えてないけど、それも明日。
あれも明日、それも明日。そして動物達のタマシイも明日。

typodupeerror

クラックを法規制強化で止められると思ってる奴は頭がおかしい -- あるアレゲ人

読み込み中...