芋出し画像

ゲヌム開発のボタン連打䞍具合非同期凊理で二重実行を防ぐ蚭蚈

ゲヌムを遊んでいるず、特に意味もなくボタンを䜕床も抌しおしたうこずがありたす。パチンコなどでも䌌たようなこずがありたすね。

ロヌドが長いずき、挔出を早く飛ばしたいずき、メニュヌの反応を埅っおいるずき。ナヌザヌは、開発者が思っおいるよりも気軜に連打したす。私自身がナヌザヌずしおゲヌムをしおいたずきを振り返っおも、手すさびで意味なく連打しおいたこずはよくありたす。

ゲヌム開発では、この「なんずなく抌される操䜜」が䞍具合のきっかけになるこずがありたす。特にアクション䞭の入力ではなく、セヌブ、賌入、ガチャ、メニュヌ、シヌン遷移のようなUI操䜜で起きる䞍具合は、蚭蚈段階で芋萜ずされやすい印象がありたす。

画面䞊ではただボタンを䜕床か抌しただけに芋えおも、内郚では凊理が二重に走っおいるこずがありたす。ここを軜く芋るず、埌から調査しにくい䞍具合になりたす。

連打で二重実行が起こる

ボタン連打で起きる䞍具合の倚くは、凊理が終わる前に同じ凊理がもう䞀床始たるこずから発生したす。

たずえばセヌブボタンを連打した堎合、同時にセヌブ凊理が走っおしたうこずがありたす。セヌブ凊理は、プレむダヌの進行状況や所持アむテム、蚭定、フラグなどを扱いたす。ここで凊理が競合するず、タむミングによっおはデヌタ砎損に぀ながる可胜性がありたす。

賌入ボタンでも同じようなこずが起きたす。賌入凊理が完了する前に、もう䞀床賌入凊理が走るず、アむテムが二重に賌入されるこずがありたす。ゲヌム内通貚や課金に関わる凊理では、画面䞊の芋た目だけでなく、サヌバヌ偎の状態も確認しないず原因を远いにくくなりたす。

ガチャでも、通信䞭や挔出䞭に入力が通っおしたうず、意図せず2回回っおしたうこずがありたす。ナヌザヌから芋るず「1回抌した぀もりだったのに、結果が2回分出おいる」「挔出䞭に觊ったら挙動がおかしくなった」ずいう芋え方になりたす。

シヌン遷移でも泚意が芁りたす。画面遷移凊理が二重に開始されるず、遷移先のロヌド、砎棄、生成が重なりたす。その結果、フリヌズしたように芋えたり、戻るボタンが効かなくなったり、想定倖の画面に移動したりしたす。

メニュヌ画面でも、UI生成凊理が重耇するず、同じメニュヌが二重に開くこずがありたす。芋た目ずしおは軜い衚瀺厩れに芋えおも、裏偎ではむベントハンドラが二重登録されおいる堎合もありたす。そうなるず、次の操䜜でさらに別の䞍具合に぀ながりたす。

非アクションシヌンのUIは芋萜ずしやすい

連打察策ずいうず、アクションゲヌムの入力受付やコンボ、回避、攻撃ボタンの話が思い浮かびやすいです。操䜜感に盎結するため、アクション䞭の入力は比范的よく確認されたす。

芋萜ずしやすいのは、非アクションシヌンのUIです。

ショップ、ガチャ、オプション、セヌブ、ロヌド、ミッション報酬、ログむンボヌナス、リザルト画面。こうした画面は、開発偎から芋るず「ボタンを抌したら凊理するだけ」に芋えやすいです。ただ、実際には通信、保存、挔出、画面遷移、UI曎新が絡みたす。

ナヌザヌは、凊理䞭であるこずをはっきり理解しおいるずは限りたせん。ボタンが抌せる芋た目のたたなら、抌しおよいものずしお扱いたす。反応が遅いず、もう䞀床抌すこずもありたす。

そのため、UIは「正しいタむミングで1回だけ抌される」前提にしないほうが安党です。党おのシヌンで連打される可胜性がある、ずいう芋方をしおおくず、蚭蚈時やレビュヌ時に確認するポむントを揃えやすくなりたす。

入力䞭の凊理をどう止めるか

よく䜿われる察策ずしおは、凊理䞭に入力をロックする方法がありたす。

ボタンを抌した時点で入力を受け付けない状態にし、凊理が終わったら再び入力できるようにする。画面䞊もボタンをグレヌアりトしたり、ロヌディング衚瀺を出したりするず、ナヌザヌにも凊理䞭であるこずが䌝わりたす。

凊理䞭フラグを持たせお、同じ凊理が二重に走らないようにする方法もありたす。たずえば賌入凊理が始たった時点でフラグを立お、完了たたは倱敗したらフラグを戻したす。これにより、同じボタンが連打されおも、2回目以降の凊理を止められたす。

ただ、通信ラグや非同期凊理が絡むず、フラグ管理だけでは防ぎきれないこずがありたす。ロヌカル偎では止めおいる぀もりでも、通信の再送、画面遷移、コヌルバックの順番、゚ラヌ時の埩垰凊理によっお、想定倖の経路から凊理が入るこずがありたす。

特に課金、賌入、ガチャ、報酬付䞎のように結果が残る凊理では、クラむアント偎の入力制埡だけで安心しないほうがよいです。サヌバヌ偎でもトランザクション管理を行い、同じ芁求が耇数回来おも状態が壊れないようにしおおく必芁がありたす。

「ボタンを抌せなくする」だけではなく、「同じ凊理が耇数回来おも砎綻しないか」を確認するほうが、運甚埌の問い合わせにも察応しやすくなりたす。

レビュヌずテストでのチェックポむント

連打察策は、実装埌にたずめお確認するより、仕様やレビュヌの段階で芋おおくほうが進めやすいです。

画面仕様を芋るずきは、そのボタンが抌された埌に䜕が起きるかを確認したす。通信が走るのか、セヌブするのか、画面遷移するのか、挔出を再生するのか。凊理が終わるたでに時間がかかるものは、連打されたずきの挙動を確認察象に入れおおくず安心です。

レビュヌ時には、凊理䞭フラグの戻し忘れも芋たいずころです。成功時だけフラグを戻しおいお、倱敗時やキャンセル時に戻しおいないず、今床はボタンが抌せなくなる䞍具合になりたす。二重実行を止める凊理は、止めるこずだけでなく、どの条件で再び操䜜可胜にするかたで確認する必芁がありたす。

テストでは、通垞操䜜だけでは芋぀からないこずがありたす。1回抌しお正垞に動くこずを確認した埌、連打、通信遅延、戻る操䜜、画面切り替え、アプリ䞭断などを組み合わせるず、問題が出る堎合がありたす。

連打䞍具合は、単にナヌザヌの操䜜が荒いから起きるものではありたせん。抌せる状態に芋えるUI、凊理䞭でも入力が通る蚭蚈、非同期凊理の完了順、サヌバヌ偎の状態管理が重なっお起きたす。

そのため、人の操䜜を責めるより、どの時点で入力を受け付けるのか、どの凊理を二重実行させないのか、どこで状態を確定させるのかを芋たほうが、次の修正に぀ながりたす。

確認ポむント

連打で起きる䞍具合を枛らすには、次のような点を確認しおおくず刀断しやすくなりたす。

・凊理開始埌もボタンが抌せる状態になっおいないか
・通信䞭、挔出䞭、画面遷移䞭に入力が通らないか
・賌入、ガチャ、報酬付䞎、セヌブなど、結果が残る凊理が二重に走らないか
・凊理䞭フラグは、成功時だけでなく倱敗時やキャンセル時にも戻っおいるか
・画面遷移を連打したずき、遷移凊理が耇数回開始されないか
・UI生成凊理が重耇しお、同じメニュヌやダむアログが二重に出ないか
・サヌバヌ偎で同じ芁求が耇数回来た堎合に、状態が壊れないか
・通信遅延や再送が起きた堎合でも、賌入や報酬付䞎の結果が重耇しないか

UIは、思った以䞊に連打されたす。

特に非アクションシヌンでは、入力の気持ちよさよりも、凊理の安党性が埌回しになりやすいです。けれど、セヌブ、賌入、ガチャ、シヌン遷移のような凊理では、連打されたずきの挙動を確認しおおくこずで、修正範囲を刀断しやすくなりたす。

「このボタンは䜕床も抌されるかもしれない」ず芋おおくだけでも、レビュヌ時に確認するポむントは倉わりたす。UIは党おのシヌンで連打される前提で蚭蚈しおおくず、埌から原因を远いにくい䞍具合を枛らしやすくなりたす。

おわりに

日々の発信は、X・Bluesky・Facebookでも行っおおりたす。
蚘事の曎新や、開発・採甚・マネゞメントに぀いおの短い投皿はこちらでもご芧いただけたす。

X    https://x.com/itchie_tatsumi
Bluesky  https://bsky.app/profile/itchie-tatsumi.bsky.social
Facebookhttps://www.facebook.com/ichino.souta

たた、蟰巳電子工業SS事業郚では、゚ンゞニアが安心しお長く働ける環境づくりに取り組んでおりたす。
案件やキャリア支揎、カゞュアル面談にご関心のある方は、こちらもご芧ください。

https://www.tatsu-mi-systemsolution.jp/

いいなず思ったら応揎しよう

itchie@蟰巳電子工業 いただいたチップはクリ゚むタヌずしおの掻動費、ならびに故郷ぞの貢献に䜿わせおいただきたす