Garakuta開発メモ

忘れっぽい自分に向けた開発メモ

Unity Android タップ処理での IsPointerOverGameObject検出

Android タップ処理で Update FixedUpdate で動作が異なっていたのでメモ

  • 開発環境:Unity2017.3.0f3
  • 動作環境:Android7.0 XPERIA SO-02J

uGUIでのタップを検出する処理

  private static bool IsPointerOverUI() {
    if (EventSystem.current == null) {
      return false;
    }
#if UNITY_IOS || UNITY_ANDROID
    int tcount = Input.touchCount;
    if (tcount > 0) {
      for (int i = 0; i < tcount; i++) {
        if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(i).fingerId)) {
          return true;
        }
      }
    }
    return false;
#else
    return EventSystem.current.IsPointerOverGameObject();
#endif
  }

uGUI入力検出処理

    if (!IsPointerOverUI()) {
#if UNITY_IOS || UNITY_ANDROID
      if (IsTouch()) {
        switch (GetTouch()) {
          case TouchPhase.Began:
            //入力開始
            break;

          case TouchPhase.Moved:
          case TouchPhase.Stationary:
            //入力移動・維持
            break;

          case TouchPhase.Ended:
          case TouchPhase.Canceled:
            //入力終了・取り消し
            break;
        }
      }
#else
      if (Input.GetButton(InputJump)) {
        //入力
      }
#endif
    }

上記の入力確認を FixedUpdate で実行すると TouchPhase.Began 時点でのuGUI入力検出が出来ない。
Update で実行すると TouchPhase.Began でのuGUI入力検出も出来た。

物理処理を行うために FixedUpdate で使用する場合は入力処理のみ Update に実装を分けるか、TouchPhase.Began での入力を除外する等の対応が必要かもしれない。
iOSでの挙動は不明、また、Androidの機種による差異の可能性もある。


入力確認処理のソースコード(AppInput.Check()で入力状況確認、IsInputで各アクションの入力判断)