ゲーム制作ネタが無いなーと思ったけど、なんとか今日中に更新したいので、
過去不具合をかましたネタを書きたいと思います。
ゲームやアプリで、ボタンの連打制御をしていなかったことで、処理が2重で走ってしまって予想外の挙動をしてしまうということは、初心者あるあるだと思います。
- ボタンを押された後の処理側で二重に動かないように管理する
- ボタンを連打できないように無効化させる
今回は後者の方法で解決するようなサンプルを書いていきたいと思います。
ボタンの連打防止処理
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class PreventRapidClick : MonoBehaviour
{
[SerializeField] Button targetButton;
[SerializeField] float disableDuration = 1.0f; // 無効化する秒数
private void Start()
{
targetButton.onClick.AddListener(() =>
{
StartCoroutine(DisableButtonTemporarily());
});
}
private IEnumerator DisableButtonTemporarily()
{
targetButton.interactable = false;
yield return new WaitForSeconds(disableDuration);
targetButton.interactable = true;
}
}
このサンプルはボタン側で完結するように、「指定秒数(disableDuration)間は二重で動かないようにする」みたいな動きになっています。
Button.interactable = false;
でボタンを一時的に無効化- 数秒後に
true
に戻すことで再び押せるようになる
という動きですね。
例えばこのフラグ管理を処理側に渡して、処理が終わって帰ってくるまでは絶対に動かないマンにしちゃうこともできますし、このボタンの上にロード画面みたいなボタンを押せなくなる障害物を一時的に置く、なんてパターンも実装できちゃいます。
とりあえず今回は簡単に!ということでボタンだけで完結できる簡単バージョンを実装してますが、もし需要があれば別パターンも書いてみますね。
(そして日を跨いでしまった… 残念ながら間に合わなかったよ…
コメント