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

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

ただいまの
回答率

88.76%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,635

tkmnusr

score 320

前提・実現したいこと

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

試したこと

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

FirstPersonController.cs

        private void RotateView()
        {
            m_MouseLook.LookRotation (transform, m_Camera.transform);
        }

MouseLock.cs

        public void LookRotation(Transform character, Transform camera)
        {
            float yRot = CrossPlatformInputManager.GetAxis("Mouse X") * XSensitivity;
            float xRot = CrossPlatformInputManager.GetAxis("Mouse Y") * YSensitivity;

            m_CharacterTargetRot *= Quaternion.Euler (0f, yRot, 0f);
            m_CameraTargetRot *= Quaternion.Euler (-xRot, 0f, 0f);

            if(clampVerticalRotation)
                m_CameraTargetRot = ClampRotationAroundXAxis (m_CameraTargetRot);

            if(smooth)
            {
                character.localRotation = Quaternion.Slerp (character.localRotation, m_CharacterTargetRot,
                    smoothTime * Time.deltaTime);
                camera.localRotation = Quaternion.Slerp (camera.localRotation, m_CameraTargetRot,
                    smoothTime * Time.deltaTime);
            }
            else
            {
                character.localRotation = m_CharacterTargetRot;
                camera.localRotation = 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を出力したままなのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

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/02 15:04

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

    キャンセル

  • 2019/01/02 16:07

    回答追記しました。

    キャンセル

  • 2019/01/02 18:49 編集

    ご回答ありがとうございます。
    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のアングルが変更しなくなってしまいました。

    キャンセル

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

  • ただいまの回答率 88.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る