はじめに
Unityの新しい入力システムである”InputSystem”を導入したものの、
マウスのホイールの値をどうやって取得するか探ってみました。
ここでは、アクションマップを作成したうえでスクリプトでの受け方を紹介します。
(この記事では、InputSystemパッケージをインストール済みであることを前提としています。)
目次
アクションマップの作成
次の手順に従って、マウスホイール入力の準備をします。
- プロジェクトウィンドウで右クリックし、"作成" -> "InputActions"を選択します
- "NewControls"という名前のファイルが作成されるので、それをダブルクリックで開きます
- 開かれたウィンドウの左上にある"NewControlScheme"横の"▼"をクリックします。
- "AddControlSchemes"を選択します。
- "Mouse"を追加して"Save"ボタンをクリックします
- "ActionMaps"の"+"ボタンを押し、"NewAction"の名前を"Wheel"に変更します
- アクションの"ActionType"を"Value"、"ControlType"を"Delta"に変更します
- "Wheel"の横の"+"ボタンを押します
- "Path"を"Mouse" -> "Scroll"に変更します
- "SaveAsset"ボタンをクリックして右上の×ボタンでウィンドウを閉じます
fig1. アクションマップの作成1
fig2. アクションマップの作成2
ゲームオブジェクトとスクリプトの作成
まず、ヒエラルキーを右クリックして空のオブジェクトを作成します。
そのオブジェクトに"PlayerInput"コンポーネントをアタッチします。
インスペクターから"PlayerInput"コンポーネントの"Actions"に先ほど作成したアクションマップ"NewControls"を設定します。
次に、プロジェクトウィンドウの任意のフォルダに新しいC#スクリプトを作成し、ファイル名を"Example"にします。
さらに、スクリプト"Example.cs"の中身を書いていきます。
スクリプトは下記のとおりです。
script.1 Example.cs
最後に、スクリプトを先ほど作成した空のオブジェクトにアタッチします。
fig3. スクリプトのアタッチまで
スクリプトの解説
fig4. スクリプトのメイン部分
まず、PlayerInputコンポーネントを使って何らかのアクションを受け取る場合の
関数名のルールは、
On + アクション名
であることから今回は"OnWheel"となります。
(申し訳ありません、他のルールがあるかもしれませんが追えていません。)
変数"inputValue"の型は設定した"Path"により異なります。
今回は"Vector2"型です。
実行時、ホイールが回転すると値が変化し都度、"OnWheel"関数が呼ばれます。
実行結果
実行してマウスホイールを回してみるとコンソールにメッセージが出てきます。
私の場合は、X値は常に"0"で Y値が回す方向によって"-120" or "120"と表示されました。
(ちなみにWindowsの設定でホイールを回すと3行ずつスクロールさせるようにしています)
fig5. マウスホイールを回してみた結果
もし、出ない場合は下記を試してみてください。
- 実行ボタンを押した後に、シーン内をクリックしてからホイールを回してみる
- アクションマップの設定がfig.1 および fig.2のようになっているか確認する
- スクリプトがアタッチされているか確認する
- 空のオブジェクトにInputSystemがアタッチされ、Actionsが設定されているか確認する
おわりに
マウスのホイールの入力についてネットで調べたものの、
PlayerInputクラスから値を取得するサンプルが見つからなく、ヒントはあったものの手探りでした。
ホイールは回るだけなので float型で受け取るものと勘違いしてしまい Vector2型に気づくまで時間がかかりました。
よく考えてみたら「チルト動作」付きのホイールもあったなーって。
今回はここまでとなります。
最後までお読みいただき本当に有難うございました。
参考
当記事は下記のサイトを参考に致しました。
この場を借りて御礼申し上げます。
・Unityの新しい入力システムInputSystemを使ってみる(Unityを使った3Dゲームの作り方, かめくめ様)
https://gametukurikata.com/basic/inputsystem