第 50 章 Unity Input Manager 入力システム (パート 1)

Unity の入力システムは、キーボードやマウス、ゲームパッド、タッチ スクリーン、VR および AR コントローラーなど、さまざまな入力デバイスをサポートしています。Unity は 2 つの別個のシステムを通じて入力サポートを提供します。 まず、入力マネージャー (Input Manager) は Unity コア プラットフォームの一部であり、デフォルトで利用可能であり、古い Unity 入力システムに属します。次に、入力システム (Input System) は、使用する前にパッケージ マネージャーを介してインストールする必要があるパッケージであり、新しい Unity 入力システムに属します。もちろん、私たちのコースは依然として古い入力システムの入力マネージャーから開始します。

入力は基本的にスクリプト内で処理されるため、入力処理に関するコードロジックはUpdateメソッドに実装されます。ここでは、Unity が提供する Input クラスを導入する必要があります。このクラスは、入力情報を取得するための多くの静的変数と静的メソッドを提供します。実際、前の章のケースでは、このクラスを使用してキーボード入力を取得しました。たとえば、Input.GetKey(KeyCode.A) は、ユーザーが文字 A キーを押したかどうかを判断するために使用されます。 GetKeyメソッドはキーボード入力を取得するために使用され、そのパラメータはキーボードのキー値であり、これらのキー値もUnityが提供する定数値です。次に、Input クラスが提供する変数とメソッドを見てみましょう。

まず、その中の静的変数を見てみましょう。

anyKey キーまたはマウス ボタンが現在押されているかどうか。

anyKeyDown は、ユーザーが任意のキーまたはマウス ボタンを押した後の最初のフレームで true を返します。

inputString は、このフレームに入力されたキーボード入力を返します。

location デバイスの位置にアクセスするためのプロパティ (ハンドヘルドのみ)。

MousePosition マウスの現在のピクセル座標位置。

いくつかを簡単に紹介します。Input クラスの静的メソッドに焦点を当てます。

ユーザーが名前で識別されたキーを押すと、GetKey は true を返します。

GetKeyDown は、ユーザーが名前で識別されるキーを押し始めたフレーム中に true を返します。

GetKeyUp は、ユーザーが名前で識別されたキーを放したフレーム中に true を返します。

上記の 3 つの方法は主にキーボードのキーを取得するために使用されます。次に、コードを使用して説明します。次のように、新しい「InputManagerDemo」プロジェクトを作成し、デフォルトのシーンに「InputScript.cs」スクリプト ファイルを作成します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InputScript : MonoBehaviour
{
    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.A))
        {
            Debug.Log("键值A");
        }
        if (Input.GetKeyDown(KeyCode.A))
        {
            Debug.Log("按下键值A");
        }
        if (Input.GetKeyUp(KeyCode.A))
        {
            Debug.Log("按上键值A");
        }
    }
}

次に、スクリプトをカメラ「Main Camera」にアタッチし、プロジェクトを実行してキー値 A を押してテストします。

コンソールでは同じログを一行で表示する折りたたみ機能を有効にしており、その後ろの数字は同じログが繰り返し出力された回数になります。キー値 A を 1 回押すと、GetKeyUp と GetKeyDown は 1 回だけトリガーされるのに対し、GetKey メソッドはユーザーが押した時間の長さに応じて複数回トリガーされることがわかります。キー値の定数についても簡単に説明しますが、結局のところ、キーボードには一般的に使用されるキーはそれほど多くありません。

KeyCode.A ~ KeyCode.Z は 26 文字なので詳しくは紹介しません。

KeyCode.Alpha0 ~ KeyCode.Alpha9 は、メイン キーボードの数字キーを表します。

KeyCode.Keypad0 ~ KeyCode.Keypad9 は、キーパッドの数字キーを表します。

KeyCode.F1~KeyCode.F12はF1~F12のファンクションキーを表します。

Backspace = バックスペース; Delete = 削除; Tab = インデント; Escape = エスケープ; Space = スペース; Return = Enter; RightShift = 右 Shift; LeftShift = 左 Shift; RightControl = 右 Ctrl ;LeftControl = 左 Ctrl キー; RightAlt = 右 Alt キー; LeftAlt = 左 Alt キー; UpArrow = 上矢印キー; DownArrow = 下矢印キー; RightArrow = 右矢印キー; LeftArrow = 左矢印キー。

これらの重要な値については、意識して覚える必要はなく、日々の開発の中で使い込むうちに自然と覚えていきます。

GetMouseButton 指定されたマウス ボタンが押されたかどうかを返します。

GetMouseButtonDown は、ユーザーが指定されたマウス ボタンを押したフレームに対して true を返します。

GetMouseButtonUp は、ユーザーが指定されたマウス ボタンを放したフレーム中に true を返します。

上記の 3 つのメソッドは主にマウス ボタンを取得するために使用されます。パラメータ値は、左ボタンの場合は 0、右ボタンの場合は 1、中央ボタンの場合は 2 です。マウスの位置情報は静的変数mousePositionを通じて取得されます。静的変数はVector3型の3次元ベクトルであり、ゲームウィンドウ座標系のx、y、z座標値に対応します。ゲーム ウィンドウの座標系の原点は左下隅であり、z 値は常に 0 であることに注意してください。次に、マウスボタンの情報取得についてもスクリプトを使用して説明します。

        if (Input.GetMouseButton(0))
        {
            Debug.Log("鼠标左键");
            Debug.Log("鼠标位置:" + Input.mousePosition);
        }
        if (Input.GetMouseButton(1))
        {
            Debug.Log("鼠标右键");
        }
        if (Input.GetMouseButton(2))
        {
            Debug.Log("鼠标中键");
        }
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("鼠标左键按下");
        }
        if (Input.GetMouseButtonUp(0))
        {
            Debug.Log("鼠标左键按上");
        }

次に、プロジェクト全体を再実行し、マウスの左ボタン、右ボタン、中ボタンを順番に押して、コンソール出力を確認します。スクリーンショットは次のとおりです。

キーボード キーを取得するメソッドと同様に、マウス クリック イベントの場合、GetMouseButton メソッドは複数回呼び出されますが、GetMouseButtonUp および GetMouseButtonDown は 1 回だけ呼び出されます。Input.mousePosition は位置座標情報を出力します。使用する場合はメソッドの呼び出し数に注意してください。

GetAxis axisName で識別される仮想軸の値を返します。

GetAxisRaw axisName で識別される仮想軸の値を返します (スムーズ フィルタリングは適用されていません)。

GetButton buttonName で識別される仮想ボタンが押されると true を返します。

GetButtonDown は、ユーザーが buttonName で識別される仮想ボタンを押しているフレーム中に true を返します。

GetButtonUp は、ユーザーが buttonName で識別される仮想ボタンを放した最初のフレームで true を返します。

上記の方法は主に「仮想軸」と「仮想ボタン」に使用されます。ゲームで使用する必要があるキーには 2 種類あり、1 つはオン/オフ キーで、2 つの状態 (押すと押す) しか取り得ないキーで、キーボード上のキーはこれに分類されます。もう 1 つはリニア キー (つまり、「軸」キー) です。そのキー値は、前後左右を制御するジョイスティックなどの範囲 (-1 から 1 の間など) にあります。ゲームパッド。「仮想軸」「仮想ボタン」に関わらず、Unityでは「Axes」の入力軸で統一して表現します(軸キーが-1と1のみの場合はボタンキー)。Unity の入力軸はデバイスに依存せず、マウス、キーボード、ゲームパッド、その他のデバイスに使用できます。各デバイスのキーには独自の番号付きの名前があり、それらはすべて Unity で対応する入力軸として設定できます。Unityの入力軸にはカスタム名があり、GetAxisメソッドとGetButtonのパラメータは入力軸の名前ですが、2つのメソッドの戻り値は異なります。

bool Input.GetButton("virtual button"): このメソッドは、実際にバインドされたキーがマウス、キーボード、またはその他の制御デバイスからのものであるかどうかに関係なく、仮想ボタンを読み取ることができます。キーが押されたか離されたかを判断するだけで、方向が左右かどうかは判断できません。したがって、このメソッドの戻り値はブール型になります。

float Input.GetAxis("仮想軸"): キーが押されたか離されたかを判断でき、方向も判断できます。戻り値は -1 ~ 1 の浮動小数点数です。値 0 は、キーが押されていないことを意味します。キーを押します を押します。[-1,0) はキーが押されて方向が左であることを示し、(0,1) はキーが押されて方向が右であることを示します。

Unity のインプット シャフトは、さまざまな入力デバイスを解決するために設計された統合ソリューションであることがわかります。次のように、メニュー バーの [編集] -> [プロジェクト設定...] をクリックし、ポップアップ ウィンドウの左側にある [入力マネージャー] を見つけます。

1 つ目は Size 値で、Unity 設定の 18 の異なる入力軸を表します。もちろん、この値を変更してカスタム入力軸を追加することもできます。次に、Unity によって事前定義されたいくつかの入力軸を簡単に紹介します。1 つ目は、水平軸「水平」と垂直軸「垂直」です。主に前後左右の方向情報入力に使用されます。このうち「水平」は左右方向に入力される情報、「垂直」は前後方向に入力される情報です。

 

設定パラメータは入力軸の各タイプで同じであることに注意してください。簡単に紹介しましょう。

名前: スクリプト内で直接使用できる軸の名前を入力します。例: Input.GetAxis ("Vertical");

説明的な名前: 入力値が正の場合に表示される名前。デフォルトは空白です。

負の説明名: 入力値が負の場合に表示される名前。デフォルトは空白です。

ネガティブボタン: ネガティブボタンの名前。つまり、負の入力値を取得するためにデバイスのどのキーを使用するかを指定します。横軸と縦軸は、キーボードの矢印キー「左」「下」に対応します。

ポジティブボタン: ポジティブボタンの名前。同様に、正の入力値を取得するために使用するデバイスのキー タイプを指定します。横軸と縦軸は、キーボードの矢印キー「右」「上」に対応します。

ポジティブとネガティブに違いがあるのはなぜですか? 実際、「仮想ボタン」の場合、ステータス値は 2 つだけなので、正と負の数値はほとんど意味がありません。ただし、「仮想軸」の場合、戻り値は「-1」~「1」となります。正の数が一方の方向を表す場合、負の数は他方の方向を表し、値の大きさはボタンを押す度合いを示すこともあります。したがって、次元上の 2 つの方向を表すには、正と負の数値を使用する方が適切です。2 つのプラスとマイナスのキー セットは、キーボードのキー、またはジョイスティックやマウスのボタンにすることができることに注意してください。デバイスボタンの名前を入力するだけです。ここでの「左」「右」「上」「下」はキーボードの矢印キーに相当します。多くのゲームでは、キーボードの矢印キーを使用して前後左右の情報入力を制御する必要があります。

Alt Negative Button: 代替のネガティブ ボタン名。つまり、デバイス上の他のキーを使用して負の入力値を取得することもできます。横軸と縦軸は、キーボードの文字キー「A」と「S」に対応します。

Alt Positive Button: 代替のポジティブ ボタン名。同様に、デバイス上の他のキーを使用して正の入力値を取得するように指定します。横軸と縦軸は、キーボードの文字キー「D」と「W」に対応します。

明らかに、ここでの代替ボタンはキーボードの「WASD」の文字キー設定に設定されています。多くのゲームでは、前後左右の情報入力を制御するためにキーボードの「WASD」キーを使用する必要があります。

重力:重力。プレーヤーが入力を停止すると、この入力シャフトは 1 秒あたりの単位でニュートラルまたは 0 速度に戻ります。

デッド: デッドゾーン。アナログ コントローラーでは、この範囲内の値はすべてニュートラルにマッピングされ、入力は提供されません。

感度: 感度。軸が目標値に移動する速度を入力します。単位は 1 秒あたりの単位です。

上記3項目は主にインプットシャフトの最適化設定です。

スナップ: キャプチャします。有効にすると、反対方向のボタンが押されたときに、その入力軸の値が 0 にリセットされます。デフォルトで有効になっています。

反転: 逆にします。有効にすると、正のコントロール キーと負のコントロール キーが交換されます。デフォルトでは有効になっていません。

上記 2 項目は主にインプットシャフトで使用する設定です。

タイプ: タイプ。入力デバイスの種類を設定します。Key または MouseButton Mouse Movement Joystick Axisを指定できますデフォルトは、Key または MouseButton キーボードまたはマウスです。すべてのボタン (ゲームパッド ボタンを含む) 入力はキーまたはマウスボタン ​​タイプに設定する必要があり、マウス移動 (マウス クリックではない) とスクロール ホイールはマウス移動タイプに設定し、ジョイスティックはジョイスティック軸タイプに設定する必要があります。ジョイスティック軸タイプに設定されている場合、ゲームパッド デバイスを接続した後、ジョイスティックを使用して前後左右の情報入力を制御できます。

軸:軸。入力デバイスの入力軸を設定します。横軸と縦軸については、対応する 2 つのデフォルト値は「X 軸」と「Y 軸」です。もちろん、他の入力軸を選択することもできます。このうち最初の3軸はX軸、Y軸はY軸、3軸はローラー、後者はジョイスティックの入力軸です。

JoyNum: ジョイスティック番号。デバイス上のどのジョイスティックを使用するかを設定します。デフォルトでは、すべてのジョイスティックからの入力を受け入れます。

次に、「Fire1」「Fire2」「Fire3」「Jump」の入力軸の設定を見てみましょう。

Positive Button と Alt Positive Button の設定によれば、「Fire1」という名前の入力軸は、キーボードの左 Ctrl キーとマウスの左ボタンに対応します。同様に、「Fire2」の入力軸は、キーボードの左 Alt キーとマウスの右ボタンに対応します。同様に、「Fire3」の入力軸はキーボードの左 Shift キーとマウスの中ボタンに対応します。最後に、「ジャンプ」入力軸はキーボードのスペース バーにのみ対応します (代替キーの押下はありません)。

        float x = Input.GetAxis("Horizontal");
        if (x != 0)
        {
            Debug.Log("Horizontal X :" + x);
        }
        float y = Input.GetAxis("Vertical");
        if (y != 0)
        {
            Debug.Log("Vertical :" + y);
        }
        bool ctrl = Input.GetButtonUp("Fire1");
        if (ctrl)
        {
            Debug.Log("ctrl :" + ctrl);
        }

次に、プロジェクトを実行し、キーボードの矢印キーまたは WASD キーを押して水平方向と垂直方向をテストするか、左 Ctrl キーを押すかマウスの左クリックで「Fire1」の入力をテストします。以下のスクリーンショット

次に、マウスの左ボタン「マウス X」、マウスの右ボタン「マウス Y」、マウスの中ボタン「マウス スクロールホイール」の 3 つの入力軸に対応する設定です。まずはスクリーンショットを見てみましょう

マウス移動の入力の場合、 Buttonを指定する必要はありませんが、Type をMouse Movement typeとして指定する必要があります。対応する軸は、「X 軸」、「Y 軸」、および「第 3 軸 (ジョイスティックとスクロールホイール)」になります。 )」。このようにして、「Mouse X」、「Mouse Y」、「Mouse ScrollWheel」を使用して、マウスの動きの入力情報を取得できます。それでは、どのようなデータが返されるのでしょうか? 「マウス X」と「マウス Y」の場合、マウスの移動方向を表し、負の値は左下方向の移動、正の値は右上方向の移動を表し、値の大きさはオフセットとして理解できます (値は -1 から 1 までで、前後のマウス位置の差を表します)。そして「Mouse ScrollWheel」はマウスの中ボタンの前後スクロール方向を表し、負の値は逆スクロール、正の値は順スクロールを表します。コードを使用して確認できます。

        float mx = Input.GetAxis("Mouse X");
        if (mx != 0)
        {
            Debug.Log("Mouse X :" + mx);
        }
        float my = Input.GetAxis("Mouse Y");
        if (my != 0)
        {
            Debug.Log("Mouse Y :" + my);
        }
        float mz = Input.GetAxis("Mouse ScrollWheel");
        if (mz != 0)
        {
            Debug.Log("Mouse ScrollWheel :" + mz);
        }

Input.GetAxis("Mouse X") は、マウス クリック イベントや画面上のマウス位置の座標ではなく、マウスの移動のオフセットを返すことに注意してください。このオフセットは、マウスの前後の移動方向を示すために使用でき、ベクトルに変換してゲーム キャラクターの制御に適用できます。シーン内で方向を制御するにはさまざまな方法があります。ゲームキャラクターの移動はキーボード操作が最も簡単で、独自の座標系を参照するだけで前後左右に移動できます。マウスでゲームキャラクターの動きを制御するには、マウスの動きでゲームキャラクターの動きを制御する方法と、マウスをクリックしてゲームキャラクターの動きを制御する方法があります。ただし、両方のコード制御ロジックは同じです。どちらの実装ロジックも、マウスの 2D 座標位置をシーン内の 3D 座標位置に変換し、前後 2 つの座標位置に応じて 3 次元ベクトル (オフセット) を計算します。ゲームキャラクターが移動する方向です。もちろん、具体的な操作としては、ゲーム キャラクタを目標方向に回転させ(ゲーム キャラクタは目標点を見て)、独自の座標系に従って前進する必要があります。したがって、ここで最も重要なのは、この方向を表す 3 次元ベクトルです。これはベクトル減算を使用して実現できます。マウスの 2D 座標位置からシーン内の 3D 座標位置への変換は、変換行列またはレイによって行われます。

概要: キー入力の場合、GetButton、GetButtonDown、GetButtonUp を使用してキーの状態を取得できます。ここでのボタンは、キーボード、マウス ボタン、ゲームパッド ボタン、またはその他のデバイス ボタンです。ゲームのインタラクションにはこれら 3 つの方法で十分です。マウスの位置情報の取得に関しては、実はあまり使いません。NGUI の場合、UI 要素のイベント属性は、ほとんどの対話ロジックの処理にすでに役立ちます。

次に、Unity がいくつかの入力軸を繰り返していることがわかりました。

このうち、水平、垂直、ファイア1、ファイア2、ファイア3、ジャンプが繰り返し定義されています。しかし、彼らはゲームパッドをターゲットにしています。水平を例として見てみましょう

対応するボタン名を設定しませんでしたが、タイプをジョイスティック軸に設定し、軸を X 軸に設定してゲームパッドのデフォルトの入力軸 (ジョイスティックのデフォルト X 軸) を使用します。Joy Num の任意のジョイスティック入力に設定します。これにより、ゲームパッドのデフォルトのプライマリ スティックが Unity の「水平」入力軸に設定されます。次に、Input.GetAxis("horizo​​ntal "); を使用して、ゲームパッドのデフォルトのメイン ジョイスティックの水平 X 軸の入力を取得できます。同様に、Input.GetAxis("Vertical "); を使用して、ゲームパッドのデフォルトのメイン ジョイスティックの垂直 Y 軸の入力を取得することもできます。次に、Fire1 を例として、Fire1、Fire2、Fire3、Jump の設定を見ていきます。

「Positive Button」項目では、設定したゲームパッドのボタン名は「Joystick Button 0」で、ゲームパッドの「A」ボタンに相当します。そして、Type 項目にキーの種類が再度設定されます。以下に示すように:

上の写真は私たちがよく使っているゲームパッドです。ジョイスティックが2つ、方向パッドが1つ、ボタンが4つ(ABXY)あり、もちろん前面の両側にLB、RBボタン、トリガーボタンが2つあります。これらのキーにはそれぞれ独自の名前があります。

A: ジョイスティックボタン0

B: ジョイスティックボタン1

X:ジョイスティックボタン2

Y:ジョイスティックボタン3

LB:ジョイスティックボタン4

RB:ジョイスティックボタン5

……

ここで、Unity の「ポジティブ ボタン」の名前を「ジョイスティック ボタン 0」に設定した理由がわかりました。次に、Unity の Fire2、Fire3、Jump の残りの 3 つの入力軸は、ゲームパッドのジョイスティック ボタン 1、ジョイスティック ボタン 2、ジョイスティック ボタン 3 に対応します。これは、上の図の 3 つのボタン B、X、Y です。次に、コードを使用してテストしてみましょう

        float jx = Input.GetAxis("Horizontal");
        if (jx != 0)
        {
            Debug.Log("Joystick X :" + jx);
        }
        float jy = Input.GetAxis("Vertical");
        if (jy != 0)
        {
            Debug.Log("Joystick Y :" + jy);
        }
        bool a = Input.GetButtonUp("Fire1");
        if (a)
        {
            Debug.Log("Joystick A :" + a);
        }

今回はゲームパッドを Unity に接続し、現在のプロジェクトを実行します。マウスとキーボードは使用せず、ゲームパッドを回転させるデフォルトのメインロッカーを直接使用し、A ボタンを押してテストします。

このコースに含まれるコンテンツは Baidu Netdisk に共有されています: https://pan.baidu.com/s/1e1jClK3MnN66GlxBmqoJWA?pwd=b2id

おすすめ

転載: blog.csdn.net/konkon2012/article/details/130599525