メインコンテンツまでスキップ
バージョン: 0.23.2

UI操作とトリガーアクションの競合

タッチパッドを押すことをトリガーとしているアクションが、UIを操作する時にも実行されると困ってしまいます。 そこで、このページではUI操作とトリガーアクションの競合の解決方法を紹介します。

この問題を解決している例として、空間アンカーのサンプルシーンが参考になります。 空間アンカーでは、タッチパッドを押すことでアンカーを生成していますが、UI操作時のみアンカーを生成しないように工夫がされています。

alt text 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()関数を実行する alt text

以上の処理を他のUIのボタンにも適用する事で、UI操作とトリガーアクションの競合を解決することが出来ます。