Unityゲームでキャラクター解放と欠片システムを設計した話
Unityで制作中のおはじきバトルゲームに、未遭遇・未解放・解放済みの状態と、敵から欠片を集めてキャラクターを解放する仕組みを設計した記録です。
Unityで制作しているスマートフォン向けのおはじきバトルゲームでは、火・水・風・雷・岩・闇の6属性に、それぞれ複数のキャラクターを登場させる予定です。
キャラクターの種類が増えてきたため、最初から全員を使用できる状態ではなく、クエストを進めながら少しずつ仲間を増やせる仕組みが欲しくなりました。
そこで今回は、敵からキャラクターの欠片を集め、必要数に達すると解放できるシステムを設計しました。
この記事では、キャラクターの状態をどのように分けたのか、既存の報酬機能をどう活用するのか、欠片の必要数やドロップ方法をどう考えたのかをまとめます。
キャラクター解放機能を追加する理由
これまでの実装では、登録されているキャラクターは基本的に全員使用できる前提でした。
開発中の動作確認としては便利ですが、完成版でも最初からすべてのキャラクターを使えると、クエストを進める目的の一つが失われてしまいます。
今回のゲームでは、敵として登場したキャラクターを倒し、その欠片を集めて味方として解放できる形を考えています。
この仕組みによって、次のような楽しさを作ることが目的です。
- クエストを繰り返し遊ぶ理由を作る
- 新しい敵と出会う楽しみを作る
- 欠片が少しずつ集まる成長感を出す
- 解放したキャラクターで編成の選択肢を増やす
- お気に入りのキャラクターを育てる目標を作る
単にキャラクターを使用できないようにするのではなく、戦って出会い、欠片を集め、仲間にするまでを一つの体験にしたいと考えました。
変更前の状態
設計を始める前に、現在の実装を確認しました。
キャラクターの欠片については、既存の PlayerRewardInventory でキャラクターIDごとの所持数を管理しています。報酬としての付与、消費、残数確認、セーブにも対応しています。
一方で、キャラクターそのものについては、解放済みかどうかを管理する仕組みがありませんでした。
キャラクター一覧では、登録されている全キャラクターからカードを生成しているため、追加したキャラクターは最初から一覧に表示され、使用できる状態になります。
つまり、欠片を所持する仕組みはすでに存在するものの、その欠片をキャラクター解放につなげる部分が不足していました。
そこで、既存の欠片管理を作り直すのではなく、新しくキャラクターの状態管理を追加して接続する方針にしました。
キャラクターIDを管理の基準にする
キャラクターの解放状態は、表示名ではなくキャラクターIDを基準に管理します。
名前は、表記の調整や英語対応によって変更する可能性があります。しかし、一度保存したデータと結び付くIDは、途中で簡単に変更できません。
たとえば、表示名が変わっても同じキャラクターとして扱えるように、次のような固定IDを使います。
wind_slime
raven_fang
ruin_shaman
obsidian_titan
欠片の所持数、遭遇状態、解放状態、育成データを同じキャラクターIDで関連付けることで、別々の機能から同じキャラクターを参照できます。
今後キャラクターが増えた場合も、個別の名前をコード内で判定せず、IDを使って共通処理へ渡せる構成を目指します。
「未遭遇」と「未解放」を分ける
キャラクターの状態は、単純な「解放済み・未解放」の二つだけではなく、次の三段階に分けることにしました。
未遭遇
まだクエスト内で一度も出会っていない状態です。
一覧に表示する場合は、キャラクターの姿や名前を隠し、シルエットや「???」として表示する方法を考えています。
先のエリアに登場するキャラクターを最初からすべて見せないことで、どのような敵が登場するのかという発見の楽しみを残せます。
遭遇済み・未解放
クエストで一度は出会ったものの、まだ必要な欠片がそろっていない状態です。
この段階では、キャラクターの名前、属性、所持している欠片数、解放に必要な数を確認できるようにします。
たとえば、次のような表示です。
レイブンファング
所持している欠片:8 / 20
状態:未解放
残りの必要数が見えることで、どのクエストを周回するか判断しやすくなります。
解放済み
必要な欠片を消費し、編成や育成で使用できる状態です。
解放後は通常のキャラクターカードとして表示し、レベル強化、スキル強化、必殺技強化、編成などの機能を利用できるようにします。
遭遇状態を別に保存する理由
欠片を1個以上持っていることを「遭遇済み」と見なす方法も考えられます。
しかし、初回報酬、運営からの配布、今後追加する交換所など、敵と戦わずに欠片を入手する経路が増える可能性があります。
反対に、敵と戦っても欠片がドロップしなければ、所持数は0のままです。
そのため、欠片の所持数だけでは、そのキャラクターと実際に遭遇したかを正しく判断できません。
遭遇状態と欠片数は、別の情報として管理する方針にしました。
- 遭遇状態:クエストでそのキャラクターと出会ったか
- 欠片数:現在いくつ所持しているか
- 解放状態:編成や育成で使用できるか
一見すると管理項目が増えますが、それぞれの意味を分けることで、報酬の入手経路が増えても仕様が崩れにくくなります。
欠片20個でキャラクターを解放する
通常キャラクターは、欠片20個を基本の解放条件にする予定です。
必要数が少なすぎると、数回の戦闘ですぐに解放できてしまい、収集する意味が薄くなります。一方で、多すぎると序盤から長い周回が必要になり、新しいキャラクターを試すまでに時間がかかります。
現在は、次の条件を考慮して20個としています。
- 序盤でも到達できる数にする
- 1回のドロップだけでは解放できないようにする
- 初回報酬によって解放までの距離を縮める
- 通常ドロップにも価値を持たせる
- 将来の上限解放にも欠片を使用できる余地を残す
ただし、20個という数値は固定せず、実際のドロップ率と必要な周回数を確認して調整します。
中ボスや大ボスなど、入手難度を高くしたいキャラクターについては、必要数や入手方法を別にする可能性もあります。
敵を倒したときに欠片を抽選する
欠片は、クエストに登場したキャラクターを倒したときに抽選する仕組みです。
敵の撃破時には、対象のキャラクターIDを使ってドロップ設定を確認します。抽選に成功した場合だけ、対応するキャラクターの欠片を報酬へ追加します。
ここで重要なのは、ドロップ演出のためにもう一度抽選しないことです。
報酬処理で抽選した結果と、画面に表示する結果を同じものにしなければ、次のような食い違いが起こる可能性があります。
- 演出では欠片が表示されたのに所持数が増えていない
- 所持数は増えたのにドロップ演出が表示されない
- 演出と実際の獲得数が異なる
そのため、一度だけ行った抽選結果を報酬への加算と演出の両方へ渡す設計にします。
ドロップが0個の場合は演出を表示せず、同じ敵の撃破通知が重複しても二重に報酬を付与しないようにします。
初回報酬と通常ドロップを分ける
欠片の入手方法は、初回クリア報酬と敵からの通常ドロップに分けます。
初回クリア報酬は、ステージを初めて攻略したことへの確定報酬です。序盤のクエストでは、そのステージを代表するキャラクター1体の欠片を5個付与する案にしました。
通常ドロップは、登場する敵を倒したときに確率で獲得する報酬です。
それぞれの役割は次のように考えています。
初回クリア報酬
- 最初の攻略に明確な価値を持たせる
- 欠片がまったく集まらない状態を避ける
- 解放までの進み具合を実感させる
- 特定キャラクターを集めるきっかけを作る
通常ドロップ
- クエストを繰り返し遊ぶ目的を作る
- 登場する敵と獲得できる欠片を結び付ける
- 欲しいキャラクターに応じて挑戦先を選べるようにする
初回報酬だけで解放できる量にはせず、通常ドロップと組み合わせて集める形にします。
序盤クエストでの報酬例
風属性の最初のクエストでは、初回報酬として次の内容を検討しています。
- ゴールド
- キャラクターポイント
- 代表キャラクター1体の欠片5個
通常報酬では、そのクエストに登場したキャラクターの欠片が確率でドロップします。
初回報酬の欠片を複数キャラクターへ分散させると、一体も解放に近づいている感覚を得にくくなります。そのため、初回報酬は一体に絞り、残りのキャラクターは通常ドロップで集める方針です。
この配分が適切かどうかは、実際に必要となる周回数を確認して調整します。
キャラクター一覧の表示方針
キャラクター一覧では、解放済みのキャラクターだけを表示すると、未解放キャラクターの存在や収集状況を確認できません。
そこで、三つの状態が分かるように表示を変えます。
未遭遇のカード
- キャラクター画像をシルエットにする
- 名前を「???」にする
- 詳細情報を非表示にする
- 編成と強化はできない
遭遇済み・未解放のカード
- キャラクター画像と名前を表示する
- 属性と簡単な情報を表示する
- 欠片の所持数と必要数を表示する
- 条件を満たした場合は解放ボタンを表示する
- 編成と強化はまだできない
解放済みのカード
- 通常のキャラクター情報を表示する
- 編成と育成を利用できる
- 欠片の残数も確認できる
一覧では、解放済み、解放可能、未解放、未遭遇の順に並べる方法も検討しています。
欠片が20個そろっているキャラクターを上の方に表示すれば、解放できることに気づきやすくなります。
解放処理で確認すること
解放ボタンを押したときは、表示上の状態を変えるだけではなく、複数の条件を確認する必要があります。
- すでに解放済みではないか確認する
- 必要な欠片数を取得する
- 所持数が必要数以上か確認する
- 欠片を一度だけ消費する
- キャラクターを解放済みに変更する
- セーブデータへ保存する
- 一覧と詳細画面を更新する
ボタンの連続タップによって欠片が二重に消費されないことや、セーブに失敗した場合に状態が食い違わないことにも注意します。
解放後にアプリを再起動し、キャラクターの解放状態と欠片の残数が正しく復元されるかも確認します。
既存のセーブデータを壊さない
開発途中で新しい保存項目を追加すると、以前のセーブデータには遭遇状態や解放状態が存在しません。
新しい項目がないだけで読み込みエラーにならないよう、初期値を決めておく必要があります。
たとえば、初期キャラクターは常に解放済みとして扱い、それ以外は未遭遇または未解放として補完します。
動作確認用のセーブデータだけは全キャラクターを解放済みにできるようにし、通常プレイ用の初期データとは分けます。
開発確認のための設定が、そのまま完成版の初期状態に混ざらないよう注意します。
欠片は解放後も使えるようにする
キャラクターを解放した後も、同じキャラクターの欠片がドロップする可能性があります。
解放後の欠片が不要になると、そのキャラクターが登場するクエストを周回する価値が下がります。
そのため、余った欠片は将来実装する上限解放にも使用できるようにする予定です。
現在考えている育成では、一定レベルごとに上限解放を行い、スキルの解放やスキル枠の追加につなげます。
キャラクター解放と上限解放で同じ欠片を利用すれば、入手直後だけでなく、育成を続ける間も欠片に価値を持たせられます。
ただし、解放直後から大量の欠片を要求すると育成が進みにくくなるため、必要数は実際のドロップ量を見ながら調整します。
実装後に確認したい項目
キャラクター解放機能では、画面表示だけでなく、報酬、セーブ、編成など複数の機能が関係します。
実装後は、少なくとも次の動作を確認します。
- 初めて出会ったキャラクターが遭遇済みになるか
- 欠片が落ちなかった場合も遭遇済みになるか
- ドロップした欠片が正しいキャラクターへ加算されるか
- 同じ撃破で欠片が二重に付与されないか
- 初回報酬を二度受け取れないか
- 欠片が20個未満では解放できないか
- 欠片が20個以上なら解放できるか
- 解放時に必要数だけ消費されるか
- 解放したキャラクターを編成できるか
- 未解放キャラクターを編成できないか
- アプリ再起動後も状態が保存されているか
- 以前のセーブデータを読み込めるか
- 解放済みキャラクターの欠片も保持されるか
特に、報酬の重複付与と欠片の二重消費は、プレイヤーの所持データへ直接影響するため重点的に確認します。
設計して分かったこと
欠片を集めてキャラクターを解放する仕組みは、最初は所持数を確認して使用可能にするだけの機能に見えました。
しかし実際には、次の機能が関係します。
- 敵との遭遇
- 敵撃破時のドロップ抽選
- クエスト報酬
- キャラクター一覧
- キャラクター詳細
- 編成
- 育成
- セーブと読み込み
- 既存データとの互換性
一つの画面だけで完結する機能ではないため、先に状態と責任を分けておくことが重要だと感じました。
特に、「未解放」を一つの状態として扱わず、「まだ出会っていない」と「出会ったが仲間になっていない」を分けたことで、ゲームとして見せたい流れが明確になりました。
今後追加したいもの
基本的な解放機能を実装した後は、次の要素も追加したいと考えています。
- 欠片を獲得したときのドロップ演出
- 解放可能になったことを知らせる表示
- キャラクター解放時の専用演出
- 欲しい欠片が落ちるクエストへの移動機能
- キャラクター詳細から入手場所を確認する機能
- 上限解放への欠片利用
- 中ボスや大ボス用の特別な解放条件
- ドロップ率や周回数のバランス調整
まずは、敵を倒して欠片を集め、一覧からキャラクターを解放し、編成で使用するところまでを一つの流れとして完成させます。
まとめ
今回は、Unityで制作中のおはじきバトルゲームに、キャラクター解放と欠片システムを追加するための設計をまとめました。
設計上の主な方針は次のとおりです。
- キャラクターIDを基準に状態を管理する
- 未遭遇、未解放、解放済みを分ける
- 既存の欠片所持・保存機能を活用する
- 通常キャラクターは欠片20個で解放する
- 初回報酬では代表キャラクターの欠片5個を付与する
- 敵撃破時の抽選結果を報酬と演出で共有する
- 解放後の欠片は上限解放にも利用する
- 既存のセーブデータを読み込めるようにする
キャラクターを増やすだけでなく、出会ってから仲間にするまでの過程を作ることで、クエストを進める目的と収集する楽しさを加えられます。
今後は実際のプレイで必要な周回数を確認し、欠片のドロップ率、初回報酬、解放に必要な数を調整していきます。