マガジン

保存機能を後から足す:既存のプレイヤーへの影響

遊びを届ける

執筆にClaudeを使用しています。

遊んだ記録を示すカード列と、途中の位置を残した迷路盤を並べた写真風イメージ。
記事のテーマをもとに制作したAI生成イラスト。

数字を順にそろえるスライドパズルを公開している場面を考えてみます。遊ぶたびに最初から始まる作りで、途中経過も最少手数の記録も、画面を閉じれば消えます。そこへ「続きから遊べる」保存機能を足すことにしました。コードは書けましたし、自分の端末で試した限りでは動きます。ところが、公開済みの作品を更新すると、すでに遊んでいる人の画面で何が起きるのかは、自分の端末の確認だけでは見えてきません。 保存機能を最初から持つゲームでは、「保存がある状態」だけを考えれば済みます。後から足す場合は、保存のない旧版を遊んだ人と、保存のある新版を初めて開く人が、同じ入口に並びます。この記事では、更新後の初回起動、開きっぱなしの旧タブ、保存の形式の変更という3つの局面で、何が食い違いやすいかを順に整理します。最後に、自分の作品で確かめるための手順もまとめます。

この記事の目次
  1. 保存がなかった時代のプレイヤーが持っているもの
  2. 更新後に起きやすい4つのこと
  3. 保存の形式に、最初からバージョンを持たせる
  4. アソバースで足すときに意識したい境界
  5. 自分の作品で確かめる手順
  6. 次の行動

保存がなかった時代のプレイヤーが持っているもの

旧版を遊んだ人が持ち帰れるものは、記憶だけです。「3×3は最少で何手だったか」「どの配置で詰まったか」は、その人の頭の中にあるだけで、ゲームの側には何も残っていません。

アソバースの公式作品を見ると、この状態は珍しくありません。確認済みの範囲では、保存があるのは余白の庭、WAVE / WAVE、かたちのあいだの3作品です。他の10作品の記録や録音は、画面を開いている間だけ残ります。たとえば小さな軌道の最速記録や、雨音のピアノの録音がそうです。記録を画面の中に限る設計は、手軽に遊べる作品として成り立ちます。

ただ、ここに保存を足すと一つの問題が出ます。更新後の初回起動では、保存の中身が「空」です。この「空」が意味するのは次の二つのどちらかで、ゲームの側からは見分けられません。

  • 初めて遊ぶ人なので、保存がなくて当然です。
  • 旧版でたくさん遊んだ人ですが、旧版は何も書き残していないので、保存がありません。

見た目は同じ「空」でも、迎える側の対応は変わります。前者には最初の画面を見せれば足ります。後者は、前回の記録が消えたように感じるかもしれません。保存を後から足すときの出発点は、この二つが区別できないことを受け入れることです。

更新後に起きやすい4つのこと

具体的に、どんな食い違いが起きるかを4つに分けて考えます。

1. 空の保存を「壊れたデータ」として扱ってしまう

読み込み処理が「保存があるはず」という前提で書かれていると、空の保存で止まることがあります。更新後の初回起動は、この前提がもっとも崩れるタイミングです。判断の基準は単純で、「保存がない」は正常な状態の一つとして最初の画面へ進める、と決めておくことです。

2. 空の状態が、そのまま保存として書き込まれる

起動した直後に、現在の状態を書き込む処理を入れると、何が起きるでしょうか。初回起動では、空の初期状態が「最初の保存」になります。それだけなら問題ありませんが、後から「記録の読み込みに失敗したので初期状態で続行した」という経路が加わると、本来の記録を空で上書きしてしまう危険があります。

読み込みが失敗したのか、保存がなかったのかを区別し、失敗のときは書き込みを控える。この区別を決めておくと、上書き事故をかなり防げます。

3. 画面上の状態と保存の内容がずれる

スライドパズルで、保存したのは盤面と手数だけだったとします。時計の経過、ヒントの使用回数、「一手戻す」の履歴は含めていませんでした。再開したときに、盤面は戻っても時計が0から始まり、戻る手順が空になります。

どの情報を保存し、どの情報を再開時に作り直すのかは、機能を足す時点で決める必要があります。迷ったときは、次のように分けると整理しやすくなります。

  • 再開に必須、例:盤面、手数、選んだ難易度、方針:保存する
  • なくても遊べる、例:一手戻すの履歴、経過時間、方針:保存するか、再開時に空から始めると明示する
  • 一時的な表示、例:開いているメニュー、一時停止の状態、方針:保存しない

公式作品の「かたちのあいだ」には、一手戻しても手数は減らない、時計を一時停止できる、といった確認済みの仕様があります。こうした仕様が保存とどう組み合わさるのかは、作品を開いて確かめる部分です。ここでは、状態の種類ごとに保存の扱いを決める考え方の例として挙げるにとどめます。

4. 旧版を開きっぱなしのタブが残る

更新を公開した時点で、旧版を開いたままの画面がどこかに残っている場合があります。旧版は保存の仕組みを知らないので、新版が書いた保存を読まず、書き戻しもしません。新版の画面で保存した直後に、旧版の画面を触っても、保存へは何も起きません。

逆に、新版の画面を開いたまま、さらに更新が入る場合も考えられます。このときは、新旧の形式が混ざります。旧版が存在し続ける間は、新版は旧版の振る舞いを前提にしない、と考えておくのが安全です。

保存の形式に、最初からバージョンを持たせる

保存を後から足す作品は、後からさらに形式を変える可能性が高くなります。たとえば、最初は盤面と手数だけを保存し、次の更新で難易度やヒント回数を足したくなる、といった流れです。

そのときに困らないよう、保存データには「この形式は第何版か」を示す番号を最初から入れておきます。番号を見て、読み込み時に次のように分岐します。

  • 番号が自分の知っている最新なら、そのまま読みます。
  • 番号が古いなら、足りない項目を既定値で補って新しい形式へ移します。
  • 番号がない、または自分の知らないほど新しいなら、無理に解釈せず、安全な側へ倒します。

アソバースの公式作品でも、共通の事項として、古い保存(version1)を新しい形式(version2)へ移行することが確認されています。形式に番号を持たせて、古いものを新しいものへ移すという考え方は、保存を扱う作品の一般的な作法として参考になります。具体的な項目の違いは、ここでは扱いません。

移行のときに守りたいのは、次の3点です。

  1. 古い保存を読み込んでも、元の保存はすぐに消さず、新形式への変換が成功してから書き換えること。
  2. 補う項目の既定値は、「プレイヤーが損をしない側」に決めること。たとえば記録の欄は、0ではなく「記録なし」と表せる値にします。0にすると、最少手数のような「小さいほど良い」記録で、誰も超えられない値になってしまいます。
  3. 読み込みに失敗したとき、プレイヤーに何を見せるかを決めておくこと。黙って初期状態にするより、「保存を読み込めませんでした」と伝えたうえで、新しく始められるようにするほうが、誤解を招きません。

アソバースで足すときに意識したい境界

アソバースに投稿している作品で保存を足す場合は、プラットフォーム側の仕組みも前提になります。確認済みの範囲を整理します。

  • アップロードしたゲームにはSDKが自動で追加されます。URL投稿のゲームは、作者がSDKを読み込むと、作品専用のプレイヤーIDとクラウドセーブ(作品ごとにJSONで128KiBまで)が使えます。
  • ログイン中は、クラウドセーブと作品ごとのプレイ履歴が使えます。
  • アップロード作品の中のlocalStorage/sessionStorageは、一時メモリーの互換処理です。端末にずっと残る保存先として期待しないほうがよいでしょう。
  • ゲストの履歴や進行は端末内に保存され、ログイン後のアカウントへ自動では混ざりません。
  • 未同期の端末セーブは、クラウド側の古いデータより優先して再送されます。
  • ゲームには、Firebaseのユーザー識別子、認証トークン、メールアドレスを渡してはいけません。

ここから読み取れる判断はいくつかあります。まず、保存先は「localStorageでよい」と決め打ちせず、クラウドセーブを軸に設計するほうが、アップロード作品の前提に合います。次に、128KiBという上限があるので、保存するのは再開に必須の項目に絞ります。さらに、ゲストとして遊んだ記録とアカウントの記録が自動で混ざらないため、「ログインしたら、ゲストのときの続きが消えた」と感じる人が出る可能性があります。そこで、ゲーム側で何を案内するかを決めておく必要があります。たとえば画面に「ログインすると、この作品の続きを別の端末でも遊べます」と一文を出すだけでも、迷いは減ります。

ゲストがクラウドセーブを使えるかどうかなど、この記事の範囲を超える細部は、現在の案内で確認してください。

更新の公開については、公開内容の更新と非公開化の機能があります。大きな形式変更を入れるときは、いったん下書きで表示を確認し、更新するという流れを使えます。

自分の作品で確かめる手順

結果はそれぞれの作品で変わるので、ここでは確かめる手順だけを示します。

準備するもの:旧版のファイル一式、新版のファイル一式、保存データを消した状態のブラウザ(別のプロファイルやシークレットウィンドウでも構いません)。

確認する順序

  1. 旧版を開き、いくつか操作します。画面を開いたまま、新版を別の場所で読み込めるようにします。
  2. 保存のない状態で新版を開きます。最初の画面が出るか、エラーが出ていないかを記録します。
  3. 新版でいくつか操作し、画面を閉じて開き直します。再開したときの盤面、手数、時計、戻る履歴のそれぞれが、狙いどおりかを確認します。
  4. 保存データを手で壊します(一部を削る、番号を書き換える)。そのうえで開き直し、プレイヤーに何を見せるかを確認します。
  5. 旧版を開いたままにして、新版で保存したあとで、旧版側の操作を行います。保存が壊れないかを確認します。
  6. 保存の形式を一度変えて、前の形式の保存を読ませます。移行後に値が欠けていないかを確認します。

記録の取り方:各項目について、「保存があった/なかった」「画面に表示された内容」「再開後に違った項目」を、1回ずつメモします。手順4と6は、壊し方や古さを変えて、最低でも2〜3パターン試すと、見落としが減ります。

結果の読み方:手順2で止まるなら、空の保存が正常として扱われていません。手順3で再開後に違う項目があれば、どの情報を保存し、どの情報を作り直すかの線引きを見直します。手順4で何も表示されないなら、失敗時の案内を足します。手順5で保存が変わるなら、旧版が書き込む経路が残っています。

起こりやすい誤り:自分の端末にはすでに保存が残っているため、初回起動の動きを再現できていないことがあります。必ず保存を消した状態で試してください。

次の行動

手元の作品で、保存に入れる項目を「再開に必須」「なくても遊べる」「保存しない」の3つに分けて書き出してみてください。そのうえで、保存を消した状態で新版を開く手順2だけでも、先に試してみるのがおすすめです。ログイン前後の扱いは、現在のアソバースの案内で確認してから決めると安心です。