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 { /// /// This is an example for how to override the default display behavior of bindings. The component /// hooks into 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. /// 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(); 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(); 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; } } } }