

画面上にいろいろのボタンがあるのですが、一つの処理中に他のボタンを使用すると、  
フリーズやバグの要因になるのではないかと思いました。

なので、処理中は他のボタンをタッチできないようにしたいのですが

false; などをそれぞれのボタンに入れて処理中はイベントの無効にするように設定するのは  
ボタンが多い場合時間がかかりますので、  
その他のボタンを一時的に無効にする方法はありますでしょうか


CC BY-SA 3.0
2016-01-10T14:22:00.733
20808
2016-05-05T07:34:55.040
9268
question
c# unity3d
ボタンを一時的に無効にする


質問者さんが意図している機能に対して最適な処理であるかどうかは何とも言えませんが、メッセージフィルタを使って、該当するコントロールに対するメッセージをフィルタリングしてしまうという方法が考えられます。

IMessageFilterインターフェースを実装したクラスをフォームに登録しておけばメッセージディスパッチ前にこのクラスのPreFilterMessageメソッドに処理が渡るので、そこで動作を止めたいボタンに対するメッセージを操作することができます。

ただUnityを知らないので、この方法が使えるか何とも言えません。IMessageFilterインターフェースについて調べてみてください。

ただ、質問に書かれている内容のみで判断すると、ボタンコントロールのプロパティをfalseにする処理をボタン数分行う方が直感的に判りやすく、コードを書くコストも大してかからず、不具合も紛れ込みにくいのではないかと思います(実行時間もそんなにかかるとは思えないです……)。


CC BY-SA 3.0
2016-01-14T13:54:51.250
20928
2016-01-14T13:54:51.250
9515
20808
answer


例えばの話を交えて回答します。

たとえばButton用のスクリプト(ButtonSample.cs)があるとします。  
またこれとは別でデータを管理するスクリプト(DataManager.cs)があるとします。

ButtonSample.csにボタン処理を実行するメソッドがあるとし、

[code]

    public void Execute(object param){
        if( DataManager.instance.waitButton ) return;
        DataManager.instance.waitButton = true;
        /*
            ここにボタンの処理
        */
    }
    
[/code]

上記のように実装されてるものとします。

> DataManager.instance.waitButton

上記は共通のボタンフラグとして管理しているものとし、  
実行されたタイミングで真を代入します。  
このフラグが真である間はこのフラグが設定されているメソッドは全て実行不能になります。

このようにひとつのフラグをうまくコントロールして使えば  
質問者さんが求めているものは実装できると思います。

> false; などをそれぞれのボタンに入れて処理中はイベントの無効にするように設定するのは  
>  ボタンが多い場合時間がかかりますので、  
>  その他のボタンを一時的に無効にする方法はありますでしょうか

この部分をボタンひとつひとつ、ではなくひとつの変数で全部管理しちゃおう！という考えです。  
※その変わりですが、ちゃんとフラグを解除する処理は所々にいれる必要はあります。  
コールバックをうまく使って一つにまとめれないことはないですが・・・。


CC BY-SA 3.0
2016-02-04T15:09:00.770
21713
2016-02-04T15:09:00.770
14215
20808
answer