シンプルなアクションゲームを作ってみよう22-Input Systemに対応する-

記事内に広告が含まれています。

シンプルなアクションゲームを作ってみようの第22回です。

今回は新しい入力システムであるInput Systemに対応していきます。

前回はライトのベイクをしました。

シンプルなアクションゲームを作ってみよう21-ライトのベイクをする-
シンプルなアクションゲームのライトのベイクをして間接光を反映させます。

シンプルなアクションゲームを作ってみようの他の記事は

シンプルなアクションゲームを作ってみよう

シンプルなアクションゲームを作るのを通してUnityの使い方を学ぶカテゴリです。

から参照出来ます。

スポンサーリンク

Input Systemについて

ここまでの記事ではInput Managerで設定したキーやボタンを押した時(例えばInput.GetAxis(“Horizontal”)やInput.GetButtonDown(“Jump”))に、キャラクターの移動やジャンプの処理をさせてきました。

しかし、ボタンの設定を変更するといった機能をゲーム内に用意する場合は柔軟に変更することが難しいです。

新しい入力システムのInput Systemでは拡張可能でカスタマイズ可能になっています。

Input Systemに対応するので、これを機会にPS4のコントローラーにも対応してしまいます(InputManagerでも対応は可能です)。

Input Systemを使う前の注意

Input Systemパッケージをインストールすると、『入力方法をInput Systemに変更しInput Managerを使えなくするか?』というダイアログが出てきて、Yesを押すとここまで使っていたInput Managerが使えなくなります。

自分で設定を変更すればInput Managerを使うように戻せますし、両方を使う事も出来ますので、今回はNoを押して自分で設定をし、両方の入力システムを使えるようにします。

Input Systemのインストール

まずはInput Systemのインストールを行います。

UnityメニューのWindowからPackage Managerを選択します。

Package Managerのパッケージの種類をUnity Registryにし、Input Systemを選択してInstallボタンを押しインストールします。

Input Systemをインストールする

インストール途中で以下のようにダイアログが表示されます。

強制的にInput Systemに切り替えないようにする

このダイアログではInput Systemを使用するにあたって有効にし、Input Managerを無効にして再起動するかを聞かれているのでNoのボタンを押します。

Input ManagerとInput Systemを両方有効にする

次にInput Systemを使えるようにする為の設定をします。

UnityメニューのEditからProject Settingsを選択し、Playerを選択します。

PlayerのOther SettingsのConfigurationのActive Input Handlingの設定をBothと変更します。

Active Input HandlingをBothにする

以下のようなダイアログが出て、設定を有効にするにはUnityエディターを再起動する必要があると表示されるので、Applyボタンを押して設定を有効にします(Unityエディターが再起動されます)。

Active Input Handlingの設定を有効にする為にダイアログでApplyボタンを押す

UIのイベント処理をするEventSystemの更新

Input SystemとInput Managerの両方を有効にしましたが、UIのイベントを処理するEvent Systemゲームオブジェクトの更新をしてInput Systemでの対応にします。

Stage1シーンのEventSystemゲームオブジェクトを選択し、インスペクタでStandalone Input ModuleコンポーネントのReplace with InputSystemUIInputModuleボタンを押してInput Systemに対応します。

UIのEventSystemをInputSystemに対応する

ボタンを押すと以下のようにInput Systemに対応した表記に変わります。

UIのEventSystemがInputSystemに対応された

Input Actionsの作成

次にInput Systemで使うアクションの割り当てをするファイルを作成します。

Assets/Settingsフォルダで右クリックからCreate→Input Actionsを選択し、名前をMyControlsとします。

Input Actionsファイルを作成する

MyControlsファイルでの設定がInput Managerのボタン設定と同じ感じです。

MyControlsファイルをダブルクリックするとアクションの設定ウインドウが開きます。

アクションの設定ウインドウが開く

次にAction Mapsの+を押し名前をPlayerとします。

Playerアクションマップを作成する

Actionsに新しく出来たNew Actionの部分をダブルクリックし名前をMoveと変更します。

またPropertiesのControl TypeをVector2にします。

Moveアクションを作成した

<No Binding>の部分を選択し、PropertiesのBindingのPathでGamepad→Left Stickを選択します。

次にMoveアクションを選択した状態で右クリックからAdd 2D Vector Compositeを選択し、名前をArrowとします。

次にUp: <No Binding>を選択しPropertiesのBindingのPathを押し、出てきたウインドウのListenを押し次にキーボードの↑のキーを押し、出てきたUp Arrowをマウスで選択し設定します。

Moveアクションに矢印キーを設定する

各方向も同じように該当するキーボードの矢印キーを設定してください。

矢印キーの設定は以下のようになりました。

Arrowに矢印キーが設定された

次にActionsの横の+を押し新しいアクションを追加して名前をJumpにします。

Jumpに対応するのはSpaceキーとGamepadのButton Southを設定します。

設定の仕方は同じです。

<No Binding>を選択し、PropertiesのBindingのPathを押し、Listenを押してSpaceキーを押し、出てきたSpace[Keyboard]をマウスで選択し、設定します。

Jumpを選択した状態で右クリックからAdd Bindingを選択し、<No Binding>を選択した状態でPropertiesのBindingのPathを押し、Gamepad→Button Southを選択します。

Button SouthはPS4で言うと×ボタンにあたります。

次にActionsの右の+を押し、Pauseアクションを作成します。

PauseアクションにはEscapeキーとStart[Gamepad]を設定します。

EscapeキーはListenから探せないので、Keyboard→By Location Of Key→Escapeを選択します。

Start[Gamepad]はGamepad→Start[Gamepad]で選択します。

これでアクションの設定が終わりました。

Playerアクションマップのアクションの設定

PlayerにPlayerInputコンポーネントを追加する

アクション設定のファイルが出来たので次はこのアクションファイルを設定するコンポーネントをPlayerゲームオブジェクトに取り付けます。

Stage1シーンのヒエラルキーのPlayerゲームオブジェクトを選択し、インスペクタのAdd ComponentからInput→Player Inputを選択し取り付けます。

Player InputのActionsに先ほど作ったMyControlsファイルをドラッグ&ドロップして設定します。

PlayerInputのActionsにMyControlsを設定する

スクリプトの入力をInputSystemに変更する

スクリプトでInputManagerを使った入力処理を記述しているので、InputSystemを使った処理に書き換えます。

InputManagerの処理を消したくない場合は別途スクリプトを作るのでもいいです。

PlayerControllerスクリプトの入力を変更する

PlayerControllerスクリプトの処理を変更します。

まずはusingディレクティブの指定と、PlayerInputコンポーネントを入れるplayerInput、PlayerInputに設定したMyControlsファイルで指定しているMoveとJumpのアクションを入れるmoveActionとjumpActionを宣言します。

StartメソッドのcanControlの処理の前に以下の処理を追加します。

PlayerInputは自身のゲームオブジェクトに取り付けたPlayerInputを取得します。
moveActionとjumpActionは取得したplayerInputから現在のアクションマップを取得し、FindActionメソッドで引数で指定したアクションを取得します。

次にMoveメソッドでinputに代入する処理を変更します。

入力値は取得したmoveActionのReadValueメソッドでVector2の値を取得し、xとyをVector3のxとzに設定しています。

次にJumpメソッドのJumpボタンが押されたかどうかで判断している部分の処理を変更します。

最初のジャンプの時のJumpボタンを押した時の処理でInput.GetButtonDown(“Jump”)で判断していたのをjumpAction.triggeredでJumpに指定したボタンがトリガーされた時に変更しています。

ダブルジャンプ時の条件にもjumpAction.triggeredに変更します。

PauseScriptスクリプトの入力を変更する

次にPauseScriptスクリプト内の処理を変更します。

PauseScriptはGameManagerゲームオブジェクトに取り付けているのでPlayerInputのアクションファイルを自身から取得する事は出来ません。

そこでインスペクタでPauseScriptのPlayerInputにPlayerゲームオブジェクトをドラッグ&ドロップして設定出来るようにします。

pauseActionはPlayerInputに設定しているアクション設定ファイルからPauseアクションを取得し入れます。

Startメソッドを書き換えます。

PlayerInputからPauseアクションを取得します。

次にUpdateメソッドを変更します。

pauseAction.triggeredでPauseアクションがトリガーされた時にポーズをするようにします。

実行して確認してみる

機能が出来たので実行して確認してみましょう。

今回はPS4コントローラーで動かすだけなので、動画では違いがわかりませんので載せません。(^_^;)

PS4コントローラーを接続しても操作が出来ない場合はパソコンを再起動すると動く可能性が高いです。

終わりに

今回はInputManagerからInputSystemに入力システムを変更しました。

次回はCinemachineを使ってカメラがキャラクターの追尾をするようにしていきます。

タイトルとURLをコピーしました