uGUIのUIをキーボードやゲームパッドで操作制御する方法について調べました。
Unityのバージョンは5.0.0f4です。
●StandaloneInputModuleについて
●StandaloneInputModuleについて
キーやパッドでのUI操作を有効にするためには、
StandaloneInputModuleコンポーネントが必要で、
StandaloneInputModuleコンポーネントが必要で、
通常はシーン内でメニューからUI要素を作った際に自動的に生成される
EventSystemにくっついています。

Allow Activation on Mobile Device:
iOSやAndroid等のモバイルデバイスで
キー操作を受け付ける場合はチェックする。
HorizontalAxis、VerticalAxis、SubmitButton、CancelButton:
縦横操作、キャンセル、決定に使用するのインプットの名称を指定する。
選択可能にしたいUIオブジェクトには、Selectableコンポーネントを付けるか、EventSystemにくっついています。
InputActionsPerSecond:
ジョイスティックや左右上下キーを倒しっぱなしにした場合に、
1秒間にリピート判定する回数を指定する。
ジョイスティックや左右上下キーを倒しっぱなしにした場合に、
1秒間にリピート判定する回数を指定する。
Allow Activation on Mobile Device:
iOSやAndroid等のモバイルデバイスで
キー操作を受け付ける場合はチェックする。
HorizontalAxis、VerticalAxis、SubmitButton、CancelButton:
縦横操作、キャンセル、決定に使用するのインプットの名称を指定する。
インプット名称がどのボタン・キーに対応するかは
InputManagerで設定した値が参照される。
(メニューのEdit→ProjectSettings→Input)
InputManagerで設定した値が参照される。
(メニューのEdit→ProjectSettings→Input)
デフォルトである程度は設定されていて、
例えばジョイスティックの0ボタンとキーボードのEnterキーが
Submitとして登録済なので、これらが決定操作となる。

●Selectableについて
例えばジョイスティックの0ボタンとキーボードのEnterキーが
Submitとして登録済なので、これらが決定操作となる。
●Selectableについて
Selectableを継承したButtonやSlider等のコンポーネントをつけます。

Intaractable:
チェックを外すことで非活性状態にできる。
チェックを外すことで非活性状態にできる。
この場合、キー操作による選択はできるが決定ができなくなる。
選択もさせたくない場合はSelectableやButtonそのものを無効化する必要がある。
(スクリプトからenable = falseを指定)
(スクリプトからenable = falseを指定)
iOSやAndroid等のタッチインターフェースなら、
覆いかぶさるようにUIを重ねた場合に後ろのボタンは押せなくなるが、
覆いかぶさるようにUIを重ねた場合に後ろのボタンは押せなくなるが、
パッドやキーの場合は背後に隠れていても操作できてしまうため、対応が必要。
Transition:
通常時、選択中、決定時、非活性時の状態変化を
色変化、スプライト変更、アニメーションのどれかで指定できる。
Navigation:
キー操作時の移動先指定の種別。
AutomaticだとUIの位置から自動で設定してくれるが、精度は怪しい。
移動先に制限をかけたい場合や、隣接していないUIへ飛びたい場合には、
Explicitにすることで上下左右の遷移先を手動で指定できる。
AutomaticだとUIの位置から自動で設定してくれるが、精度は怪しい。
移動先に制限をかけたい場合や、隣接していないUIへ飛びたい場合には、
Explicitにすることで上下左右の遷移先を手動で指定できる。
Visualizeボタンを押すと、シーン上にUIの遷移矢印が表示されるので、わかりやすい。

UIを選択した状態でSubmitに設定されたキーを押すと、
Submitイベントが呼び出されます。(Buttonの場合はOnClickも)
●スクリプトからの制御について
現在選択中の情報はEventSystemコンポーネントが持っていて、
以下の用に取得できる。
UIを選択した状態でSubmitに設定されたキーを押すと、
Submitイベントが呼び出されます。(Buttonの場合はOnClickも)
●スクリプトからの制御について
現在選択中の情報はEventSystemコンポーネントが持っていて、
以下の用に取得できる。
1 2 | // 選択中のGameObjectを取得 GameObject go = EventSystem.current.currentSelectedGameObject; |
※この辺のプロパティ情報は何故かAPIドキュメントに載っていないが、
UIとEventSystemはソースコードが公開されているので困ったときに参照できる。
スクリプトから選択状態にしたい場合は、
選択状態にしたいSelectableからSelectメソッドを呼べば選択状態にできる。
選択状態にしたいSelectableからSelectメソッドを呼べば選択状態にできる。
1 2 3 | // 自分を選択状態にする Selectable sel = GetComponent<Selectable> (); sel.Select (); |
逆に、選択状態を解除したい場合には
EventSystemのSetSelectedGameObjectメソッドでnullを入れれば解除できる。
EventSystemのSetSelectedGameObjectメソッドでnullを入れれば解除できる。
1 2 | // 選択を解除 EventSystem.current.SetSelectedGameObject ( null ); |