Unityの新しいInput SystemでOculusを使用する
以前のチュートリアルでUnityで作成したコンテンツをOculus Riftで表示できるところまで進みました。Oculus RiftでもOculus Questでも便利なOculusコントローラーを使います。Unityの従来の入力システムが、なんといえばいいでしょうか、まあ、あまりよくないです。そのために全く新しいInput Systemが導入されました。パワフルで柔軟性がありますが、その分、複雑になりました。ドキュメントもまだ不十分で使いにくい印象を与えてしまいますが、基本を理解すれば、むしろ従来のシステムより非常に使い勝手がいいです。 Input Systemの準備 新しいInput Systemは標準でプロジェクトに追加されないので、パッケージマネージャでインストールする必要があります。 最初はプロジェクトに追加されているパッケージしか表示されないので、「Unityレジストリ」を選択して、インストール可能な標準パッケージを表示します。 「Input System」をインストールします。 そこで、重要なお知らせが表示されます。旧入力システムから新システムに移行するためにプロジェクトの設定を変える必要がありますとの事です。必ず、絶対に「Yes」を押してください。 そうするとなんとUnityが再起動します。クラッシュではなく正常の動作です。 アクションの登録 新しいInput Systemは同じゲームがさまざまなデバイスで、さまざまなコントローラで遊べるように設計されています。設定を簡単に切り替えるためにアセットとして保存されます。シンプルなコンテンツなら一つのインプット設定ファイルで十分です。 アセットメニューから新規の「Input Actions」ファイルを作成します。(Input Systemパッケージがインストールされていないと表示されません。) 「DefaultActions」など、分かりやすい名称を付けます。 このアセットをダブルクリックして編集します。 プレーヤーが引き起こすイベントをアクション(Action)といいます。アクションは基本的に自分で必要に応じて追加して定義します。Move(移動)、Jump(ジャンプ)、Fire(撃つ)などなど。複雑なゲームので、操作方法を切り替えたい場合、アクションを複数のアクションマップ(Action Map)でまとめる事ができます。例えば、戦闘の時のアクション、会話の時のアクション、メニューの時のアクションなどを別々のアクションマップで設定することができます。 今回は単純なゲームを作るので一つだけのアクションマップを使います。新しいアクションマップを追加して、「Oculus Actions」という名称を付けます。(アクションマップの名称は自由です。) 次は新しいアクションを追加します。今回は動作確認のためにキューブを落下させたいですので、「Drop」アクションを追加します。 デフォルトのアクションの「New action」の名称を変えるだけでいいです。 アクションをもっと追加したい時は「+」ボタンを押して追加していきます。 次の重要な概念はバインドです。分かりにくいプログラミング用語ですが、単純にこのアクションを引き起こす時にプレーヤーはどうすればいいのかという設定です。一つのアクションに複数のバインドを登録する事ができます。例えば、「弾を撃つ」というアクションはキーボードのCtrlキー、エンターキー、マウスの左ボタン、ゲームコントローラーのトリガーボタンなど、いくつもの操作方法を登録することができます。今回はプレーヤーが右手のOculusコントローラーのトリガーボタンを押したらキューブが落下するという風に登録します。 「Drop」アクションの表示を展開して、「<No Binding>」を選択します。 「Binding」の「Path」でプレーヤーの操作を選びます。「XR Controller」でAR・VRコントローラーを選択します。 「Oculus Touch Controller」を選ぶと… 左手(LeftHand)と右手(RightHand)のどちらかを選びます。 ここにいくつもの操作がリストアップされます。「Button」で終わる操作はボタンが押された時を意味します。「Touched」で終わる操作はプレーヤーが該当の入力を触れるだけで反応します。スティックだけ押す操作が「Clicked」になっています。コントローラーの入力デバイスの名称とそのバインドはこちらです。 「triggerPressed」を選択しますが、他の操作でも登録してもいいです。 入力設定の編集が終わったら忘れずに設定を保存します。 保存すれば設定画面を閉じます。 アクションを受け取る 登録したアクションに反応してほしいゲームオブジェクトに「PlayerInput」というコンポーネントを追加します。今回のチュートリアルではCubeになります。 PlayerInputコンポーネントに使用する設定を指定しないと動作しません。Actionsパラメータで先ほど作成した設定アセットを選択します。 初期値になっているので変更する必要はありませんが、Behaviorパラメータを必ず「Send Messages」をしておきましょう。アクションが起きた時に様々な形で通知を受け取る事ができますが、「メッセージを送信」という方法から説明します。この方法ではC#のスクリプトで通知を受け取ります。 プロジェクトでスクリプト用のフォルダーを用意します。(整理整頓!) この中に「ObjectDrop」というスクリプトを作成します。 この「ObjectDrop」をCubeに追加します。まだ書いていませんが、ObjectDropスクリプトはPlayerInputと連動するので必ずセットで使います。 スクリプトをダブルクリックしてコード編集ソフトウェアで必要なスクリプトを書きます。 void OnDrop()から始まる部分だけを追加します。このOnDropというのは「On」(起きた時に)と自分で設定したアクション名で構成されています。波括弧の中にアクションが起きた時に実行するコードを書きます。ここは自分自身のゲームオブジェクト(gameObject)に「Rigidbody」という種類のコンポーネントを追加する指示をします。Rigidbodyは物理演算を影響を受けるようにするので、追加することで重力で落下します。 Unityに戻って、再生ボタンを押すと右手のトリガーボタンを押したらキューブが落下します。 […]