Open5

UnityのInputSystemでゲームパッドからキャンセルボタンを有効にする

Cz_mirrorCz_mirror

InputSystemでゲームパッドからキャンセルをできるように、キャンセルボタンの設定を行なってみました。

Cz_mirrorCz_mirror

キャンセルボタン押下時に、キャンセルのシグナルを発信するようにしてみました。

TitleController.cs
こちらはInputSystemでキャンセルボタンに設定する関数を定義しています。

using Event.Signal;
using UniRx;
using UnityEngine;
using UnityEngine.InputSystem;

namespace InputSystem
{
    public class TitleController : MonoBehaviour
    {
        [SerializeField] private PlayerInputActions _playerInputActions;
        [SerializeField] private GameObject currentUI;

        private void Awake()
        {
            _playerInputActions = new PlayerInputActions();
            _playerInputActions.Enable();
        }

        private void OnEnable()
        {
            _playerInputActions.UI.Cancel.canceled += OnCancel;
        }

        private void OnDisable()
        {
            _playerInputActions.UI.Cancel.canceled -= OnCancel;
        }

        private void OnCancel(InputAction.CallbackContext obj)
        {
            MessageBroker.Default.Publish(new GamePadCancelButtonPush());
        }
    }
}

Cz_mirrorCz_mirror

GamePadCancelButtonPush.cs
キャンセルボタン押下時に発信するクラスで、発信のみが目的なので中身は空です。

namespace Event.Signal
{
    /// <summary>
    /// ゲームパッドのキャンセルボタン押下
    /// </summary>
    public class GamePadCancelButtonPush
    {

    }
}
Cz_mirrorCz_mirror

ButtonLicense.cs
ライセンスボタン押下時のクラス内に、MessageBroker.Default.ReceiveでGamePadCancelButtonPushクラスを受信した場合に、閉じるボタンのメソッドを実行する様に設定することで、ゲームパッドからキャンセルボタンを有効にしています。

using DG.Tweening;
using Event.Signal;
using UniRx;
using UnityEngine;
using UnityEngine.EventSystems;

namespace UI.Title
{
    public class ButtonLicense : MonoBehaviour
    {
        [SerializeField] private CanvasGroup menuButtonsCanvasGroup;
        [SerializeField] private RectTransform menuButtonsRectTransform;
        [SerializeField] private CanvasGroup licenseCanvasGroup;
        [SerializeField] private RectTransform licenseRectTransform;
        [SerializeField] private CanvasGroup headerImageCanvasGroup;
        [SerializeField] private CanvasGroup insideButtonsCanvasGroup;
        [SerializeField] private CanvasGroup contentCanvasGroup;

        /// <summary>
        /// メニューUIのゲームオブジェクト
        /// </summary>
        [SerializeField] private GameObject menuUI;

        /// <summary>
        /// ライセンスUIのゲームオブジェクト
        /// </summary>
        [SerializeField] private GameObject licenseUI;

        /// <summary>
        /// 最初にフォーカスになるメニューUIのボタン
        /// </summary>
        [SerializeField] private GameObject menuUIFirstFocusButton;

        /// <summary>
        /// 最初にフォーカスになるライセンスUIのボタン
        /// </summary>
        [SerializeField] private GameObject licenseUIFirstFocusButton;

        /// <summary>
        /// ゲームパッドのキャンセルボタン受付
        /// </summary>
        private bool _gamePadCancelButtonAcceptance = false;

        private Vector3 _initialMenuButtonPosition = Vector3.zero;
        private Vector3 _initialPosition = Vector3.zero;
        private Vector2 _initialUISizeDelta = Vector2.zero;
        private Vector3 _inUIPosition;
        private Vector3 _outUIPosition;

        private void InitializeUI()
        {
            licenseCanvasGroup.alpha = 0;
            licenseRectTransform.sizeDelta = Vector2.zero;
            headerImageCanvasGroup.alpha = 0;
            insideButtonsCanvasGroup.alpha = 0;
            contentCanvasGroup.alpha = 0;

            _inUIPosition = new Vector3(0, 0, 0);
            _outUIPosition = new Vector3(2000, 0, 0);
            licenseRectTransform.position = _outUIPosition;
        }

        private void Start()
        {
            _initialMenuButtonPosition = menuButtonsRectTransform.position;
            _initialPosition = licenseRectTransform.position;
            _initialUISizeDelta = licenseRectTransform.sizeDelta;
            InitializeUI();

            // ゲームパッドキャンセルボタン受付
            MessageBroker.Default.Receive<GamePadCancelButtonPush>()
                .Where(_ => _gamePadCancelButtonAcceptance)
                .Subscribe(_ => PushCloseButton())
                .AddTo(this);

            licenseUI.SetActive(false);
        }

        public void PushButton()
        {
            //初期選択ボタンの初期化
            EventSystem.current.SetSelectedGameObject(null);

            // LicenseUI有効化
            licenseUI.SetActive(true);

            if (menuButtonsCanvasGroup.alpha == 0)
            {
                return;
            }

            InitializeUI();

            // DOTweenシーケンスセット
            var sequence = DOTween
                .Sequence()
                .Pause()
                .SetAutoKill(false)
                .SetLink(gameObject);

            // メニューボタン非表示
            sequence
                .Append(menuButtonsCanvasGroup.DOFade(0f, 0.2f))
                .Join(menuButtonsRectTransform.DOMoveX(1000, 0.1f))
                .AppendInterval(0.1f);


            // マニュアル表示
            licenseRectTransform.position = _initialPosition;
            sequence
                .Append(licenseCanvasGroup.DOFade(1f, 0.5f))
                .Join(licenseRectTransform.DOSizeDelta(new Vector2(_initialUISizeDelta.x, 2), 1f))
                .Append(licenseRectTransform.DOSizeDelta(
                    new Vector2(_initialUISizeDelta.x, _initialUISizeDelta.y), 1f))
                .AppendInterval(0.5f);

            // 見出しイメージ表示
            sequence
                .Append(headerImageCanvasGroup.DOFade(1f, 0.3f))
                .AppendInterval(0.3f);

            // テキスト表示
            sequence
                .Append(contentCanvasGroup.DOFade(1f, 0.3f))
                .AppendInterval(0.3f);

            // UI内ボタン表示
            sequence
                .Append(insideButtonsCanvasGroup.DOFade(1f, 0.3f))
                .AppendInterval(0.3f)
                .OnComplete(() =>
                {
                    menuUI.SetActive(false);
                    //初期選択ボタンの再指定
                    EventSystem.current.SetSelectedGameObject(licenseUIFirstFocusButton);

                    // ゲームパッドのキャンセルボタン受付
                    _gamePadCancelButtonAcceptance = true;
                });

            sequence.Restart();
        }

        public void PushCloseButton()
        {
            //初期選択ボタンの初期化
            EventSystem.current.SetSelectedGameObject(null);

            // ゲームパッドのキャンセルボタン受付解除
            _gamePadCancelButtonAcceptance = false;

            // メニューボタンUI有効化
            menuUI.SetActive(true);

            // DOTweenシーケンスセット
            var sequence = DOTween
                .Sequence()
                .Pause()
                .SetAutoKill(false)
                .SetLink(gameObject);

            // 見出しイメージ非表示
            sequence
                .Append(headerImageCanvasGroup.DOFade(0f, 0.1f))
                .AppendInterval(0.2f);

            // テキスト非表示
            sequence
                .Append(contentCanvasGroup.DOFade(0f, 0.1f))
                .AppendInterval(0.2f);

            // UI内ボタン非表示
            sequence
                .Append(insideButtonsCanvasGroup.DOFade(0f, 0.1f))
                .AppendInterval(0.2f);

            // License非表示
            sequence
                .Append(licenseRectTransform.DOSizeDelta(new Vector2(_initialUISizeDelta.x, 2), 1f))
                .Append(licenseCanvasGroup.DOFade(0f, 0.1f))
                .Join(licenseRectTransform.DOSizeDelta(new Vector2(0, 2), 1f))
                .AppendInterval(0.2f)
                .AppendCallback(() =>
                {
                    licenseRectTransform.position = _outUIPosition;

                    // License無効
                    licenseUI.SetActive(false);

                    //初期選択ボタンの再指定
                    EventSystem.current.SetSelectedGameObject(menuUIFirstFocusButton);
                });

            // メニューボタン表示
            sequence
                .Append(menuButtonsCanvasGroup.DOFade(1f, 0.1f))
                .Join(menuButtonsRectTransform.DOMoveX(_initialMenuButtonPosition.x, 0.1f))
                .AppendInterval(0.1f);
            sequence.Restart();
        }
    }
}