- Web Engineer
- アウトバウンド営業
- Webエンジニア(経験者)
- Other occupations (18)
- Development
- Business
はじめに
今回は、Unityにおけるボタンの連打・同時押し対策についてまとめました。
業務でゲーム開発を進める中で、これらの対策を初めて実装する機会があり、多くの学びがあったので、これからUnityでゲームを開発される方の参考になれば幸いです!
前提として、アーキテクチャにはMVPを採用し、ライブラリにはUniTaskおよびR3を使用しています。
どんな不具合が起きたのか
実際に発生した不具合は以下の2点です。
- ボタンを連打した後、タップしても処理が実行されず、ゲームが進行不能になる
- 複数のボタンを同時にタップした際、それぞれの処理が並行して実行され、想定外の挙動になる
いずれも致命的な問題ですが、比較的シンプルな対策で解消できたため、今回はその方法をご紹介します!
基本の実装例
不具合が発生していた当時は、主にViewからPresenterに対してボタンタップイベントをSubjectで通知する実装を行っていました。
View
private readonly Subject<string> _onButtonClick = new();
public IObservable<string> OnButtonClick => _onButtonClick;
view.OnButtonClick.Subscribe(_ =>
{
_onButtonClick.OnNext("通知したい内容");
}).AddTo(this);
Presenter
_view.OnButtonClick
.Subscribe(() =>
{
ShowPopup();
}).AddTo(this);
public void ShowPopup()
{
// Popup表示処理
}
この状態では通常のタップ操作では問題ありませんが、連打や同時押しには無防備で、不具合が発生しやすい状況でした。
問題ごとの対策方法
対策方法は処理内容に応じて異なりますが、以下のような対応を行いました。
- SubscribeAwait を使用して非同期処理の重複実行を防止
- R3の ThrottleFirst を使用して一定時間内の連続タップを抑止
- View側のみで完結する処理は購読を外して制御
A. ボタンを素早く連打したとき
SubscribeAwait を使うことで、非同期処理が完了するまで次のタップイベントを処理しないようにできます。
_view.OnButtonClick
.SubscribeAwait(async (_, cancellationToken) =>
{
await ShowPopup(cancellationToken);
}).AddTo(this);
このようにすることで、ShowPopupの処理が完了するまで Subject でイベントが通知されても購読側では処理されなくなり、重複実行を防げます。
なぜSubjectで通知されなくなるのか?
正確には、通知自体は OnNext で発行されています。
しかし SubscribeAwait を使っている場合、非同期処理が進行中の間は、新たな通知が届いても購読側の処理が開始されません。
つまり、「通知はされているが処理されない状態」になるため、結果的に通知されていないように見えるのです。
これは、非同期処理が完了するまで SubscribeAwait が次のイベント処理を受け付けない仕組みになっているためです。
B. 異なるボタンを同時タップしたとき
同時に複数のボタンをタップして処理が重なるのを防ぐには、ThrottleFirst が有効です。
…
記事の続きは下のURLをクリック!
https://rightcode.co.jp/blogs/52070
エンジニア積極採用中です!
現在、WEBエンジニア、モバイルエンジニア、デザイナー、営業などを積極採用中です!
採用ページはこちら:https://rightcode.co.jp/recruit
社員の声や社風などを知りたい方はこちら:https://rightcode.co.jp/blogs?category=life
社長と一杯飲みながらお話しませんか?(転職者向け)
特設ページはこちら: https://rightcode.co.jp/gohan-sake-president-talk
もっとワクワクしたいあなたへ
現在、ライトコードでは「WEBエンジニア」「モバイルエンジニア」「ゲームエンジニア」、「デザイナー」「WEBディレクター」「営業」などを積極採用中です!
ライトコードは技術力に定評のある受託開発をメインにしているIT企業です。
有名WEBサービスやアプリの受託開発などの企画、開発案件が目白押しの状況です。
- もっと大きなことに挑戦したい!
- エンジニアとしてもっと成長したい!
- モダンな技術に触れたい!
現状に満足していない方は、まずは、エンジニアとしても第一線を走り続ける弊社代表と気軽にお話してみませんか?
ネット上では、ちょっとユルそうな会社に感じると思いますが(笑)、
実は技術力に定評があり、沢山の実績を残している会社ということをお伝えしたいと思っております。
- ライトコードの魅力を知っていただきたい!
- 社風や文化なども知っていただきたい!
- 技術に対して熱意のある方に入社していただきたい!
一度、【Wantedly内の弊社ページ】や【コーポレートサイト】をのぞいてみてください。
Wantedly:https://www.wantedly.com/companies/rightcode
コーポレート:https://rightcode.co.jp/