0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Unity】任意の処理 / タイミングでUIに対して操作をする方法

Last updated at Posted at 2023-05-26

皆さん、こんな経験ありませんか?

・EventSystemで定義したボタン以外でも、UI操作を行いたい
・キーコンフィグ等で、動的にボタンを変えたい
・言語設定に応じて、UIに対する決定ボタンを変えたい(日本だと○、海外だと✖みたいな感じ)

今回実装する事

・デフォルトだと、EventSystemのインスペクターで指定したボタンでしか
 UIに対して決定処理できませんが
 スクリプトを通じてどのボタン/キーからでも決定処理できるようにします

実際に試した環境

・Unity 2021.3.0 LTS
・Visual Studio2017

この処理は旧式のInputManagerでのみ動作します
新システムであるInputSystemでは、デフォルトで変更可能になっておりAPIも提供されています

この処理はPC向けのゲームのコントローラー操作を対象にしています
また、この処理では従来のInputManager同様に決定ボタンを押した後
次はどのボタンにカーソルを合わせるかについては独自に実装する必要があります

実装方法

①新規にScriptを作成します(別に名前は何でもいいです)
②標準のStart関数とUpdate関数を消して、usingに以下の項目を追加します

InputManager_SubmitButton_Change
using UnityEngine.EventSystems;
using UnityEngine.UI;
using System; //もしかしたらいらないかも

③継承を変更します

InputManager_SubmitButton_Change
public class InputManager_SubmitButton_Change : MonoBehaviour //←ここのMonoBehaviourを変える
{

}

InputManager_SubmitButton_Change
public class InputManager_SubmitButton_Change : StandaloneInputModule
{

}

④必要な変数を追加します

InputManager_SubmitButton_Change
    [SerializeField]
    EventSystem eventSystem; //イベントシステム用
    public GameObject SelectedButton; //現在選択されているボタン

⑤初期化関数を設定します

InputManager_SubmitButton_Change
    protected override void OnEnable()
    {
        base.OnEnable();
    }

    public void Start()
    {
        base.Start();
        EventSystem ev = EventSystem.current;
        ev.firstSelectedGameObject = SelectedButton;
    }

⑥任意の処理で決定処理を行う処理を書きます

InputManager_SubmitButton_Change
    public void Update()
    {
            if (//ここに決定させたい時に使うものを記載)
            {
                if (eventSystem.currentSelectedGameObject == null)
                {
                    return; //現在選択中のボタンが無い場合は終了
                }
                var baseEventData = GetBaseEventData();
                ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, baseEventData, ExecuteEvents.submitHandler); //この処理によって現在選択中のUIオブジェクトに対して決定コマンドが送信されます
            }
    }

⑦スクリプトを保存し、Unityに戻ります
⑧インスペクター上で、SelectedButton変数に最初にカーソルを合わせるボタンをセットします
⑨インスペクター上で、eventSystem変数にイベントシステムのゲームオブジェクトをセットします
⑩動作確認を行います

以上です!
快適なUnityライフをお楽しみください!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?