UI操作とトリガーアクションの競合
タッチパッドを押すことをトリガーとしているアクションが、UIを操作する時にも実行されると困ってしまいます。 そこで、このページではUI操作とトリガーアクションの競合の解決方法を紹介します。
この問題を解決している例として、空間アンカーのサンプルシーンが参考になります。 空間アンカーでは、タッチパッドを押すことでアンカーを生成していますが、UI操作時のみアンカーを生成しないように工夫がされています。
Sample Assets > Anchor Sample Controller
オブジェクトにアタッチされているAnchorSampleController
スクリプトでは以下のメソッドが実装されています。
トリガーアクションの実行
以下のようにトリガーアクションが実行されると、ギズモが生成されるようになっていますが、キャンセルするかどうかの処理も行われています。
private void OnTriggerAction(InputAction.CallbackContext context)
{
if (!_canPlaceAnchorGizmos)
{
return;
}
SendHapticImpulse();
InstantiateGizmos();
}
トリガーアクションのキャンセルの管理
以下の関数では、トリガーアクションが実行された際に、キャンセルを行うかどうかの変数_canPlaceAnchorGizmos
を管理しています。
public void OnPointerEnterEvent()
{
_canPlaceAnchorGizmos = false;
}
public void OnPointerExitEvent()
{
_canPlaceAnchorGizmos = true;
}
トリガーアクションのキャンセルの実行
シーン内のUIのボタンオブジェクトのEventTrigerコンポーネント内で、前項のトリガーアクションのキャンセルの管理の関数が登録されています。
- ボタンを押した際には、OnPointerEnterEvent()関数を実行する
- ボタンを離した際には、OnPointerExitEvent()関数を実行する
以上の処理を他のUIのボタンにも適用する事で、UI操作とトリガーアクションの競合を解決することが出来ます。