diff --git a/Assets/Samples/RebindingUI/ActionLabelEditor.cs b/Assets/Samples/RebindingUI/ActionLabelEditor.cs index 8e491b9156..4e8e6a6925 100644 --- a/Assets/Samples/RebindingUI/ActionLabelEditor.cs +++ b/Assets/Samples/RebindingUI/ActionLabelEditor.cs @@ -15,13 +15,9 @@ public class ActionLabelEditor : UnityEditor.Editor { protected void OnEnable() { - m_ActionProperty = serializedObject.FindProperty("m_Action"); - m_BindingIdProperty = serializedObject.FindProperty("m_BindingId"); m_BindingTextProperty = serializedObject.FindProperty("m_BindingText"); - m_DisplayStringOptionsProperty = serializedObject.FindProperty("m_DisplayStringOptions"); m_UpdateBindingUIEventProperty = serializedObject.FindProperty("m_UpdateBindingUIEvent"); - - RefreshBindingOptions(); + m_BindingUI = new BindingUI(serializedObject); } public override void OnInspectorGUI() @@ -29,24 +25,7 @@ public override void OnInspectorGUI() EditorGUI.BeginChangeCheck(); // Binding section. - EditorGUILayout.LabelField(m_BindingLabel, Styles.boldLabel); - using (new EditorGUI.IndentLevelScope()) - { - EditorGUILayout.PropertyField(m_ActionProperty); - - var newSelectedBinding = EditorGUILayout.Popup(m_BindingLabel, m_SelectedBindingOption, m_BindingOptions); - if (newSelectedBinding != m_SelectedBindingOption) - { - var bindingId = m_BindingOptionValues[newSelectedBinding]; - m_BindingIdProperty.stringValue = bindingId; - m_SelectedBindingOption = newSelectedBinding; - } - - var optionsOld = (InputBinding.DisplayStringOptions)m_DisplayStringOptionsProperty.intValue; - var optionsNew = (InputBinding.DisplayStringOptions)EditorGUILayout.EnumFlagsField(m_DisplayOptionsLabel, optionsOld); - if (optionsOld != optionsNew) - m_DisplayStringOptionsProperty.intValue = (int)optionsNew; - } + m_BindingUI.Draw(); // UI section. EditorGUILayout.Space(); @@ -67,91 +46,16 @@ public override void OnInspectorGUI() if (EditorGUI.EndChangeCheck()) { serializedObject.ApplyModifiedProperties(); - RefreshBindingOptions(); - } - } - - protected void RefreshBindingOptions() - { - var actionReference = (InputActionReference)m_ActionProperty.objectReferenceValue; - var action = actionReference?.action; - - if (action == null) - { - m_BindingOptions = new GUIContent[0]; - m_BindingOptionValues = new string[0]; - m_SelectedBindingOption = -1; - return; - } - - var bindings = action.bindings; - var bindingCount = bindings.Count; - - m_BindingOptions = new GUIContent[bindingCount]; - m_BindingOptionValues = new string[bindingCount]; - m_SelectedBindingOption = -1; - - var currentBindingId = m_BindingIdProperty.stringValue; - for (var i = 0; i < bindingCount; ++i) - { - var binding = bindings[i]; - var bindingId = binding.id.ToString(); - var haveBindingGroups = !string.IsNullOrEmpty(binding.groups); - - // If we don't have a binding groups (control schemes), show the device that if there are, for example, - // there are two bindings with the display string "A", the user can see that one is for the keyboard - // and the other for the gamepad. - var displayOptions = - InputBinding.DisplayStringOptions.DontUseShortDisplayNames | InputBinding.DisplayStringOptions.IgnoreBindingOverrides; - if (!haveBindingGroups) - displayOptions |= InputBinding.DisplayStringOptions.DontOmitDevice; - - // Create display string. - var displayString = action.GetBindingDisplayString(i, displayOptions); - - // If binding is part of a composite, include the part name. - if (binding.isPartOfComposite) - displayString = $"{ObjectNames.NicifyVariableName(binding.name)}: {displayString}"; - - // Some composites use '/' as a separator. When used in popup, this will lead to to submenus. Prevent - // by instead using a backlash. - displayString = displayString.Replace('/', '\\'); - - // If the binding is part of control schemes, mention them. - if (haveBindingGroups) - { - var asset = action.actionMap?.asset; - if (asset != null) - { - var controlSchemes = string.Join(", ", - binding.groups.Split(InputBinding.Separator) - .Select(x => asset.controlSchemes.FirstOrDefault(c => c.bindingGroup == x).name)); - - displayString = $"{displayString} ({controlSchemes})"; - } - } - - m_BindingOptions[i] = new GUIContent(displayString); - m_BindingOptionValues[i] = bindingId; - - if (currentBindingId == bindingId) - m_SelectedBindingOption = i; + m_BindingUI.Refresh(); } } - private SerializedProperty m_ActionProperty; - private SerializedProperty m_BindingIdProperty; private SerializedProperty m_BindingTextProperty; private SerializedProperty m_UpdateBindingUIEventProperty; - private SerializedProperty m_DisplayStringOptionsProperty; - private GUIContent m_BindingLabel = new GUIContent("Binding"); - private GUIContent m_DisplayOptionsLabel = new GUIContent("Display Options"); private GUIContent m_UILabel = new GUIContent("UI"); private GUIContent m_EventsLabel = new GUIContent("Events"); - private GUIContent[] m_BindingOptions; - private string[] m_BindingOptionValues; - private int m_SelectedBindingOption; + private BindingUI m_BindingUI; private static class Styles { diff --git a/Assets/Samples/RebindingUI/Game/GameplayManager.cs b/Assets/Samples/RebindingUI/Game/GameplayManager.cs index 90eaaf4b62..f0199a4a80 100644 --- a/Assets/Samples/RebindingUI/Game/GameplayManager.cs +++ b/Assets/Samples/RebindingUI/Game/GameplayManager.cs @@ -191,6 +191,9 @@ internal bool TryTeleportOrthographicExtents(Vector3 position, out Vector3 resul private void Awake() { + // This game is designed for landscape orientation, so make sure we use it. + Screen.orientation = ScreenOrientation.LandscapeLeft; + m_FeedbackController = GetComponent(); m_EnemyPool = new ObjectPool( @@ -256,7 +259,7 @@ void SpawnEnemy() --m_EnemySpawnCount; // Rent an enemy from the enemy pool - var enemyComponent = m_EnemyPool.Get(); + var enemyComponent = m_EnemyPool.Get(); // TODO Null reference here on domain reload // Make the enemy spawn on border of visible game area var orthoSize = gameCamera.orthographicSize; diff --git a/Assets/Samples/RebindingUI/InputActionExtensions.cs b/Assets/Samples/RebindingUI/InputActionExtensions.cs new file mode 100644 index 0000000000..7df26ed53d --- /dev/null +++ b/Assets/Samples/RebindingUI/InputActionExtensions.cs @@ -0,0 +1,24 @@ +using System; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + /// + /// Extension methods to reduce code bloat of this example. + /// + public static class InputActionExtensions + { + /// + /// Attempts to find an action binding using its binding ID (GUID). + /// + /// The action instance, may be null. + /// The binding ID (GUID) represented by a string. + /// Zero-based index of the binding or -1 if not found. + public static int FindBindingById(this InputAction action, string bindingId) + { + if (action == null || string.IsNullOrEmpty(bindingId)) + return -1; + var id = new Guid(bindingId); + return action.bindings.IndexOf(x => x.id == id); + } + } +} diff --git a/Assets/Samples/RebindingUI/InputActionExtensions.cs.meta b/Assets/Samples/RebindingUI/InputActionExtensions.cs.meta new file mode 100644 index 0000000000..7790740f15 --- /dev/null +++ b/Assets/Samples/RebindingUI/InputActionExtensions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ad53b6fa614c40fa86b979a6dfca6eb5 +timeCreated: 1758779730 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/InputActionIndicator.cs b/Assets/Samples/RebindingUI/InputActionIndicator.cs index f28f5aa554..b15cdfe4b8 100644 --- a/Assets/Samples/RebindingUI/InputActionIndicator.cs +++ b/Assets/Samples/RebindingUI/InputActionIndicator.cs @@ -34,7 +34,9 @@ public class InputActionIndicator : MonoBehaviour private void OnEnable() { if (action != null && action.action != null) - action.action.performed += OnPerformed; + { + action.action.performed += OnPerformed; // TODO Problem here after domain reload, InputAction.addperformed(), CallbackArray.AddCallback,. InputArrayExtensions.Contains + } } private void OnDisable() diff --git a/Assets/Samples/RebindingUI/README.md b/Assets/Samples/RebindingUI/README.md index 373291438f..b0a65c2d39 100644 --- a/Assets/Samples/RebindingUI/README.md +++ b/Assets/Samples/RebindingUI/README.md @@ -1,10 +1,31 @@ -This sample demonstrates how to use the Input System APIs to set up a rebinding UI. The main file is [RebindActionUI](./RebindActionUI.cs) which, aside from serving as an example, contains a reusable `MonoBehaviour` component for composing rebinding UIs. The [RebindUIPrefab](./RebindUIPrefab.prefab) contains a ready-made prefab that can be used as a simple drop-in setup for rebinding an individual action. +This sample demonstrates how to use the Input System APIs to set up a rebinding UI. The main file is +[RebindActionUI](./RebindActionUI.cs) which, aside from serving as an example, contains a reusable `MonoBehaviour` +component for composing rebinding UIs. The [RebindUIPrefab](./RebindUIPrefab.prefab) contains a ready-made prefab that +can be used as a simple drop-in setup for rebinding an individual action. -To demonstrate how to use images instead of textual display strings, take a look at [GamepadIconsExample](./GamepadIconsExample.cs). +To demonstrate how to use images instead of textual display strings, take a look at +[GamepadIconsExample](./GamepadIconsExample.cs). -To demonstrate how to show dynamic texts based on input action bindings, see [ActionLabel](./ActionLabel.cs). +To demonstrate how to show dynamic UI texts based on input action bindings, see [ActionLabel](./ActionLabel.cs). - Finally, the [RebindSaveLoad](./RebindSaveLoad.cs) script demonstrates how to persist user rebinds in `PlayerPrefs` and how to restore them from there. +[InputActionIndicator](./InputActionIndicator.cs) and [InputActionIndicator.prefab](./InputActionIndicator.prefab) +shows how to make a simple UI indicator that shows whether an associated input action is enabled, disabled or +performed. This behavior has been added to this sample to add observability of actions triggered within gameplay, +menu and rebind contexts. - The icons used in the sample are taken from [Free Prompts Pack v4.0](https://opengameart.org/content/free-keyboard-and-controllers-prompts-pack) created by, and made available to public domain by Nicolae Berbece. - Icons are licensed under [Creative Commons CC0](https://creativecommons.org/publicdomain/zero/1.0/). +The [RebindSaveLoad](./RebindSaveLoad.cs) script demonstrates how to persist user rebinds in `PlayerPrefs` and how +to restore them. + +In this sample, keyboard bindings for "Move" (default WASD) is rebound as a single composite. This means that +indivudual parts will get assigned one after the other. Another way of doing this is to set it up as four individual +button bindings and assign them individually as four partial bindings. + +In this sample it is possible to directly rebind gamepad sticks in the gamepad control scheme. In practice, you +probably don't want to set up rebinding the sticks like this but rather have a "swap sticks" kind of toggle instead. +In this sample we have both variants for demonstration purposes. See [RebindActionUI.SwapBinding](./RebindActionUI.cs) +for a method that swaps two bindings of similar type. + +The icons used in the sample are taken from +[Free Prompts Pack v4.0](https://opengameart.org/content/free-keyboard-and-controllers-prompts-pack) created by, +and made available to public domain by Nicolae Berbece. +Icons are licensed under [Creative Commons CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/Assets/Samples/RebindingUI/RebindActionEditor.cs b/Assets/Samples/RebindingUI/RebindActionEditor.cs new file mode 100644 index 0000000000..68c586e023 --- /dev/null +++ b/Assets/Samples/RebindingUI/RebindActionEditor.cs @@ -0,0 +1,146 @@ +#if UNITY_EDITOR + +using System; +using System.Linq; +using UnityEditor; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + /// + /// Common binding UI helper to allow editor composition. + /// + internal class BindingUI + { + private readonly SerializedProperty m_ActionProperty; + private readonly SerializedProperty m_BindingIdProperty; + private readonly SerializedProperty m_DisplayStringOptionsProperty; + + public BindingUI(SerializedObject serializedObject) + : this(serializedObject.FindProperty("m_Action"), serializedObject.FindProperty("m_BindingId"), + serializedObject.FindProperty("m_DisplayStringOptions")) + {} + + public BindingUI(SerializedProperty actionProperty, SerializedProperty bindingIdProperty, + SerializedProperty displayStringOptionsProperty = null) + { + m_ActionProperty = actionProperty; + m_BindingIdProperty = bindingIdProperty; + m_DisplayStringOptionsProperty = displayStringOptionsProperty; + + Reset(); + Refresh(); + } + + private void Reset() + { + bindingOptions = Array.Empty(); + bindingOptionValues = Array.Empty(); + selectedBindingIndex = -1; + } + + public void Draw() + { + // Binding section. + EditorGUILayout.LabelField(m_BindingLabel); + using (new EditorGUI.IndentLevelScope()) + { + EditorGUILayout.PropertyField(m_ActionProperty); + + var newSelectedBinding = EditorGUILayout.Popup(m_BindingLabel, selectedBindingIndex, bindingOptions); + if (newSelectedBinding != selectedBindingIndex) + { + var bindingId = bindingOptionValues[newSelectedBinding]; + m_BindingIdProperty.stringValue = bindingId; + selectedBindingIndex = newSelectedBinding; + } + + if (m_DisplayStringOptionsProperty != null) + { + var optionsOld = (InputBinding.DisplayStringOptions)m_DisplayStringOptionsProperty.intValue; + var optionsNew = (InputBinding.DisplayStringOptions)EditorGUILayout.EnumFlagsField(m_DisplayOptionsLabel, optionsOld); + if (optionsOld != optionsNew) + m_DisplayStringOptionsProperty.intValue = (int)optionsNew; + } + } + } + + public bool Refresh() + { + if (action == null) + { + Reset(); + return false; + } + + var bindings = action.bindings; + var bindingCount = bindings.Count; + + bindingOptions = new GUIContent[bindingCount]; + bindingOptionValues = new string[bindingCount]; + selectedBindingIndex = -1; + + var currentBindingId = m_BindingIdProperty.stringValue; + for (var i = 0; i < bindingCount; ++i) + { + var binding = bindings[i]; + var bindingId = binding.id.ToString(); + var haveBindingGroups = !string.IsNullOrEmpty(binding.groups); + + // If we don't have a binding groups (control schemes), show the device that if there are, for example, + // there are two bindings with the display string "A", the user can see that one is for the keyboard + // and the other for the gamepad. + var displayOptions = + InputBinding.DisplayStringOptions.DontUseShortDisplayNames | InputBinding.DisplayStringOptions.IgnoreBindingOverrides; + if (!haveBindingGroups) + displayOptions |= InputBinding.DisplayStringOptions.DontOmitDevice; + + // Create display string. + var displayString = action.GetBindingDisplayString(i, displayOptions); + + // If binding is part of a composite, include the part name. + if (binding.isPartOfComposite) + displayString = $"{ObjectNames.NicifyVariableName(binding.name)}: {displayString}"; + + // Some composites use '/' as a separator. When used in popup, this will lead to to submenus. Prevent + // by instead using a backlash. + displayString = displayString.Replace('/', '\\'); + + // If the binding is part of control schemes, mention them. + if (haveBindingGroups) + { + var asset = action.actionMap?.asset; + if (asset != null) + { + var controlSchemes = string.Join(", ", + binding.groups.Split(InputBinding.Separator) + .Select(x => asset.controlSchemes.FirstOrDefault(c => c.bindingGroup == x).name)); + + displayString = $"{displayString} ({controlSchemes})"; + } + } + + bindingOptions[i] = new GUIContent(displayString); + bindingOptionValues[i] = bindingId; + + if (currentBindingId == bindingId) + selectedBindingIndex = i; + } + + return true; + } + + public string bindingId => m_BindingIdProperty.stringValue; + public int bindingIndex => action.FindBindingById(m_BindingIdProperty.stringValue); + + public InputAction action => ((InputActionReference)m_ActionProperty.objectReferenceValue)?.action; + + private GUIContent[] bindingOptions { get; set; } + private string[] bindingOptionValues { get; set; } + private int selectedBindingIndex { get; set; } + + private readonly GUIContent m_BindingLabel = new GUIContent("Binding"); + private readonly GUIContent m_DisplayOptionsLabel = new GUIContent("Display Options"); + } +} + +#endif // UNITY_EDITOR diff --git a/Assets/Samples/RebindingUI/RebindActionEditor.cs.meta b/Assets/Samples/RebindingUI/RebindActionEditor.cs.meta new file mode 100644 index 0000000000..7edd0aaa83 --- /dev/null +++ b/Assets/Samples/RebindingUI/RebindActionEditor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9e880855c77044fb9a41f843560d9a3a +timeCreated: 1758622918 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/RebindActionParameterUI.cs b/Assets/Samples/RebindingUI/RebindActionParameterUI.cs new file mode 100644 index 0000000000..55b0fdb209 --- /dev/null +++ b/Assets/Samples/RebindingUI/RebindActionParameterUI.cs @@ -0,0 +1,147 @@ +using System; +using UnityEngine; +using UnityEngine.InputSystem; +using UnityEngine.InputSystem.Processors; +using UnityEngine.UI; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + public class RebindActionParameterUI : MonoBehaviour + { + /// + /// Reference to the action that is to be rebound (Required). + /// + public InputActionReference actionReference + { + get => m_Action; + set => m_Action = value; + } + + /// + /// ID (in string form) of the binding that is to be rebound on the action. + /// + /// If this is not set (null or empty), corresponds to an action processor + /// parameter, otherwise it corresponds to a binding parameter. + /// + public string bindingId + { + get => m_BindingId; + set => m_BindingId = value; + } + + /// + /// The preference key to be used for persistence. + /// + public string mPreferenceKey + { + get => m_PreferenceKey; + set => m_PreferenceKey = value; + } + + /// + /// The associated slider UI component instance. + /// + public Slider slider + { + get => m_Slider; + set + { + if (m_Slider != null) + m_Slider.onValueChanged.RemoveListener(SetParameterValue); + m_Slider = value; + if (value != null) + value.onValueChanged.AddListener(SetParameterValue); + } + } + + /// + /// The default value to apply when reset or no preference exist. + /// + public float defaultValue + { + get => m_DefaultValue; + set => m_DefaultValue = value; + } + + [Tooltip("Reference to action that holds the parameter to be configurable via this behaviour.")] + [SerializeField] + private InputActionReference m_Action; + + [Tooltip("Optional binding ID of the binding processor parameter to override.")] + [SerializeField] + private string m_BindingId; + + [Tooltip("The player preference key to be used for persistence.")] + [SerializeField] + private string m_PreferenceKey; + + [Tooltip("The default value to be be used when no preference exists or when resetting")] + [SerializeField] + private float m_DefaultValue; + + [Tooltip("The associated slider UI component used to change the value.")] + [SerializeField] + private Slider m_Slider; + + [SerializeField] + private string[] m_ParameterOverrides; + + private float m_Value; + + public void ResetToDefault() + { + PlayerPrefs.SetFloat(m_PreferenceKey, m_DefaultValue); + SetParameterValue(m_DefaultValue); + } + + private void Awake() + { + if (m_Slider == null) + m_Slider = GetComponent(); + } + + private void OnEnable() + { + if (!string.IsNullOrEmpty(m_PreferenceKey)) + SetParameterValue(PlayerPrefs.GetFloat(m_PreferenceKey, m_DefaultValue)); + + if (m_Slider != null) + m_Slider.onValueChanged.AddListener(SetParameterValue); + } + + private void OnDisable() + { + if (m_Slider != null) + m_Slider.onValueChanged.RemoveListener(SetParameterValue); + + if (!string.IsNullOrEmpty(m_PreferenceKey)) + PlayerPrefs.SetFloat(m_PreferenceKey, m_Value); + } + + private void SetParameterValue(float value) + { + // Apply parameter value as a parametric override + if (m_Action != null && m_Action.action != null) + { + var action = m_Action.action; + int bindingIndex = action.FindBindingById(m_BindingId); + var bindingMask = bindingIndex >= 0 ? action.bindings[bindingIndex] : default; + + // We apply parameter override. This directly affects matching processors and interactions + // if they have matching parameters. + foreach (var parameterOverride in m_ParameterOverrides) + action.ApplyParameterOverride(parameterOverride, value, bindingMask); + } + + m_Value = value; + + UpdateDisplayValue(value); + } + + private void UpdateDisplayValue(float value) + { + if (m_Slider != null) + m_Slider.value = Mathf.Clamp(value, m_Slider.minValue, m_Slider.maxValue); + } + } +} diff --git a/Assets/Samples/RebindingUI/RebindActionParameterUI.cs.meta b/Assets/Samples/RebindingUI/RebindActionParameterUI.cs.meta new file mode 100644 index 0000000000..fbf6f6b58a --- /dev/null +++ b/Assets/Samples/RebindingUI/RebindActionParameterUI.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b52b7577d0f9e44e99408e2e11257fd6 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs b/Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs new file mode 100644 index 0000000000..be7f34e2ad --- /dev/null +++ b/Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs @@ -0,0 +1,77 @@ +#if UNITY_EDITOR + +using System; +using UnityEditor; +using UnityEngine; +using UnityEngine.UI; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + /// + /// Allows persisting a parameter override associated with a binding. + /// + [CustomEditor(typeof(RebindActionParameterUI))] + public class RebindActionParameterUIEditor : UnityEditor.Editor + { + protected void OnEnable() + { + m_Binding = new BindingUI(serializedObject); + m_DefaultValueProperty = serializedObject.FindProperty("m_DefaultValue"); + m_PreferenceKeyProperty = serializedObject.FindProperty("m_PreferenceKey"); + m_SliderProperty = serializedObject.FindProperty("m_Slider"); + m_ParameterOverridesProperty = serializedObject.FindProperty("m_ParameterOverrides"); + + Refresh(); + } + + public override void OnInspectorGUI() + { + EditorGUI.BeginChangeCheck(); + + // Binding section. + m_Binding.Draw(); + + // UI section + EditorGUILayout.LabelField("UI"); + using (new EditorGUI.IndentLevelScope()) + { + EditorGUILayout.ObjectField(m_SliderProperty); + } + + // Parameter section. + EditorGUILayout.LabelField("Parameter"); + using (new EditorGUI.IndentLevelScope()) + { + EditorGUILayout.PropertyField(m_PreferenceKeyProperty); + EditorGUILayout.PropertyField(m_DefaultValueProperty); + EditorGUILayout.PropertyField(m_ParameterOverridesProperty, true); + } + + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + Refresh(); + } + } + + private void Refresh() + { + m_Binding.Refresh(); + } + + private struct ParameterValue + { + public string bindingId; + public string name; + } + + private SerializedProperty m_PreferenceKeyProperty; + private SerializedProperty m_DefaultValueProperty; + private SerializedProperty m_SliderProperty; + private SerializedProperty m_ParameterOverridesProperty; + + private BindingUI m_Binding; + } +} + +#endif diff --git a/Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs.meta b/Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs.meta new file mode 100644 index 0000000000..6cbbac349e --- /dev/null +++ b/Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6ae2957a180004e979cb5ae77b2e0f3f \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/RebindActionUI.cs b/Assets/Samples/RebindingUI/RebindActionUI.cs index 3bce3b6068..9b581edd16 100644 --- a/Assets/Samples/RebindingUI/RebindActionUI.cs +++ b/Assets/Samples/RebindingUI/RebindActionUI.cs @@ -182,25 +182,15 @@ public InteractiveRebindEvent stopRebindEvent /// true if able to resolve, otherwise false. public bool ResolveActionAndBinding(out InputAction action, out int bindingIndex) { - bindingIndex = -1; - action = m_Action?.action; - if (action == null) - return false; - if (string.IsNullOrEmpty(m_BindingId)) - return false; + bindingIndex = action.FindBindingById(m_BindingId); + if (bindingIndex >= 0) + return true; - // Look up binding index. - var id = new Guid(m_BindingId); - bindingIndex = action.bindings.IndexOf(x => x.id == id); - if (bindingIndex == -1) - { + if (action != null && !string.IsNullOrEmpty(m_BindingId)) Debug.LogError($"Cannot find binding with ID '{m_BindingId}' on '{action}'", this); - return false; - } - - return true; + return false; } /// @@ -250,6 +240,30 @@ public void ResetToDefault() UpdateBindingDisplay(); } + /// + /// Attempts to swap associated binding of this instance with another instance. + /// + /// It is expected that the other control is of a compatible type. + /// The other instance to swap binding with. + /// true if successfully swapped, else false. + public void SwapBinding(RebindActionUI other) + { + if (this == other) + return; // Silently ignore any request to swap binding with itself + if (ongoingRebind != null || other.ongoingRebind != null) + throw new Exception("Cannot swap bindings when interactive rebinding is ongoing"); + if (!ResolveActionAndBinding(out var action, out var bindingIndex)) + throw new Exception("Failed to resolve action and binding index"); + if (!other.ResolveActionAndBinding(out var otherAction, out var otherBindingIndex)) + throw new Exception("Failed to resolve action and binding index"); + + // Apply binding override to target binding based on swapped effective binding paths. + var effectivePath = action.bindings[bindingIndex].effectivePath; + var otherEffectivePath = otherAction.bindings[otherBindingIndex].effectivePath; + action.ApplyBindingOverride(bindingIndex, otherEffectivePath); + otherAction.ApplyBindingOverride(otherBindingIndex, effectivePath); + } + /// /// Initiate an interactive rebind that lets the player actuate a control to choose a new binding /// for the action. diff --git a/Assets/Samples/RebindingUI/RebindActionUIEditor.cs b/Assets/Samples/RebindingUI/RebindActionUIEditor.cs index 18e4c86532..13875a8247 100644 --- a/Assets/Samples/RebindingUI/RebindActionUIEditor.cs +++ b/Assets/Samples/RebindingUI/RebindActionUIEditor.cs @@ -15,8 +15,6 @@ public class RebindActionUIEditor : UnityEditor.Editor { protected void OnEnable() { - m_ActionProperty = serializedObject.FindProperty("m_Action"); - m_BindingIdProperty = serializedObject.FindProperty("m_BindingId"); m_ActionLabelProperty = serializedObject.FindProperty("m_ActionLabel"); m_BindingTextProperty = serializedObject.FindProperty("m_BindingText"); m_RebindOverlayProperty = serializedObject.FindProperty("m_RebindOverlay"); @@ -27,9 +25,8 @@ protected void OnEnable() m_UpdateBindingUIEventProperty = serializedObject.FindProperty("m_UpdateBindingUIEvent"); m_RebindStartEventProperty = serializedObject.FindProperty("m_RebindStartEvent"); m_RebindStopEventProperty = serializedObject.FindProperty("m_RebindStopEvent"); - m_DisplayStringOptionsProperty = serializedObject.FindProperty("m_DisplayStringOptions"); - RefreshBindingOptions(); + m_BindingUI = new BindingUI(serializedObject); } public override void OnInspectorGUI() @@ -37,28 +34,11 @@ public override void OnInspectorGUI() EditorGUI.BeginChangeCheck(); // Binding section. - EditorGUILayout.LabelField(m_BindingLabel, Styles.boldLabel); - using (new EditorGUI.IndentLevelScope()) - { - EditorGUILayout.PropertyField(m_ActionProperty); - - var newSelectedBinding = EditorGUILayout.Popup(m_BindingLabel, m_SelectedBindingOption, m_BindingOptions); - if (newSelectedBinding != m_SelectedBindingOption) - { - var bindingId = m_BindingOptionValues[newSelectedBinding]; - m_BindingIdProperty.stringValue = bindingId; - m_SelectedBindingOption = newSelectedBinding; - } - - var optionsOld = (InputBinding.DisplayStringOptions)m_DisplayStringOptionsProperty.intValue; - var optionsNew = (InputBinding.DisplayStringOptions)EditorGUILayout.EnumFlagsField(m_DisplayOptionsLabel, optionsOld); - if (optionsOld != optionsNew) - m_DisplayStringOptionsProperty.intValue = (int)optionsNew; - } + m_BindingUI.Draw(); // UI section. EditorGUILayout.Space(); - EditorGUILayout.LabelField(m_UILabel, Styles.boldLabel); + EditorGUILayout.LabelField(m_UILabel); using (new EditorGUI.IndentLevelScope()) { EditorGUILayout.PropertyField(m_ActionLabelProperty); @@ -71,7 +51,7 @@ public override void OnInspectorGUI() // Rebind options section. EditorGUILayout.Space(); - EditorGUILayout.LabelField(m_RebindOptionsLabel, Styles.boldLabel); + EditorGUILayout.LabelField(m_RebindOptionsLabel); using (new EditorGUI.IndentLevelScope()) { EditorGUILayout.PropertyField(m_RebindTimeoutProperty); @@ -79,7 +59,7 @@ public override void OnInspectorGUI() // Events section. EditorGUILayout.Space(); - EditorGUILayout.LabelField(m_EventsLabel, Styles.boldLabel); + EditorGUILayout.LabelField(m_EventsLabel); using (new EditorGUI.IndentLevelScope()) { EditorGUILayout.PropertyField(m_RebindStartEventProperty); @@ -90,80 +70,10 @@ public override void OnInspectorGUI() if (EditorGUI.EndChangeCheck()) { serializedObject.ApplyModifiedProperties(); - RefreshBindingOptions(); + m_BindingUI.Refresh(); } } - protected void RefreshBindingOptions() - { - var actionReference = (InputActionReference)m_ActionProperty.objectReferenceValue; - var action = actionReference?.action; - - if (action == null) - { - m_BindingOptions = new GUIContent[0]; - m_BindingOptionValues = new string[0]; - m_SelectedBindingOption = -1; - return; - } - - var bindings = action.bindings; - var bindingCount = bindings.Count; - - m_BindingOptions = new GUIContent[bindingCount]; - m_BindingOptionValues = new string[bindingCount]; - m_SelectedBindingOption = -1; - - var currentBindingId = m_BindingIdProperty.stringValue; - for (var i = 0; i < bindingCount; ++i) - { - var binding = bindings[i]; - var bindingId = binding.id.ToString(); - var haveBindingGroups = !string.IsNullOrEmpty(binding.groups); - - // If we don't have a binding groups (control schemes), show the device that if there are, for example, - // there are two bindings with the display string "A", the user can see that one is for the keyboard - // and the other for the gamepad. - var displayOptions = - InputBinding.DisplayStringOptions.DontUseShortDisplayNames | InputBinding.DisplayStringOptions.IgnoreBindingOverrides; - if (!haveBindingGroups) - displayOptions |= InputBinding.DisplayStringOptions.DontOmitDevice; - - // Create display string. - var displayString = action.GetBindingDisplayString(i, displayOptions); - - // If binding is part of a composite, include the part name. - if (binding.isPartOfComposite) - displayString = $"{ObjectNames.NicifyVariableName(binding.name)}: {displayString}"; - - // Some composites use '/' as a separator. When used in popup, this will lead to to submenus. Prevent - // by instead using a backlash. - displayString = displayString.Replace('/', '\\'); - - // If the binding is part of control schemes, mention them. - if (haveBindingGroups) - { - var asset = action.actionMap?.asset; - if (asset != null) - { - var controlSchemes = string.Join(", ", - binding.groups.Split(InputBinding.Separator) - .Select(x => asset.controlSchemes.FirstOrDefault(c => c.bindingGroup == x).name)); - - displayString = $"{displayString} ({controlSchemes})"; - } - } - - m_BindingOptions[i] = new GUIContent(displayString); - m_BindingOptionValues[i] = bindingId; - - if (currentBindingId == bindingId) - m_SelectedBindingOption = i; - } - } - - private SerializedProperty m_ActionProperty; - private SerializedProperty m_BindingIdProperty; private SerializedProperty m_ActionLabelProperty; private SerializedProperty m_BindingTextProperty; private SerializedProperty m_RebindOverlayProperty; @@ -174,21 +84,11 @@ protected void RefreshBindingOptions() private SerializedProperty m_RebindStartEventProperty; private SerializedProperty m_RebindStopEventProperty; private SerializedProperty m_UpdateBindingUIEventProperty; - private SerializedProperty m_DisplayStringOptionsProperty; - private GUIContent m_BindingLabel = new GUIContent("Binding"); - private GUIContent m_DisplayOptionsLabel = new GUIContent("Display Options"); private GUIContent m_UILabel = new GUIContent("UI"); private GUIContent m_RebindOptionsLabel = new GUIContent("Rebind Options"); private GUIContent m_EventsLabel = new GUIContent("Events"); - private GUIContent[] m_BindingOptions; - private string[] m_BindingOptionValues; - private int m_SelectedBindingOption; - - private static class Styles - { - public static GUIStyle boldLabel = new GUIStyle("MiniBoldLabel"); - } + private BindingUI m_BindingUI; } } #endif diff --git a/Assets/Samples/RebindingUI/RebindSaveLoad.cs b/Assets/Samples/RebindingUI/RebindSaveLoad.cs index c94fe6f74e..968877cb76 100644 --- a/Assets/Samples/RebindingUI/RebindSaveLoad.cs +++ b/Assets/Samples/RebindingUI/RebindSaveLoad.cs @@ -3,21 +3,79 @@ namespace UnityEngine.InputSystem.Samples.RebindUI { + /// + /// Handles persisting binding overrides which implies that customizations of controls will be persisted + /// between runs. + /// public class RebindSaveLoad : MonoBehaviour { + [Tooltip("The associated input action asset to be serialized to player preferences (Required).")] public InputActionAsset actions; - public void OnEnable() + [Tooltip("The player preference key to be used when serializing binding overrides to player preferences (Required).")] + public string playerPreferenceKey; + + [Tooltip("Specifies whether to load and apply binding overrides when the component is enabled")] + public bool loadOnEnable = true; + + [Tooltip("Specifies whether to save binding overrides when the component is disabled")] + public bool saveOnDisable = true; + + /// + /// Loads binding overrides from player preferences and applies them to the associated input action asset. + /// + public void Load() { - var rebinds = PlayerPrefs.GetString("rebinds"); - if (!string.IsNullOrEmpty(rebinds)) - actions.LoadBindingOverridesFromJson(rebinds); + if (!IsValidConfiguration()) + return; + + var rebinds = PlayerPrefs.GetString(playerPreferenceKey); + if (string.IsNullOrEmpty(rebinds)) + return; // OK, we may not have saved any binding overrides yet. + + actions.LoadBindingOverridesFromJson(rebinds); } - public void OnDisable() + /// + /// Saves binding overrides from the associated input action asset and persists them to player preferences. + /// + public void Save() { + if (!IsValidConfiguration()) + return; + var rebinds = actions.SaveBindingOverridesAsJson(); - PlayerPrefs.SetString("rebinds", rebinds); + PlayerPrefs.SetString(playerPreferenceKey, rebinds); + } + + private void OnEnable() + { + if (loadOnEnable) + Load(); + } + + private void OnDisable() + { + if (saveOnDisable) + Save(); + } + + private bool IsValidConfiguration() + { + if (actions == null) + { + Debug.LogWarning("Unable to apply binding overrides from player preferences without an associated " + + "action asset."); + return false; + } + + if (string.IsNullOrEmpty(playerPreferenceKey)) + { + Debug.LogWarning("Unable to load binding overrides from player preferences without a key"); + return false; + } + + return true; } } } diff --git a/Assets/Samples/RebindingUI/RebindUISampleActions.inputactions b/Assets/Samples/RebindingUI/RebindUISampleActions.inputactions index 2cf39cb8ba..24cd0138f9 100644 --- a/Assets/Samples/RebindingUI/RebindUISampleActions.inputactions +++ b/Assets/Samples/RebindingUI/RebindUISampleActions.inputactions @@ -115,7 +115,7 @@ "id": "d540edf6-bfaa-4b08-b8d5-925398a2debe", "path": "/rightStick", "interactions": "", - "processors": "ScaleVector2", + "processors": "", "groups": "Gamepad", "action": "Look", "isComposite": false, diff --git a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity index 621d1b5c14..637ffc785c 100644 --- a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity +++ b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity @@ -13,7 +13,7 @@ OcclusionCullingSettings: --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 10 + serializedVersion: 9 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -42,8 +42,8 @@ RenderSettings: --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 13 - m_BakeOnSceneLoad: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -66,6 +66,9 @@ LightmapSettings: m_LightmapParameters: {fileID: 0} m_LightmapsBakeMode: 1 m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 m_ReflectionCompression: 2 m_MixedBakeMode: 2 m_BakeBackend: 1 @@ -441,7 +444,7 @@ MonoBehaviour: m_EditorClassIdentifier: menu: {fileID: 508436405} actions: {fileID: -944628639613478452, guid: 7dead05c54ca85b4681351aafd8bd03a, type: 3} - enableUIActionsDuringGameplay: 0 + enableUIActionsDuringGameplay: 1 gameplayManager: {fileID: 51853247} gameUI: {fileID: 5139312} --- !u!114 &51853246 @@ -457,6 +460,9 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: actions: {fileID: -944628639613478452, guid: 7dead05c54ca85b4681351aafd8bd03a, type: 3} + playerPreferenceKey: rebinds + loadOnEnable: 1 + saveOnDisable: 1 --- !u!114 &51853247 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1055,10 +1061,10 @@ MonoBehaviour: m_FillRect: {fileID: 685041075} m_HandleRect: {fileID: 1063908417} m_Direction: 0 - m_MinValue: 0 - m_MaxValue: 1 + m_MinValue: 0.5 + m_MaxValue: 2.5 m_WholeNumbers: 0 - m_Value: 0.5 + m_Value: 1 m_OnValueChanged: m_PersistentCalls: m_Calls: [] @@ -1893,11 +1899,11 @@ RectTransform: m_Children: - {fileID: 356416661} - {fileID: 331853782} + - {fileID: 725406578} - {fileID: 720160215} - {fileID: 982377776} - {fileID: 852899507} - {fileID: 67962920} - - {fileID: 1014357782} m_Father: {fileID: 1820892250} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 1} @@ -2144,7 +2150,7 @@ MonoBehaviour: m_HorizontalOverflow: 0 m_VerticalOverflow: 0 m_LineSpacing: 1 - m_Text: Sensitivity + m_Text: Look Sensitivity --- !u!222 &674949963 CanvasRenderer: m_ObjectHideFlags: 0 @@ -2186,7 +2192,7 @@ RectTransform: m_Father: {fileID: 785347010} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0.5, y: 1} + m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 10, y: 0} m_Pivot: {x: 0.5, y: 0.5} @@ -2437,6 +2443,141 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: cc11d99b1a6682f4cbc4aba1fcd9ac5d, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &725406577 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 725406578} + - component: {fileID: 725406581} + - component: {fileID: 725406580} + - component: {fileID: 725406579} + m_Layer: 5 + m_Name: Swap + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &725406578 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 725406577} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1737030749} + m_Father: {fileID: 589143015} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: -23.19, y: 325.5} + m_SizeDelta: {x: 19.4, y: 17.7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &725406579 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 725406577} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 0.25, g: 0.3071429, b: 0.45, a: 1} + m_HighlightedColor: {r: 0.36173913, g: 0.4408696, b: 0.65, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.8679245, g: 0.4550042, b: 0.045033824, a: 1} + m_DisabledColor: {r: 0.21960784, g: 0.21960784, b: 0.25882354, a: 1} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 725406580} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1627715299} + m_TargetAssemblyTypeName: UnityEngine.InputSystem.Samples.RebindUI.RebindActionUI, + Unity.InputSystem.RebindingUI + m_MethodName: SwapBinding + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 720160216} + m_ObjectArgumentAssemblyTypeName: UnityEngine.InputSystem.Samples.RebindUI.RebindActionUI, + Unity.InputSystem.RebindingUI + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &725406580 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 725406577} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &725406581 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 725406577} + m_CullTransparentMesh: 0 --- !u!1001 &736025223 PrefabInstance: m_ObjectHideFlags: 0 @@ -3238,7 +3379,7 @@ Canvas: m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 m_VertexColorAlwaysGammaSpace: 0 - m_AdditionalShaderChannelsFlag: 0 + m_AdditionalShaderChannelsFlag: 25 m_UpdateRectTransformForStandalone: 0 m_SortingLayerID: 0 m_SortingOrder: 0 @@ -3261,6 +3402,7 @@ RectTransform: - {fileID: 1106689462} - {fileID: 5139313} - {fileID: 2040634063} + - {fileID: 1628222610} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -3878,7 +4020,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1003189950} m_CullTransparentMesh: 0 ---- !u!1 &1014357781 +--- !u!1 &1044043760 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3886,78 +4028,131 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1014357782} - - component: {fileID: 1014357784} - - component: {fileID: 1014357783} + - component: {fileID: 1044043761} + - component: {fileID: 1044043764} + - component: {fileID: 1044043763} + - component: {fileID: 1044043762} m_Layer: 5 - m_Name: Help + m_Name: Resume m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1014357782 +--- !u!224 &1044043761 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1014357781} + m_GameObject: {fileID: 1044043760} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 589143015} + m_Children: + - {fileID: 1853629578} + m_Father: {fileID: 1820892250} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 50, y: -140} - m_SizeDelta: {x: 175, y: 110} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 0, y: 32.9} + m_SizeDelta: {x: 150, y: 30} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1014357783 +--- !u!114 &1044043762 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1014357781} + m_GameObject: {fileID: 1044043760} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 0.25, g: 0.3071429, b: 0.45, a: 1} + m_HighlightedColor: {r: 0.36173913, g: 0.4408696, b: 0.65, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.8679245, g: 0.4550042, b: 0.045033824, a: 1} + m_DisabledColor: {r: 0.21960784, g: 0.21960784, b: 0.25882354, a: 1} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1044043763} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 51853245} + m_TargetAssemblyTypeName: UnityEngine.InputSystem.Samples.RebindUI.RebindUIGameManager, + Unity.InputSystem.RebindingUI + m_MethodName: ToggleMenu + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1044043763 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1044043760} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.6666667, g: 0.73333335, b: 0.8, a: 1} - m_RaycastTarget: 0 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 13 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 178 - m_Alignment: 0 - m_AlignByGeometry: 1 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 1 - m_LineSpacing: 1 - m_Text: In practice, you probably don't want to set up rebinding the sticks like - this on a gamepad scheme but rather have a "swap sticks" kind of toggle instead. - The stick bindings here are included mainly for demonstration purposes. ---- !u!222 &1014357784 + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1044043764 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1014357781} + m_GameObject: {fileID: 1044043760} m_CullTransparentMesh: 0 --- !u!1 &1063908416 GameObject: @@ -3991,8 +4186,8 @@ RectTransform: m_Children: [] m_Father: {fileID: 2052415375} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0} - m_AnchorMax: {x: 0.5, y: 1} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 20, y: 0} m_Pivot: {x: 0.5, y: 0.5} @@ -4646,7 +4841,7 @@ PrefabInstance: - target: {fileID: 690190895482579582, guid: f25dcd618d3acd64795bf8bb32edb6c9, type: 3} propertyPath: m_Text - value: Escape + value: Esc objectReference: {fileID: 0} - target: {fileID: 6680292650503350822, guid: f25dcd618d3acd64795bf8bb32edb6c9, type: 3} @@ -4986,13 +5181,15 @@ GameObject: m_Component: - component: {fileID: 1214352211} - component: {fileID: 1214352212} + - component: {fileID: 1214352214} + - component: {fileID: 1214352213} m_Layer: 5 m_Name: Sensitivity m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &1214352211 RectTransform: m_ObjectHideFlags: 0 @@ -5006,13 +5203,13 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 674949961} - - {fileID: 1424978755} - {fileID: 244172484} + - {fileID: 1424978755} m_Father: {fileID: 1219085456} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 430, y: -350} + m_AnchoredPosition: {x: 430, y: -150} m_SizeDelta: {x: 1345.7778, y: 757} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &1214352212 @@ -5023,90 +5220,79 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1214352210} m_CullTransparentMesh: 1 ---- !u!1 &1219085455 -GameObject: +--- !u!114 &1214352213 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1219085456} - - component: {fileID: 1219085458} - - component: {fileID: 1219085457} - m_Layer: 5 - m_Name: Keyboard - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1219085456 -RectTransform: + m_GameObject: {fileID: 1214352210} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b52b7577d0f9e44e99408e2e11257fd6, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.InputSystem.RebindingUI::UnityEngine.InputSystem.Samples.RebindUI.RebindActionParameterUI + m_Action: {fileID: 4485540969121359642, guid: 7dead05c54ca85b4681351aafd8bd03a, + type: 3} + m_BindingId: 7c03e976-d9da-4d96-9bcd-622e98b0f3c3 + m_PreferenceKey: lookSensitivity + m_DefaultValue: 1 + m_Slider: {fileID: 244172485} + m_ParameterOverrides: + - scaleVector2:x + - scaleVector2:y +--- !u!114 &1214352214 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1219085455} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1880645689} - - {fileID: 1414988296} - - {fileID: 16074951} - - {fileID: 1099885700} - - {fileID: 825336766} - - {fileID: 1199058183} - - {fileID: 1214352211} - - {fileID: 1237134518} - m_Father: {fileID: 1820892250} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 1} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: -215, y: -271.1} - m_SizeDelta: {x: 430, y: 450} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1219085457 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1219085455} - m_Enabled: 0 + m_GameObject: {fileID: 1214352210} + m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.13725491, g: 0.16862746, b: 0.24705882, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Slider + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 0} + m_FillRect: {fileID: 0} + m_HandleRect: {fileID: 0} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 1 + m_WholeNumbers: 0 + m_Value: 0 + m_OnValueChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1219085458 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1219085455} - m_CullTransparentMesh: 0 ---- !u!1 &1237134517 +--- !u!1 &1219085455 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5114,78 +5300,79 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1237134518} - - component: {fileID: 1237134520} - - component: {fileID: 1237134519} + - component: {fileID: 1219085456} + - component: {fileID: 1219085458} + - component: {fileID: 1219085457} m_Layer: 5 - m_Name: Help + m_Name: Keyboard m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1237134518 +--- !u!224 &1219085456 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1237134517} + m_GameObject: {fileID: 1219085455} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1219085456} + m_Children: + - {fileID: 1880645689} + - {fileID: 1414988296} + - {fileID: 16074951} + - {fileID: 1099885700} + - {fileID: 825336766} + - {fileID: 1199058183} + - {fileID: 1214352211} + m_Father: {fileID: 1820892250} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: -50, y: -140} - m_SizeDelta: {x: 175, y: 110} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: -215, y: -271.1} + m_SizeDelta: {x: 430, y: 450} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1237134519 +--- !u!114 &1219085457 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1237134517} - m_Enabled: 1 + m_GameObject: {fileID: 1219085455} + m_Enabled: 0 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.6666667, g: 0.73333335, b: 0.8, a: 1} - m_RaycastTarget: 0 + m_Color: {r: 0.13725491, g: 0.16862746, b: 0.24705882, a: 1} + m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 13 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 1 - m_MaxSize: 40 - m_Alignment: 0 - m_AlignByGeometry: 1 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 1 - m_LineSpacing: 1 - m_Text: It is up to you whether to do something like e.g. WASD as a single composite - like to the right (in which case the individual parts will get assigned one after - the other) or as four separate partial bindings. ---- !u!222 &1237134520 + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1219085458 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1237134517} + m_GameObject: {fileID: 1219085455} m_CullTransparentMesh: 0 --- !u!224 &1311197229 stripped RectTransform: @@ -5306,8 +5493,9 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 1414988297} - m_TargetAssemblyTypeName: + - m_Target: {fileID: 1214352213} + m_TargetAssemblyTypeName: UnityEngine.InputSystem.Samples.RebindUI.RebindActionParameterUI, + Unity.InputSystem.RebindingUI m_MethodName: ResetToDefault m_Mode: 1 m_Arguments: @@ -5447,6 +5635,64 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: cc11d99b1a6682f4cbc4aba1fcd9ac5d, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &1492503863 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1492503865} + - component: {fileID: 1492503864} + m_Layer: 0 + m_Name: Stick + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1492503864 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1492503863} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5514b68a2410f4ab8a2e19c8b963b6f3, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.InputSystem.RebindingUI::UnityEngine.InputSystem.Samples.RebindUI.CustomOnScreenControl + m_Shape: 0 + m_NormalizedBounds: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_ControlPath: + m_Curve: 0 + m_StickRadiusMillimeters: 7.2 +--- !u!224 &1492503865 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1492503863} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1582852134 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 6680292650503350826, guid: f25dcd618d3acd64795bf8bb32edb6c9, @@ -5820,8 +6066,9 @@ Light: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1618329838} m_Enabled: 1 - serializedVersion: 11 + serializedVersion: 10 m_Type: 1 + m_Shape: 0 m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} m_Intensity: 1 m_Range: 10 @@ -5871,12 +6118,8 @@ Light: m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} m_UseBoundingSphereOverride: 0 m_UseViewFrustumForShadowCasterCull: 1 - m_ForceVisible: 0 m_ShadowRadius: 0 m_ShadowAngle: 0 - m_LightUnit: 1 - m_LuxAtDistance: 1 - m_EnableSpotReflector: 1 --- !u!4 &1618329840 Transform: m_ObjectHideFlags: 0 @@ -6063,7 +6306,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} m_AnchorMax: {x: 0.5, y: 0} - m_AnchoredPosition: {x: 0, y: 32.9} + m_AnchoredPosition: {x: 0, y: 70} m_SizeDelta: {x: 150, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1622482957 @@ -6240,6 +6483,19 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 + - m_Target: {fileID: 1214352213} + m_TargetAssemblyTypeName: UnityEngine.InputSystem.Samples.RebindUI.RebindActionParameterUI, + Unity.InputSystem.RebindingUI + m_MethodName: ResetToDefault + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 --- !u!114 &1622482958 MonoBehaviour: m_ObjectHideFlags: 0 @@ -6290,6 +6546,153 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: cc11d99b1a6682f4cbc4aba1fcd9ac5d, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &1628222609 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1628222610} + - component: {fileID: 1628222613} + - component: {fileID: 1628222612} + - component: {fileID: 1628222611} + - component: {fileID: 1628222614} + m_Layer: 5 + m_Name: Menu + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1628222610 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628222609} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2095398991} + m_Father: {fileID: 861395295} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -30, y: -30} + m_SizeDelta: {x: 30, y: 30} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1628222611 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628222609} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 0.25, g: 0.3071429, b: 0.45, a: 1} + m_HighlightedColor: {r: 0.36173913, g: 0.4408696, b: 0.65, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.8679245, g: 0.4550042, b: 0.045033824, a: 1} + m_DisabledColor: {r: 0.21960784, g: 0.21960784, b: 0.25882354, a: 1} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1628222612} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 51853245} + m_TargetAssemblyTypeName: UnityEngine.InputSystem.Samples.RebindUI.RebindUIGameManager, + Unity.InputSystem.RebindingUI + m_MethodName: ToggleMenu + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 +--- !u!114 &1628222612 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628222609} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1628222613 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628222609} + m_CullTransparentMesh: 0 +--- !u!114 &1628222614 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628222609} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d629571aa8e184bd3b6d1e6cb1bf2116, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.InputSystem.RebindingUI::RequireTouchscreen --- !u!1 &1648186665 GameObject: m_ObjectHideFlags: 0 @@ -6591,6 +6994,85 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: cc11d99b1a6682f4cbc4aba1fcd9ac5d, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &1737030748 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1737030749} + - component: {fileID: 1737030751} + - component: {fileID: 1737030750} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1737030749 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1737030748} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 725406578} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0.4999999, y: 0.5} + m_SizeDelta: {x: -1.0000002, y: 1} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1737030750 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1737030748} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8901961, g: 0.8901961, b: 0.8901961, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "\u21C5" +--- !u!222 &1737030751 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1737030748} + m_CullTransparentMesh: 0 --- !u!1 &1801770802 GameObject: m_ObjectHideFlags: 0 @@ -6704,6 +7186,7 @@ RectTransform: - {fileID: 1219085456} - {fileID: 589143015} - {fileID: 1622482956} + - {fileID: 1044043761} m_Father: {fileID: 508436406} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} @@ -7017,6 +7500,85 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1836782273} m_CullTransparentMesh: 0 +--- !u!1 &1853629577 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1853629578} + - component: {fileID: 1853629580} + - component: {fileID: 1853629579} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1853629578 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1853629577} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1044043761} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1853629579 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1853629577} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8901961, g: 0.8901961, b: 0.8901961, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Resume Game +--- !u!222 &1853629580 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1853629577} + m_CullTransparentMesh: 0 --- !u!1001 &1855225027 PrefabInstance: m_ObjectHideFlags: 0 @@ -7035,6 +7597,11 @@ PrefabInstance: propertyPath: m_Name value: LookRebind objectReference: {fileID: 0} + - target: {fileID: 6680292650503350822, guid: f25dcd618d3acd64795bf8bb32edb6c9, + type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} - target: {fileID: 6680292650503350825, guid: f25dcd618d3acd64795bf8bb32edb6c9, type: 3} propertyPath: m_Pivot.x @@ -7593,6 +8160,85 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: cc11d99b1a6682f4cbc4aba1fcd9ac5d, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &2095398990 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2095398991} + - component: {fileID: 2095398993} + - component: {fileID: 2095398992} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2095398991 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2095398990} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1628222610} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2095398992 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2095398990} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8901961, g: 0.8901961, b: 0.8901961, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "\u2630" +--- !u!222 &2095398993 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2095398990} + m_CullTransparentMesh: 0 --- !u!1001 &965552502757445288 PrefabInstance: m_ObjectHideFlags: 0 @@ -7712,6 +8358,11 @@ PrefabInstance: propertyPath: m_Name value: KeyboardMenu objectReference: {fileID: 0} + - target: {fileID: 5069869388558284848, guid: a6b634f465c284d30ac5a7dd706644da, + type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} - target: {fileID: 7131517231734196562, guid: a6b634f465c284d30ac5a7dd706644da, type: 3} propertyPath: m_FontData.m_FontStyle @@ -8097,3 +8748,4 @@ SceneRoots: - {fileID: 861395295} - {fileID: 780148237} - {fileID: 51853244} + - {fileID: 1492503865} diff --git a/Assets/Samples/RebindingUI/RequireTouchscreen.cs b/Assets/Samples/RebindingUI/RequireTouchscreen.cs new file mode 100644 index 0000000000..800e848ca1 --- /dev/null +++ b/Assets/Samples/RebindingUI/RequireTouchscreen.cs @@ -0,0 +1,37 @@ +using System; +using UnityEngine; +using UnityEngine.InputSystem; + +/// +/// A simple utility script that disables/enables its associated GameObject based on the presence of a Touchscreen +/// device. +/// +public class RequireTouchscreen : MonoBehaviour +{ + private void OnEnable() + { + InputSystem.onDeviceChange += OnDeviceChanged; + UpdateState(); + } + + private void OnDisable() + { + UpdateState(); + InputSystem.onDeviceChange -= OnDeviceChanged; + } + + private void OnDeviceChanged(InputDevice device, InputDeviceChange change) + { + UpdateState(); + } + + private void UpdateState() + { + var touchscreenIsPresent = Touchscreen.current != null; + var activeInHierarchy = gameObject.activeInHierarchy || gameObject.activeSelf; + if (activeInHierarchy && !touchscreenIsPresent) + gameObject.SetActive(false); + else if (!activeInHierarchy && touchscreenIsPresent) + gameObject.SetActive(true); + } +} diff --git a/Assets/Samples/RebindingUI/RequireTouchscreen.cs.meta b/Assets/Samples/RebindingUI/RequireTouchscreen.cs.meta new file mode 100644 index 0000000000..a10f52e960 --- /dev/null +++ b/Assets/Samples/RebindingUI/RequireTouchscreen.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d629571aa8e184bd3b6d1e6cb1bf2116 \ No newline at end of file diff --git a/Packages/com.unity.inputsystem/CHANGELOG.md b/Packages/com.unity.inputsystem/CHANGELOG.md index a691fdd3c9..90995e48c5 100644 --- a/Packages/com.unity.inputsystem/CHANGELOG.md +++ b/Packages/com.unity.inputsystem/CHANGELOG.md @@ -16,6 +16,7 @@ however, it has to be formatted properly to pass verification tests. ### Changed - Expanded `RebindingUISample` to include a "game mode" state and a "menu state" to be more similar to a real game. Also added action-performed indicators (`InputActionIndicator`) illustrating when actions get triggered. +- Extended `RebindingUISample` to include example of mouse sensitivity slider and "swap controls" example. ### Added - Exposed MediaPlayPause, MediaRewind, MediaForward keys on Keyboard.