さーたはうす 2024/06/09 00:56

クイーンズ:システム設計紹介 実績(ミッション・アチーブメント)編

クイーンズ:システム設計紹介 実績編

今回は開発中のゲーム:クイーンズのリアクションシステムの紹介記事です!
ゲームシステム紹介の観点もありますが、どちらかというとコーディング・設計寄りの内容になります。
こういう作り方もあるんだな~ と、クリエイターさんやゲーム制作に興味がある方へサクッと楽しんで頂ける記事を目指して書いています。

いつものごとくかわいさ補充のためにコノハちゃんにコメントをお願いしています。よろしくね

はーい!なんかスクロールバーちっちゃいね!今回すごい!

「実績」とは

ついに体験版にない要素です!仕様だけ軽く紹介しますね

ゲーム内のいろんな条件を満たすと右上にピロンって出てきて...

専用の画面で現在の進捗を一覧して、クリアした実績の報酬を受け取れます。(UIはまだまだ作成途中...)

このUI、見覚えが...

むずい!

こういうゲームの実績って、例えばどんな物があるとわくわくするでしょうか?
パッと思いつく範囲だと...

  • 特定のステージをクリア
  • スキルを使わないとか、縛り条件を満たしてステージクリア
  • ライフを一定以上残してステージクリア
  • ヒロインをつついてみる
  • ◯◯コンボ達成
  • ◯◯枚のコインを集める

...なんでもありますね!(本編のネタバレ防止のため、ありきたりな発想のものだけ書いています)

ゲーム内のどんな操作も、あらゆる実績のクリア判定に使われる可能性がある のです。

私をつついてもなんにもないのに...

どうやって実装する?

ゲーム内のどんな操作も、あらゆる実績のクリア判定に使われる可能性がある というのは、サラッと書いてしまいましたが非常にまずいです。

上記にあげたもののうち、ステージクリア系の処理を考えてみましょうか。
実績機能が導入される直前のステージクリア処理のコードが以下のようだったとします。

見通しがいいですね。このゲームにおけるクリアとはゲームにどのような影響を与えるものなのか、コードと仕様がそのまま一致している状態です。

コードと仕様がそろっていると読みやすいね

じゃあ、実績判定を追加しましょうか。

いやーーーーっ!

まずいですね。急にこの世の終わりみたいな関数になってしまいました
どうしてこうなってしまったのでしょう。

  • 実績の数だけ、処理内容が追加されている
  • 同じ実績を複数処理で別々に管理してしまう可能性がある

主にこの2点に問題がありそうです。個別に考えてみましょう。

実績の数だけ、処理内容が追加されている

これは明らかにまずいですね。
ライフ20%以下でクリアの実績を作ったり、ノーダメージの実績を作ったり、スキルを5回以上使ってからクリアする実績を作ることを考えると頭が痛くなります。そのたびにコードが3行ずつ増えます。

デバッグももはや無理

同じ実績を複数処理で別々に管理してしまう可能性がある

今回はステージクリア処理しか書いていなかったんですが、もしこの他の処理でコインが増える可能性があったらよくありませんね。
例えば負けたときもコインが100枚もらえる仕様だった場合、そこにも

これが必要になります。

...え、1000枚だとゲームバランス的にイマイチで条件を500枚にしたくなった?
じゃあ「このゲームにおいてコインが増える処理全部」を直さなきゃいけませんね...

で、なおした処理全部テストしなきゃだね...

じゃあどうしろと

これはよくやるノウハウがあって、 「実績を管理するボス」と「ボスに報告する子分」に役割を分ける ことでかなりの改善を見込めます。

まず子分は、ボスに報告するためのメッセージを準備します。
ステージクリアの場合、こんな感じ。

判定に使うデータだけまとめた構造体を作るって感じ?

そう!クラスがある言語は出来事ごとのクラスを作っちゃっていいよ

ボスはこんな感じにメッセージを待ち構えます。
(言語によっては、switch文など使わずとももっとスッキリ書けるものもあるでしょう)

実績判定用の処理に正しくメッセージを送るところまでがステージクリア処理の責任 で、そのメッセージを使ってどんな実績がクリアされるかはわからないし、興味がない、といった方針でステージクリア処理のコードを書けるようになります。
色々な実績判定のバリエーションを作りたければメッセージの中身に必要なデータを詰め込んでいけばよいのです。
実績判定関数がいる世界では、こんな感じに処理を書けるでしょう。

実績判定くん以外の普通のゲーム処理は実績について何も考えなくていいってこと?

メッセージまとめる処理はやるけど、このゲームにどんな実績が何個あるかは意識しないってこと

なるほどね~

「実績判定」に処理が移動しただけでコードの総量は変わっていないのですが、ステージクリアに際して今後どんな実績を追加してもステージクリア処理そのものには影響がありません。

さらに、コイン系実績の処理本体が実績判定処理の中で共通化されたため、数値バランス調整時の更新漏れも起きなくなりました。
今後別経路でコインが獲得されても、メッセージを作って実績判定を呼ぶだけですべてのコインが条件になる実績判定の対象とすることができます。

ステージ実績判定とコイン実績判定でファイル分けてもいい?

もちろん

見通しがどんどん良くなるね!

いつかこれ体験版に乗せます!

...というような機能を作ってなんでもかんでも自由な実績システムができつつあります!
ゲーム全体の手触りブラッシュアップもやりたいので、そこまで作業が進められたところで体験版に大規模アプデを入れようかなと思っています。

逆にいうと、Web体験版で現バージョンが遊べるのは今だけ!
いまご意見いただければ大規模アプデで即反映できるやもしれません。

https://jyllsarta.net/queens_trial

最近は結構コメント落ち着いてきましたが、引き続き感想お待ちしております!

ということで、今回はがっつり実装設計記事でした。
次回更新予定は6/16(日)、進捗報告の予定です。

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索