Open5
UnityのInputSystemでゲームパッドからキャンセルボタンを有効にする
InputSystemでゲームパッドからキャンセルをできるように、キャンセルボタンの設定を行なってみました。
キャンセルボタン押下時に、キャンセルのシグナルを発信するようにしてみました。
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());
}
}
}
GamePadCancelButtonPush.cs
キャンセルボタン押下時に発信するクラスで、発信のみが目的なので中身は空です。
namespace Event.Signal
{
/// <summary>
/// ゲームパッドのキャンセルボタン押下
/// </summary>
public class GamePadCancelButtonPush
{
}
}
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();
}
}
}
実際に動作している部分をニコニコ動画にアップしてみました。