IndieGame/client/Assets/Samples/Input System/1.7.0/Rebinding UI/GamepadIconsExample.cs

114 lines
4.6 KiB
C#
Raw Normal View History

2024-10-11 10:12:15 +08:00
using System;
using UnityEngine.UI;
////TODO: have updateBindingUIEvent receive a control path string, too (in addition to the device layout name)
namespace UnityEngine.InputSystem.Samples.RebindUI
{
/// <summary>
/// This is an example for how to override the default display behavior of bindings. The component
/// hooks into <see cref="RebindActionUI.updateBindingUIEvent"/> which is triggered when UI display
/// of a binding should be refreshed. It then checks whether we have an icon for the current binding
/// and if so, replaces the default text display with an icon.
/// </summary>
public class GamepadIconsExample : MonoBehaviour
{
public GamepadIcons xbox;
public GamepadIcons ps4;
protected void OnEnable()
{
// Hook into all updateBindingUIEvents on all RebindActionUI components in our hierarchy.
var rebindUIComponents = transform.GetComponentsInChildren<RebindActionUI>();
foreach (var component in rebindUIComponents)
{
component.updateBindingUIEvent.AddListener(OnUpdateBindingDisplay);
component.UpdateBindingDisplay();
}
}
protected void OnUpdateBindingDisplay(RebindActionUI component, string bindingDisplayString, string deviceLayoutName, string controlPath)
{
if (string.IsNullOrEmpty(deviceLayoutName) || string.IsNullOrEmpty(controlPath))
return;
var icon = default(Sprite);
if (InputSystem.IsFirstLayoutBasedOnSecond(deviceLayoutName, "DualShockGamepad"))
icon = ps4.GetSprite(controlPath);
else if (InputSystem.IsFirstLayoutBasedOnSecond(deviceLayoutName, "Gamepad"))
icon = xbox.GetSprite(controlPath);
var textComponent = component.bindingText;
// Grab Image component.
var imageGO = textComponent.transform.parent.Find("ActionBindingIcon");
var imageComponent = imageGO.GetComponent<Image>();
if (icon != null)
{
textComponent.gameObject.SetActive(false);
imageComponent.sprite = icon;
imageComponent.gameObject.SetActive(true);
}
else
{
textComponent.gameObject.SetActive(true);
imageComponent.gameObject.SetActive(false);
}
}
[Serializable]
public struct GamepadIcons
{
public Sprite buttonSouth;
public Sprite buttonNorth;
public Sprite buttonEast;
public Sprite buttonWest;
public Sprite startButton;
public Sprite selectButton;
public Sprite leftTrigger;
public Sprite rightTrigger;
public Sprite leftShoulder;
public Sprite rightShoulder;
public Sprite dpad;
public Sprite dpadUp;
public Sprite dpadDown;
public Sprite dpadLeft;
public Sprite dpadRight;
public Sprite leftStick;
public Sprite rightStick;
public Sprite leftStickPress;
public Sprite rightStickPress;
public Sprite GetSprite(string controlPath)
{
// From the input system, we get the path of the control on device. So we can just
// map from that to the sprites we have for gamepads.
switch (controlPath)
{
case "buttonSouth": return buttonSouth;
case "buttonNorth": return buttonNorth;
case "buttonEast": return buttonEast;
case "buttonWest": return buttonWest;
case "start": return startButton;
case "select": return selectButton;
case "leftTrigger": return leftTrigger;
case "rightTrigger": return rightTrigger;
case "leftShoulder": return leftShoulder;
case "rightShoulder": return rightShoulder;
case "dpad": return dpad;
case "dpad/up": return dpadUp;
case "dpad/down": return dpadDown;
case "dpad/left": return dpadLeft;
case "dpad/right": return dpadRight;
case "leftStick": return leftStick;
case "rightStick": return rightStick;
case "leftStickPress": return leftStickPress;
case "rightStickPress": return rightStickPress;
}
return null;
}
}
}
}