🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1030閲覧

【Unity】スマホのTPS系3Dゲームで、ジョイスティックを触っている指ではカメラアングルを動かせないようにしたいです。

kosho206

総合スコア41

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/11/28 08:59

編集2020/12/06 07:55

前提・実現したいこと

スマホで動く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); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

追記で書いたような処理に変えたら解決できました。

投稿2020/12/01 09:24

編集2020/12/06 07:55
kosho206

総合スコア41

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問