質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

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

Q&A

解決済

1回答

2344閲覧

GetAxisをタッチ操作でも取得する。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

0グッド

0クリップ

投稿2018/12/31 14:46

編集2019/01/02 06:00

前提・実現したいこと

タッチ操作で、GetAxisを取得することは可能ですか?
可能な場合、その実装方法を教えていただきたいです。
宜しくお願い致します。

試したこと

標準アセットのプレハブのFPSControllerを試したところ、
マウス操作でGetAxisしていて、アングルの変更ができていました。
解析した箇所は下記です。

FirstPersonController.cs

C#

1 private void RotateView() 2 { 3 m_MouseLook.LookRotation (transform, m_Camera.transform); 4 }

MouseLock.cs

C#

1 public void LookRotation(Transform character, Transform camera) 2 { 3 float yRot = CrossPlatformInputManager.GetAxis("Mouse X") * XSensitivity; 4 float xRot = CrossPlatformInputManager.GetAxis("Mouse Y") * YSensitivity; 5 6 m_CharacterTargetRot *= Quaternion.Euler (0f, yRot, 0f); 7 m_CameraTargetRot *= Quaternion.Euler (-xRot, 0f, 0f); 8 9 if(clampVerticalRotation) 10 m_CameraTargetRot = ClampRotationAroundXAxis (m_CameraTargetRot); 11 12 if(smooth) 13 { 14 character.localRotation = Quaternion.Slerp (character.localRotation, m_CharacterTargetRot, 15 smoothTime * Time.deltaTime); 16 camera.localRotation = Quaternion.Slerp (camera.localRotation, m_CameraTargetRot, 17 smoothTime * Time.deltaTime); 18 } 19 else 20 { 21 character.localRotation = m_CharacterTargetRot; 22 camera.localRotation = m_CameraTargetRot; 23 } 24 25 UpdateCursorLock(); 26 }

CrossPlatformInputManager.csに関しては、ここから先の構造がよくわかりませんでした。

C#

1 // returns the platform appropriate axis for the given name 2 public static float GetAxis(string name) 3 { 4 return GetAxis(name, false); 5 }

標準アセットのプレハブのFPSControllerのプレハブをシーンに配置してゲームを実行してみると、
特にゲームパットとかのUIを置かないで、マウス移動だけで、GetAxisを取得してアングル変更しているように思えたので、
これと同様にタッチ移動で、GetAxisを取得できることが可能かもしれないと思い、質問しました。

最終的な目標としては、このFPSControllerを改造して、タッチ移動でアングル変更できるように実装することですが、
そもそも、まず、タッチ移動でGetAxisの取得が可能かどうか?という疑問と、
その実装方法を知りたくて質問しました。

こちらのサイトでは、
一見、モバイルでGetAxisの取得ができているように見えますが、
MobileSingleStickControlというUIを使って取得しているので、意図したいこととは違います。
FPSControllerのUIを使わないマウス移動によるGetAxisの取得と同様に、
純粋なタッチ移動だけでGetAxisの取得をしたいです。
CrossPlatformInputManager.csをもっと解析すればそのヒントが見つかるかもしれないですが、
CrossPlatformInputManager.csに関しては、上記のGetAxisを見つけた後、これ以上、どのようにコードを追っていけばよいかわかりませんでした。
ご教示お願い致します。

追記。

最終的に行き着いたメソッド。
StandaloneInput.cs

C#

1 public override float GetAxis(string name, bool raw) 2 { 3 return raw ? Input.GetAxisRaw(name) : Input.GetAxis(name); 4 }

このメソッド内でログを取ったところ、毎回rawの値はfalseでした。
よって、Input.GetAxis(name)が動いているみたいです。
このメソッド内でnameのログを取ったところ、どういう挙動で出力が分かれるのかはわからなかったですが、
下記4つの出力がとれました。

Vertical Horizontal Mouse X Mouse Y

そして、Input.GetAxisって、そもそも何か?と分からなくなってしまったので、
別のサンプルコードで下記ログを取りました。

C#

1 void Update () { 2 Debug.Log(Input.GetAxis("Vertical")); 3 Debug.Log(Input.GetAxis("Horizontal")); 4 Debug.Log(Input.GetAxis("Mouse X")); 5 Debug.Log(Input.GetAxis("Mouse Y")); 6 }

VerticalとHorizontalは常に0を出力したままでした。
Mouse XやMouse Yは-1~1の間の値を出力しているようでしたが、どういう挙動で(例えばマウスの移動スピードで?)、
この値が出力されているのかよくわかりません。
そして、なぜ、VerticalとHorizontalは常に0を出力したままなのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

CrossPlatformInputManager.csの中に
public static float GetAxis(string name, bool ???)という、引数が2つあるメソッドがあると思います。(???は何らかの文字)
もしもその中身も同じようにreturn GetAxis(引数);だったら、更に同じ個数・同じ型の引数を持つGetAxisメソッドを探してください。

最終的に行き着いたメソッドの中身で何をしているのか見れば出来ると思います。
(多分数秒前のタッチ位置と現在のタッチ位置を比較して、その差分から方向を取っているのではないかと思います)


余談ですが「同じ名前で引数が違うメソッド」の仕組みを**「オーバーロード」**と言います。
同じ名前ですが引数が違うので実質的には別メソッドです。

今回だと「本当はstringとboolを渡して欲しい」「でも毎回2つを渡すのは面倒臭い(boolはfalseであることが大半である)」「じゃあstringだけを渡された時は、第二引数はfalseだと勝手に決めることにしよう」という思惑で実装されています。
(つまり「引数がstring1つ」「引数がstringとboolの2つ」のどちらでも動くようになっています)


【2019/01/02追記】
今更検証しましたが、これそのままタッチで動きませんか?
少なくともInput.GetAxis("Mouse X")はタッチでも動いてる(Unityバージョン2018.2.3f1で検証)んで、最終地点までに余計な処理していなければ動作するような気がします。

Input.GetAxisはUnityで定義されてるメソッドです。
Input.GetAxis - Unity スクリプトリファレンス
ここを見ると「Edit > Project Settings > Input で設定されてるaxisNameの入力を取るよ」とあります。
なので該当の設定画面を見てください。
Input Manager - Unity マニュアル

デフォルト設定だと、例えば
「Horizontal」は「leftキーかaキーが押されたらマイナス、rightキーかdキーが押されたらプラス」、
「Mouse X」は「マウスが動いた時のX値(つまり左右)」を取得してることになります。
なのでこの条件を満たしていなかったら常に0だし、満たしていれば-1〜1の値を取ります。

で、Unityはマウスの処理がタッチでも発生するようにしてくれている場合が多いです。
今回の場合は「Mouse X・Mouse Y」の設定で「Type : Mouse Movement」になってますが、こいつはタッチの時も有効のようです。
(2本指以上でやると狂うっぽいですが)

ざっくり実装するならこのままこれを使う、2本指以上のタッチも適切に処理するなら自分で実装(「unity タッチ 方向入力」とかでググれば出て来ますし、そういうアセットを導入するのも良いでしょう)になるかと思います。
自力実装の場合は以前の回答の通り
「数秒前のタッチ位置(もしくはタッチ開始位置)と現在のタッチ位置を比較して、その差分から方向を求める」
という形でいいかと思います。

投稿2019/01/01 02:39

編集2019/01/02 07:07
sakura_hana

総合スコア11427

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

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

退会済みユーザー

退会済みユーザー

2019/01/02 06:04

ご回答ありがとうございます。 オーバーロードのご説明ありがとうございます。 なるほど、オーバーロードで解析して、続きのソースコードを追っていくことができ、 最終的なメソッドまで(おそらく?)辿り着くことができました。 ただ、ここで行き詰まってしまいました。 Input.GetAxisとはそもそもどういうものなのか?という点でわからなくなったり、これをモバイル用に改造できるのか?ということなどがわからない状態です。 詳細は質問に追記しました。
退会済みユーザー

退会済みユーザー

2019/01/03 01:53 編集

ご回答ありがとうございます。 Input.GetAxisの 「Horizontal」はleftキーとかのキーで反応して、 「Mouse X」はマウスが動いた時やタッチ移動でのX値だったのですね、理解できました。 実際にスマホで検証して、下記のようにログをとった所、 タッチ移動で値が反応していました。 float h = Input.GetAxis("Mouse X"); mytext.text = h.ToString(); Input.GetAxis("Mouse X")はタッチでも動いてることが理解できました。 ありがとうございます。 ちなみに、何故かFPSControllerではスマホのタッチ操作でアングル変更しませんでした。 スマホの検証でなくとも、スイッチプラットフォームでAndroidに設定したら、 Unityエディタ上でも、マウス移動でFPSControllerのアングルが変更しなくなってしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問