ここで理解し、学習しようとしているのは非常に基本的なことです:C#を使用して、Unityの3つのメインマウスボタンのシングルクリックとダブルクリックを適切に区別する最も一般的で洗練された方法は何ですか?
言葉を適切に強調することは、何の役にも立ちません。このウェブサイトでこれが一度も聞かれたことがないことに驚きましたが、もちろん、UnityのフォーラムやUnityの質問/回答ページで同様の質問を数多く見つけました。ただし、これらのリソースに回答が投稿される場合が多いため、それらはすべて明らかに間違っているか、少なくとも少しアマチュアすぎるように見えました。
説明させてください。提案されたソリューションには、常に2つのアプローチと対応する欠陥のいずれかがありました。
- クリックが発生するたびに、最後のクリックからの時間差を計算し、それが所定のしきい値よりも小さい場合、ダブルクリックが検出されます。ただし、このソリューションでは、ダブルクリックが検出される前にクイックシングルクリックが検出されます。これは、シングルクリックアクションとダブルクリックアクションの両方をアクティブにするため、ほとんどの状況で望ましくありません。
大まかな例:
float dclick_threshold = 0.25f;
double timerdclick = 0;
if (Input.GetMouseButtonDown(0)
{
if (Time.time - timerdclick) > dclick_threshold)
{
Debug.Log("single click");
//call the SingleClick() function, not shown
} else {
Debug.Log("double click");
//call the DoubleClick() function, not shown
}
timerdclick = Time.time;
}
- アクティブ化されるシングルクリックの待機遅延を設定します。つまり、クリックごとに、最後のクリックからの遅延時間が所定のしきい値を超える場合にのみ、シングルクリックアクションをアクティブにします。ただし、シングルクリックが検出される前に待機に気づくことができるため、これは結果が遅くなります。さらに悪いことに、この種のソリューションは、OSレベルでのユーザーのダブルクリック速度設定の速度や速度を考慮していないため、マシン間の不一致に悩まされています。
大まかな例:
float one_click = false;
float dclick_threshold = 0.25f;
double timerdclick = 0;
if (one_click && ((Time.time - timerdclick) > dclick_threshold))
{
Debug.Log("single click");
//call the SingleClick() function, not shown
one_click = false;
}
if (Input.GetMouseButtonDown(0))
{
if (!one_click)
{
dclick = -1;
timerdclick = Time.time;
one_click = true;
}
else if (one_click && ((Time.time - timerdclick) < dclick_threshold))
{
Debug.Log("double click");
//call the DoubleClick() function, not shown
one_click = false;
}
}
したがって、私の質問は次のようになります。これらのソリューション以外に、C#を使用してUnityでダブルクリックを検出するより洗練された信頼性の高い方法と、前述の問題を処理する方法はありますか?