114 lines
4.6 KiB
C#
114 lines
4.6 KiB
C#
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|