皆さん、こんな経験ありませんか?
・EventSystemで定義したボタン以外でも、UI操作を行いたい
・キーコンフィグ等で、動的にボタンを変えたい
・言語設定に応じて、UIに対する決定ボタンを変えたい(日本だと○、海外だと✖みたいな感じ)
今回実装する事
・デフォルトだと、EventSystemのインスペクターで指定したボタンでしか
UIに対して決定処理できませんが
スクリプトを通じてどのボタン/キーからでも決定処理できるようにします
実際に試した環境
・Unity 2021.3.0 LTS
・Visual Studio2017
この処理は旧式のInputManagerでのみ動作します
新システムであるInputSystemでは、デフォルトで変更可能になっておりAPIも提供されています
この処理はPC向けのゲームのコントローラー操作を対象にしています
また、この処理では従来のInputManager同様に決定ボタンを押した後
次はどのボタンにカーソルを合わせるかについては独自に実装する必要があります
実装方法
①新規にScriptを作成します(別に名前は何でもいいです)
②標準のStart関数とUpdate関数を消して、usingに以下の項目を追加します
using UnityEngine.EventSystems;
using UnityEngine.UI;
using System; //もしかしたらいらないかも
③継承を変更します
public class InputManager_SubmitButton_Change : MonoBehaviour //←ここのMonoBehaviourを変える
{
}
↓
public class InputManager_SubmitButton_Change : StandaloneInputModule
{
}
④必要な変数を追加します
[SerializeField]
EventSystem eventSystem; //イベントシステム用
public GameObject SelectedButton; //現在選択されているボタン
⑤初期化関数を設定します
protected override void OnEnable()
{
base.OnEnable();
}
public void Start()
{
base.Start();
EventSystem ev = EventSystem.current;
ev.firstSelectedGameObject = SelectedButton;
}
⑥任意の処理で決定処理を行う処理を書きます
public void Update()
{
if (//ここに決定させたい時に使うものを記載)
{
if (eventSystem.currentSelectedGameObject == null)
{
return; //現在選択中のボタンが無い場合は終了
}
var baseEventData = GetBaseEventData();
ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, baseEventData, ExecuteEvents.submitHandler); //この処理によって現在選択中のUIオブジェクトに対して決定コマンドが送信されます
}
}
⑦スクリプトを保存し、Unityに戻ります
⑧インスペクター上で、SelectedButton変数
に最初にカーソルを合わせるボタンをセットします
⑨インスペクター上で、eventSystem変数
にイベントシステムのゲームオブジェクトをセットします
⑩動作確認を行います
以上です!
快適なUnityライフをお楽しみください!!