ハツェの真時代傾向璋

興味を持ったことを書いていく鱗片的な場所から先の未来の場

コントローラーによって与えるPresetを変えてみる

こんばんは。ハツェです。
最近は連日の騒動でリアルは楽しくないですね。
そんな時はSocial VR !って感じもします。

さてさて、今回も調べたところで全く書かれてなかったので備忘録として記事にします。
今回は条件に応じて異なるPresetを反映させようといった内容です。
Preset自体はエディタのみの機能ですので、ビルドしてアプリケーションとして出しても機能しないのでそこはあらかじめご注意ください。
今回の動作環境はUnity 2019.3.5f1です。


目次


実際にやってみる

概要

完成イメージは以下のような感じです。
f:id:hatuxes:20200327224010g:plain

今回はXboxPS4コントローラーどちらにも同じ操作を行えるようにします。
XboxPS4では与えられている番号がそれぞれ異なります。
hakonebox.hatenablog.com qiita.com そのため、それぞれ独自の設定をPresetとしてあらかじめセットしておき、最終的な反映をコントローラーごとに分けて行うといった寸法です。
また、今回はコントローラーで操作する前提とし、何も入力されてなかったらエラーとします。
つまりは、キーボードでの入力は無効という仕様にします。

そして、操作は

  • 左スティック : Cubeの移動
  • 右スティック : Cubeの回転
  • L/Rボタン : Cubeの色変更
  • L/Rトリガー : Cubeの奥行き移動
  • Rスティック押し込み : リセット

というふうにします。

読み込む名前空間

だいたいこんな感じです。

using UnityEngine;
#if UNITY_EDITOR
    using UnityEditor;
    using UnityEditor.Presets;
#endif

Presetクラスは、実際にはUnityEditor.Presets.Presetなので、あらかじめPresetsまでを読み込んでおきます。

コントローラーごとにPresetを指定する

stringで分岐させているので、これで正しいのかどうか若干不安なんですが、私はこれで動作したため一応乗っけておきます。

コントローラーの名前を取る

コントローラー名の取得はこんな感じです。

//コントローラーの名前を取得
foreach (var name in Input.GetJoystickNames())
    if (name.Length > 1)
        _controllerName = name;

Input.GetJoystickNames()は文字の配列を返します。
先頭は空配列で、1Pから順番にコントローラーの名前が格納されていく仕様です。
なので、配列の要素数とかを返せば何個のコントローラーが接続されているかとかがわかるようになっています。
今回はコントローラーは一台のみ接続されているという前提で組んだので、要素の中で長さがある要素名をコントローラー名として取得するようにしています。

名前ごとに与えるPresetを変える

ここが今回の目玉だと思います。

//InputManagerを取得
Object manager = AssetDatabase.LoadAssetAtPath<Object>("ProjectSettings/InputManager.asset");

//コントローラー別にInputManagerにPresetを反映
if (_controllerName == "Controller (XBOX 360 For Windows)") _XBoxPreset.ApplyTo(manager);
else if (_controllerName == "Wireless Controller") _PS4Preset.ApplyTo(manager);

ProjectSettings系はSerializedObjectとして読み込みますが、個々に値を変えるといったわけでなくPresetを反映させたいだけなのでObjectとしてそのまま読み込みました。
その後、コントローラー名ごとにPreset.ApplyTo (Object target)でPresetを適用しています。

全文

コードの全体はGithubにサンプルプロジェクトを乗っけているので、そちらをご覧ください。
github.com

終わりに

Presetを反映するというのが、意外と調べても出てこなかったので今回の記事を書くことにしました。
まぁビルドするときには一切この方法は使えないので、エディタ拡張を作るときに参考になるかな~って感じがします。
実際にアプリケーションにするなら、今だとInputSystemの方が凄く楽なので、そっちで作られている方も少なくない気がしますね。