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で各アクションの入力判断)