前提・実現したいこと
スマホで動くTPS系の3Dゲームを作っています。
UIのジョイスティックを使って自分のキャラクターを動かせるようにしました。
そして、スマホのスクリーンをスクロールしたら、カメラアングルを変更できるようにしました。
荒野行動のようなスマホゲームと同じような感じです。
ですが、これだけだとジョイスティックを動かした時にカメラアングルも一緒に動くようになってしまいました。
これではまともな操作ができないので、ジョイスティックを動かしている指ではカメラアングルを動かせないようにしたいです。
複数の指入力の中からジョイスティックを触っている指入力を取得して、その指入力ではカメラアングル入力を受け付けないようにしたいです。
そのために、下記のコードを書きました。
発生している問題・エラーメッセージ
foreach文で取得した複数の指入力に対して、Handleをタッチしている指ではupdateAngle関数を実行しないようにすることで、今回やりたいことの処理ができると思っていたのですができませんでした。
下記のコードでは、ジョイスティックを触っている間は全ての指入力でカメラアングルを動かせなくなってしまいました。
また、タップした位置にある複数のオブジェクトの中から1つ取得するコードについては恐らく少し間違っていると思います。
Debug.Logで確認した所、タップしたオブジェクトよりも奥側(隠れて見えなくなっている奥にあるオブジェクト)のオブジェクトがログに出力されてしまうことがありました。
ですが、ジョイスティックをタップした時は必ずジョイスティックのオブジェクトを取得できていたので、問題はありません。
該当のソースコード
「Handle」という名前の変数に、ジョイスティックのオブジェクトが代入されています。
updateAngle関数が、カメラのアングルを操作するための関数です。
LateUpdate() { foreach (Touch touch in Input.touches) { Ray ray = mainCamera.ScreenPointToRay(touch.position); PointerEventData pointer = new PointerEventData(EventSystem.current); pointer.position = touch.position; List<RaycastResult> result = new List<RaycastResult>(); EventSystem.current.RaycastAll(pointer, result); float objDistance; float mostSmallObjDistance = 999; //タップした位置にあるObjの中から、ポインタの場所に一番近いObjを取得することでタップしたObjを取得する foreach (RaycastResult raycastResult in result) { objDistance = Vector3.Distance(Input.mousePosition, raycastResult.gameObject.transform.position); if (objDistance < mostSmallObjDistance) { mostSmallObjDistance = objDistance; touchObj = raycastResult.gameObject; } } Debug.Log(touchObj); if (touchObj != Handle) updateAngle(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")); } } void updateAngle(float x, float y) { if (target == null) return; x = azimuthalAngle - x * mouseXSensitivity; azimuthalAngle = Mathf.Repeat(x, 360); y = polarAngle + y * mouseYSensitivity; polarAngle = Mathf.Clamp(y, minPolarAngle, maxPolarAngle); }
試したこと
EventTriggerを使ったり色々調べたりしたのですが、ジョイスティックをタップしている間は全ての指入力でカメラアングルを動かせなくする方法しかわかりませんでした。
ジョイスティックを触っている指入力だけカメラアングルを動かせないようにするにはどんなコードを書けばできるのか教えて下さい。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
###追記
Joystickのオブジェクトをタッチしているかどうかで判定するのでなく、画面右半分をタッチしていたらカメラアングルを動かすという判定方法にしたら上手くいきました。
Raycastでオブジェクトを取得する処理なども必要なくなったので、下記のような短いコードだけで今回やりたかったことができました。
foreach (Touch touch in Input.touches) { if (touch.position.x > Screen.width / 2.0f) { updateAngle(touch.deltaPosition.x * Time.deltaTime, touch.deltaPosition.y * Time.deltaTime); } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。