質問: m_CameraTargetRot; } UpdateCursorLock(); } ``` CrossPlatformInputManager.csに関しては、ここから先の構造がよくわかりませんでした。 ``` // returns the platform appropriate axis for the given name public static float GetAxis(string name) { return GetAxis(name, false); } ``` 標準アセットのプレハブのFPSControllerのプレハブをシーンに配置してゲームを実行してみると、 特にゲームパットとかのUIを置かないで、マウス移動だけで、GetAxisを取得してアングル変更しているように思えたので、 これと同様にタッチ移動で、GetAxisを取得できることが可能かもしれないと思い、質問しました。 最終的な目標としては、このFPSControllerを改造して、タッチ移動でアングル変更できるように実装することですが、 そもそも、まず、タッチ移動でGetAxisの取得が可能かどうか?という疑問と、 その実装方法を知りたくて質問しました。 こちらのサイトでは、 一見、モバイルでGetAxisの取得ができているように見えますが、 MobileSingleStickControlというUIを使って取得しているので、意図したいこととは違います。 FPSControllerのUIを使わないマウス移動によるGetAxisの取得と同様に、 純粋なタッチ移動だけでGetAxisの取得をしたいです。 CrossPlatformInputManager.csをもっと解析すればそのヒントが見つかるかもしれないですが、 CrossPlatformInputManager.csに関しては、上記のGetAxisを見つけた後、これ以上、どのようにコードを追っていけばよいかわかりませんでした。 ご教示お願い致します。 ### 追記。 最終的に行き着いたメソッド。 StandaloneInput.cs ``` public override float GetAxis(string name, bool raw) { return raw ? Input.GetAxisRaw(name) : Input.GetAxis(name); } ``` このメソッド内でログを取ったところ、毎回rawの値はfalseでした。 よって、Input.GetAxis(name)が動いているみたいです。 このメソッド内でnameのログを取ったところ、どういう挙動で出力が分かれるのかはわからなかったですが、 下記4つの出力がとれました。 ``` Vertical Horizontal Mouse X Mouse Y ``` そして、Input.GetAxisって、そもそも何か?と分からなくなってしまったので、 別のサンプルコードで下記ログを取りました。 ``` void Update () { Debug.Log(Input.GetAxis("Vertical")); Debug.Log(Input.GetAxis("Horizontal")); Debug.Log(Input.GetAxis("Mouse X")); Debug.Log(Input.GetAxis("Mouse Y")); } ``` VerticalとHorizontalは常に0を出力したままでした。 Mouse XやMouse Yは-1~1の間の値を出力しているようでしたが、どういう挙動で(例えばマウスの移動スピードで?)、 この値が出力されているのかよくわかりません。 そして、なぜ、VerticalとHorizontalは常に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 タッチ 方向入力」とかでググれば出て来ますし、そういうアセットを導入するのも良いでしょう)になるかと思います。 自力実装の場合は以前の回答の通り 「数秒前のタッチ位置(もしくはタッチ開始位置)と現在のタッチ位置を比較して、その差分から方向を求める」 という形でいいかと思います。