A game about forced loneliness, made by TACStudios
1using System;
2using UnityEngine.UI;
3
4////TODO: have updateBindingUIEvent receive a control path string, too (in addition to the device layout name)
5
6namespace UnityEngine.InputSystem.Samples.RebindUI
7{
8 /// <summary>
9 /// This is an example for how to override the default display behavior of bindings. The component
10 /// hooks into <see cref="RebindActionUI.updateBindingUIEvent"/> which is triggered when UI display
11 /// of a binding should be refreshed. It then checks whether we have an icon for the current binding
12 /// and if so, replaces the default text display with an icon.
13 /// </summary>
14 public class GamepadIconsExample : MonoBehaviour
15 {
16 public GamepadIcons xbox;
17 public GamepadIcons ps4;
18
19 protected void OnEnable()
20 {
21 // Hook into all updateBindingUIEvents on all RebindActionUI components in our hierarchy.
22 var rebindUIComponents = transform.GetComponentsInChildren<RebindActionUI>();
23 foreach (var component in rebindUIComponents)
24 {
25 component.updateBindingUIEvent.AddListener(OnUpdateBindingDisplay);
26 component.UpdateBindingDisplay();
27 }
28 }
29
30 protected void OnUpdateBindingDisplay(RebindActionUI component, string bindingDisplayString, string deviceLayoutName, string controlPath)
31 {
32 if (string.IsNullOrEmpty(deviceLayoutName) || string.IsNullOrEmpty(controlPath))
33 return;
34
35 var icon = default(Sprite);
36 if (InputSystem.IsFirstLayoutBasedOnSecond(deviceLayoutName, "DualShockGamepad"))
37 icon = ps4.GetSprite(controlPath);
38 else if (InputSystem.IsFirstLayoutBasedOnSecond(deviceLayoutName, "Gamepad"))
39 icon = xbox.GetSprite(controlPath);
40
41 var textComponent = component.bindingText;
42
43 // Grab Image component.
44 var imageGO = textComponent.transform.parent.Find("ActionBindingIcon");
45 var imageComponent = imageGO.GetComponent<Image>();
46
47 if (icon != null)
48 {
49 textComponent.gameObject.SetActive(false);
50 imageComponent.sprite = icon;
51 imageComponent.gameObject.SetActive(true);
52 }
53 else
54 {
55 textComponent.gameObject.SetActive(true);
56 imageComponent.gameObject.SetActive(false);
57 }
58 }
59
60 [Serializable]
61 public struct GamepadIcons
62 {
63 public Sprite buttonSouth;
64 public Sprite buttonNorth;
65 public Sprite buttonEast;
66 public Sprite buttonWest;
67 public Sprite startButton;
68 public Sprite selectButton;
69 public Sprite leftTrigger;
70 public Sprite rightTrigger;
71 public Sprite leftShoulder;
72 public Sprite rightShoulder;
73 public Sprite dpad;
74 public Sprite dpadUp;
75 public Sprite dpadDown;
76 public Sprite dpadLeft;
77 public Sprite dpadRight;
78 public Sprite leftStick;
79 public Sprite rightStick;
80 public Sprite leftStickPress;
81 public Sprite rightStickPress;
82
83 public Sprite GetSprite(string controlPath)
84 {
85 // From the input system, we get the path of the control on device. So we can just
86 // map from that to the sprites we have for gamepads.
87 switch (controlPath)
88 {
89 case "buttonSouth": return buttonSouth;
90 case "buttonNorth": return buttonNorth;
91 case "buttonEast": return buttonEast;
92 case "buttonWest": return buttonWest;
93 case "start": return startButton;
94 case "select": return selectButton;
95 case "leftTrigger": return leftTrigger;
96 case "rightTrigger": return rightTrigger;
97 case "leftShoulder": return leftShoulder;
98 case "rightShoulder": return rightShoulder;
99 case "dpad": return dpad;
100 case "dpad/up": return dpadUp;
101 case "dpad/down": return dpadDown;
102 case "dpad/left": return dpadLeft;
103 case "dpad/right": return dpadRight;
104 case "leftStick": return leftStick;
105 case "rightStick": return rightStick;
106 case "leftStickPress": return leftStickPress;
107 case "rightStickPress": return rightStickPress;
108 }
109 return null;
110 }
111 }
112 }
113}