jInput Mapping

detailed explanation

Thank you for liking  jInput Mapping!

このページではjInput Mappingの導入の仕方や使い方を説明します。あなたの作るUnityゲーム内に簡単にキーコンフィグ(ボタン設定やキーアサインなどとも呼ばれます)を設置することが出来ます。また、更なるカスタマイズを求める方へのより詳しい解説も用意しています。

もしあなたがまだjInput Mappingをお持ちでないなら、まずはこちらのデモページにてどのように動作するか試してみてください。

jInputでは、GamePad, Joystick, キーボード, マウス, どれでも自由に使うことができ、それを GetKey&Button, KeyUp, KeyDown, GetAxis&Raw のどれででも取得することができます。

例えばスクリプトでGetKeyUpと記述した所にプレイヤーがアナログスティックをマッピングしたとしてもスティックがニュートラルに戻る際(Up)を取得します。Key/Button/Axis といった挙動の違いを考慮せず同一のソースで全てのレスポンスを得られます。複数のデバイスを同時に混在させることもできます。このため、あなたはプレイヤーの操作環境を気にする必要がありませんし、プレイヤーもまた自分の好きなデバイスで自由にゲームを楽しめるのです。jInputはあなたのゲームとプレイヤーの入力機器の間の壁を取り除きます。

Set up

ここではまずjInputを設置する手順を説明していきます。

  1. デモでの動作確認
  2. あなたのプロジェクトへの設置
  3. アップデートの際の注意
  4. 設定の競合の回避

デモでの動作確認

アセットのインポート処理が完了するとUnityのConsoleウインドウに"[jInput] Initial setting has been completed."の表示が出ます。インポートされたjInputのファイル群は、Unity上ではProjectウインドウの中のjInputMappingフォルダの中に全てあります。
OS上で言えば、プロジェクトのフォルダ以下/Assets/jInputMappingフォルダの中です。

フォルダの中には InputMappingDemo と InputMappingUGUIDemo の2つのデモシーンがあります。InputMappingDemoはUIが全て3Dオブジェクトで作られ、InputMappingUGUIDemoはUnityGUIで作られています。インポートが完了したら、一度どちらかのデモシーンををPlayしてデモが正常に動くか試してみてください。

[補足] 初期設定において、あなたの以前のInputManager.assetはInputManager(original).assetにリネームされ別途保持されます。すでにInputManager(original).assetというファイルが存在する場合(jInputの再インポートの時など)は、以前からあったものを保持し上書きはしません。

あなたのプロジェクトへの設置

デモが動いたらあなたのプロジェクトへの設置も簡単です。まずデモシーンのHierarchyウインドウの中から、'jInputMappingSet' を選択しコピーします。そしてあなたの製作中のゲームを開いてそこにペーストするだけです。

jInputMappingSetは、プレイヤーがキーコンフィグを行う画面を構成するためのUIオブジェクトなどのセットです。ゲームのオプション画面などのキーコンフィグするシーンに置いてください。

[補足] あなたがこのアセットで使用しているスクリプト名と同名のスクリプト名をすでに使用していた場合、そのままではエラーとなり動作しません。これはUnityの仕様です。この場合はnamespace(名前空間)を使うなどして対処してください。

[補足2] もし万が一、あなたがすでに'jInputMappingSet' や 'jInputMappingManager' の名前を持つオブジェクトを作っていて名前が重複した場合、jInputは正常に動作しません。また、jInputMappingSet内の階層構造を変えたり、内部でフォルダ構造になっているものの中に無関係なオブジェクトを入れないでください。

[補足3] 3Dオブジェクト版において、あなたがシーンに設置しているカメラにjInputMappingSetが映り込むと表示上おかしな事になるかもしれません。jInputのUIは自身を映すカメラを持っているので2箇所から映像に入ってしまうからです。この場合はワールドの使用していない位置にjInputMappingSetを設置したりカメラのCullingMaskを使用してください。

アップデートの際の注意

アセットのアップデートを適用した後は、まずあなたのゲーム内のjInputMappingSetオブジェクトがあるシーンを開いてください。これにより、アップデートの変更点が機能に適合されます。これを行わない場合、既存のデータ部分とアップデートした部分が食い違って正常に動かない可能性があります。アップデートの際は忘れないように行ってください。
そのまま一度シーンをPlayしておけば、新しいバージョンでエラーが出ないかの確認もなって尚良いでしょう。

また、アップデートの為の再インポートによってPrefabやテクスチャが上書きされるので、デザインのために独自の変更を加えている場合は注意してください。それらのリソースはjInputMapping/Componentsフォルダにまとめられているので、独自の変更を加えたものはインポートされるのと別の場所に分けて置いておくとよいでしょう。

設定の競合の回避

jInputはインポートする前のあなたの設定を極力保持しつつ追加する形で初期設定を行うため、あなたの設定や他のアセットと競合してエラーとなることはほとんどないはずです。しかし逆に、お行儀のよくない他のアセットを後でインポートしたりして、jInputに必要な設定が上書きで消されてしまった場合は、jInputが正常に動かなくなってしまいます。このような場合は、他の設定も保持するjInputを後からインポートすることで競合を回避できるかもしれません。
同様に、PC向けのスタンドアロンでビルドしたゲームにおいてプレイヤーがUnityの標準のInput設定を変更してしまうと、設定が食い違って正常に動かなくなる可能性にも注意してください。

Use

jInputをあなたのゲーム内で使用する際の、基本的な知識と設定について解説していきます。ここでは特にUnityを始めたばかりの方でも迷わないようにできるだけ詳しく手順を追っていきますが、行う内容は非常に簡単です。

  1. スクリプトの記述方法
  2. キー設定する項目を増減する
  3. 設定項目の見出しの変更
  4. プレイヤー人数の設定
  5. デフォルトキーの設定
  6. 同じキーの重複マッピング
  7. マッピングに使用しないキーの設定
  8. 除外するデバイスの設定
  9. UI上でのキーの役割の設定
  10. Escキーの既定の動作を使用するか
  11. マッピングウインドウの開閉の仕方の設定
  12. AxisのDeadZone,Gravity,Sensitivity
  13. どうしてもエラーが出る場合

スクリプトの記述方法

jInputを使った入力をゲーム内で使用するために記述すべきスクリプトは、Unity標準のInputの記述とほとんど変わりません。もしUnity標準のInputを使った経験があるならその知識でほぼそのまま利用できるでしょう。ここではとりあえず一人プレイゲーム(Player1)の場合のスクリプトを例に解説します。

通常ではInput.Get...と記述する場所を jInput.Get... と記述するだけです。また、プレイヤーがマッピングした項目は Mapper.InputArray[] 配列に格納されています。

var v = jInput.GetAxis(Mapper.InputArray[0]);

例として、これで配列の0番目にマッピングされた入力を得られます。キャラクターなどに操作を反映する例として、デモのDemoCubeオブジェクトを動かしているDemoCube.csを見ればわかりやすいでしょう。

Unity標準のInputでは、GetKey、GetKeyUp、GetKeyDownのboolではアナログスティックなどの反応をそのまま取得することはできませんが、jInputでは問題ありません。例えばGetKeyUpと記述した所にプレイヤーがアナログスティックをマッピングしたとしても、スティックがニュートラルに戻る際(Up)をそのままで取得できます。Key/Button/Axis といった挙動の違いを考慮せず同一のソースで全てのレスポンスを得られるので、あなたのスクリプト記述は最小限で済みます。

Unity標準のInputではAxisは対極がペアになっていて、例えばアナログスティックの対の上下を組で使って-1~1を得るといった挙動でしたが、jInputではニュートラルから上0~1、ニュートラルから下0~1と分離しています。これによりスティックの対極にまったく別のアクションを設定する事が容易になっています。もし通常と同じように対極を1組にして-1~1の数値を得なければならないような処理をしたい場合はDemoCube.csの移動のように記述すればよいです。

var vPositive = jInput.GetAxis(Mapper.InputArray[0]); //上方向
                            var vNegative = jInput.GetAxis(Mapper.InputArray[1]); //下方向
                            var v =  vPositive - vNegative; //vは-1~1

キー設定する項目を増減する

まずあなたのゲームにおいてキー設定する項目の数を決めます。デモの設定では、3Dオブジェクト版は上下左右移動の4つと動作3つの計7つのキー設定項目、UnityGUI版は上下左右移動の4つと動作3つとダミー3つ(スクロール動作確認のために欄を縦長にする水増し)の計10のキー設定項目になっています。HierarchyウインドウでjInputMappingSetをクリックし、Inspectorウインドウを見てください。jInputSettingsスクリプトの Menu Item Headings にある、Size でキー設定する項目の数を決めてください。項目はElement 0~30の計31個まで作ることができます。

数を入力したら、Hierarchyウインドウで jInputMappingSet/MainWindow/InMapperMenuItems を展開してみてください。この中に先ほど設定した数と同数のオブジェクトが連番で作成されています。

ここでのMapperMenuItem00がMapper.InputArray[0]、MapperMenuItem01がMapper.InputArray[1]...というふうに対応します。

3Dオブジェクト版の場合

各MapperMenuItemXXのtransform.position.yを変えて画面上の位置を上から番号順に配置してください。等間隔にきちんと並べたりといったデザインは後述するので、とりあえず最初は大まかな配置で大丈夫です。この際、オブジェクトのtransform.position.zを変えて他のパーツとの奥行き関係が変わってしまうと、画面に映らなくなったりクリックできなくなるなどの問題が起こるので注意しましょう。画面に収まり切らないなら jInputMappingSet/jInputCamera の size と transform を調節します。

UnityGUI版の場合

キー設定する項目を増減した際に自動的にUIでの上下左右の移動の繋がり(ButtonコンポーネントのNavigation)を作ります。これはデフォルトのUIの配置で使用するには何も設定を加える必要がないので便利です。もしあなたがUIの配置を大きく変えて独自のUIでの上下左右の移動の繋がりを作った場合には、あとあとになってからキー設定する項目の数を増減するとこのUIの上下左右移動の繋がりが自動生成され標準に戻ってしまうことに注意してください。

また、UnityGUI版はスクロールバーが付いています。HierarchyウインドウでjInputMappingSet/MainWindowを選択し、Inspectorウインドウを見てください。UGUIMeniVerticalScrollスクリプトの部分でこのスクロールバーの設定ができます。

Use VerticalScrollのチェックを外すとスクロールバーを使用しない状態になります。
ScrollInto Ratioはキーでの上下移動でカーソル位置にスクロールが追いつくスピード、ScrollInto Inertiaはその際の慣性力です。よくわからない場合は一度極端に値を変更してからシーンをPlayして試しにキーでの移動で上下端にスクロールしてみると分かりやすでしょう。

キー設定する項目を増やした場合、付随する他の設定を行っていないためまだシーンをPlayすることはできないので、jInputの設定を先に進めて下さい。

スクリプトで使用しているMapper.InputArray[]の要素数と同数かそれ以上の数の項目を作っておかないとシーンのPlay時にエラーとなる事に注意してください。例えば、デモではDemoCube.csにてMapper.InputArray[0]...Mapper.InputArray[6]を使用しているため、DemoCube.csをそのままでキー設定する項目の数を7つ未満にするとエラーとなります。その場合はこのようなエラーが出ます。

設定項目の見出しの変更

jInputのマッピングウインドウの各項目の左に、デモだと UpMove,DownMove,...Particle と見出し文字があります。これをあなたのゲームの操作に合った見出しにします。

HierarchyウインドウでjInputMappingSetをクリックし、Inspectorウインドウを見てください。jInputSettingsスクリプトの Menu Item Headings の各Elementに適切な見出しを記入します。

プレイヤー人数の設定

あなたのゲームを同じ場所でプレイできる最大人数を設定する必要があります。これはインターネットなどの通信を介すのではなく、例えば友達の部屋に集まって一台のゲーム機に複数のゲームパッドを接続してプレイするような場合に、一つのゲーム機に接続する最大数ということです。これにより同一のプログラムに接続している複数人のプレイヤーが各々のキーコンフィグ設定をすることができます。

HierarchyウインドウでjInputMappingSetをクリックし、Inspectorウインドウを見てください。jInputSettingsスクリプトの Max Players in Same Place の項目で1~4人の最大人数を選びます。4人はUnityの仕様での上限です。

2~4人にすると、マッピングウインドウのシーンでプレイヤーを選ぶウインドウが出るようになります。

2~4人目のスクリプトの記述方法に関しては、それぞれ
Mapper.InputArray2p[]
Mapper.InputArray3p[]
Mapper.InputArray4p[]
配列に格納されています。あとは1人の時(Player1)の記述と変わりません。

var jump = jInput.GetKeyDown(Mapper.InputArray2p[5]);

例として、これでPlayer2の配列の6番目にマッピングされた入力を得られます。

[補足] 最大人数が2~4人の場合、各プレイヤーのキーコンフィグに入ると最初に入力を感知したもの以外のゲームパッドは設定できないようになります。これはあるプレイヤーがキーコンフィグ中に他のプレイヤーがゲームパッドをいじっても反応しないようにする為です。具体的には、AさんBさんが集まってゲームをしているとすると、BさんがPlayer2のキーコンフィグをしている最中にAさんのゲームパッドを触ってもAさんのボタンがマッピングされることはありません。
もし、やはりAさんの持っているゲームパッドをPlayer2にしたいとなった場合は一度プレイヤー選択ウインドウに戻り、今度はAさんがPlayer2を選んでキーコンフィグを始めれば、今度はそのコンフィグ中にBさんのゲームパッドを触っても反応しない状態になります。
キーボード、マウスなどからの入力は、どのプレイヤーの時でも自由に設定することができます。

マッピングウインドウにおいて、現在設定中のプレイヤーと別のプレイヤーのマッピングが干渉している場合(別のパッドが設定に混じっている、もしくは他のプレイヤーと同じキーを設定している場合)には、その項目の左上に注意マークが出ます。

プレイヤーに設定の修正を促すためのものですが、あえてそのままにして1つのキーで2キャラを一斉に動かしたり、逆に1キャラの操作を2人のプレイヤーで分担するような変則的な設定も可能です。

デフォルトキーの設定

プレイヤーがキーコンフィグをまだしていない状態の、ゲームに最初から割り当たっているデフォルトのキーを設定しておかねばなりません。HierarchyウインドウでjInputMappingSetをクリックし、Inspectorウインドウを見てください。jInputSettingsスクリプトの Default Input Mapping の各項目に、デモでデフォルトになっていたキーが設定されています。

この各項目に、デフォルト設定とするキーの名前を入力します。あるいはその右にあるドロップダウンリストの中から選択すれば自動で入力されます。キーの設定名は以下の規則に沿っています。

KeyCodeのあるkeyやbuttonは、KeyCodeをそのまま記入
例 :  'A'  'Space'  'Mouse0'  'Joystick1Button0'

JoystickのAxisは、以下の規則的な名前を記入
'Joystick1Axis1' ... 'Joystick1Axis20' ... 'Joystick4Axis20' の
末尾に '+'か'-'
例 :  Joystick1Axis1+

マウスホイールは、'MouseWheel' の末尾に '+'か'-'
例 :  MouseWheel-

末尾の+-が必要なものに気を付けてください。大文字小文字の違いは自動で補正されるので気にする必要はありません。入力したキー設定名が誤っている場合はドロップダウンリストが空白状態なのですぐわかります。
'Joystick'の直後の数字は1~4、'Button'の直後の数字は0~19、'Axis'の直後の数字は1~20です。(少々判りづらいですがUnity標準の表記に準拠しています。)

KeyCodeに関してはここに一覧があります。ただし、JoystickButtonXXという記述は使用せず、Joystick1ButtonXX...Joystick4ButtonXXを使用します。これはJoystickButtonXXという記述だと接続されているどのGamePadでも同じボタンに反応してしまうため、多人数プレイのゲームなどで混乱を招くからです。そのためjInputではマッピングから除外しています。どのGamePadか番号が振られているJoystick1ButtonXX...Joystick4ButtonXXの記述を使ってください。

末尾に+-が付くものは、Unity標準のInputで相反する方向が同名の一組になっているものを、jInputでは別個に扱えるようにしたための方向の区別です。例えば、Unity標準のInputでは方向キーの左右が-1~1と一組で取得されてしまいますが、jInputでは右が'Joystick1Axis1+'の0~1、左が'Joystick1Axis1-'の0~1と分離しています。これにより対極の方向にまったく別のアクションを設定する事が容易になっています。

ドロップダウンリスト内から目的のキーの設定名を見つけるのが大変な場合、リストを開いた状態で頭文字をキーボードで押すたびに順にその頭文字のキー名がフォーカスされます。

あるいは、ゲームのユーザーがマッピングするのと同じように実際にキーを入力してデフォルトキーを設定することもできます。設定したいプレイヤーの項目の一番下にあるDefaultKeySetModeボタンを押すと、ボタンの表示に[ON]が付き、シーンがPlayされそのモードに入ります。

シーン内でデフォルトキーに設定したいキーを実際に押して割り当ててください。何かしらキーを設定すると先ほどのボタンに更に*マークがつきます。

設定し終えたらもう一度ボタンを押せば、変更したデフォルトキーが反映されます。設定開始前のデフォルトキーに戻したい場合はこのボタンでなくUnityの上部にある通常のシーンPlayボタンを押してPlayを止めてください。この場合はシーン内で行った設定は適用されずに以前のデフォルトキーのままになります。

ここまでの設定をし終えたら、一度シーンをPlayしてみてください。シーン開始時にデフォルトキーをチェックし、設定名が間違っていればエラーを返します。Player1には未設定のデフォルトキー項目があっても同様のエラーとなります。

エラーが出た場合、シーンのPlayが停止されInspectorウインドウで該当部分の折り畳みが開き、Default Input Mappingの欄の一番下にも誤った設定の部分を示唆するエラーログが出ます。

修正したらもう一度シーンをPlayしてエラーが出なくなったか確認します。シーンが一度Playされることで正常なデフォルトキーが保存され、jInputが正しく働きます。
エラーが出ずに正常にシーンをPlay出来たなら、一度そのシーンを保存しましょう。(UnityのメニューのSave Scene)この時にここまで入力したInspectorウインドウの値も保存されます。

[補足] 頭にJoystick...と付くAxisやButtonは、プレイヤーの接続しているデバイスの種類や接続数によって番号部分がまちまちになるため、あなたとプレイヤーが同じキー設定名で動作するとは限りません。これはUnityやOSの仕様です。据え置き機等なら各プラットフォームで入力が統一されているので問題ありませんが、PC等ではプレイヤーの入力デバイスの種類や入力環境が多岐になるので、あなたがデフォルトキーにしたボタンがプレイヤーのGamePadには存在しなかったり、上下方向の取得値が逆だったりといったことが有り得ます。キーボードやマウスのKeyCodeはどんなものでも共通なので、PC用ゲームではデフォルトキーは共通性の広いKeyCodeを指定しておいて、GamePadなどはプレイヤー各自でマッピングしてもらうようにしたほうがよいでしょう。どうしてもゲームパッドをデフォルトキーに設定するのであれば、Player1はJoystick1...、Player2はJoystick2...としておくのが無難です。

[補足2] Inspectorウインドウ上でのデフォルトキー設定はドラッグして並べ替えることができます。デフォルトキーを設定した後にボタンの配置を変えたくなった場合、一つ一つ再設定しなくても並び替えることができます。

[補足3] あなたが製作中にキー設定する項目の数やプレイヤー数を変更したりして、セーブデータの項目の数が実際の数と違っている場合、シーンをPlayした際にセーブデータはデフォルトのキー設定で新たに作り直されます。これはもしゲーム中に何かの要因でセーブデータと実際の要素の数が食い違うようなことが起こった場合に、正常なデータに初期化するためでもあります。

[補足4] セーブデータが破損していたり値がおかしかったりして正常にロードできなかった場合、jInputはセーブデータファイルを削除します。その後、UnityEditor上ならばPlayを停止し、その他のプラットフォームであればjInputのマッピングウインドウがシーンにあるならばjInputを起動しなおして、キー設定はデフォルトのキーに戻ります。要するにjInputのリセットをかけます。

このため、Buildしたゲームでデフォルトのキー設定名自体が間違っていると、エラーで再作成されたデフォルトキーのセーブデータもエラーとなりループし、正常に動きません。デフォルトのキー設定名が正しい事の確認に、設定後は一度シーンをplayしてみてエラーが出ないか試すのを忘れないようにしてください。
また、このロードが正常に行えなかったエラーが起こった際はMapper.cs内のLoadfailureDeal()メソッドを実行するので、プレイヤーへの注意表示などロードエラー時にゲーム内に何かを反映したい場合はこのメソッドを利用して行ってください。

同じキーの重複マッピング

jInputではデフォルトでは別々の項目に同じキーを割り振れるようになっています。これによってプレイヤーが自由に同時押しのような設定をすることができます。ただしプレイヤーが意図せず同じキーを使ってしまった場合には挙動がおかしくなってしまうので、マッピングしたキーの名称に色が付いて示唆するようになっています。また、そもそも同じキーを重複して割り当てられないようにすることもできます。

3Dオブジェクト版の場合

HierarchyウインドウでjInputMappingSetを選択し、Inspectorウインドウを見てください。jInputSettingsスクリプトの Preclude Same Mapping の項目にチェックを入れると、ユーザーが別々の項目に同じキーを割り当てられなくなります。

すでに使用されているキーを別の項目でもマッピングしようとすると、設定されていたキーが入れ替わり1つのキーは常に1つの項目にしかマッピングされないようになります(一般的な重複不可のマッピングによくある挙動です)。
この項目にチェックを入れている場合、デフォルトキーの設定も別々の項目でキーが重複しているとエラーとなる事に注意してください。

上記のチェックを入れず、重複したキーのマッピングを可能とする場合には示唆する色を変更することができますが、UnityGUI版と違い一括で設定する項目はないのでとりあえず読み進めてかまいません。後述するDesignの章で詳しく説明します。

UnityGUI版の場合

HierarchyウインドウでjInputMappingSetを選択し、Inspectorウインドウを見ます。jInputSettingsスクリプトの Deal with Same Key の項目でこれらを変更することができます。

Preclude Same Mapping の項目にチェックを入れると、ユーザーが別々の項目に同じキーを割り当てられなくなります。

すでに使用されているキーを別の項目でもマッピングしようとすると、設定されていたキーが入れ替わり1つのキーは常に1つの項目にしかマッピングされないようになります(一般的な重複不可のマッピングによくある挙動です)。
この項目にチェックを入れている場合、デフォルトキーの設定も別々の項目でキーが重複しているとエラーとなる事に注意してください。

上記のチェックを入れず、重複したキーのマッピングを可能とする場合には示唆する色を変更することができます。Same KeyName Color で色を設定すれば、重複したキーの名称のふちにその色が付きます。

マッピングに使用しないキーの設定

プレイヤーがマッピングに使用できないキーを設定できます。例えばあなたがReturnキーに特殊な動作を固定で設定したい場合、このキーにユーザーが別の動作をマッピングしてしまうとReturnに2つの挙動が重なってしまいおかしなことになってしまいます。こういった場合はReturnをマッピングに使用できないようにします。HierarchyウインドウでjInputMappingSetをクリックし、Inspectorウインドウを見てください。

jInputSettingsスクリプトの Unusable Mapping でマッピングに使用させないキーの数とキー設定名を入力します。キー設定名に関しては上述のデフォルトキーの設定と同じですのでそちらを参照してください。

除外するデバイスの設定

各プレイヤーでキーボードもしくはゲームパッドをマッピングできないようにすることができます。HierarchyウインドウでjInputMappingSetを選択し、Inspectorウインドウを見てください。jInputSettingsスクリプトの Exclude Device の項目で各プレイヤーで除外するデバイスを選択することができます。

例えばキーボードだけでプレイしてほしいゲームの場合にゲームパッドを除外することができます。この場合はもちろんデフォルトのキー設定からもゲームパッドのキーは外しておいてください。
あるいは一人用のゲームで、1Pをゲームパッドのみ、2Pをキーボードのみとすれば、ゲームパッドとキーボードのマッピングを別々にそれぞれ持つようにすることができます。この場合は加えてシーン上のPlayer1などの文字を少し修正する必要があるでしょう。

マウスは常に除外できません。これは万が一操作不能に陥った場合にプレイヤーがマウスやタッチ操作でマッピング画面に戻ってこられるようにするためです。

UIでのキーの役割の設定

あなたが作ったキー項目の、UIでの作用をシステムに伝える必要があります。Unity標準のUnityGUIのシステムで言えば Standalone Input Module でVertical AxisやCancel Buttonといったキーの役割を設定する必要がありますが、それと同じ事です。
HierarchyウインドウでjInputMappingSetを選択し、Inspectorウインドウを見てください。jInputSettingsスクリプトの UI Operation Settings 内の各ドロップダウンリストでそれぞれの動作に割り当てるキー項目を設定します。

ここで設定した項目のキーが、jInput内あるいはあなたのゲームのUnityGUI内では指定した役割になります。重複して役割を設定できるので、例えばCancel動作の項目をいくつか作るような事もできます。

UpMove/DownMove/RightMove/LeftMoveはマッピングウインドウ内とUnityGUIでの上下左右移動です。
UGUISubmitはUnityGUIでのSubmitの動作、UGUICancelはUnityGUIでのCancelの動作をします。

ExcludeDecisionFuncはマッピングウインドウ内での決定動作から除外します。決定動作というのは、例えば入力設定されていない適当なキーボードのキーをマッピングウインドウのどこかの欄で押すと、まだ設定していないキーなのに反応してマッピング入力待ち状態になります。これが決定動作しているということです。jInputのマッピングウインドウ内では操作の簡略化や確実性のためほとんどのキーが決定動作しています。(マッピングウインドウ内限定でほぼ全てのキーがSubmit動作しているようなものです。)しかしもし全てのキーが決定動作してしまうと、方向キーやキャンセルキーとして動作しているキーまで決定動作してしまい操作がおかしくなってしまいます。例えば方向キーが決定動作もしてしまうと、移動と同時に決定してしまうためその方向キーではカーソルを正常に動かすことができません。このため特定の動作のキーはjInputのマッピングウインドウ内で決定動作させないようにすることが必要です。
UI Operation Settings内で各方向とUGUICancelに割り当てられた項目は自動でExcludeDecisionFuncに設定されます。これらは前述の理由で決定動作すると挙動がおかしくなるからです。それ以外にもあなたのゲーム内でのキーの動作によって、jInput内で決定動作させたくない項目があれば選択してください。

さらに、あなたのゲームでUnityGUIを使用している場合はそちらのUnity標準の StandaloneInputModule への設定が必要です。先ほど設定したjInputからのUnityGUIへの命令と通常のUnityのInputからのUnityGUIの命令が2つ同時に存在すると、UnityGUI上の操作が2重に行われおかしな挙動になるからです。

あなたのゲームで使用しているStandaloneInputModuleをInspectorウインドウで見てください。各欄を以下のように設定します。
- Horizontal Axis: jInputHorizontal
- Vertical Axis: jInputVertical
- Submit Button: jInputSubmit
- Cancel Button: jInputCancel
これであなたのゲーム内の他のUnityGUIもjInputを通して操作することができます。

Escキーの既定の動作を使用するか

Escapeキーは恒久的にマッピングできないようになっています。しかしデモでのEscキーはマッピングウインドウの開閉やキャンセルキー的な役割も持っています。例えばマッピングウインドウ上で何かの入力を待っている状態の時にEscキーを押すとその状態がキャンセルされ通常状態に戻ります。このようなマッピングウインドウ上でのEscキーの挙動をあなたのゲームでも使うか、あるいはjInputでは一切機能しないキーにするかを選択できます。

HierarchyウインドウでjInputMappingSetをクリックし、Inspectorウインドウを見てください。jInputSettingsスクリプトの Use Esc Definited Behavior の項目にチェックを入れると、Escキーをマッピングウインドウ上ではキャンセル的な挙動をする固定役割のキーとして使用する事ができます。チェックを外すとjInput上では何の動作も持たないキーとすることができます。

Escキーはゲームを終了するためのメニューを開くなどですでに使っているといった場合も多いと思います。jInputは最初からEscキーをマッピングできないようになっているのでゲームのプレイヤーのマッピングと競合することはありません。またこのチェックを外しておけばマッピングウインドウ上の動作とも競合することはありません。

マッピングウインドウの開閉の仕方の設定

デモではEscキーでマッピングウインドウのOn/Offになっていますが、実際の場合はゲームメニューから開くなど別の方法でマッピングウインドウを呼び出す事が多いと思います。あなたのゲームでのマッピングウインドウの呼び出し方を決め、ゲームシーンからマッピングに入れるようにしましょう。マッピングウインドウの開閉の方法には、あなたのゲームの構築の仕方によっていくつかの方法が考えられます。

1).他のものと同一のシーンにjInputMappingSetを混在させて、
    SetActive(true/false)を切り替える方法
2).単独個別のシーンにjInputMappingSetを配置して、
    SceneManager.LoadScene() でシーン自体を切り替える方法
3).単独個別のシーンにjInputMappingSetを配置して、
    SceneManager.LoadScene() の LoadSceneMode.Additive で
    既存のシーンに追加してマッピングウインドウを読み込む方法

デモでは1)の方法で開閉を行っています。これは行っている事が最も判りやすい方法なので、特にこだわりがなければこの方法でよいでしょう。HierarchyウインドウでjInputMappingSetをクリックし、Inspectorウインドウを見てください。jInputSettingsスクリプトの jInput Open/Close Settings の項目でウインドウ開閉のための設定を行います。

1)の方法の場合

SetActive to Open のチェックを入れてください。これでSetActive(true/false)を切り替えて開閉するということになります。
まずキーコンフィグするシーンにjInputMappingSetオブジェクトを置きます。この場合、シーン開始時にjInputMappingSetは動作準備をしたあと自動でSetActive(false)の状態になるので、手動で非アクティブにはしないでおいてください。

マッピングウインドウを開く際はスクリプトから以下を実行することで適切な処理でウインドウを開くことができます。

Mapper.MappingWindowOpen();

マッピングウインドウを閉じる際は、シーンのUIのClose(Exit)ボタンが押されると閉じられます。

ウインドウを閉じる際に、InspectorウインドウのClosingEventの欄に登録したメソッドも同時に実行されるので、例えば閉じるサウンドを鳴らすなどに利用できます。

2)の方法の場合

SetActive to Open のチェックを外しておきます。2)の方法ではシーン丸ごとを切り替えるため、マッピングウインドウが開閉される際にSetActive(true/false)を行う必要がないからです。
まず新たなシーンを作り、そこにjInputMappingSetオブジェクトを置きます。あなたのゲームのシーンからこのシーンに切り替えることでマッピングウインドウが開いたことになり、更にここから別のシーンに替わることで閉じたことになります。マッピングウインドウはシーン丸ごと現れシーン丸ごと消える事になります。

マッピングウインドウを開く際は、先ほどのjInputMappingSetオブジェクトだけを置いたシーンにSceneManager.LoadScene()で移動するだけです。

マッピングウインドウを閉じる際は、InspectorウインドウのClosingEventの欄に別のシーンへ移動するメソッドを登録します。シーンのUIのClose(Exit)ボタンが押された際に、適切な処理の後ClosingEventが実行され、別のシーンに移動する事になります。

3)の方法の場合

SetActive to Open のチェックを外しておきます。3)の方法の場合もマッピングウインドウが開閉される際にSetActive(true/false)を行う必要がないからです。
まず新たなシーンを作り、そこにjInputMappingSetオブジェクトを置きます。このシーンをあなたのゲームのシーンに追加で読み込むことでマッピングウインドウが開いたことになり、マッピングウインドウのシーンだけをSceneManager.UnloadScene()することで閉じたことになります。追加シーンだけを破棄する事で既存のシーンをそのまま続行する事ができます。

マッピングウインドウを開く際は、先ほどのjInputMappingSetオブジェクトだけを置いたシーンをSceneManager.LoadScene() の LoadSceneMode.Additive で既存のシーンに追加で読み込むだけです。

マッピングウインドウを閉じる際は、InspectorウインドウのClosingEventの欄にSceneManager.UnloadScene()するメソッドを登録します。シーンのUIのClose(Exit)ボタンが押された際に、適切な処理の後ClosingEventが実行されマッピングウインドウは破棄される事になります。

全ての方法共通として、スクリプトから以下を実行することでもClose(Exit)ボタンが押されたのと同様にマッピングウインドウを閉じることができます。

Mapper.MappingWindowClose();

ただしウインドウを閉じるには不適切なタイミングの場合はキャンセル的な動作をします。例えばセーブするか確認するウインドウが出ているときに実行されても確認ウインドウが閉じるだけで、マッピングウインドウ全体は閉じられません。

AxisのDeadZone,Gravity,Sensitivity

Axis入力に対してDeadZone,Gravity,Sensitivityを設定することができます。HierarchyウインドウでjInputMappingSetを選択し、Inspectorウインドウを見ます。jInputSettingsスクリプトの Axes Advance Settings 内の各スライダで値を設定します。

ここでの値が全てのAxisに一括で設定されます。通常、UnityはシーンをPlay中にInspectorウインドウから値を変更してもPlay停止後は以前の値に戻りますが、ここでの値はPlay中に変更した値のままPlay停止後も維持されます。シーンをPlayしながらの値の調整が容易なので、あなたのゲームのプレイヤーキャラを実際に動かしながら適切な値に調整するといいでしょう。

どうしてもエラーが出る場合

ここまでの設定をしてきて、説明と同じようにしたつもりなのになぜかエラーが出るといった場合は、一度マッピングのセーブデータを削除してから再びシーンをPlayし直してみてください。特にスクリプトに独自の変更を加えた場合などに、それまでのセーブデータと現在のプログラムの挙動が食い違ってエラーになっている可能性があります。UnityEditor上でのセーブデータは、初期設定ではプロジェクトのフォルダ以下/SaveDataフォルダの中に作成されます。

Design

ここではjInputのマッピングウインドウをあなたのゲームに合ったデザインに変更する方法を説明していきます。

  1. デザインの変更方法
  2. デザインの適用の手順
  3. 位置や大きさの変更
  4. InMapperMenuItemsのデザイン
  5. InMapperOperateItemsのデザイン
  6. ConfirmWindow & ExitWindow
  7. PlayerNumWindowのデザイン
  8. その他の物のデザイン

デザインの変更方法

ほとんどのパーツはInspectorウインドウでデザインを変更することができるようになっています。Unity標準のコンポーネント以外にも、スクリプトで追加されているデザイン項目もあります。デザインの項目はそのパーツにより異なります。

同じ種類のオブジェクトを一斉にデザインしたい場合、例えばマッピング入力欄であるMapperMenuItemXX全部を一斉に同じデザインに変更したいといった場合には、複数選択してください。同種のオブジェクトであれば、選択されている全てを一度にデザインすることができます。

あるいはprefabに変更を適用し、prefabと同じ状態にすることでも一斉に同じデザインにすることができます。各prefabはProjectウインドウのjInputMapping/Components/Prefabの中に3Dオブジェクト版とUnityGUI版に分けられて入っています。

デザインの適用の手順

Inspectorウインドウの項目からデザイン変更を行えるパーツでは、できるだけシーンをPlayせずとも変更が適用され実際の見た目を確認することができるようになっていますが、状態によって色が変わるようなパーツは実際にシーンをPlayして確認してください。逆に、シーンPlay中に変更したデザインは、Unityの仕様によりシーンPlayを停止すると以前の状態に戻ることに注意してください。

位置や大きさの変更

3Dオブジェクト版

各パーツの位置や大きさを変えたい場合は、通常のGameObjectと同じようにTransform項目やSceneウインドウでの操作で変更することができます。ただし、パーツのtransform.position.zを変えて他のパーツとの奥行き関係が変わると、画面に映らなくなってしまったりクリックできなくなるなどの問題が起こるので、パーツのtransform.position.zはむやみに動かさないほうがいいでしょう。同様の理由でパーツに奥行きがつくtransform.rotation.xとtransform.rotation.yにも注意してください。

各パーツはある程度自由に位置調整ができるよう、自動で整列するようにはなっていませんが、キー設定項目(jInputMappingSet/MainWindow/InMapperMenuItemsの中にあるMapperMenuItemXXの一群)は等間隔に並び直させる事ができるようになっています。Hierarchyウインドウで jInputMappingSet/MainWindow/InMapperMenuItemsをクリックし、Inspectorウインドウを見てください。

ここでInterval(間隔)の数値を入力してAlignボタンを押すと、各キー設定項目が縦に等間隔に並び直されます。位置基準はMapperMenuItem00です。

横方向に関しては、整列した場合のX軸は全て同じ座標なので、Unity標準のTransformコンポーネントで整列させることができます。MapperMenuItemXXを複数選択してtransform.position.xを入力します。

その横にある見出しの位置は、相対位置を一括で調整することができます。

Hierarchyウインドウで jInputMappingSet/MainWindow/InMapperMenuItems をクリックし、InspectorウインドウでHeading Relative Posiのx,y座標を変更してください。座標は属する設定欄からの相対位置です。

[補足] キー設定項目を2列にしたりといった極端に配置が変わる位置変更だと、スクリプトとの兼ね合いが変わって直感的な操作と食い違ってしまう場合があります。例えばキー設定項目を2列にした場合は左右移動キーで1列目>2列目>セーブボタンの列、と選択が3段移動するようにようにしたほうがよいでしょうし、あるいはセーブボタンの位置を画面左に入れ替えたらそれに応じた修正が必要になってきます。
大きくUIの配置を変えたい場合はUnityGUI版のjInputを使い、Unity標準のUnityGUIでUIの制御をするほうが楽です。3Dオブジェクト版はUIの制御を全てjInputのスクリプトが行っているため、こういった変更をするためにはスクリプトを読んで書き換える必要があります。

UnityGUI版

各パーツの位置や大きさは、UnityGUIのコンポーネントで制御されています。そのため、標準のUnityGUIの知識で位置や大きさを変更することができるでしょう。
ただしSelectionオブジェクトは、選択されたButtonの位置に移動するようにUGUISelectionController.csによってtransform.position.xがスクリプトから制御されています。

InMapperMenuItemsのデザイン

InMapperMenuItemsはマッピング入力欄と見出し文字を構成しています。HierarchyウインドウのjInputMappingSet/MainWindow/InMapperMenuItemsにあります。

3Dオブジェクト版

HierarchyウインドウでInMapperMenuItemsの中にあるMapperMenuItemXXのどれかをクリックし、Inspectorウインドウを見てください。

ここでフォントデザインを変更できます。また、文字の色と入力欄の枠の色を設定できます。見出しのテキスト内容は、前述の通りjInputMappingSetのInspectorウインドウで設定できます。

UnityGUI版

InMapperMenuItemsオブジェクトのVerticalLayoutGroupコンポーネントによって入れ子の各マッピング項目(MapperMenuItemXX)が整列しています。更にMapperMenuItemXXの中には各々が見出し、ボタン、アラートマークを持っています。デザインを変更したいオブジェクトをクリックしてInspectorウインドウを見れば、標準のUnityGUIの仕様に従ってほとんどのデザインの変更を行うことができます。

見出し(InMapperMenuItems/MapperMenuItemXX/HeadingText)のテキスト内容に限り、前述の通りjInputMappingSetのInspectorウインドウで設定してください。ここでテキスト内容を変えてもjInputMappingSetで設定した見出しが優先され書き直されてしまいます。

InMapperOperateItemsのデザイン

InMapperOperateItemsはシステム的なボタン部分を構成しています。HierarchyウインドウのjInputMappingSet/MainWindow/InMapperOperateItemsにあります。

3Dオブジェクト版

HierarchyウインドウでInMapperOperateItemsの中にあるMapperOperateItemXXのどれかをクリックし、Inspectorウインドウを見てください。

ここでボタンの表示文字とフォントデザインを変更できます。また、文字の色とボタンの枠の色を設定できます。

UnityGUI版

InMapperOperateItemsの中にある各MapperOperateItemXXは、UnityGUIの通常のButtonオブジェクトと同じ構造です。デザインも通常のUnityGUIの方法に従って行うことができます。

ConfirmWindow & ExitWindow

ConfirmWindow と ExitWindow はマッピングウインドウを閉じる際のセーブの確認ダイアログを構成しています。

3Dオブジェクト版

HierarchyウインドウでConfirmWindowかExitWindowの中にあるButton系のどれかをクリックし、Inspectorウインドウを見てください。

ここでボタンの表示文字とフォントデザインを変更できます。また、文字の色を設定できます。

UnityGUI版

ConfirmWindowとExitWindowの中にある各ボタンとウインドウ枠は、UnityGUIの通常のButtonやImageオブジェクトと同じ構造です。デザインも通常のUnityGUIの方法に従って行うことができます。

PlayerNumWindowのデザイン

PlayerNumWindowはプレイヤー選択ウインドウを構成しています。

3Dオブジェクト版

HierarchyウインドウでPlayerNumWindowをクリックし、Inspectorウインドウを見てください。

ここで各プレイヤー表示の数字部分の色を設定できます。ここでのテキストの構造は少し入り組んでいるためPrefabから生成するようになっています。フォントデザインを変更したい場合はNum Prefab の項目にアサインされているPrefabの中にあるテキスとオブジェクトをUnityの通常の方法でデザインしてください。
CloseButtonは今までと同じ手法でデザインすることができます。

UnityGUI版

PlayerMappingNumsオブジェクト(PlayerNumWindow/PlayerMappingNums)のHorizontal Layout Groupコンポーネントによって、さらにその中に入れ子になっている各プレイヤー選択ボタン(PlayerXMappingNum)が整列しています。

jInputMappingSetオブジェクトでプレイヤー最大人数(Max Players in Same Placeの値)が変更された際に、必要なPlayerXMappingNumだけが表示されるように各表示非表示が切り替えられ、先のHorizontal Layout GroupコンポーネントのSpacingの値が見栄えの良い値に設定されます。そして自動的にUIでの上下左右の移動の繋がり(ButtonコンポーネントのNavigation)を作ります。

これらはPlayerNumWindowをデフォルトのUIの配置で使う場合には便利ですが、もしあなたがPlayerXMappingNumの配置を独自に変更した後にプレイヤー最大人数を変えた場合、これによって配置がずれる可能性があることに注意してください。この説明サイトの手順通り、まずプレイヤー最大人数を決めてからUIの配置をすれば気にする必要はありません。

各PlayerXMappingNumは、Buttonオブジェクトの中に"Player"と"Number"の2つのTextオブジェクトが入った構造です。PlayerXMappingNumのButtonコンポーネントで設定したカラーは数字のTextオブジェクトに適用されるようになっています。

Closeボタンとウインドウ枠は、UnityGUIの通常のButtonやImageオブジェクトと同じ構造です。デザインも通常のUnityGUIの方法に従って行うことができます。

その他の物のデザイン

その他の物はスクリプトから色を変えたりしていない普通のオブジェクトなのでUnity準拠の方法でデザインを変えてください。
また、ここまで挙げてきたパーツもテクスチャの変更などはUnity準拠の方法です。

Detail

ここでは踏み込んだ注意点についてまとめます。

  1. 打ち消しあう動作の注意
  2. セーブデータについて
  3. 操作できなくなる可能性の回避

打ち消しあう動作の注意

jInputは1つのボタンを違う動作に重複して自由に割り振れるため、プレイヤーが1つのボタンに同時押しを設定することなどが簡単にできる反面、ゲーム製作時に注意しておかなければならない点があります。例えばプレイヤーが決定キーとキャンセルキーなど相反する動作を一つのキーに設定した場合、正常な動作が不能になりキー設定を修正しに設定画面に戻ってくる操作ができずにハマるといったことが起こり得ます。こういった場合は、同時入力時の処理をスクリプトに記述しておくとプレイヤーが誤った割り振りをしてしまった際の救済措置になるでしょう。

if (jInput.GetKey(Mapper.InputArray[6]) && jInput.GetKey(Mapper.InputArray[7])) { //2つが同時にオンになった場合
    jInput.GetKey(Mapper.InputArray[7]) = false; //Mapper.InputArray[6]だけにする
}

これ以外にも、タイトル画面からjInputでの設定画面を開くまでの操作をマウスやタッチだけでも行えるようする事で、プレイヤーが設定を修正しに戻ってこられるように配慮しておくのが有効です。

セーブデータについて

セーブデータはstandalone環境(Unityエディタ内含む)においては暗号化バイナリファイルで書き出されます。これはレジストリを使わないようにするためです。また、PCゲームの場合はプレイヤーが別途複数のデータを保持しておける利点があります。ゲームの実行データがあるディレクトリにSaveDataというフォルダが作られ、その中にInputMapping.datというファイルで生成されます。

SaveLoadScript.cs を書き換えれば、セーブデータを書き出す階層やdatファイル名、Rijndael暗号鍵を変えることができます。

standalone環境以外ではPlayerPrefsを使用してセーブデータを保存しているので、Unityの仕様に従ってください。

操作できなくなる可能性の回避

プレイヤーがキー設定をセーブしたあと、GamePadを別の種類に繋ぎ変えたり故障してキーボード操作に変えた等した場合、キーを設定しなおそうにも以前の設定のキーが今の入力デバイスには無く設定画面を開くまでの操作ができずにハマる可能性があるかもしれません。具体的な例としてボタンが10あるゲームパッドが壊れて4つしかボタンのないような古いタイプのゲームパッドに変えたとして、ゲームのオプションメニューを開く動作を以前のゲームパッドの10番目のボタンにマッピングしていたとすると、10番目のボタンは今のゲームパッドに物理的に存在していないので押す事ができません。オプションメニューを開くことができないのでキーマッピングを設定する画面にたどり着けず手詰まりになってしまいます。これは各プラットフォームで入力が統一されている据え置き機等なら起こらないでしょう。また、タッチ操作が必須になるモバイル系の環境でもタッチ操作でオプションメニューを開ければ問題ありません。これは、入力デバイスの種類やプレイヤーの入力環境が多岐になるPC等で、且つマウスやタッチでの操作を行えないゲームで考えられる事態です。

単純な対応策としては、説明書やReadMeにデフォルトキーへの戻し方を書いておく事です。上のトピックで述べたセーブデータを消せば、次のゲーム起動時にキー設定はデフォルトに戻ります。環境が変わって操作ができなくなった場合はセーブデータを消してデフォルトのキー設定に戻してから、再度キー設定してもらうように書いておきます。デフォルトキーは共通性の広いキーボードのキーにしておけばプレイヤーが動かせなくなるということはないでしょう。もちろん、タイトル画面からマッピングウインドウを開くまでの操作をマウスやタッチ操作だけでも行えるように配慮しておくというのも有効です。

Support

サポートについてです。

  1. ご質問、ご要望
  2. 新しいバージョンのリリース

ご質問、ご要望

ご質問、ご要望などがありましたらこちらのサポートフォーラムに気軽に書き込んでください。

新しいバージョンのリリース

新しいバージョンが出た場合もサポートフォーラムに変更点などが書き込まれますので定期的に覗いてみてください。簡単な履歴としてはこちらのページのリリースノートをチェックしても良いでしょう。

新しいバージョンが出ていた場合はアセットストアから入手してください。

© 2014-2016  Myouji