テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】新しいインプットシステムで、バーチャルパッドに対応させる

f:id:tsubaki_t1:20191014002517g:plain

バーチャルパッドに対応させる

 新しいInput Systemでバーチャルパッドを作ってみます。モバイルでは殆どの環境ではゲームパッドもキーボードもマウスも繋がっていないので、バーチャルパッドは悪い選択肢ではないと思います。特にカメラが追跡するタイプのサードパーソンゲームでは。

 今回はゲームパッドの入力をオーバーライドしてUIからの操作を注入するアプローチをとります。前提としてゲームがNew Input Systemでゲームパッドに対応している必要があります。今回のゲームの場合「Leftスティックで移動」「Westボタンで弾が出る」という操作を事前に実装し、そのゲームにバーチャルパッド対応を行います。

f:id:tsubaki_t1:20191014004033j:plain
ActionMapsを定義して、ゲームパッドとキーボード操作に対応させる

 なお、このバーチャルパッドは現行主流の押した位置からの差分ではなく、一世代古い固定位置からのバーチャルパッドです。

手順1:UIを作る

 最初にUIのレイアウトを決めます。バーチャルスティック一つにボタンが二つといった感じでしょうか。アンカーも使って画面サイズが変わってもちゃんと追随できるようにしておきます。このUIはボタンで作っておくと、実際にタッチさせているかどうかが視覚的に分かりやすくて良いです。スティックは親を作っておくと座標を動かしやすくて良いです。  

f:id:tsubaki_t1:20191014005157j:plain
UIの構成

 ゲームを再生してみるとUIが反応しないかもしれません。これはEventSystemに古いInput Systemのものを使用している為です。StandaloneInputModuleInputSystemUIInputModuleに変更してやれば使用可能になります。

f:id:tsubaki_t1:20191014005941j:plain
EventSystemを新しいInputSystemに対応させる

手順2:UIのボタンを押したら弾を出す

 「Westボタンで弾が出る」の動作を、UIのボタンを押したら射撃を行うようにします。正確にはボタンのタップに合わせてWestボタンのステータスを更新するだけです。結果としてUIのボタンを押すと弾が出ます。

  1. UIのWestボタンOnScreenButtonコンポーネントを追加
  2. Control PathにButton West[GamePad]を選択

 これでUIのボタンを押せばButton Westが押された事になります。

 一点注意としては、このボタンのタップ判定はButtonのIntractableではなくImageのRaycast Targetが使用される点です。なのでUIを一気に無効化する場合はCanvasGroupのBlock Raycaster等を使用します。

f:id:tsubaki_t1:20191014011821g:plain
ボタンを押したら弾が出る

手順3:スティックを動かしたら動く

 「Leftスティックで移動」の動作を、UIのバーチャルスティックを動かしたら動く形に変更します。

  1. UIのスティック(ドラッグで動くUI)にOnScreenStickコンポーネントを追加
  2. Control PathにLeft Stick[GamePad]を選択

 これでスティックを動かせばプレイヤーが動くようになります。あとはMovementRangeで感度を調整したりします。

f:id:tsubaki_t1:20191014013227j:plain
コンポーネントの設定

オマケ:ボタン操作でプレイヤーを動かす

 OnScreenButtonではゲームパッドのボタンだけでなくキー入力も上書き出来るので、シミュレーションで「上」「下」「左」「右」といった厳密な操作が必要な場合は、ボタンとキーを上書きするのも面白いかもしれません。

f:id:tsubaki_t1:20191014012733g:plain
スティックではなくボタンで動かす

f:id:tsubaki_t1:20191014012827j:plain
ボタンにキー操作を割り当てる

関連

tsubakit1.hateblo.jp