From bb3838941fd654ee7e0e2d4919b430c2a13e975d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Mon, 22 Sep 2025 17:22:27 +0200 Subject: [PATCH 01/22] Added "swap controls" button to rebinding sample to allow swapping left and right sticks. --- Assets/Samples/RebindingUI/RebindActionUI.cs | 25 ++ .../RebindingUI/RebindingUISampleScene.unity | 217 +++++++++++++++++- 2 files changed, 241 insertions(+), 1 deletion(-) diff --git a/Assets/Samples/RebindingUI/RebindActionUI.cs b/Assets/Samples/RebindingUI/RebindActionUI.cs index 3bce3b6068..3efd2762dd 100644 --- a/Assets/Samples/RebindingUI/RebindActionUI.cs +++ b/Assets/Samples/RebindingUI/RebindActionUI.cs @@ -250,6 +250,31 @@ 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 Swap(RebindActionUI other) + { + if (this == other) + return; // Silently ignore any request to swap binding with itself + if (ongoingRebind != null || other.ongoingRebind != null) + return; // Do not allow swapping with ongoing rebinding . + + 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 + var path = action.bindings[bindingIndex].path; + var otherPath = otherAction.bindings[otherBindingIndex].path; + action.ApplyBindingOverride(bindingIndex, otherPath); + otherAction.ApplyBindingOverride(otherBindingIndex, path); + } + /// /// 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/RebindingUISampleScene.unity b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity index 621d1b5c14..8322dcb9b0 100644 --- a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity +++ b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity @@ -1893,6 +1893,7 @@ RectTransform: m_Children: - {fileID: 356416661} - {fileID: 331853782} + - {fileID: 725406578} - {fileID: 720160215} - {fileID: 982377776} - {fileID: 852899507} @@ -2437,6 +2438,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: Swap + 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 @@ -3895,7 +4031,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &1014357782 RectTransform: m_ObjectHideFlags: 0 @@ -6591,6 +6727,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 From a66c81986166ec17f6002301e5838574c2e0c247 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Mon, 22 Sep 2025 20:50:37 +0200 Subject: [PATCH 02/22] Fixed a problem with previous swap bindings preventing multiple swaps in a row --- Assets/Samples/RebindingUI/RebindActionUI.cs | 15 +++++++-------- .../RebindingUI/RebindingUISampleScene.unity | 10 +++++----- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Assets/Samples/RebindingUI/RebindActionUI.cs b/Assets/Samples/RebindingUI/RebindActionUI.cs index 3efd2762dd..e80a8835ec 100644 --- a/Assets/Samples/RebindingUI/RebindActionUI.cs +++ b/Assets/Samples/RebindingUI/RebindActionUI.cs @@ -256,23 +256,22 @@ public void ResetToDefault() /// 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 Swap(RebindActionUI other) + public void SwapBinding(RebindActionUI other) { if (this == other) return; // Silently ignore any request to swap binding with itself if (ongoingRebind != null || other.ongoingRebind != null) - return; // Do not allow swapping with ongoing rebinding . - + 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 - var path = action.bindings[bindingIndex].path; - var otherPath = otherAction.bindings[otherBindingIndex].path; - action.ApplyBindingOverride(bindingIndex, otherPath); - otherAction.ApplyBindingOverride(otherBindingIndex, path); + // 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); } /// diff --git a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity index 8322dcb9b0..4322a043e5 100644 --- a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity +++ b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity @@ -2524,7 +2524,7 @@ MonoBehaviour: - m_Target: {fileID: 1627715299} m_TargetAssemblyTypeName: UnityEngine.InputSystem.Samples.RebindUI.RebindActionUI, Unity.InputSystem.RebindingUI - m_MethodName: Swap + m_MethodName: SwapBinding m_Mode: 2 m_Arguments: m_ObjectArgument: {fileID: 720160216} @@ -4031,7 +4031,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &1014357782 RectTransform: m_ObjectHideFlags: 0 @@ -4084,9 +4084,9 @@ MonoBehaviour: 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. + 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. + \n\nHere we do both variants for demonstration purposes." --- !u!222 &1014357784 CanvasRenderer: m_ObjectHideFlags: 0 From ba19e190aa91d4d9ef036d7cc1a9c7546aa959a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Tue, 23 Sep 2025 07:52:29 +0200 Subject: [PATCH 03/22] Improved RebindSaveLoad to allow reuse, added embryo of RebindBindingParameter to enable mouse sensitivity setting. --- .../RebindingUI/RebindBindingParameter.cs | 94 +++++++++++++++++++ .../RebindBindingParameter.cs.meta | 2 + Assets/Samples/RebindingUI/RebindSaveLoad.cs | 66 ++++++++++++- .../RebindUISampleActions.inputactions | 2 +- .../RebindingUI/RebindingUISampleScene.unity | 34 ++++++- 5 files changed, 189 insertions(+), 9 deletions(-) create mode 100644 Assets/Samples/RebindingUI/RebindBindingParameter.cs create mode 100644 Assets/Samples/RebindingUI/RebindBindingParameter.cs.meta diff --git a/Assets/Samples/RebindingUI/RebindBindingParameter.cs b/Assets/Samples/RebindingUI/RebindBindingParameter.cs new file mode 100644 index 0000000000..ef3fffaa79 --- /dev/null +++ b/Assets/Samples/RebindingUI/RebindBindingParameter.cs @@ -0,0 +1,94 @@ +using System; +using UnityEngine; +using UnityEngine.InputSystem; +using UnityEngine.InputSystem.Processors; +using UnityEngine.UI; + +public class RebindBindingParameter : MonoBehaviour +{ + /// + /// Reference to the action that is to be rebound. + /// + public InputActionReference actionReference + { + get => m_Action; + set + { + m_Action = value; + } + } + + [Tooltip("Reference to action that holds the parameter to be .")] + [SerializeField] + private InputActionReference m_Action; + + private Slider m_Slider; + + void Awake() + { + m_Slider = GetComponent(); + // TODO How to we register an event listener? + } + + public void ResetToDefault() + { + } + + // Start is called once before the first execution of Update after the MonoBehaviour is created + void Start() + { + //m_Action.action.processors + } + + // Update is called once per frame + void Update() + { + } + + private void OnEnable() + { + if (TryGetParameterValue(m_ParameterName, out var value)) + m_Slider.value = value; + } + + private string m_ParameterName = "x"; + + private bool TryGetParameterValue(string name, out float value) + { + if (m_Action != null) + { + //var k = m_Action.action.GetParameterValue((ScaleVector2Processor p) => p.x); + + var v = m_Action.action.GetParameterValue("x"); + if (v.HasValue) + { + var val = v.Value; + if (val.type == TypeCode.Single) + { + value = val.ToSingle(); + return true; + } + } + } + + value = default; + return false; + } + + private void SetParameterValue(float value) + { + if (!Mathf.Approximately(m_Slider.value, value)) + m_Slider.value = value; + if (m_Action != null) + m_Action.action.ApplyParameterOverride(m_ParameterName, value); + } + + private void UpdateDisplayValue() + { + if (m_Action == null) return; + if (m_Action.action == null) return; + var parameterValue = m_Action.action.GetParameterValue("x"); + if (parameterValue != null) + m_Slider.value = parameterValue.Value.ToSingle(); + } +} diff --git a/Assets/Samples/RebindingUI/RebindBindingParameter.cs.meta b/Assets/Samples/RebindingUI/RebindBindingParameter.cs.meta new file mode 100644 index 0000000000..fbf6f6b58a --- /dev/null +++ b/Assets/Samples/RebindingUI/RebindBindingParameter.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b52b7577d0f9e44e99408e2e11257fd6 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/RebindSaveLoad.cs b/Assets/Samples/RebindingUI/RebindSaveLoad.cs index c94fe6f74e..acc5ef1400 100644 --- a/Assets/Samples/RebindingUI/RebindSaveLoad.cs +++ b/Assets/Samples/RebindingUI/RebindSaveLoad.cs @@ -3,21 +3,77 @@ namespace UnityEngine.InputSystem.Samples.RebindUI { + /// + /// Handles persisting binding overrides which implies that customizations of controls will be persisted + /// between runs. + /// public class RebindSaveLoad : MonoBehaviour { + /// + /// The associated input action asset (Required). + /// + [Tooltip("The associated input action asset to be serialized to player preferences (Required).")] public InputActionAsset actions; - public void OnEnable() + /// + /// The associated player preference key. + /// + [Tooltip("The player preference key to be used when serializing binding overrides to player preferences (Required).")] + public string playerPreferenceKey; + + /// + /// Loads binding overrides from player preferences and applies them to the associated input action asset. + /// + public void Load() { + if (!IsValidConfiguration()) + return; + var rebinds = PlayerPrefs.GetString("rebinds"); - if (!string.IsNullOrEmpty(rebinds)) - actions.LoadBindingOverridesFromJson(rebinds); + 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() + { + Load(); + } + + private void OnDisable() + { + 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..3d01b00112 100644 --- a/Assets/Samples/RebindingUI/RebindUISampleActions.inputactions +++ b/Assets/Samples/RebindingUI/RebindUISampleActions.inputactions @@ -126,7 +126,7 @@ "id": "7c03e976-d9da-4d96-9bcd-622e98b0f3c3", "path": "/delta", "interactions": "", - "processors": "ScaleVector2", + "processors": "ScaleVector2(x=1.5,y=1.5)", "groups": "Keyboard", "action": "Look", "isComposite": false, diff --git a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity index 4322a043e5..b816b3e059 100644 --- a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity +++ b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity @@ -457,6 +457,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: actions: {fileID: -944628639613478452, guid: 7dead05c54ca85b4681351aafd8bd03a, type: 3} + playerPreferenceKey: rebinds --- !u!114 &51853247 MonoBehaviour: m_ObjectHideFlags: 0 @@ -982,6 +983,7 @@ GameObject: m_Component: - component: {fileID: 244172484} - component: {fileID: 244172485} + - component: {fileID: 244172486} m_Layer: 5 m_Name: Slider m_TagString: Untagged @@ -1061,7 +1063,33 @@ MonoBehaviour: m_Value: 0.5 m_OnValueChanged: m_PersistentCalls: - m_Calls: [] + m_Calls: + - m_Target: {fileID: 244172483} + m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_MethodName: + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &244172486 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 244172483} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b52b7577d0f9e44e99408e2e11257fd6, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.InputSystem.RebindingUI::RebindBindingParameter + m_Action: {fileID: 4485540969121359642, guid: 7dead05c54ca85b4681351aafd8bd03a, + type: 3} --- !u!1 &303988305 GameObject: m_ObjectHideFlags: 0 @@ -5142,8 +5170,8 @@ 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} @@ -5442,7 +5470,7 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 1414988297} + - m_Target: {fileID: 244172483} m_TargetAssemblyTypeName: m_MethodName: ResetToDefault m_Mode: 1 From c0720c199ff56d41137b2113df9074cd82c79b5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Tue, 23 Sep 2025 07:58:38 +0200 Subject: [PATCH 04/22] Made load/save configurable on RebindSaveLoad component. --- Assets/Samples/RebindingUI/RebindSaveLoad.cs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Assets/Samples/RebindingUI/RebindSaveLoad.cs b/Assets/Samples/RebindingUI/RebindSaveLoad.cs index acc5ef1400..0db3db0f52 100644 --- a/Assets/Samples/RebindingUI/RebindSaveLoad.cs +++ b/Assets/Samples/RebindingUI/RebindSaveLoad.cs @@ -9,18 +9,18 @@ namespace UnityEngine.InputSystem.Samples.RebindUI /// public class RebindSaveLoad : MonoBehaviour { - /// - /// The associated input action asset (Required). - /// [Tooltip("The associated input action asset to be serialized to player preferences (Required).")] public InputActionAsset actions; - /// - /// The associated player preference key. - /// [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. /// @@ -50,12 +50,14 @@ public void Save() private void OnEnable() { - Load(); + if (loadOnEnable) + Load(); } private void OnDisable() { - Save(); + if (saveOnDisable) + Save(); } private bool IsValidConfiguration() From 76649d672ee705aea6c4836a83e721f7c0a75d61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Tue, 23 Sep 2025 17:07:23 +0200 Subject: [PATCH 05/22] Refactoring of editor code, adding look sensitivity slider, added parameter override utility script. --- .../Samples/RebindingUI/ActionLabelEditor.cs | 104 +-------- .../RebindingUI/InputActionIndicator.cs | 2 +- Assets/Samples/RebindingUI/README.md | 13 +- .../Samples/RebindingUI/RebindActionEditor.cs | 153 +++++++++++++ .../RebindingUI/RebindActionEditor.cs.meta | 3 + .../RebindingUI/RebindActionParameterUI.cs | 123 ++++++++++ ...s.meta => RebindActionParameterUI.cs.meta} | 0 .../RebindActionParameterUIEditor.cs | 134 +++++++++++ .../RebindActionParameterUIEditor.cs.meta | 2 + .../RebindingUI/RebindActionUIEditor.cs | 114 +--------- .../RebindingUI/RebindBindingParameter.cs | 94 -------- .../RebindUISampleActions.inputactions | 2 +- .../RebindingUI/RebindingUISampleScene.unity | 214 ++++-------------- 13 files changed, 477 insertions(+), 481 deletions(-) create mode 100644 Assets/Samples/RebindingUI/RebindActionEditor.cs create mode 100644 Assets/Samples/RebindingUI/RebindActionEditor.cs.meta create mode 100644 Assets/Samples/RebindingUI/RebindActionParameterUI.cs rename Assets/Samples/RebindingUI/{RebindBindingParameter.cs.meta => RebindActionParameterUI.cs.meta} (100%) create mode 100644 Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs create mode 100644 Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs.meta delete mode 100644 Assets/Samples/RebindingUI/RebindBindingParameter.cs 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/InputActionIndicator.cs b/Assets/Samples/RebindingUI/InputActionIndicator.cs index f28f5aa554..9668bac4c8 100644 --- a/Assets/Samples/RebindingUI/InputActionIndicator.cs +++ b/Assets/Samples/RebindingUI/InputActionIndicator.cs @@ -34,7 +34,7 @@ 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..76e28a1c84 100644 --- a/Assets/Samples/RebindingUI/README.md +++ b/Assets/Samples/RebindingUI/README.md @@ -4,7 +4,14 @@ To demonstrate how to use images instead of textual display strings, take a look To demonstrate how to show dynamic 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. +Finally, the [RebindSaveLoad](./RebindSaveLoad.cs) script demonstrates how to persist user rebinds in `PlayerPrefs` and how to restore them from there. - 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/). +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. + +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..c13c1fd96c --- /dev/null +++ b/Assets/Samples/RebindingUI/RebindActionEditor.cs @@ -0,0 +1,153 @@ +#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 static int FindBindingById(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); + } + + public string bindingId => m_BindingIdProperty.stringValue; + public int bindingIndex => FindBindingById(action, 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..b1d9e901fb --- /dev/null +++ b/Assets/Samples/RebindingUI/RebindActionParameterUI.cs @@ -0,0 +1,123 @@ +using System; +using UnityEngine; +using UnityEngine.InputSystem; +using UnityEngine.InputSystem.Processors; +using UnityEngine.UI; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + [RequireComponent(typeof(Slider))] + 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; + } + + /// + /// Parameter name of the parameter to be configured. + /// + /// This corresponds to a binding processor parameter name when is not + /// null nor empty and otherwise corresponds to an action processor parameter. + public string parameterName + { + get => m_ParameterName; + set => m_ParameterName = 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 parameter name to be configured via this behaviour.")] + [SerializeField] + private string m_ParameterName; + + private Slider m_Slider; + + public void ResetToDefault() + { + if (m_Action != null && m_Action.action != null) + m_Action.action.RemoveAllBindingOverrides(); + + if (TryGetParameterValue(out var value)) + UpdateDisplayValue(value); + } + + private void Awake() + { + m_Slider = GetComponent(); + } + + private void OnEnable() + { + if (TryGetParameterValue(out var value)) + UpdateDisplayValue(value); + m_Slider.onValueChanged.AddListener(SetParameterValue); + } + + private void OnDisable() + { + m_Slider.onValueChanged.RemoveListener(SetParameterValue); + } + + private bool TryGetParameterValue(out float value) + { + if (m_Action != null && !string.IsNullOrEmpty(m_ParameterName)) + { + //var k = m_Action.action.GetParameterValue((ScaleVector2Processor p) => p.x); + + var v = m_Action.action.GetParameterValue(m_ParameterName); + if (v.HasValue) + { + var val = v.Value; + if (val.type == TypeCode.Single) + { + value = val.ToSingle(); + return true; + } + } + } + + value = default; + return false; + } + + private void SetParameterValue(float value) + { + // Apply parameter value as a parametric override + if (m_Action != null && !string.IsNullOrEmpty(m_ParameterName)) + { + m_Action.action.ApplyParameterOverride(m_ParameterName, 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/RebindBindingParameter.cs.meta b/Assets/Samples/RebindingUI/RebindActionParameterUI.cs.meta similarity index 100% rename from Assets/Samples/RebindingUI/RebindBindingParameter.cs.meta rename to Assets/Samples/RebindingUI/RebindActionParameterUI.cs.meta diff --git a/Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs b/Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs new file mode 100644 index 0000000000..60d1185df3 --- /dev/null +++ b/Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs @@ -0,0 +1,134 @@ +#if UNITY_EDITOR + +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; +using UnityEngine.InputSystem.Utilities; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + [CustomEditor(typeof(RebindActionParameterUI))] + public class RebindActionParameterUIEditor : UnityEditor.Editor + { + protected void OnEnable() + { + m_Binding = new BindingUI(serializedObject); + m_ParameterNameProperty = serializedObject.FindProperty("m_ParameterName"); + + Refresh(); + } + + public override void OnInspectorGUI() + { + EditorGUI.BeginChangeCheck(); + + //EditorGUILayout.PropertyField(m_ActionProperty); + + // Binding section. + m_Binding.Draw(); + + // Parameter section. + var newSelectedParameter = EditorGUILayout.Popup(m_ParameterLabel, m_SelectedParameterOption, m_Parameters); + if (newSelectedParameter != m_SelectedParameterOption) + { + m_SelectedParameterOption = newSelectedParameter; + } + + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + Refresh(); + } + } + + private void Refresh() + { + if (!m_Binding.Refresh()) + return; + + RefreshItems(); + } + + private void RefreshItems() + { + var action = m_Binding.action; + + var parameters = new List(); + var parameterValues = new List(); + + // Add action processors + var actionItems = NameAndParameters.ParseMultiple(action.processors); + foreach (var item in actionItems) + { + // TODO FIX + //parameters.Add(new GUIContent(item.name + " (Action)")); + //parameterValues.Add(item); + } + + // Add binding processors + var bindings = action.bindings; + for (var i = 0; i < bindings.Count; i++) + { + var bindingItems = NameAndParameters.ParseMultiple(bindings[i].processors); + foreach (var item in bindingItems) + { + //parameters.Add(new GUIContent(item.name + " (Binding)")); + //parameterValues.Add(item.name); + + // Only add parameters from the active binding + if (m_Binding.bindingIndex != i) + continue; + + var uniformParameterType = true; + var previousType = TypeCode.Empty; + var processorParameters = item.parameters; + foreach (var parameter in processorParameters) + { + if (uniformParameterType && parameter.type != previousType && previousType != TypeCode.Empty) + uniformParameterType = false; + previousType = parameter.type; + + // And option for individual parameter + var processorParameterName = item.name + "." + parameter.name; + parameters.Add(new GUIContent(processorParameterName)); + parameterValues.Add(new ParameterValue + { + bindingId = m_Binding.bindingId, + name = parameter.name, + }); + } + + // Add parameter option for all/uniform parameter modification if all parameters are of + // the same type. + if (!uniformParameterType) + continue; + parameters.Add(new GUIContent(item.name + " (Uniform)")); + parameterValues.Add(new ParameterValue + { + bindingId = m_Binding.bindingId, + name = null + }); + } + } + + m_Parameters = parameters.ToArray(); + m_ParameterValues = parameterValues.ToArray(); + } + + private struct ParameterValue + { + public string bindingId; + public string name; + } + + private SerializedProperty m_ParameterNameProperty; + private BindingUI m_Binding; + private GUIContent[] m_Parameters; + private ParameterValue[] m_ParameterValues; + private int m_SelectedParameterOption; + private readonly GUIContent m_ParameterLabel = new GUIContent("Processor Parameter"); + } +} + +#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/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/RebindBindingParameter.cs b/Assets/Samples/RebindingUI/RebindBindingParameter.cs deleted file mode 100644 index ef3fffaa79..0000000000 --- a/Assets/Samples/RebindingUI/RebindBindingParameter.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System; -using UnityEngine; -using UnityEngine.InputSystem; -using UnityEngine.InputSystem.Processors; -using UnityEngine.UI; - -public class RebindBindingParameter : MonoBehaviour -{ - /// - /// Reference to the action that is to be rebound. - /// - public InputActionReference actionReference - { - get => m_Action; - set - { - m_Action = value; - } - } - - [Tooltip("Reference to action that holds the parameter to be .")] - [SerializeField] - private InputActionReference m_Action; - - private Slider m_Slider; - - void Awake() - { - m_Slider = GetComponent(); - // TODO How to we register an event listener? - } - - public void ResetToDefault() - { - } - - // Start is called once before the first execution of Update after the MonoBehaviour is created - void Start() - { - //m_Action.action.processors - } - - // Update is called once per frame - void Update() - { - } - - private void OnEnable() - { - if (TryGetParameterValue(m_ParameterName, out var value)) - m_Slider.value = value; - } - - private string m_ParameterName = "x"; - - private bool TryGetParameterValue(string name, out float value) - { - if (m_Action != null) - { - //var k = m_Action.action.GetParameterValue((ScaleVector2Processor p) => p.x); - - var v = m_Action.action.GetParameterValue("x"); - if (v.HasValue) - { - var val = v.Value; - if (val.type == TypeCode.Single) - { - value = val.ToSingle(); - return true; - } - } - } - - value = default; - return false; - } - - private void SetParameterValue(float value) - { - if (!Mathf.Approximately(m_Slider.value, value)) - m_Slider.value = value; - if (m_Action != null) - m_Action.action.ApplyParameterOverride(m_ParameterName, value); - } - - private void UpdateDisplayValue() - { - if (m_Action == null) return; - if (m_Action.action == null) return; - var parameterValue = m_Action.action.GetParameterValue("x"); - if (parameterValue != null) - m_Slider.value = parameterValue.Value.ToSingle(); - } -} diff --git a/Assets/Samples/RebindingUI/RebindUISampleActions.inputactions b/Assets/Samples/RebindingUI/RebindUISampleActions.inputactions index 3d01b00112..88ad03042f 100644 --- a/Assets/Samples/RebindingUI/RebindUISampleActions.inputactions +++ b/Assets/Samples/RebindingUI/RebindUISampleActions.inputactions @@ -126,7 +126,7 @@ "id": "7c03e976-d9da-4d96-9bcd-622e98b0f3c3", "path": "/delta", "interactions": "", - "processors": "ScaleVector2(x=1.5,y=1.5)", + "processors": "ScaleVector2(x=1.5,y=1.5),ScaleVector2", "groups": "Keyboard", "action": "Look", "isComposite": false, diff --git a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity index b816b3e059..96ec256c12 100644 --- a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity +++ b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity @@ -458,6 +458,8 @@ MonoBehaviour: m_EditorClassIdentifier: actions: {fileID: -944628639613478452, guid: 7dead05c54ca85b4681351aafd8bd03a, type: 3} playerPreferenceKey: rebinds + loadOnEnable: 1 + saveOnDisable: 1 --- !u!114 &51853247 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1057,10 +1059,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: @@ -1090,6 +1092,8 @@ MonoBehaviour: m_EditorClassIdentifier: Unity.InputSystem.RebindingUI::RebindBindingParameter m_Action: {fileID: 4485540969121359642, guid: 7dead05c54ca85b4681351aafd8bd03a, type: 3} + m_BindingId: 7c03e976-d9da-4d96-9bcd-622e98b0f3c3 + m_ParameterName: x --- !u!1 &303988305 GameObject: m_ObjectHideFlags: 0 @@ -1926,7 +1930,6 @@ RectTransform: - {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} @@ -2173,7 +2176,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 @@ -2215,7 +2218,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} @@ -4042,87 +4045,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1003189950} m_CullTransparentMesh: 0 ---- !u!1 &1014357781 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1014357782} - - component: {fileID: 1014357784} - - component: {fileID: 1014357783} - m_Layer: 5 - m_Name: Help - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1014357782 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1014357781} - 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_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_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1014357783 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1014357781} - 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.6666667, g: 0.73333335, b: 0.8, a: 1} - m_RaycastTarget: 0 - 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. - \n\nHere we do both variants for demonstration purposes." ---- !u!222 &1014357784 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1014357781} - m_CullTransparentMesh: 0 --- !u!1 &1063908416 GameObject: m_ObjectHideFlags: 0 @@ -4155,8 +4077,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} @@ -5156,7 +5078,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &1214352211 RectTransform: m_ObjectHideFlags: 0 @@ -5176,7 +5098,7 @@ RectTransform: 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 @@ -5224,7 +5146,6 @@ RectTransform: - {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} @@ -5270,87 +5191,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1219085455} m_CullTransparentMesh: 0 ---- !u!1 &1237134517 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1237134518} - - component: {fileID: 1237134520} - - component: {fileID: 1237134519} - m_Layer: 5 - m_Name: Help - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1237134518 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1237134517} - 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_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_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1237134519 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1237134517} - 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.6666667, g: 0.73333335, b: 0.8, a: 1} - m_RaycastTarget: 0 - 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 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1237134517} - m_CullTransparentMesh: 0 --- !u!224 &1311197229 stripped RectTransform: m_CorrespondingSourceObject: {fileID: 4997344956118145359, guid: a6b634f465c284d30ac5a7dd706644da, @@ -5470,8 +5310,9 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 244172483} - m_TargetAssemblyTypeName: + - m_Target: {fileID: 244172486} + m_TargetAssemblyTypeName: UnityEngine.InputSystem.Samples.RebindUI.RebindActionParameterUI, + Unity.InputSystem.RebindingUI m_MethodName: ResetToDefault m_Mode: 1 m_Arguments: @@ -6404,6 +6245,19 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 + - m_Target: {fileID: 244172486} + 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 @@ -7278,6 +7132,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 @@ -7955,6 +7814,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 From 90f0b5319180debf9bcd4419c5112fd07482496b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Wed, 24 Sep 2025 22:06:23 +0200 Subject: [PATCH 06/22] Simplified look sensitivity code --- .../RebindingUI/RebindActionParameterUI.cs | 107 +++++++++------- .../RebindActionParameterUIEditor.cs | 115 +++++------------- Assets/Samples/RebindingUI/RebindSaveLoad.cs | 2 +- .../RebindUISampleActions.inputactions | 4 +- .../RebindingUI/RebindingUISampleScene.unity | 106 +++++++++++----- 5 files changed, 172 insertions(+), 162 deletions(-) diff --git a/Assets/Samples/RebindingUI/RebindActionParameterUI.cs b/Assets/Samples/RebindingUI/RebindActionParameterUI.cs index b1d9e901fb..ffa4da6b27 100644 --- a/Assets/Samples/RebindingUI/RebindActionParameterUI.cs +++ b/Assets/Samples/RebindingUI/RebindActionParameterUI.cs @@ -6,7 +6,6 @@ namespace UnityEngine.InputSystem.Samples.RebindUI { - [RequireComponent(typeof(Slider))] public class RebindActionParameterUI : MonoBehaviour { /// @@ -31,14 +30,37 @@ public string bindingId } /// - /// Parameter name of the parameter to be configured. + /// The preference key to be used for persistence. /// - /// This corresponds to a binding processor parameter name when is not - /// null nor empty and otherwise corresponds to an action processor parameter. - public string parameterName + public string mPreferenceKey { - get => m_ParameterName; - set => m_ParameterName = value; + 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.")] @@ -49,68 +71,67 @@ public string parameterName [SerializeField] private string m_BindingId; - [Tooltip("The parameter name to be configured via this behaviour.")] + [Tooltip("The player preference key to be used for persistence.")] [SerializeField] - private string m_ParameterName; + 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; + private float m_Value; + public void ResetToDefault() { - if (m_Action != null && m_Action.action != null) - m_Action.action.RemoveAllBindingOverrides(); - - if (TryGetParameterValue(out var value)) - UpdateDisplayValue(value); + PlayerPrefs.SetFloat(m_PreferenceKey, m_DefaultValue); + SetParameterValue(m_DefaultValue); } private void Awake() { - m_Slider = GetComponent(); + if (m_Slider == null) + m_Slider = GetComponent(); } private void OnEnable() { - if (TryGetParameterValue(out var value)) - UpdateDisplayValue(value); - m_Slider.onValueChanged.AddListener(SetParameterValue); - } + if (!string.IsNullOrEmpty(m_PreferenceKey)) + SetParameterValue(PlayerPrefs.GetFloat(m_PreferenceKey, m_DefaultValue)); - private void OnDisable() - { - m_Slider.onValueChanged.RemoveListener(SetParameterValue); + if (m_Slider != null) + m_Slider.onValueChanged.AddListener(SetParameterValue); } - private bool TryGetParameterValue(out float value) + private void OnDisable() { - if (m_Action != null && !string.IsNullOrEmpty(m_ParameterName)) - { - //var k = m_Action.action.GetParameterValue((ScaleVector2Processor p) => p.x); - - var v = m_Action.action.GetParameterValue(m_ParameterName); - if (v.HasValue) - { - var val = v.Value; - if (val.type == TypeCode.Single) - { - value = val.ToSingle(); - return true; - } - } - } + if (m_Slider != null) + m_Slider.onValueChanged.RemoveListener(SetParameterValue); - value = default; - return false; + 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 && !string.IsNullOrEmpty(m_ParameterName)) + if (m_Action != null && m_Action.action != null) { - m_Action.action.ApplyParameterOverride(m_ParameterName, value); + var action = m_Action.action; + int bindingIndex = BindingUI.FindBindingById(action, 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. + action.ApplyParameterOverride("scaleVector2:x", value, bindingMask); + action.ApplyParameterOverride("scaleVector2:y", value, bindingMask); } - + + m_Value = value; + UpdateDisplayValue(value); } diff --git a/Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs b/Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs index 60d1185df3..dd2e01f262 100644 --- a/Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs +++ b/Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs @@ -5,16 +5,22 @@ using UnityEditor; using UnityEngine; using UnityEngine.InputSystem.Utilities; +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_ParameterNameProperty = serializedObject.FindProperty("m_ParameterName"); + m_DefaultValueProperty = serializedObject.FindProperty("m_DefaultValue"); + m_PreferenceKeyProperty = serializedObject.FindProperty("m_PreferenceKey"); + m_SliderProperty = serializedObject.FindProperty("m_Slider"); Refresh(); } @@ -23,97 +29,39 @@ public override void OnInspectorGUI() { EditorGUI.BeginChangeCheck(); - //EditorGUILayout.PropertyField(m_ActionProperty); - // Binding section. m_Binding.Draw(); - // Parameter section. - var newSelectedParameter = EditorGUILayout.Popup(m_ParameterLabel, m_SelectedParameterOption, m_Parameters); - if (newSelectedParameter != m_SelectedParameterOption) + // UI section + EditorGUILayout.LabelField("UI"); + using (new EditorGUI.IndentLevelScope()) { - m_SelectedParameterOption = newSelectedParameter; + EditorGUILayout.ObjectField(m_SliderProperty); } - if (EditorGUI.EndChangeCheck()) + // Parameter section. + EditorGUILayout.LabelField("Parameter"); + using (new EditorGUI.IndentLevelScope()) { - serializedObject.ApplyModifiedProperties(); - Refresh(); - } - } - - private void Refresh() - { - if (!m_Binding.Refresh()) - return; - - RefreshItems(); - } - - private void RefreshItems() - { - var action = m_Binding.action; + var key = EditorGUILayout.TextField("Preference Key", m_PreferenceKeyProperty.stringValue); + if (key != m_PreferenceKeyProperty.stringValue) + m_PreferenceKeyProperty.stringValue = key; - var parameters = new List(); - var parameterValues = new List(); + var defaultValue = EditorGUILayout.FloatField("Default Value", m_DefaultValueProperty.floatValue); + if (!Mathf.Approximately(defaultValue, m_DefaultValueProperty.floatValue)) + m_DefaultValueProperty.floatValue = defaultValue; - // Add action processors - var actionItems = NameAndParameters.ParseMultiple(action.processors); - foreach (var item in actionItems) - { - // TODO FIX - //parameters.Add(new GUIContent(item.name + " (Action)")); - //parameterValues.Add(item); - } - - // Add binding processors - var bindings = action.bindings; - for (var i = 0; i < bindings.Count; i++) - { - var bindingItems = NameAndParameters.ParseMultiple(bindings[i].processors); - foreach (var item in bindingItems) + if (EditorGUI.EndChangeCheck()) { - //parameters.Add(new GUIContent(item.name + " (Binding)")); - //parameterValues.Add(item.name); - - // Only add parameters from the active binding - if (m_Binding.bindingIndex != i) - continue; - - var uniformParameterType = true; - var previousType = TypeCode.Empty; - var processorParameters = item.parameters; - foreach (var parameter in processorParameters) - { - if (uniformParameterType && parameter.type != previousType && previousType != TypeCode.Empty) - uniformParameterType = false; - previousType = parameter.type; - - // And option for individual parameter - var processorParameterName = item.name + "." + parameter.name; - parameters.Add(new GUIContent(processorParameterName)); - parameterValues.Add(new ParameterValue - { - bindingId = m_Binding.bindingId, - name = parameter.name, - }); - } - - // Add parameter option for all/uniform parameter modification if all parameters are of - // the same type. - if (!uniformParameterType) - continue; - parameters.Add(new GUIContent(item.name + " (Uniform)")); - parameterValues.Add(new ParameterValue - { - bindingId = m_Binding.bindingId, - name = null - }); + serializedObject.ApplyModifiedProperties(); + Refresh(); } } + } - m_Parameters = parameters.ToArray(); - m_ParameterValues = parameterValues.ToArray(); + private void Refresh() + { + m_Binding.Refresh(); } private struct ParameterValue @@ -122,12 +70,11 @@ private struct ParameterValue public string name; } - private SerializedProperty m_ParameterNameProperty; + private SerializedProperty m_PreferenceKeyProperty; + private SerializedProperty m_DefaultValueProperty; + private SerializedProperty m_SliderProperty; + private BindingUI m_Binding; - private GUIContent[] m_Parameters; - private ParameterValue[] m_ParameterValues; - private int m_SelectedParameterOption; - private readonly GUIContent m_ParameterLabel = new GUIContent("Processor Parameter"); } } diff --git a/Assets/Samples/RebindingUI/RebindSaveLoad.cs b/Assets/Samples/RebindingUI/RebindSaveLoad.cs index 0db3db0f52..968877cb76 100644 --- a/Assets/Samples/RebindingUI/RebindSaveLoad.cs +++ b/Assets/Samples/RebindingUI/RebindSaveLoad.cs @@ -29,7 +29,7 @@ public void Load() if (!IsValidConfiguration()) return; - var rebinds = PlayerPrefs.GetString("rebinds"); + var rebinds = PlayerPrefs.GetString(playerPreferenceKey); if (string.IsNullOrEmpty(rebinds)) return; // OK, we may not have saved any binding overrides yet. diff --git a/Assets/Samples/RebindingUI/RebindUISampleActions.inputactions b/Assets/Samples/RebindingUI/RebindUISampleActions.inputactions index 88ad03042f..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, @@ -126,7 +126,7 @@ "id": "7c03e976-d9da-4d96-9bcd-622e98b0f3c3", "path": "/delta", "interactions": "", - "processors": "ScaleVector2(x=1.5,y=1.5),ScaleVector2", + "processors": "ScaleVector2", "groups": "Keyboard", "action": "Look", "isComposite": false, diff --git a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity index 96ec256c12..92eb742d08 100644 --- a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity +++ b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity @@ -985,7 +985,6 @@ GameObject: m_Component: - component: {fileID: 244172484} - component: {fileID: 244172485} - - component: {fileID: 244172486} m_Layer: 5 m_Name: Slider m_TagString: Untagged @@ -1065,35 +1064,7 @@ MonoBehaviour: m_Value: 1 m_OnValueChanged: m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 244172483} - m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine - m_MethodName: - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 ---- !u!114 &244172486 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 244172483} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b52b7577d0f9e44e99408e2e11257fd6, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.InputSystem.RebindingUI::RebindBindingParameter - m_Action: {fileID: 4485540969121359642, guid: 7dead05c54ca85b4681351aafd8bd03a, - type: 3} - m_BindingId: 7c03e976-d9da-4d96-9bcd-622e98b0f3c3 - m_ParameterName: x + m_Calls: [] --- !u!1 &303988305 GameObject: m_ObjectHideFlags: 0 @@ -5072,6 +5043,8 @@ GameObject: m_Component: - component: {fileID: 1214352211} - component: {fileID: 1214352212} + - component: {fileID: 1214352214} + - component: {fileID: 1214352213} m_Layer: 5 m_Name: Sensitivity m_TagString: Untagged @@ -5109,6 +5082,75 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1214352210} m_CullTransparentMesh: 1 +--- !u!114 &1214352213 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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} +--- !u!114 &1214352214 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1214352210} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + 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: [] --- !u!1 &1219085455 GameObject: m_ObjectHideFlags: 0 @@ -5310,7 +5352,7 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 244172486} + - m_Target: {fileID: 0} m_TargetAssemblyTypeName: UnityEngine.InputSystem.Samples.RebindUI.RebindActionParameterUI, Unity.InputSystem.RebindingUI m_MethodName: ResetToDefault @@ -6245,7 +6287,7 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 - - m_Target: {fileID: 244172486} + - m_Target: {fileID: 0} m_TargetAssemblyTypeName: UnityEngine.InputSystem.Samples.RebindUI.RebindActionParameterUI, Unity.InputSystem.RebindingUI m_MethodName: ResetToDefault From 8178b942e68565e3d0a636db39ead85e5dbe2c0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Thu, 25 Sep 2025 06:49:21 +0200 Subject: [PATCH 07/22] Generalized RebindActionParameterUI to make it possible to select parameters to override. --- .../RebindingUI/RebindActionParameterUI.cs | 3 +++ .../RebindActionParameterUIEditor.cs | 24 ++++++++----------- .../RebindingUI/RebindingUISampleScene.unity | 3 +++ 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Assets/Samples/RebindingUI/RebindActionParameterUI.cs b/Assets/Samples/RebindingUI/RebindActionParameterUI.cs index ffa4da6b27..d1d0f5329b 100644 --- a/Assets/Samples/RebindingUI/RebindActionParameterUI.cs +++ b/Assets/Samples/RebindingUI/RebindActionParameterUI.cs @@ -83,6 +83,9 @@ public float defaultValue [SerializeField] private Slider m_Slider; + [SerializeField] + private string[] m_ParameterOverrides; + private float m_Value; public void ResetToDefault() diff --git a/Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs b/Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs index dd2e01f262..be7f34e2ad 100644 --- a/Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs +++ b/Assets/Samples/RebindingUI/RebindActionParameterUIEditor.cs @@ -1,10 +1,8 @@ #if UNITY_EDITOR using System; -using System.Collections.Generic; using UnityEditor; using UnityEngine; -using UnityEngine.InputSystem.Utilities; using UnityEngine.UI; namespace UnityEngine.InputSystem.Samples.RebindUI @@ -21,6 +19,7 @@ protected void OnEnable() 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(); } @@ -43,19 +42,15 @@ public override void OnInspectorGUI() EditorGUILayout.LabelField("Parameter"); using (new EditorGUI.IndentLevelScope()) { - var key = EditorGUILayout.TextField("Preference Key", m_PreferenceKeyProperty.stringValue); - if (key != m_PreferenceKeyProperty.stringValue) - m_PreferenceKeyProperty.stringValue = key; - - var defaultValue = EditorGUILayout.FloatField("Default Value", m_DefaultValueProperty.floatValue); - if (!Mathf.Approximately(defaultValue, m_DefaultValueProperty.floatValue)) - m_DefaultValueProperty.floatValue = defaultValue; + EditorGUILayout.PropertyField(m_PreferenceKeyProperty); + EditorGUILayout.PropertyField(m_DefaultValueProperty); + EditorGUILayout.PropertyField(m_ParameterOverridesProperty, true); + } - if (EditorGUI.EndChangeCheck()) - { - serializedObject.ApplyModifiedProperties(); - Refresh(); - } + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + Refresh(); } } @@ -73,6 +68,7 @@ private struct ParameterValue private SerializedProperty m_PreferenceKeyProperty; private SerializedProperty m_DefaultValueProperty; private SerializedProperty m_SliderProperty; + private SerializedProperty m_ParameterOverridesProperty; private BindingUI m_Binding; } diff --git a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity index 92eb742d08..de9e3524be 100644 --- a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity +++ b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity @@ -5100,6 +5100,9 @@ MonoBehaviour: m_PreferenceKey: lookSensitivity m_DefaultValue: 1 m_Slider: {fileID: 244172485} + m_ParameterOverrides: + - x + - y --- !u!114 &1214352214 MonoBehaviour: m_ObjectHideFlags: 0 From 0962b731e73ee29409ef66ec3ce6da5a3d74f2dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Thu, 25 Sep 2025 06:54:39 +0200 Subject: [PATCH 08/22] Removed hardcoded parameter names --- Assets/Samples/RebindingUI/RebindActionParameterUI.cs | 4 ++-- Assets/Samples/RebindingUI/RebindingUISampleScene.unity | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Assets/Samples/RebindingUI/RebindActionParameterUI.cs b/Assets/Samples/RebindingUI/RebindActionParameterUI.cs index d1d0f5329b..3747d61b03 100644 --- a/Assets/Samples/RebindingUI/RebindActionParameterUI.cs +++ b/Assets/Samples/RebindingUI/RebindActionParameterUI.cs @@ -129,8 +129,8 @@ private void SetParameterValue(float value) // We apply parameter override. This directly affects matching processors and interactions // if they have matching parameters. - action.ApplyParameterOverride("scaleVector2:x", value, bindingMask); - action.ApplyParameterOverride("scaleVector2:y", value, bindingMask); + foreach (var parameterOverride in m_ParameterOverrides) + action.ApplyParameterOverride(parameterOverride, value, bindingMask); } m_Value = value; diff --git a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity index de9e3524be..990204d512 100644 --- a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity +++ b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity @@ -5101,8 +5101,8 @@ MonoBehaviour: m_DefaultValue: 1 m_Slider: {fileID: 244172485} m_ParameterOverrides: - - x - - y + - scaleVector2:x + - scaleVector2:y --- !u!114 &1214352214 MonoBehaviour: m_ObjectHideFlags: 0 From a579bfabacd483cf926baaa5649ef0603270e146 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Thu, 25 Sep 2025 08:33:48 +0200 Subject: [PATCH 09/22] Fixed a problem which would cause mobile rebind sample build to run in portrait mode. Game manager now enforces landscape as part of running. Added menu button and reenabled UI actions during gameplay. --- .../RebindingUI/Game/GameplayManager.cs | 3 + .../RebindingUI/InputActionExtensions.cs | 24 + .../RebindingUI/InputActionExtensions.cs.meta | 3 + .../Samples/RebindingUI/RebindActionEditor.cs | 9 +- .../RebindingUI/RebindActionParameterUI.cs | 2 +- Assets/Samples/RebindingUI/RebindActionUI.cs | 20 +- .../RebindingUI/RebindingUISampleScene.unity | 434 +++++++++++++++++- 7 files changed, 468 insertions(+), 27 deletions(-) create mode 100644 Assets/Samples/RebindingUI/InputActionExtensions.cs create mode 100644 Assets/Samples/RebindingUI/InputActionExtensions.cs.meta diff --git a/Assets/Samples/RebindingUI/Game/GameplayManager.cs b/Assets/Samples/RebindingUI/Game/GameplayManager.cs index 90eaaf4b62..36eda7c570 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( 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/RebindActionEditor.cs b/Assets/Samples/RebindingUI/RebindActionEditor.cs index c13c1fd96c..68c586e023 100644 --- a/Assets/Samples/RebindingUI/RebindActionEditor.cs +++ b/Assets/Samples/RebindingUI/RebindActionEditor.cs @@ -129,15 +129,8 @@ public bool Refresh() return true; } - public static int FindBindingById(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); - } - public string bindingId => m_BindingIdProperty.stringValue; - public int bindingIndex => FindBindingById(action, m_BindingIdProperty.stringValue); + public int bindingIndex => action.FindBindingById(m_BindingIdProperty.stringValue); public InputAction action => ((InputActionReference)m_ActionProperty.objectReferenceValue)?.action; diff --git a/Assets/Samples/RebindingUI/RebindActionParameterUI.cs b/Assets/Samples/RebindingUI/RebindActionParameterUI.cs index 3747d61b03..55b0fdb209 100644 --- a/Assets/Samples/RebindingUI/RebindActionParameterUI.cs +++ b/Assets/Samples/RebindingUI/RebindActionParameterUI.cs @@ -124,7 +124,7 @@ private void SetParameterValue(float value) if (m_Action != null && m_Action.action != null) { var action = m_Action.action; - int bindingIndex = BindingUI.FindBindingById(action, m_BindingId); + 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 diff --git a/Assets/Samples/RebindingUI/RebindActionUI.cs b/Assets/Samples/RebindingUI/RebindActionUI.cs index e80a8835ec..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; } /// diff --git a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity index 990204d512..b98fdd2aaf 100644 --- a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity +++ b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity @@ -441,7 +441,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 @@ -3399,6 +3399,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} @@ -4016,6 +4017,140 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1003189950} m_CullTransparentMesh: 0 +--- !u!1 &1044043760 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1044043761} + - component: {fileID: 1044043764} + - component: {fileID: 1044043763} + - component: {fileID: 1044043762} + m_Layer: 5 + m_Name: Resume + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1044043761 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: + - {fileID: 1853629578} + m_Father: {fileID: 1820892250} + 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_SizeDelta: {x: 150, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1044043762 +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: 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: 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 &1044043764 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1044043760} + m_CullTransparentMesh: 0 --- !u!1 &1063908416 GameObject: m_ObjectHideFlags: 0 @@ -4703,7 +4838,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} @@ -6113,7 +6248,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 @@ -6353,6 +6488,140 @@ 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} + 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!1 &1648186665 GameObject: m_ObjectHideFlags: 0 @@ -6846,6 +7115,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} @@ -7159,6 +7429,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 @@ -7740,6 +8089,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 From 07161d9161a20bec592a045dc5d39f3d2064526e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Fri, 26 Sep 2025 23:01:05 +0200 Subject: [PATCH 10/22] Added rough on screen control that do not depend on UI --- .../RebindingUI/Game/GameplayManager.cs | 2 +- Assets/Samples/RebindingUI/OnScreen.meta | 3 + .../RebindingUI/OnScreen/ActiveDetector.cs | 65 ++ .../OnScreen/ActiveDetector.cs.meta | 3 + .../Samples/RebindingUI/OnScreen/AreaShape.cs | 13 + .../RebindingUI/OnScreen/AreaShape.cs.meta | 3 + .../RebindingUI/OnScreen/ChangeMonitor.cs | 185 +++++ .../OnScreen/ChangeMonitor.cs.meta | 3 + Assets/Samples/RebindingUI/OnScreen/Curve.cs | 51 ++ .../RebindingUI/OnScreen/Curve.cs.meta | 3 + .../OnScreen/CustomOnScreenControl.cs | 406 +++++++++++ .../OnScreen/CustomOnScreenControl.cs.meta | 2 + .../RebindingUI/OnScreen/DragDetector.cs | 84 +++ .../RebindingUI/OnScreen/DragDetector.cs.meta | 3 + .../RebindingUI/OnScreen/GestureEvent.cs | 66 ++ .../RebindingUI/OnScreen/GestureEvent.cs.meta | 3 + .../RebindingUI/OnScreen/ITouchMonitor.cs | 9 + .../OnScreen/ITouchMonitor.cs.meta | 3 + .../RebindingUI/OnScreen/ITouchProcessor.cs | 12 + .../OnScreen/ITouchProcessor.cs.meta | 3 + .../RebindingUI/OnScreen/TapDetector.cs | 64 ++ .../RebindingUI/OnScreen/TapDetector.cs.meta | 3 + .../RebindingUI/RebindingUISampleScene.unity | 674 +++++++++++++++++- .../Samples/RebindingUI/RequireTouchscreen.cs | 37 + .../RebindingUI/RequireTouchscreen.cs.meta | 2 + .../Plugins/OnScreen/OnScreenControl.cs | 23 +- .../Plugins/OnScreen/OnScreenHelpers.cs | 58 ++ .../Plugins/OnScreen/OnScreenHelpers.cs.meta | 3 + 28 files changed, 1762 insertions(+), 24 deletions(-) create mode 100644 Assets/Samples/RebindingUI/OnScreen.meta create mode 100644 Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs create mode 100644 Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs.meta create mode 100644 Assets/Samples/RebindingUI/OnScreen/AreaShape.cs create mode 100644 Assets/Samples/RebindingUI/OnScreen/AreaShape.cs.meta create mode 100644 Assets/Samples/RebindingUI/OnScreen/ChangeMonitor.cs create mode 100644 Assets/Samples/RebindingUI/OnScreen/ChangeMonitor.cs.meta create mode 100644 Assets/Samples/RebindingUI/OnScreen/Curve.cs create mode 100644 Assets/Samples/RebindingUI/OnScreen/Curve.cs.meta create mode 100644 Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs create mode 100644 Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs.meta create mode 100644 Assets/Samples/RebindingUI/OnScreen/DragDetector.cs create mode 100644 Assets/Samples/RebindingUI/OnScreen/DragDetector.cs.meta create mode 100644 Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs create mode 100644 Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs.meta create mode 100644 Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs create mode 100644 Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs.meta create mode 100644 Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs create mode 100644 Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs.meta create mode 100644 Assets/Samples/RebindingUI/OnScreen/TapDetector.cs create mode 100644 Assets/Samples/RebindingUI/OnScreen/TapDetector.cs.meta create mode 100644 Assets/Samples/RebindingUI/RequireTouchscreen.cs create mode 100644 Assets/Samples/RebindingUI/RequireTouchscreen.cs.meta create mode 100644 Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenHelpers.cs create mode 100644 Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenHelpers.cs.meta diff --git a/Assets/Samples/RebindingUI/Game/GameplayManager.cs b/Assets/Samples/RebindingUI/Game/GameplayManager.cs index 36eda7c570..f0199a4a80 100644 --- a/Assets/Samples/RebindingUI/Game/GameplayManager.cs +++ b/Assets/Samples/RebindingUI/Game/GameplayManager.cs @@ -259,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/OnScreen.meta b/Assets/Samples/RebindingUI/OnScreen.meta new file mode 100644 index 0000000000..532915f28d --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5b35834c37104fbbbe5b35fa3bae3ec4 +timeCreated: 1758895399 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs b/Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs new file mode 100644 index 0000000000..f83a2bea3c --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs @@ -0,0 +1,65 @@ +using UnityEngine.InputSystem.LowLevel; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + class ActiveDetector : ITouchProcessor + { + private Vector2 m_InitialPosition = Vector2.zero; + private double m_InitialTime = 0; + private bool m_Valid = true; + + public void OnTouchBegin(ChangeMonitor context, in TouchState[] touches, int count, int index) + { + if (count == 1) + { + m_InitialPosition = touches[index].position; + m_InitialTime = Time.realtimeSinceStartupAsDouble; + m_Valid = true; + + GestureEvent @event = new GestureEvent( + delta: Vector2.zero, + duration: 0.0, + flags: GestureFlags.Active | GestureFlags.PhaseStart, + start: m_InitialPosition + ); + context.FireEvent(in @event); + } + else + { + m_Valid = false; + } + } + + public void OnTouchEnd(ChangeMonitor context, in TouchState[] touches, int count, int index) + { + if (m_Valid) + { + GestureEvent @event = new GestureEvent( + delta: touches[index].position - m_InitialPosition, + duration: Time.realtimeSinceStartupAsDouble - m_InitialTime, + flags: GestureFlags.Active | GestureFlags.PhaseEnd, start: m_InitialPosition); + context.FireEvent(in @event); + } + } + + public void OnTouchMoved(ChangeMonitor context, in TouchState[] touches, int count, int index) + { + // Ignored + } + + public void OnTouchCanceled(ChangeMonitor context, in TouchState[] touches, int count, int index) + { + if (m_Valid) + { + m_Valid = false; + + GestureEvent @event = new GestureEvent( + delta: touches[index].position - m_InitialPosition, + duration: Time.realtimeSinceStartupAsDouble - m_InitialTime, + flags: GestureFlags.Active | GestureFlags.PhaseCancel, + start: m_InitialPosition); + context.FireEvent(in @event); + } + } + } +} diff --git a/Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs.meta b/Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs.meta new file mode 100644 index 0000000000..a62a124ee1 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4d488485897e442d9b8455eb311c09b5 +timeCreated: 1758906025 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/AreaShape.cs b/Assets/Samples/RebindingUI/OnScreen/AreaShape.cs new file mode 100644 index 0000000000..e17e5ea31e --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/AreaShape.cs @@ -0,0 +1,13 @@ +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + /// + /// Specifies the geometric shape of the touch clipping area. + /// + public enum AreaShape + { + /// + /// A rectangular clipping area is used (default). + /// + Rectangle = 0, + } +} diff --git a/Assets/Samples/RebindingUI/OnScreen/AreaShape.cs.meta b/Assets/Samples/RebindingUI/OnScreen/AreaShape.cs.meta new file mode 100644 index 0000000000..1181b6bb36 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/AreaShape.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ac3cfbb9cf3e41b194a245cf1464f287 +timeCreated: 1758920079 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/ChangeMonitor.cs b/Assets/Samples/RebindingUI/OnScreen/ChangeMonitor.cs new file mode 100644 index 0000000000..c3a2536090 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/ChangeMonitor.cs @@ -0,0 +1,185 @@ +using System; +using System.Text; +using Unity.Properties; +using UnityEngine.InputSystem.LowLevel; +using UnityEngine.InputSystem.OnScreen; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + abstract class ChangeMonitor : ITouchMonitor + { + public delegate void GestureEventHandler(in GestureEvent gestureEvent); // ref readonly not available until C# 12.0 + + protected ChangeMonitor(int maxTouches) + { + m_Touches = new TouchState[maxTouches]; + Reset(Rect.zero, AreaShape.Rectangle, null); + } + + public virtual void Reset(Rect bounds, AreaShape shape, ChangeMonitor.GestureEventHandler handler) + { + m_Handler = handler; + m_Bounds = bounds; + m_GestureFlags = GestureFlags.None; + m_Count = 0; + } + + protected bool Contains(in TouchState touch) + { + switch (m_Shape) + { + case AreaShape.Rectangle: + { + // TODO Caching opportunities here + var display = Display.displays[touch.displayIndex]; + var width = display.renderingWidth; + var height = display.renderingHeight; + var absoluteBounds = new Rect( + x: m_Bounds.xMin * width, + y: m_Bounds.yMin * height, + width: m_Bounds.width * width, + height: m_Bounds.height * height); + return absoluteBounds.Contains(touch.position); + } + } + + return false; + } + + protected int FindTouch(int touchId) + { + for (var i = 0; i < m_Count; ++i) + if (m_Touches[i].touchId == touchId) + return i; + return -1; + } + + public void FireEvent(in GestureEvent gestureEvent) + { + m_Handler.Invoke(in gestureEvent); + } + + public ref readonly TouchState this[int index] => ref m_Touches[index]; // TODO Make sure no defensive copy is created + + //set => SetValue(key, value); + protected Rect m_Bounds; + protected AreaShape m_Shape; + private GestureFlags m_GestureFlags; + private GestureEventHandler m_Handler; + protected readonly TouchState[] m_Touches; + protected int m_Count; + + public abstract void NotifyControlStateChanged(InputControl control, double time, InputEventPtr eventPtr, + long monitorIndex); + + public abstract void NotifyTimerExpired(InputControl control, double time, long monitorIndex, + int timerIndex); + } + + // TODO This class is doing way too much error checking. Underlying implementation should be correct but + // there seem to be some kind of bug resulting in duplicate callbacks. + internal class ChangeMonitor : ChangeMonitor, ITouchMonitor + where TProcessor : ITouchProcessor + { + private TProcessor m_Processor; + + public ChangeMonitor(int maxTouches, TProcessor processor) + : base(maxTouches) + { + m_Processor = processor; + } + + /*public static ChangeMonitor Create(int maxTouches, TProcessor processor) + { + return new ChangeMonitor(maxTouches, processor); + }*/ + + public override void Reset(Rect bounds, AreaShape shape, ChangeMonitor.GestureEventHandler handler) + { + // Make sure we cancel any pending touches. This way processor do not need a reset method. + for (var i = m_Count; i != 0; --i) + m_Processor.OnTouchCanceled(this, m_Touches, m_Count, m_Count - 1); + + // Reset base + base.Reset(bounds, shape, handler); + } + + public override void NotifyControlStateChanged(InputControl control, double time, InputEventPtr eventPtr, long monitorIndex) + { + // Ignore state change if it is not a touch state + if (!OnScreenUnsafeHelpers.TryGetStateCopy(eventPtr, TouchState.Format, out var state)) + return; + + // Intentionally left commented to aid debugging + //Debug.Log($"monitorIndex: {monitorIndex}, id: {state.touchId}, phase: {state.phase}, position: {state.position}"); + + // Delegate touch phase events + int index; + switch (state.phase) + { + case TouchPhase.Began: + // Only add the point for tracking if we do not violate max point constraint. + if (FindTouch(state.touchId) < 0 && m_Count < m_Touches.Length && Contains(state)) + { + index = m_Count++; + m_Touches[index] = state; + + m_Processor.OnTouchBegin(this, m_Touches, m_Count, index); + } + break; + + case TouchPhase.Ended: + index = FindTouch(state.touchId); + if (index < 0) + break; + + m_Processor.OnTouchEnd(this, m_Touches, m_Count, index); + + // Remove point + if (index != m_Count - 1) + { + Array.Copy(m_Touches, index + 1, + m_Touches, index, m_Count - index - 1); + } + --m_Count; + break; + + case TouchPhase.Canceled: + index = FindTouch(state.touchId); + if (index < 0) + break; + + m_Processor.OnTouchCanceled(this, m_Touches, m_Count, index); + + // TODO Need to remove or will we get end?! + break; + + case TouchPhase.Moved: + index = FindTouch(state.touchId); + if (index < 0) + { + if (m_Count < m_Touches.Length && Contains(state)) + { + // TODO Handle as an addition + } + + break; // Unexpected or not tracked by this processor + } + + m_Touches[index] = state; + + // TODO Handle capture + + m_Processor.OnTouchMoved(this, m_Touches, m_Count, index); + break; + + case TouchPhase.Stationary: // Not used by touchscreen + case TouchPhase.None: // Default initialized (no meaning) + default: + break; + } + } + + public override void NotifyTimerExpired(InputControl control, double time, long monitorIndex, int timerIndex) {} + } +} diff --git a/Assets/Samples/RebindingUI/OnScreen/ChangeMonitor.cs.meta b/Assets/Samples/RebindingUI/OnScreen/ChangeMonitor.cs.meta new file mode 100644 index 0000000000..4ae7e6bc48 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/ChangeMonitor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e4aa0ac8504b4e7494c61fb19aefd489 +timeCreated: 1758895723 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/Curve.cs b/Assets/Samples/RebindingUI/OnScreen/Curve.cs new file mode 100644 index 0000000000..bf91491226 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/Curve.cs @@ -0,0 +1,51 @@ +using System; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + public enum PredefinedCurve + { + Linear, + Quatratic, + Cubic, + } + + public static class CurveExtensions + { + /// + /// Apply response curve shaping to vlaue . + /// + /// The normalized value to be transformed. + /// The response curve. + /// Transformed normalized value. + /// If is outside valid range. + public static float Transform(float x, PredefinedCurve curve) + { + switch (curve) + { + case PredefinedCurve.Linear: + return x; + case PredefinedCurve.Quatratic: + return x * x; + case PredefinedCurve.Cubic: + return x * x * x; + default: + throw new ArgumentOutOfRangeException(nameof(curve)); + } + } + + /// + /// Apply response curve shaping to vector . + /// + /// The provided vector is first transformed to polar form, then the vector length is scaled + /// before it is finally converted back to euclidean space. + /// A normalized Euclidean vector to be transformed. + /// The response curve. + /// Transformed normalized Euclidean vector. + public static Vector2 Transform(Vector2 v, PredefinedCurve curve) + { + var r = Transform(v.magnitude, curve); + var theta = Mathf.Atan2(v.y, v.x); + return new Vector2(r * Mathf.Cos(theta), r * Mathf.Sin(theta)); + } + } +} diff --git a/Assets/Samples/RebindingUI/OnScreen/Curve.cs.meta b/Assets/Samples/RebindingUI/OnScreen/Curve.cs.meta new file mode 100644 index 0000000000..6cf28fca77 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/Curve.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 15c021c605ca4243bddb86ddad37dc2b +timeCreated: 1758909648 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs b/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs new file mode 100644 index 0000000000..1e00ea99f7 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs @@ -0,0 +1,406 @@ +using System; +using System.Collections.Generic; +using NUnit.Framework; +using UnityEditor; +using UnityEngine; +using UnityEngine.InputSystem.Controls; +using UnityEngine.InputSystem.OnScreen; +using UnityEngine.InputSystem.Layouts; +using UnityEngine.InputSystem.LowLevel; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + // TODO Should maybe be split into GestureArea and OnScreenControl + // TODO Might need to handle delta state events + public class CustomOnScreenControl : UnityEngine.InputSystem.OnScreen.OnScreenControl + { + #region Properties + + /// + /// Gets or set the geometric shape of the touch clipping area. + /// + private AreaShape shape + { + get => m_Shape; + set + { + if (m_Shape == value) + return; + + m_Shape = value; + OnConfigurationChanged(); + } + } + + /// + /// Gets or sets the geometric clipping area position. + /// + public Vector2 position + { + get => m_NormalizedBounds.position; + set + { + if (m_NormalizedBounds.position.Equals(value)) + return; + + m_NormalizedBounds.position = value; + OnConfigurationChanged(); + } + } + + /// + /// Gets or sets the size of the geometric clipping area. + /// + public Vector2 size + { + get => m_NormalizedBounds.size; + set + { + if (m_NormalizedBounds.size.Equals(value)) + return; + + m_NormalizedBounds.size = value; + OnConfigurationChanged(); + } + } + + /// + /// Gets or sets the bounds of the geometric clipping area. + /// + public Rect bounds + { + get => m_NormalizedBounds; + set + { + if (m_NormalizedBounds.Equals(value)) + return; + + m_NormalizedBounds = value; + OnConfigurationChanged(); + } + } + + /// + /// Gets or sets the mapping curve. + /// + public PredefinedCurve curve + { + get => m_Curve; + set + { + if (m_Curve.Equals(value)) + return; + + m_Curve = value; + OnConfigurationChanged(); + } + } + + [Header("Bounds")] + [Tooltip("The geometric clipping area shape")] + [SerializeField] + private AreaShape m_Shape = AreaShape.Rectangle; + + [Tooltip("The geometric clipping area shape")] + [SerializeField] private Rect m_NormalizedBounds; + + [Header("Control")] + [Tooltip("The output control path")] + [InputControl(layout = "Vector2")] + [SerializeField] + private string m_ControlPath; + + [Tooltip("Response curve to be applied to the control value")] + [SerializeField] + private PredefinedCurve m_Curve = PredefinedCurve.Linear; + + [Tooltip("The stick radius in millimeters when used as an on-screen stick. " + + "This defaults to 7.2 millimeters which is similar to the mechanical stick displacement of popular " + + "gamepads.")] + [SerializeField] + private float m_StickRadiusMillimeters = 7.2f; + + protected override string controlPathInternal + { + get => m_ControlPath; + set => m_ControlPath = value; + } + + #endregion // Properties + + private Touchscreen m_Touchscreen; + + protected override void OnEnable() + { + base.OnEnable(); + + // TODO This should really be reacting to changes of control path and properties + const float threshold = 10.0f; + if (control is ButtonControl) + m_ChangeMonitor = new ChangeMonitor(1, new ActiveDetector()); + else if (control is StickControl) + m_ChangeMonitor = new ChangeMonitor(1, new DragDetector(threshold)); + else + throw new Exception($"Unsupported control type: {control.GetType()}"); + + ChangeDevice(); + + InputSystem.onDeviceChange += OnDeviceChange; + //InputSystem.onEvent += OnEvent; + } + + protected override void OnDisable() + { + //InputSystem.onEvent -= OnEvent; + InputSystem.onDeviceChange -= OnDeviceChange; + + base.OnDisable(); + } + + private void OnDeviceChange(InputDevice device, InputDeviceChange change) + { + switch (change) + { + case InputDeviceChange.Added: + // We can ignore added devices if its an unrelated device. + if (device is Touchscreen) + ChangeDevice(); + break; + case InputDeviceChange.Removed: + // We can ignore removed device if its not the device we are using. + if (device == m_Touchscreen) + ChangeDevice(); + break; + case InputDeviceChange.ConfigurationChanged: + // The device configuration changed, we currently ignore this. + break; + case InputDeviceChange.Enabled: + // A touchscreen got enabled so we attempt to change device + if (device is Touchscreen) + ChangeDevice(); + break; + case InputDeviceChange.Disabled: + // We can ignore disable events if it is an unrelated device + if (device == m_Touchscreen) + ChangeDevice(); + break; + case InputDeviceChange.UsageChanged: + // The device usages changed, we currently ignore this. + break; + case InputDeviceChange.HardReset: + // The device was reset, we currently ignore this. + break; + case InputDeviceChange.SoftReset: + // The device was reset, we currently ignore this. + break; + case InputDeviceChange.Reconnected: + ChangeDevice(); + break; + case InputDeviceChange.Disconnected: + // We can ignore disconnect event if it is an unrelated device + if (device == m_Touchscreen) + ChangeDevice(); + break; + default: + Debug.LogWarning($"Unhandled device change, device={device}, change={change}."); + break; + } + } + + private void ChangeDevice() => ChangeDevice(Touchscreen.current); + + private ChangeMonitor m_ChangeMonitor; + + private void ChangeDevice(Touchscreen current) + { + // If touchscreen device have not changed, return immediately. + if (m_Touchscreen == current) + return; + + // Stop monitoring the previous device + if (m_Touchscreen != null && m_ChangeMonitor != null) + InputState.RemoveChangeMonitor(m_Touchscreen, m_ChangeMonitor); + + // Update current device + m_Touchscreen = current; + + // Start monitoring the new device + if (m_ChangeMonitor != null) + { + m_ChangeMonitor.Reset(m_NormalizedBounds, m_Shape, OnGestureEvent); + + if (current != null && m_ChangeMonitor != null) + InputState.AddChangeMonitor(current, m_ChangeMonitor); + } + } + + private void OnGestureEvent(in GestureEvent gestureEvent) + { + // TODO Button control should be whether touch is inside area + + // For button control, we consider the whole clip region as a button area. + if (control is ButtonControl) + { + var value = 0.0f; + if (gestureEvent.flags.HasFlag(GestureFlags.PhaseStart)) + { + value = 1.0f; + } + + value = CurveExtensions.Transform(value, m_Curve); + + SendValueToControl(value); + } + // For stick control, we map drag gesture delta as stick actuation from initial press point + // and reset virtual stick back to zero if touch ends or is cancelled. Note that we transform + // pixels to physical distance since on-screen controls are expected to be consistent regardless + // of the displays physical size. + else if (control is StickControl && gestureEvent.flags.HasFlag(GestureFlags.DragGesture)) + { + var value = Vector2.zero; + if (gestureEvent.flags.HasFlag(GestureFlags.PhaseStart) || + gestureEvent.flags.HasFlag(GestureFlags.PhaseChange)) + { + // A DualSense has a mechanical displacement of ~7.4 mm. + // A DualShock has a mechanical displacement of ~6.9 mm. + + const float kMillimetersPerInch = 25.4f; + var deltaPx = gestureEvent.delta; + var dpi = Screen.dpi; + var deltaInches = new Vector2(deltaPx.x / dpi, deltaPx.y / dpi); + var deltaMillimeters = deltaInches * kMillimetersPerInch; + var stickRadius = Vector2.ClampMagnitude(deltaMillimeters, m_StickRadiusMillimeters); + value = stickRadius / m_StickRadiusMillimeters; + Debug.Log($"{deltaMillimeters} mm, stick={value}"); + } + + // Transform to polar form before we apply curve and then inverse transform. + value = CurveExtensions.Transform(value, m_Curve); + + SendValueToControl(value); + } + } + + // private void OnEvent(InputEventPtr eventPtr, InputDevice device) + // { + // /*Touchscreen.current.GetStatePtrFromStateEvent() + // if (m_Touchscreen != null && eventPtr.type == StateEvent.Type) + // { + // TouchState state; + // device.GetStatePtrFromStateEvent(eventPtr); + // }*/ + // } + + private static Material mat; + + // public void OnRenderObject() + // { + // if (!mat) + // { + // Shader shader = Shader.Find("Hidden/Internal-Colored"); + // mat = new Material(shader); + // mat.hideFlags = HideFlags.HideAndDontSave; + // // Turn on alpha blending + // mat.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); + // mat.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); + // // Turn backface culling off + // mat.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off); + // // Turn off depth writes + // mat.SetInt("_ZWrite", 0); + // return; + // } + // GL.PushMatrix(); + // mat.SetPass(0); + // GL.LoadOrtho(); + // + // GL.Begin(GL.QUADS); + // + // GL.Color(new Color(1.0f, 0.0f, 0.0f, 0.5f)); + // GL.Vertex3(m_NormalizedBounds.xMin, m_NormalizedBounds.yMin, 0); + // GL.Vertex3(m_NormalizedBounds.xMin, m_NormalizedBounds.yMax, 0); + // GL.Vertex3(m_NormalizedBounds.xMax, m_NormalizedBounds.yMax, 0); + // GL.Vertex3(m_NormalizedBounds.xMax, m_NormalizedBounds.yMin, 0); + // + // GL.End(); + // GL.PopMatrix(); + // } + + private void OnConfigurationChanged() + { + } + + // TODO Fix SendValueToControl instead + // private void ChangeValueOfControl(TValue value) where TValue : struct + // { + // var x = base.control; + // if (x == null) + // return; + // if (x is not InputControl) + // { + // throw new ArgumentException($"The control path {controlPath} yields a control of type "+ + // "{m_Control.GetType().Name} which is not an InputControl with value type " + + // "{typeof(TValue).Name}", nameof(value)); + // } + // + // m + // } + + // private void Foo(in Camera camera, in Vector3 position) + // { + // var orthoSize = camera.orthographicSize; + // var horizontalExtent = orthoSize * camera.aspect; + // return (position.x >= -horizontalExtent - margin) && + // (position.x <= horizontalExtent + margin) && + // (position.y >= -orthoSize - margin) && + // (position.y <= orthoSize + margin); + // } + + /*private void OnDrawGizmos() + { + Gizmos.color = new Color(1f, 1.0f, 0.0f, 0.75f); + Gizmos.DrawLine(new Vector3(0,0,0), new Vector3(100,0,0)); + }*/ + + void OnDrawGizmosSelected() + { + //Gizmos.color = new Color(1f, 1.0f, 0.0f, 0.75f); + + // Convert the local coordinate values into world + // coordinates for the matrix transformation. + //Gizmos.matrix = transform.localToWorldMatrix; + //Gizmos.DrawCube(Vector3.zero, Vector3.one); + + //Gizmos.DrawWireCube(new Vector3(m_Bounds.center.x, m_Bounds.center.y, 0.01f), new Vector3(m_Bounds.size.x, m_Bounds.size.y, 0.01f)); + } + } + + //#if UNITY_EDITOR + + + //[CustomEditor(typeof(CustomOnScreenControl))] + // internal class CustomOnScreenControlEditor : UnityEditor.Editor + // { + // public void OnEnable() + // { + // m_ControlPathInternal = serializedObject.FindProperty("m_ControlPath"); + // m_Bounds = serializedObject.FindProperty("m_NormalizedBounds"); + // } + // + // public override void OnInspectorGUI() + // { + // EditorGUI.BeginChangeCheck(); + // + // Debug.Log(m_Bounds); + // //EditorGUILayout.PropertyField(m_Bounds); + // EditorGUILayout.PropertyField(m_ControlPathInternal); + // + // if (EditorGUI.EndChangeCheck()) + // serializedObject.ApplyModifiedProperties(); + // } + // + // private SerializedProperty m_ControlPathInternal; + // private SerializedProperty m_Bounds; + // } + + //#endif // UNITY_EDITOR +} diff --git a/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs.meta b/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs.meta new file mode 100644 index 0000000000..81892fc140 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5514b68a2410f4ab8a2e19c8b963b6f3 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs b/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs new file mode 100644 index 0000000000..9bb573e77e --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs @@ -0,0 +1,84 @@ +using UnityEngine.InputSystem.LowLevel; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + class DragDetector : ITouchProcessor + { + private double m_InitialTime; + private Vector2 m_InitialPosition; + private readonly float m_ThresholdSqr; + private bool m_Valid; + + public DragDetector(float threshold) + { + m_InitialTime = 0; + m_InitialPosition = Vector2.zero; + m_ThresholdSqr = threshold * threshold; + m_Valid = false; + } + + public void OnTouchBegin(ChangeMonitor context, in TouchState[] touches, int count, int index) + { + if (count == 1) + { + m_InitialPosition = touches[index].position; + m_InitialTime = Time.realtimeSinceStartupAsDouble; + } + else if (m_Valid) + { + m_Valid = false; + Fire(context, touches, count, index, GestureFlags.PhaseCancel); + } + } + + public void OnTouchEnd(ChangeMonitor context, in TouchState[] touches, int count, int index) + { + if (!m_Valid) + return; + + Fire(context, touches, count, index, GestureFlags.PhaseEnd); + m_Valid = false; + } + + public void OnTouchMoved(ChangeMonitor context, in TouchState[] touches, int count, int index) + { + if (m_Valid) + { + Fire(context, touches, count, index, GestureFlags.PhaseChange); + } + else + { + // Require that we move outside "dead zone" before we consider the drag to start. + if (IsWithinMargin(touches[index].position)) + return; + + m_Valid = true; + Fire(context, touches, count, index, GestureFlags.PhaseStart); + } + } + + public void OnTouchCanceled(ChangeMonitor context, in TouchState[] touches, int count, int index) + { + if (m_Valid) + { + m_Valid = false; + Fire(context, touches, count, index, GestureFlags.PhaseCancel); + } + } + + private void Fire(ChangeMonitor context, in TouchState[] touches, int count, int index, GestureFlags phase) + { + GestureEvent @event = new GestureEvent( + delta: touches[index].position - m_InitialPosition, + duration: Time.realtimeSinceStartupAsDouble - m_InitialTime, + flags: GestureFlags.DragGesture | phase, start: m_InitialPosition); + context.FireEvent(in @event); + } + + private bool IsWithinMargin(Vector2 point) + { + var sqrMagnitude = (point - m_InitialPosition).sqrMagnitude; + return sqrMagnitude <= m_ThresholdSqr; + } + } +} diff --git a/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs.meta b/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs.meta new file mode 100644 index 0000000000..1bc9b75129 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d1f619de762d44f4ab27642006b28191 +timeCreated: 1758895643 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs b/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs new file mode 100644 index 0000000000..c92edebbf1 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs @@ -0,0 +1,66 @@ +using System; +using System.Text; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + [Flags] + public enum GestureFlags + { + None = 0, + + TapGesture = 1 << 0, + PressAndHoldGesture = 1 << 1, + DragGesture = 1 << 2, + Active = 1 << 3, + + PhaseCancel = 1 << 28, + PhaseStart = 1 << 29, + PhaseChange = 1 << 30, + PhaseEnd = 1 << 31, + } + + public readonly struct GestureEvent + { + public readonly GestureFlags flags; + public readonly Vector2 start; + public readonly Vector2 delta; + public readonly double duration; + + public GestureEvent(Vector2 delta, double duration, GestureFlags flags, Vector2 start) + { + this.delta = delta; + this.duration = duration; + this.flags = flags; + this.start = start; + } + + public override string ToString() + { + var sb = new StringBuilder(); + if (flags.HasFlag(GestureFlags.TapGesture)) + Append(sb, "Tap"); + if (flags.HasFlag(GestureFlags.PressAndHoldGesture)) + Append(sb, "PressAndHold"); + if (flags.HasFlag(GestureFlags.DragGesture)) + Append(sb, "Drag"); + if (flags.HasFlag(GestureFlags.PhaseCancel)) + Append(sb, "PhaseCancel"); + if (flags.HasFlag(GestureFlags.PhaseStart)) + Append(sb, "PhaseStart"); + if (flags.HasFlag(GestureFlags.PhaseChange)) + Append(sb, "PhaseChange"); + if (flags.HasFlag(GestureFlags.PhaseEnd)) + Append(sb, "PhaseEnd"); + return $"GestureEvent{{delta: {delta}, duration: {duration}, start: {start}, flags: {sb}}}"; + } + + private static void Append(StringBuilder sb, string s) + { + if (sb.Length != 0) + sb.Append(", "); + sb.Append(s); + } + + // TODO Consider including a transform for direct manipulation + } +} diff --git a/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs.meta b/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs.meta new file mode 100644 index 0000000000..2dbd399b88 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7e233c17090c47cca81f36ac0fbfdbc0 +timeCreated: 1758896699 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs b/Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs new file mode 100644 index 0000000000..90986c2e6c --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs @@ -0,0 +1,9 @@ +using UnityEngine.InputSystem.LowLevel; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + interface ITouchMonitor : IInputStateChangeMonitor + { + void Reset(Rect bounds, AreaShape shape, ChangeMonitor.GestureEventHandler handler); + } +} diff --git a/Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs.meta b/Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs.meta new file mode 100644 index 0000000000..a6ea75798e --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e0289fdf031b4efc96d6d89b9cced828 +timeCreated: 1758895694 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs b/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs new file mode 100644 index 0000000000..05fbaa8d55 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs @@ -0,0 +1,12 @@ +using UnityEngine.InputSystem.LowLevel; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + interface ITouchProcessor + { + void OnTouchBegin(ChangeMonitor context, in TouchState[] touches, int count, int index); + void OnTouchEnd(ChangeMonitor context, in TouchState[] touches, int count, int index); + void OnTouchMoved(ChangeMonitor context, in TouchState[] touches, int count, int index); + void OnTouchCanceled(ChangeMonitor context, in TouchState[] touches, int count, int index); + } +} diff --git a/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs.meta b/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs.meta new file mode 100644 index 0000000000..931d5ed725 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bc06ca24beb747348546bc744798b26d +timeCreated: 1758895602 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/TapDetector.cs b/Assets/Samples/RebindingUI/OnScreen/TapDetector.cs new file mode 100644 index 0000000000..e5ab95e4f3 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/TapDetector.cs @@ -0,0 +1,64 @@ +using UnityEngine.InputSystem.LowLevel; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + class TapDetector : ITouchProcessor + { + private Vector2 m_InitialPosition; + private double m_InitialTime; + private readonly float m_ThresholdSqr; + private bool m_Valid; + + public TapDetector(float threshold) + { + m_ThresholdSqr = threshold * threshold; + m_InitialPosition = Vector2.zero; + m_InitialTime = 0; + m_Valid = true; + } + + public void OnTouchBegin(ChangeMonitor context, in TouchState[] touches, int count, int index) + { + if (count == 1) + { + m_InitialPosition = touches[index].position; + m_InitialTime = Time.realtimeSinceStartupAsDouble; + m_Valid = true; + } + else + { + m_Valid = false; + } + } + + public void OnTouchEnd(ChangeMonitor context, in TouchState[] touches, int count, int index) + { + if (m_Valid && IsWithinMargin(touches[index].position)) + { + GestureEvent @event = new GestureEvent( + delta: touches[index].position - m_InitialPosition, + duration: Time.realtimeSinceStartupAsDouble - m_InitialTime, + flags: GestureFlags.TapGesture, start: m_InitialPosition); + context.FireEvent(in @event); + } + } + + public void OnTouchMoved(ChangeMonitor context, in TouchState[] touches, int count, int index) + { + if (m_Valid && !IsWithinMargin(touches[index].position)) + m_Valid = false; + } + + public void OnTouchCanceled(ChangeMonitor context, in TouchState[] touches, int count, int index) + { + if (m_Valid) + m_Valid = false; + } + + private bool IsWithinMargin(Vector2 point) + { + var sqrMagnitude = (point - m_InitialPosition).sqrMagnitude; + return sqrMagnitude <= m_ThresholdSqr; + } + } +} diff --git a/Assets/Samples/RebindingUI/OnScreen/TapDetector.cs.meta b/Assets/Samples/RebindingUI/OnScreen/TapDetector.cs.meta new file mode 100644 index 0000000000..97cf6ff3ca --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/TapDetector.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 172bea12883c486ea051f49339fe4fd5 +timeCreated: 1758895544 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity index b98fdd2aaf..c9246bce18 100644 --- a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity +++ b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity @@ -493,6 +493,124 @@ MonoBehaviour: m_EditorClassIdentifier: colorOutputFrequency: 10 rumbleOutputFrequency: 10 +--- !u!1 &58438677 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 58438681} + - component: {fileID: 58438680} + - component: {fileID: 58438679} + - component: {fileID: 58438678} + - component: {fileID: 58438682} + m_Layer: 0 + m_Name: OnScreenControls + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!114 &58438678 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 58438677} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.CanvasScaler + m_UiScaleMode: 2 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!114 &58438679 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 58438677} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.GraphicRaycaster + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!223 &58438680 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 58438677} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &58438681 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 58438677} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1883433308} + - {fileID: 688012660} + - {fileID: 1577491575} + - {fileID: 447384400} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!114 &58438682 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 58438677} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d629571aa8e184bd3b6d1e6cb1bf2116, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.InputSystem.RebindingUI::RequireTouchscreen --- !u!1001 &67962919 PrefabInstance: m_ObjectHideFlags: 0 @@ -1521,6 +1639,95 @@ RectTransform: type: 3} m_PrefabInstance: {fileID: 331853781} m_PrefabAsset: {fileID: 0} +--- !u!1 &447384399 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 447384400} + - component: {fileID: 447384403} + - component: {fileID: 447384402} + - component: {fileID: 447384401} + m_Layer: 5 + m_Name: ChangeButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &447384400 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 447384399} + 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: 58438681} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -25, y: 100} + m_SizeDelta: {x: 40, y: 40} + m_Pivot: {x: 1, y: 0} +--- !u!114 &447384401 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 447384399} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6d54531977ecb194c95e2d3aa7a5d72a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.OnScreen.OnScreenButton + m_ControlPath: /buttonEast +--- !u!114 &447384402 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 447384399} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.2509804} + 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: 21300000, guid: d08c52c09554ca8418a86627f4bd14e1, type: 3} + m_Type: 0 + 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 &447384403 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 447384399} + m_CullTransparentMesh: 1 --- !u!1001 &481729234 PrefabInstance: m_ObjectHideFlags: 0 @@ -2231,6 +2438,131 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 685041074} m_CullTransparentMesh: 1 +--- !u!1 &688012659 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 688012660} + - component: {fileID: 688012663} + - component: {fileID: 688012662} + - component: {fileID: 688012661} + - component: {fileID: 688012664} + m_Layer: 5 + m_Name: RightStick + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &688012660 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 688012659} + 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: 58438681} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -25, y: 20} + m_SizeDelta: {x: 40, y: 40} + m_Pivot: {x: 1, y: 0} +--- !u!114 &688012661 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 688012659} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 0.75, g: 0.75, b: 0.75, a: 0.2509804} + 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: 21300000, guid: 04f2711270cd5b64099d2ca2f99529de, type: 3} + m_Type: 0 + 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 &688012662 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 688012659} + m_CullTransparentMesh: 1 +--- !u!114 &688012663 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 688012659} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e9d677f1681015749b15c436eec6d880, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.OnScreen.OnScreenStick + m_MovementRange: 25 + m_DynamicOriginRange: 100 + m_ControlPath: /rightStick + m_Behaviour: 2 + m_UseIsolatedInputActions: 0 + m_PointerDownAction: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: aa9c528a-7f8d-4f95-a0d7-e0d86e736c25 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_PointerMoveAction: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 58f22a70-1f1b-4e3f-a15e-259d6e4f5e3b + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 +--- !u!114 &688012664 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 688012659} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6d54531977ecb194c95e2d3aa7a5d72a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.OnScreen.OnScreenButton + m_ControlPath: /buttonSouth --- !u!224 &696388013 stripped RectTransform: m_CorrespondingSourceObject: {fileID: 4997344956118145359, guid: a6b634f465c284d30ac5a7dd706644da, @@ -5490,7 +5822,7 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 0} + - m_Target: {fileID: 1214352213} m_TargetAssemblyTypeName: UnityEngine.InputSystem.Samples.RebindUI.RebindActionParameterUI, Unity.InputSystem.RebindingUI m_MethodName: ResetToDefault @@ -5632,6 +5964,95 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: cc11d99b1a6682f4cbc4aba1fcd9ac5d, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &1577491574 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1577491575} + - component: {fileID: 1577491578} + - component: {fileID: 1577491577} + - component: {fileID: 1577491576} + m_Layer: 5 + m_Name: FireButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1577491575 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1577491574} + 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: 58438681} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -25, y: 60} + m_SizeDelta: {x: 40, y: 40} + m_Pivot: {x: 1, y: 0} +--- !u!114 &1577491576 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1577491574} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6d54531977ecb194c95e2d3aa7a5d72a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.OnScreen.OnScreenButton + m_ControlPath: /rightTrigger +--- !u!114 &1577491577 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1577491574} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.2509804} + 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: 21300000, guid: 87dce22414624c74d90f8bfc4bf3582f, type: 3} + m_Type: 0 + 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 &1577491578 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1577491574} + m_CullTransparentMesh: 1 --- !u!114 &1582852134 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 6680292650503350826, guid: f25dcd618d3acd64795bf8bb32edb6c9, @@ -6425,7 +6846,7 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 - - m_Target: {fileID: 0} + - m_Target: {fileID: 1214352213} m_TargetAssemblyTypeName: UnityEngine.InputSystem.Samples.RebindUI.RebindActionParameterUI, Unity.InputSystem.RebindingUI m_MethodName: ResetToDefault @@ -6500,6 +6921,7 @@ GameObject: - component: {fileID: 1628222613} - component: {fileID: 1628222612} - component: {fileID: 1628222611} + - component: {fileID: 1628222614} m_Layer: 5 m_Name: Menu m_TagString: Untagged @@ -6622,6 +7044,18 @@ CanvasRenderer: 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 @@ -7904,6 +8338,117 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1880645688} m_CullTransparentMesh: 0 +--- !u!1 &1883433307 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1883433308} + - component: {fileID: 1883433311} + - component: {fileID: 1883433310} + - component: {fileID: 1883433309} + m_Layer: 5 + m_Name: LeftStick + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1883433308 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883433307} + 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: 58438681} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 25, y: 20} + m_SizeDelta: {x: 40, y: 40} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1883433309 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883433307} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 0.75, g: 0.75, b: 0.75, a: 0.2509804} + 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: 21300000, guid: 7e177675a5fc16248b6e164ef7a7f2a6, type: 3} + m_Type: 0 + 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 &1883433310 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883433307} + m_CullTransparentMesh: 1 +--- !u!114 &1883433311 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883433307} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e9d677f1681015749b15c436eec6d880, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.OnScreen.OnScreenStick + m_MovementRange: 25 + m_DynamicOriginRange: 100 + m_ControlPath: /leftStick + m_Behaviour: 2 + m_UseIsolatedInputActions: 0 + m_PointerDownAction: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: aa9c528a-7f8d-4f95-a0d7-e0d86e736c25 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_PointerMoveAction: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 58f22a70-1f1b-4e3f-a15e-259d6e4f5e3b + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 --- !u!224 &1883834775 stripped RectTransform: m_CorrespondingSourceObject: {fileID: 6968172690644006903, guid: f25dcd618d3acd64795bf8bb32edb6c9, @@ -8041,6 +8586,129 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2040634062} m_CullTransparentMesh: 1 +--- !u!1 &2044918821 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2044918824} + - component: {fileID: 2044918823} + - component: {fileID: 2044918825} + - component: {fileID: 2044918822} + - component: {fileID: 2044918826} + m_Layer: 0 + m_Name: OnScreenControls + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2044918822 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2044918821} + 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.5 + y: 0.5 + width: 0.5 + height: 0.5 + m_ControlPath: /buttonEast + m_Curve: 0 + m_StickRadiusMillimeters: 7.2 +--- !u!114 &2044918823 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2044918821} + 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.5 + height: 1 + m_ControlPath: /leftStick + m_Curve: 0 + m_StickRadiusMillimeters: 7.2 +--- !u!4 &2044918824 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2044918821} + serializedVersion: 2 + 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} +--- !u!114 &2044918825 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2044918821} + 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.5 + y: 0 + width: 0.5 + height: 0.5 + m_ControlPath: /rightStick + m_Curve: 0 + m_StickRadiusMillimeters: 7.2 +--- !u!114 &2044918826 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2044918821} + 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.5 + y: 0 + width: 0.5 + height: 0.5 + m_ControlPath: /rightTrigger + m_Curve: 0 + m_StickRadiusMillimeters: 7.2 --- !u!1 &2052415374 GameObject: m_ObjectHideFlags: 0 @@ -8675,5 +9343,7 @@ SceneRoots: - {fileID: 1183078599} - {fileID: 1618329840} - {fileID: 861395295} + - {fileID: 58438681} - {fileID: 780148237} - {fileID: 51853244} + - {fileID: 2044918824} diff --git a/Assets/Samples/RebindingUI/RequireTouchscreen.cs b/Assets/Samples/RebindingUI/RequireTouchscreen.cs new file mode 100644 index 0000000000..3b01b008f1 --- /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.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/InputSystem/Plugins/OnScreen/OnScreenControl.cs b/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenControl.cs index 06b464802f..ce0fedbcbf 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenControl.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenControl.cs @@ -203,7 +203,8 @@ protected void SendValueToControl(TValue value) ////FIXME: this gives us a one-frame lag (use InputState.Change instead?) m_InputEventPtr.internalTime = InputRuntime.s_Instance.currentTime; control.WriteValueIntoEvent(value, m_InputEventPtr); - InputSystem.QueueEvent(m_InputEventPtr); + //InputSystem.QueueEvent(m_InputEventPtr); + InputState.Change(m_Control.m_Device, m_InputEventPtr); } protected void SentDefaultValueToControl() @@ -346,24 +347,4 @@ internal string GetWarningMessage() return $"{GetType()} needs to be attached as a child to a UI Canvas and have a RectTransform component to function properly."; } } - - internal static class UGUIOnScreenControlUtils - { - public static RectTransform GetCanvasRectTransform(Transform transform) - { - var parentTransform = transform.parent; - return parentTransform != null ? transform.parent.GetComponentInParent() : null; - } - } - -#if UNITY_EDITOR - internal static class UGUIOnScreenControlEditorUtils - { - public static void ShowWarningIfNotPartOfCanvasHierarchy(OnScreenControl target) - { - if (UGUIOnScreenControlUtils.GetCanvasRectTransform(target.transform) == null) - UnityEditor.EditorGUILayout.HelpBox(target.GetWarningMessage(), UnityEditor.MessageType.Warning); - } - } -#endif } diff --git a/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenHelpers.cs b/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenHelpers.cs new file mode 100644 index 0000000000..0eeabb3bd5 --- /dev/null +++ b/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenHelpers.cs @@ -0,0 +1,58 @@ +using System; +using UnityEngine.InputSystem.LowLevel; + +namespace UnityEngine.InputSystem.OnScreen +{ + // Current implementation has UGUI dependencies (ISXB-915, ISXB-916) + + internal static class UGUIOnScreenControlUtils + { + public static RectTransform GetCanvasRectTransform(Transform transform) + { + var parentTransform = transform.parent; + return parentTransform != null ? transform.parent.GetComponentInParent() : null; + } + } + + // TODO Reconsider this before landing anything, there seems to be no way to access accumulated state without unsafe code? + public static class OnScreenUnsafeHelpers + { + public static bool TryGetStateCopy(InputEventPtr eventPtr, int format, out T touchState) where T : unmanaged + { + try + { + if (eventPtr == null || eventPtr.type != format) + { + unsafe + { + var stateEvent = (StateEvent*)eventPtr.ToPointer(); + if (stateEvent->stateFormat == TouchState.Format) + { + touchState = *(T*)stateEvent->state; + return true; + } + } + } + } + catch (Exception e) + { + Console.WriteLine(e); + throw; + } + + touchState = default(T); + return false; + } + } + +#if UNITY_EDITOR + internal static class UGUIOnScreenControlEditorUtils + { + public static void ShowWarningIfNotPartOfCanvasHierarchy(OnScreenControl target) + { + if (UGUIOnScreenControlUtils.GetCanvasRectTransform(target.transform) == null) + UnityEditor.EditorGUILayout.HelpBox(target.GetWarningMessage(), UnityEditor.MessageType.Warning); + } + } +#endif +} diff --git a/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenHelpers.cs.meta b/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenHelpers.cs.meta new file mode 100644 index 0000000000..43505b5247 --- /dev/null +++ b/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenHelpers.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b04044ee8dfc48409d1d55a48af5cb77 +timeCreated: 1758782539 \ No newline at end of file From b854395a2510a9355d4aed17401db481eeebc92d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Sat, 27 Sep 2025 22:19:51 +0200 Subject: [PATCH 11/22] Additional work on on screen controls including UI visualisation --- .../RebindingUI/InputActionIndicator.cs | 2 + .../RebindingUI/OnScreen/ActiveDetector.cs | 18 +- Assets/Samples/RebindingUI/OnScreen/Curve.cs | 45 +- .../OnScreen/CustomOnScreenControl.cs | 161 +-- .../{ChangeMonitor.cs => Detector.cs} | 22 +- ...ChangeMonitor.cs.meta => Detector.cs.meta} | 0 .../RebindingUI/OnScreen/DragDetector.cs | 22 +- .../RebindingUI/OnScreen/GestureEvent.cs | 70 +- .../RebindingUI/OnScreen/ITouchMonitor.cs | 4 +- .../RebindingUI/OnScreen/ITouchProcessor.cs | 10 +- .../RebindingUI/OnScreen/OnScreenControlUI.cs | 227 ++++ .../OnScreen/OnScreenControlUI.cs.meta | 2 + .../RebindingUI/OnScreen/ScreenGizmos.cs | 60 + .../RebindingUI/OnScreen/ScreenGizmos.cs.meta | 3 + .../RebindingUI/OnScreen/TapDetector.cs | 12 +- .../RebindingUI/OnScreen/UnitConverter.cs | 57 + .../OnScreen/UnitConverter.cs.meta | 3 + .../RebindingUI/RebindingUISampleScene.unity | 1107 ++++++++++++++++- .../Samples/RebindingUI/RequireTouchscreen.cs | 2 +- 19 files changed, 1605 insertions(+), 222 deletions(-) rename Assets/Samples/RebindingUI/OnScreen/{ChangeMonitor.cs => Detector.cs} (90%) rename Assets/Samples/RebindingUI/OnScreen/{ChangeMonitor.cs.meta => Detector.cs.meta} (100%) create mode 100644 Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs create mode 100644 Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs.meta create mode 100644 Assets/Samples/RebindingUI/OnScreen/ScreenGizmos.cs create mode 100644 Assets/Samples/RebindingUI/OnScreen/ScreenGizmos.cs.meta create mode 100644 Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs create mode 100644 Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs.meta diff --git a/Assets/Samples/RebindingUI/InputActionIndicator.cs b/Assets/Samples/RebindingUI/InputActionIndicator.cs index 9668bac4c8..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; // TODO Problem here after domain reload, InputAction.addperformed(), CallbackArray.AddCallback,. InputArrayExtensions.Contains + } } private void OnDisable() diff --git a/Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs b/Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs index f83a2bea3c..0f44dcefe2 100644 --- a/Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs +++ b/Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs @@ -2,13 +2,13 @@ namespace UnityEngine.InputSystem.Samples.RebindUI { - class ActiveDetector : ITouchProcessor + internal class ActiveDetector : ITouchProcessor { private Vector2 m_InitialPosition = Vector2.zero; private double m_InitialTime = 0; private bool m_Valid = true; - public void OnTouchBegin(ChangeMonitor context, in TouchState[] touches, int count, int index) + public void OnTouchBegin(Detector context, in TouchState[] touches, int count, int index) { if (count == 1) { @@ -19,7 +19,7 @@ public void OnTouchBegin(ChangeMonitor context, in TouchState[] touches, int cou GestureEvent @event = new GestureEvent( delta: Vector2.zero, duration: 0.0, - flags: GestureFlags.Active | GestureFlags.PhaseStart, + flags: GestureEvent.Flags.Active | GestureEvent.Flags.PhaseStart, start: m_InitialPosition ); context.FireEvent(in @event); @@ -30,33 +30,33 @@ public void OnTouchBegin(ChangeMonitor context, in TouchState[] touches, int cou } } - public void OnTouchEnd(ChangeMonitor context, in TouchState[] touches, int count, int index) + public void OnTouchEnd(Detector context, in TouchState[] touches, int count, int index) { if (m_Valid) { GestureEvent @event = new GestureEvent( delta: touches[index].position - m_InitialPosition, duration: Time.realtimeSinceStartupAsDouble - m_InitialTime, - flags: GestureFlags.Active | GestureFlags.PhaseEnd, start: m_InitialPosition); + flags: GestureEvent.Flags.Active | GestureEvent.Flags.PhaseEnd, start: m_InitialPosition); context.FireEvent(in @event); } } - public void OnTouchMoved(ChangeMonitor context, in TouchState[] touches, int count, int index) + public void OnTouchMoved(Detector context, in TouchState[] touches, int count, int index) { // Ignored } - public void OnTouchCanceled(ChangeMonitor context, in TouchState[] touches, int count, int index) + public void OnTouchCanceled(Detector context, in TouchState[] touches, int count, int index) { if (m_Valid) { m_Valid = false; - GestureEvent @event = new GestureEvent( + var @event = new GestureEvent( delta: touches[index].position - m_InitialPosition, duration: Time.realtimeSinceStartupAsDouble - m_InitialTime, - flags: GestureFlags.Active | GestureFlags.PhaseCancel, + flags: GestureEvent.Flags.Active | GestureEvent.Flags.PhaseCancel, start: m_InitialPosition); context.FireEvent(in @event); } diff --git a/Assets/Samples/RebindingUI/OnScreen/Curve.cs b/Assets/Samples/RebindingUI/OnScreen/Curve.cs index bf91491226..8b0c8c9df5 100644 --- a/Assets/Samples/RebindingUI/OnScreen/Curve.cs +++ b/Assets/Samples/RebindingUI/OnScreen/Curve.cs @@ -2,32 +2,49 @@ namespace UnityEngine.InputSystem.Samples.RebindUI { - public enum PredefinedCurve + /// + /// Represents a response curve for mapping normalized values onto the normalized value axis. + /// + public enum Curve { + /// + /// Linear curve f(x) = x. + /// Linear, - Quatratic, + + /// + /// Quadratic curve f(x) = x^2. + /// + Quadratic, + + /// + /// Cubic curve f(x) = x^3. + /// Cubic, } - public static class CurveExtensions + /// + /// Extension methods for . + /// + internal static class CurveExtensions { /// /// Apply response curve shaping to vlaue . /// - /// The normalized value to be transformed. /// The response curve. + /// The normalized value to be transformed. /// Transformed normalized value. /// If is outside valid range. - public static float Transform(float x, PredefinedCurve curve) + public static float Transform(this Curve curve, float v) { switch (curve) { - case PredefinedCurve.Linear: - return x; - case PredefinedCurve.Quatratic: - return x * x; - case PredefinedCurve.Cubic: - return x * x * x; + case Curve.Linear: + return v; + case Curve.Quadratic: + return v * v; + case Curve.Cubic: + return v * v * v; default: throw new ArgumentOutOfRangeException(nameof(curve)); } @@ -38,12 +55,12 @@ public static float Transform(float x, PredefinedCurve curve) /// /// The provided vector is first transformed to polar form, then the vector length is scaled /// before it is finally converted back to euclidean space. - /// A normalized Euclidean vector to be transformed. /// The response curve. + /// A normalized Euclidean vector to be transformed. /// Transformed normalized Euclidean vector. - public static Vector2 Transform(Vector2 v, PredefinedCurve curve) + public static Vector2 Transform(this Curve curve, Vector2 v) { - var r = Transform(v.magnitude, curve); + var r = curve.Transform(v.magnitude); var theta = Mathf.Atan2(v.y, v.x); return new Vector2(r * Mathf.Cos(theta), r * Mathf.Sin(theta)); } diff --git a/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs b/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs index 1e00ea99f7..89c60ef2fb 100644 --- a/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs +++ b/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs @@ -1,13 +1,16 @@ using System; -using System.Collections.Generic; -using NUnit.Framework; using UnityEditor; -using UnityEngine; using UnityEngine.InputSystem.Controls; -using UnityEngine.InputSystem.OnScreen; using UnityEngine.InputSystem.Layouts; using UnityEngine.InputSystem.LowLevel; +// TODO Consider if we should ditch shape control on this one? Only if we want a square shaped stick it does matter. +// We could call that joystick in that case. +// TODO Consider not using viewport coordinates for bounds. Instead we want a bounding rect in physical screen space. +// This is similar but make more sense. +// TODO Consider support for 1D sticks +// TODO Consider support for d-pad. + namespace UnityEngine.InputSystem.Samples.RebindUI { // TODO Should maybe be split into GestureArea and OnScreenControl @@ -83,7 +86,7 @@ public Rect bounds /// /// Gets or sets the mapping curve. /// - public PredefinedCurve curve + public Curve curve { get => m_Curve; set @@ -96,6 +99,22 @@ public PredefinedCurve curve } } + /// + /// Gets or sets the on-screen stick radius in millimeters. + /// + /// If attempting to set the stick radius to a negative value. + public float stickRadiusMillimeters + { + get => m_StickRadiusMillimeters; + set + { + if (value < 0.0f) + throw new ArgumentOutOfRangeException("stickRadiusMillimeters must be greater or equal to zero."); + + m_StickRadiusMillimeters = value; + } + } + [Header("Bounds")] [Tooltip("The geometric clipping area shape")] [SerializeField] @@ -112,7 +131,7 @@ public PredefinedCurve curve [Tooltip("Response curve to be applied to the control value")] [SerializeField] - private PredefinedCurve m_Curve = PredefinedCurve.Linear; + private Curve m_Curve = Curve.Linear; [Tooltip("The stick radius in millimeters when used as an on-screen stick. " + "This defaults to 7.2 millimeters which is similar to the mechanical stick displacement of popular " + @@ -126,9 +145,10 @@ protected override string controlPathInternal set => m_ControlPath = value; } - #endregion // Properties - private Touchscreen m_Touchscreen; + private Detector m_Detector; + + #endregion // Properties protected override void OnEnable() { @@ -137,21 +157,18 @@ protected override void OnEnable() // TODO This should really be reacting to changes of control path and properties const float threshold = 10.0f; if (control is ButtonControl) - m_ChangeMonitor = new ChangeMonitor(1, new ActiveDetector()); + m_Detector = new Detector(1, new ActiveDetector()); else if (control is StickControl) - m_ChangeMonitor = new ChangeMonitor(1, new DragDetector(threshold)); + m_Detector = new Detector(1, new DragDetector(threshold)); else throw new Exception($"Unsupported control type: {control.GetType()}"); ChangeDevice(); - InputSystem.onDeviceChange += OnDeviceChange; - //InputSystem.onEvent += OnEvent; } protected override void OnDisable() { - //InputSystem.onEvent -= OnEvent; InputSystem.onDeviceChange -= OnDeviceChange; base.OnDisable(); @@ -171,8 +188,13 @@ private void OnDeviceChange(InputDevice device, InputDeviceChange change) if (device == m_Touchscreen) ChangeDevice(); break; - case InputDeviceChange.ConfigurationChanged: - // The device configuration changed, we currently ignore this. + case InputDeviceChange.Reconnected: + ChangeDevice(); + break; + case InputDeviceChange.Disconnected: + // We can ignore disconnect event if it is an unrelated device + if (device == m_Touchscreen) + ChangeDevice(); break; case InputDeviceChange.Enabled: // A touchscreen got enabled so we attempt to change device @@ -184,22 +206,15 @@ private void OnDeviceChange(InputDevice device, InputDeviceChange change) if (device == m_Touchscreen) ChangeDevice(); break; + case InputDeviceChange.ConfigurationChanged: case InputDeviceChange.UsageChanged: - // The device usages changed, we currently ignore this. + OnConfigurationChanged(); break; case InputDeviceChange.HardReset: - // The device was reset, we currently ignore this. + // The device was reset, we currently ignore this and rely on event propagation. break; case InputDeviceChange.SoftReset: - // The device was reset, we currently ignore this. - break; - case InputDeviceChange.Reconnected: - ChangeDevice(); - break; - case InputDeviceChange.Disconnected: - // We can ignore disconnect event if it is an unrelated device - if (device == m_Touchscreen) - ChangeDevice(); + // The device was reset, we currently ignore this and rely on event propagation. break; default: Debug.LogWarning($"Unhandled device change, device={device}, change={change}."); @@ -209,8 +224,6 @@ private void OnDeviceChange(InputDevice device, InputDeviceChange change) private void ChangeDevice() => ChangeDevice(Touchscreen.current); - private ChangeMonitor m_ChangeMonitor; - private void ChangeDevice(Touchscreen current) { // If touchscreen device have not changed, return immediately. @@ -218,80 +231,55 @@ private void ChangeDevice(Touchscreen current) return; // Stop monitoring the previous device - if (m_Touchscreen != null && m_ChangeMonitor != null) - InputState.RemoveChangeMonitor(m_Touchscreen, m_ChangeMonitor); + if (m_Touchscreen != null && m_Detector != null) + InputState.RemoveChangeMonitor(m_Touchscreen, m_Detector); // Update current device m_Touchscreen = current; // Start monitoring the new device - if (m_ChangeMonitor != null) + if (m_Detector != null) { - m_ChangeMonitor.Reset(m_NormalizedBounds, m_Shape, OnGestureEvent); + m_Detector.Reset(m_NormalizedBounds, m_Shape, OnGestureEvent); - if (current != null && m_ChangeMonitor != null) - InputState.AddChangeMonitor(current, m_ChangeMonitor); + if (current != null && m_Detector != null) + InputState.AddChangeMonitor(current, m_Detector); } } private void OnGestureEvent(in GestureEvent gestureEvent) { - // TODO Button control should be whether touch is inside area - // For button control, we consider the whole clip region as a button area. if (control is ButtonControl) { - var value = 0.0f; - if (gestureEvent.flags.HasFlag(GestureFlags.PhaseStart)) - { - value = 1.0f; - } - - value = CurveExtensions.Transform(value, m_Curve); - + var value = (gestureEvent.flags.HasFlag(GestureEvent.Flags.PhaseStart) ? 1.0f : 0.0f); + value = m_Curve.Transform(value); SendValueToControl(value); } // For stick control, we map drag gesture delta as stick actuation from initial press point // and reset virtual stick back to zero if touch ends or is cancelled. Note that we transform // pixels to physical distance since on-screen controls are expected to be consistent regardless // of the displays physical size. - else if (control is StickControl && gestureEvent.flags.HasFlag(GestureFlags.DragGesture)) + else if (control is StickControl && gestureEvent.flags.HasFlag(GestureEvent.Flags.DragGesture)) { var value = Vector2.zero; - if (gestureEvent.flags.HasFlag(GestureFlags.PhaseStart) || - gestureEvent.flags.HasFlag(GestureFlags.PhaseChange)) + if (gestureEvent.flags.HasFlag(GestureEvent.Flags.PhaseStart) || + gestureEvent.flags.HasFlag(GestureEvent.Flags.PhaseChange)) { // A DualSense has a mechanical displacement of ~7.4 mm. // A DualShock has a mechanical displacement of ~6.9 mm. - const float kMillimetersPerInch = 25.4f; - var deltaPx = gestureEvent.delta; - var dpi = Screen.dpi; - var deltaInches = new Vector2(deltaPx.x / dpi, deltaPx.y / dpi); - var deltaMillimeters = deltaInches * kMillimetersPerInch; + var deltaMillimeters = UnitConverter.PixelsToMillimeters(gestureEvent.delta); var stickRadius = Vector2.ClampMagnitude(deltaMillimeters, m_StickRadiusMillimeters); value = stickRadius / m_StickRadiusMillimeters; - Debug.Log($"{deltaMillimeters} mm, stick={value}"); } - // Transform to polar form before we apply curve and then inverse transform. - value = CurveExtensions.Transform(value, m_Curve); - + value = m_Curve.Transform(value); SendValueToControl(value); } } - // private void OnEvent(InputEventPtr eventPtr, InputDevice device) - // { - // /*Touchscreen.current.GetStatePtrFromStateEvent() - // if (m_Touchscreen != null && eventPtr.type == StateEvent.Type) - // { - // TouchState state; - // device.GetStatePtrFromStateEvent(eventPtr); - // }*/ - // } - - private static Material mat; +// private static Material mat; // public void OnRenderObject() // { @@ -327,6 +315,7 @@ private void OnGestureEvent(in GestureEvent gestureEvent) private void OnConfigurationChanged() { + // TODO Handle configuration change } // TODO Fix SendValueToControl instead @@ -355,11 +344,43 @@ private void OnConfigurationChanged() // (position.y <= orthoSize + margin); // } - /*private void OnDrawGizmos() + private Rect GetScreenSpaceRect(Rect rect, int displayIndex) + { + var display = Display.displays[displayIndex]; + var width = display.renderingWidth; + var height = display.renderingHeight; + return new Rect( + x: rect.xMin * width, + y: rect.yMin * height, + width: rect.width * width, + height: rect.height * height); + } + + private void OnDrawGizmos() { Gizmos.color = new Color(1f, 1.0f, 0.0f, 0.75f); - Gizmos.DrawLine(new Vector3(0,0,0), new Vector3(100,0,0)); - }*/ + ScreenGizmos.DrawLine(Camera.current, new Vector2(0, 0), new Vector2(1000, 1000)); + //Gizmos.DrawLine(new Vector3(0,0,0), new Vector3(10000,0,0)); + //Gizmos.DrawCube(Vector3.zero, new Vector3(5,5,1e-3f)); + // + // // Start drawing in screen coordinates. + // Handles.BeginGUI(); + // + // // Get screen space rect + // //var r = GetScreenSpaceRect(m_NormalizedBounds, Display.activeEditorGameViewTarget); + // + // var r = new Rect(x: 0, y: -20, width: 500, height: 500); + // + // // Transform to GUI coordinates + // + // + // // Draw a solid rectangle with an outline. + // Color backgroundColor = new Color(1.0f, 0.0f, 0.0f, 0.25f); + // Handles.DrawSolidRectangleWithOutline(r, backgroundColor, Color.white); + // + // // End drawing in screen coordinates. + // Handles.EndGUI(); + } void OnDrawGizmosSelected() { diff --git a/Assets/Samples/RebindingUI/OnScreen/ChangeMonitor.cs b/Assets/Samples/RebindingUI/OnScreen/Detector.cs similarity index 90% rename from Assets/Samples/RebindingUI/OnScreen/ChangeMonitor.cs rename to Assets/Samples/RebindingUI/OnScreen/Detector.cs index c3a2536090..75d8b07f7e 100644 --- a/Assets/Samples/RebindingUI/OnScreen/ChangeMonitor.cs +++ b/Assets/Samples/RebindingUI/OnScreen/Detector.cs @@ -1,26 +1,24 @@ using System; -using System.Text; -using Unity.Properties; using UnityEngine.InputSystem.LowLevel; using UnityEngine.InputSystem.OnScreen; namespace UnityEngine.InputSystem.Samples.RebindUI { - abstract class ChangeMonitor : ITouchMonitor + abstract class Detector : ITouchMonitor { public delegate void GestureEventHandler(in GestureEvent gestureEvent); // ref readonly not available until C# 12.0 - protected ChangeMonitor(int maxTouches) + protected Detector(int maxTouches) { m_Touches = new TouchState[maxTouches]; Reset(Rect.zero, AreaShape.Rectangle, null); } - public virtual void Reset(Rect bounds, AreaShape shape, ChangeMonitor.GestureEventHandler handler) + public virtual void Reset(Rect bounds, AreaShape shape, Detector.GestureEventHandler handler) { m_Handler = handler; m_Bounds = bounds; - m_GestureFlags = GestureFlags.None; + m_GestureFlags = GestureEvent.Flags.None; m_Count = 0; } @@ -64,7 +62,7 @@ public void FireEvent(in GestureEvent gestureEvent) //set => SetValue(key, value); protected Rect m_Bounds; protected AreaShape m_Shape; - private GestureFlags m_GestureFlags; + private GestureEvent.Flags m_GestureFlags; private GestureEventHandler m_Handler; protected readonly TouchState[] m_Touches; protected int m_Count; @@ -78,23 +76,23 @@ public abstract void NotifyTimerExpired(InputControl control, double time, long // TODO This class is doing way too much error checking. Underlying implementation should be correct but // there seem to be some kind of bug resulting in duplicate callbacks. - internal class ChangeMonitor : ChangeMonitor, ITouchMonitor + internal class Detector : Detector, ITouchMonitor where TProcessor : ITouchProcessor { private TProcessor m_Processor; - public ChangeMonitor(int maxTouches, TProcessor processor) + public Detector(int maxTouches, TProcessor processor) : base(maxTouches) { m_Processor = processor; } - /*public static ChangeMonitor Create(int maxTouches, TProcessor processor) + /*public static Detector Create(int maxTouches, TProcessor processor) { - return new ChangeMonitor(maxTouches, processor); + return new Detector(maxTouches, processor); }*/ - public override void Reset(Rect bounds, AreaShape shape, ChangeMonitor.GestureEventHandler handler) + public override void Reset(Rect bounds, AreaShape shape, Detector.GestureEventHandler handler) { // Make sure we cancel any pending touches. This way processor do not need a reset method. for (var i = m_Count; i != 0; --i) diff --git a/Assets/Samples/RebindingUI/OnScreen/ChangeMonitor.cs.meta b/Assets/Samples/RebindingUI/OnScreen/Detector.cs.meta similarity index 100% rename from Assets/Samples/RebindingUI/OnScreen/ChangeMonitor.cs.meta rename to Assets/Samples/RebindingUI/OnScreen/Detector.cs.meta diff --git a/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs b/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs index 9bb573e77e..4538909014 100644 --- a/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs +++ b/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs @@ -17,7 +17,7 @@ public DragDetector(float threshold) m_Valid = false; } - public void OnTouchBegin(ChangeMonitor context, in TouchState[] touches, int count, int index) + public void OnTouchBegin(Detector context, in TouchState[] touches, int count, int index) { if (count == 1) { @@ -27,24 +27,24 @@ public void OnTouchBegin(ChangeMonitor context, in TouchState[] touches, int cou else if (m_Valid) { m_Valid = false; - Fire(context, touches, count, index, GestureFlags.PhaseCancel); + Fire(context, touches, count, index, GestureEvent.Flags.PhaseCancel); } } - public void OnTouchEnd(ChangeMonitor context, in TouchState[] touches, int count, int index) + public void OnTouchEnd(Detector context, in TouchState[] touches, int count, int index) { if (!m_Valid) return; - Fire(context, touches, count, index, GestureFlags.PhaseEnd); + Fire(context, touches, count, index, GestureEvent.Flags.PhaseEnd); m_Valid = false; } - public void OnTouchMoved(ChangeMonitor context, in TouchState[] touches, int count, int index) + public void OnTouchMoved(Detector context, in TouchState[] touches, int count, int index) { if (m_Valid) { - Fire(context, touches, count, index, GestureFlags.PhaseChange); + Fire(context, touches, count, index, GestureEvent.Flags.PhaseChange); } else { @@ -53,25 +53,25 @@ public void OnTouchMoved(ChangeMonitor context, in TouchState[] touches, int cou return; m_Valid = true; - Fire(context, touches, count, index, GestureFlags.PhaseStart); + Fire(context, touches, count, index, GestureEvent.Flags.PhaseStart); } } - public void OnTouchCanceled(ChangeMonitor context, in TouchState[] touches, int count, int index) + public void OnTouchCanceled(Detector context, in TouchState[] touches, int count, int index) { if (m_Valid) { m_Valid = false; - Fire(context, touches, count, index, GestureFlags.PhaseCancel); + Fire(context, touches, count, index, GestureEvent.Flags.PhaseCancel); } } - private void Fire(ChangeMonitor context, in TouchState[] touches, int count, int index, GestureFlags phase) + private void Fire(Detector context, in TouchState[] touches, int count, int index, GestureEvent.Flags phase) { GestureEvent @event = new GestureEvent( delta: touches[index].position - m_InitialPosition, duration: Time.realtimeSinceStartupAsDouble - m_InitialTime, - flags: GestureFlags.DragGesture | phase, start: m_InitialPosition); + flags: GestureEvent.Flags.DragGesture | phase, start: m_InitialPosition); context.FireEvent(in @event); } diff --git a/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs b/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs index c92edebbf1..6102e87c7d 100644 --- a/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs +++ b/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs @@ -3,30 +3,54 @@ namespace UnityEngine.InputSystem.Samples.RebindUI { - [Flags] - public enum GestureFlags + /// + /// A gesture event. + /// + public readonly struct GestureEvent { - None = 0, + /// + /// Gesture event flags. + /// + [Flags] + public enum Flags + { + /// + /// No gesture flags, indicates an invalid or default constructed gesture event. + /// + None = 0, - TapGesture = 1 << 0, - PressAndHoldGesture = 1 << 1, - DragGesture = 1 << 2, - Active = 1 << 3, + /// + /// The event is a tap gesture. + /// + TapGesture = 1 << 0, - PhaseCancel = 1 << 28, - PhaseStart = 1 << 29, - PhaseChange = 1 << 30, - PhaseEnd = 1 << 31, - } + /// + /// The event is a press-and-hold (also known as long tap) gesture. + /// + PressAndHoldGesture = 1 << 1, - public readonly struct GestureEvent - { - public readonly GestureFlags flags; + /// + /// The event is a drag gesture. + /// + DragGesture = 1 << 2, + + /// + /// The event is an active gesture. + /// + Active = 1 << 3, + + PhaseStart = 1 << 28, + PhaseChange = 1 << 29, + PhaseEnd = 1 << 30, + PhaseCancel = 1 << 31, + } + + public readonly Flags flags; public readonly Vector2 start; public readonly Vector2 delta; public readonly double duration; - public GestureEvent(Vector2 delta, double duration, GestureFlags flags, Vector2 start) + public GestureEvent(Vector2 delta, double duration, Flags flags, Vector2 start) { this.delta = delta; this.duration = duration; @@ -37,19 +61,19 @@ public GestureEvent(Vector2 delta, double duration, GestureFlags flags, Vector2 public override string ToString() { var sb = new StringBuilder(); - if (flags.HasFlag(GestureFlags.TapGesture)) + if (flags.HasFlag(Flags.TapGesture)) Append(sb, "Tap"); - if (flags.HasFlag(GestureFlags.PressAndHoldGesture)) + if (flags.HasFlag(Flags.PressAndHoldGesture)) Append(sb, "PressAndHold"); - if (flags.HasFlag(GestureFlags.DragGesture)) + if (flags.HasFlag(Flags.DragGesture)) Append(sb, "Drag"); - if (flags.HasFlag(GestureFlags.PhaseCancel)) + if (flags.HasFlag(Flags.PhaseCancel)) Append(sb, "PhaseCancel"); - if (flags.HasFlag(GestureFlags.PhaseStart)) + if (flags.HasFlag(Flags.PhaseStart)) Append(sb, "PhaseStart"); - if (flags.HasFlag(GestureFlags.PhaseChange)) + if (flags.HasFlag(Flags.PhaseChange)) Append(sb, "PhaseChange"); - if (flags.HasFlag(GestureFlags.PhaseEnd)) + if (flags.HasFlag(Flags.PhaseEnd)) Append(sb, "PhaseEnd"); return $"GestureEvent{{delta: {delta}, duration: {duration}, start: {start}, flags: {sb}}}"; } diff --git a/Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs b/Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs index 90986c2e6c..1d67085461 100644 --- a/Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs +++ b/Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs @@ -2,8 +2,8 @@ namespace UnityEngine.InputSystem.Samples.RebindUI { - interface ITouchMonitor : IInputStateChangeMonitor + internal interface ITouchMonitor : IInputStateChangeMonitor { - void Reset(Rect bounds, AreaShape shape, ChangeMonitor.GestureEventHandler handler); + void Reset(Rect bounds, AreaShape shape, Detector.GestureEventHandler handler); } } diff --git a/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs b/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs index 05fbaa8d55..3757e5a38e 100644 --- a/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs +++ b/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs @@ -2,11 +2,11 @@ namespace UnityEngine.InputSystem.Samples.RebindUI { - interface ITouchProcessor + internal interface ITouchProcessor { - void OnTouchBegin(ChangeMonitor context, in TouchState[] touches, int count, int index); - void OnTouchEnd(ChangeMonitor context, in TouchState[] touches, int count, int index); - void OnTouchMoved(ChangeMonitor context, in TouchState[] touches, int count, int index); - void OnTouchCanceled(ChangeMonitor context, in TouchState[] touches, int count, int index); + void OnTouchBegin(Detector context, in TouchState[] touches, int count, int index); + void OnTouchEnd(Detector context, in TouchState[] touches, int count, int index); + void OnTouchMoved(Detector context, in TouchState[] touches, int count, int index); + void OnTouchCanceled(Detector context, in TouchState[] touches, int count, int index); } } diff --git a/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs b/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs new file mode 100644 index 0000000000..92a92ecc1e --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs @@ -0,0 +1,227 @@ +using UnityEngine; +using UnityEngine.InputSystem.Controls; +using UnityEngine.InputSystem.Samples.RebindUI; +using UnityEngine.UI; + +// Should warn about not having a canvas or parent canvas assigned. +// Should warn about ray-casted UI consuming events. + + +[ExecuteInEditMode] +public class OnScreenControlUI : MonoBehaviour +{ + public Canvas canvas; + public Camera camera; + public CustomOnScreenControl control; + public RectTransform area; + public RectTransform bounds; + public RectTransform knob; + + private void OnDrawGizmosSelected() + { + // This will not produce meaningful results unless we have a rect transform (ISXB-915, ISXB-916). + var parentRectTransform = transform.parent as RectTransform; + if (parentRectTransform == null) + return; + + Gizmos.matrix = parentRectTransform.localToWorldMatrix; + + var startPos = parentRectTransform.anchoredPosition; + + /*var startPos = parentRectTransform.anchoredPosition; + if (Application.isPlaying) + startPos = m_StartPos; +*/ + Gizmos.color = new Color32(84, 173, 219, 255); + + var center = startPos; + /*if (Application.isPlaying && m_Behaviour == Behaviour.ExactPositionWithDynamicOrigin) + center = m_PointerDownPos;*/ + + var radius = UnitConverter.MillimetersToPixels(control.stickRadiusMillimeters); + ScreenGizmos.DrawGizmoCircle(center, radius); + + //if (m_Behaviour != Behaviour.ExactPositionWithDynamicOrigin) return; + + //Gizmos.color = new Color32(158, 84, 219, 255); + //DrawGizmoCircle(startPos, m_DynamicOriginRange); + } + + // Start is called once before the first execution of Update after the MonoBehaviour is created + void Start() + { + } + + void OnEnable() + { + if (canvas == null) + canvas = GetComponentInParent(); + if (camera == null) + camera = Camera.main; + + if (bounds != null) + { + var rawImage = knob.GetComponent(); + if (rawImage != null /*&& rawImage.texture == null*/) + { + var g = new Gradient + { + colorKeys = new GradientColorKey[] + { + new(new Color(0.1f, 0.1f, 0.1f, 1.0f), 0.0f), + new(new Color(0.1f, 0.1f, 0.1f, 1.0f), 0.8f), + new(new Color(0.2f, 0.2f, 0.2f, 1.0f), 0.9f), + new(new Color(0.2f, 0.2f, 0.2f, 1.0f), 1.0f) + }, + mode = GradientMode.PerceptualBlend + }; + + var texture = GenerateCircleTexture(128, 64.0f, g); + texture.hideFlags = HideFlags.HideAndDontSave; + texture.filterMode = FilterMode.Bilinear; + bounds.GetComponent().texture = texture; + } + } + + if (knob != null) + { + var rawImage = knob.GetComponent(); + if (rawImage != null /*&& rawImage.texture == null*/) + { + var g = new Gradient + { + colorKeys = new GradientColorKey[] + { + new(new Color(0.3f, 0.3f, 0.3f, 1.0f), 0.0f), + new(new Color(0.3f, 0.3f, 0.3f, 1.0f), 0.5f), + new(new Color(0.5f, 0.5f, 0.5f, 1.0f), 0.9f), + new(new Color(0.2f, 0.2f, 0.2f, 1.0f), 1.0f) + }, + mode = GradientMode.PerceptualBlend + }; + + var texture = GenerateCircleTexture(128, 64.0f, g); + texture.hideFlags = HideFlags.HideAndDontSave; + texture.filterMode = FilterMode.Bilinear; + knob.GetComponent().texture = texture; + } + } + } + + void Update() + { + // If we do not have a control nor a camera, there is nothing we can visualize via UI. + if (control == null || camera == null) + return; + + var normalizedBounds = control.bounds; + var stickRadiusPixels = UnitConverter.MillimetersToPixels(control.stickRadiusMillimeters); + var stickViewport = camera.ScreenToViewportPoint(new Vector2(stickRadiusPixels, stickRadiusPixels)); + var stickRect = new Rect(normalizedBounds.center.x - stickViewport.x, + normalizedBounds.center.y - stickViewport.y, stickViewport.x * 2, stickViewport.y * 2); + + // Optionally transform a UI object to represent the interactable area in viewport space. + if (area != null) + PlaceAtViewportRect(area, canvas, normalizedBounds, camera); + + // Optionally transform a UI object to represent the stick bounds. + if (bounds != null) + PlaceAtViewportRect(bounds, canvas, stickRect, camera); + + // Optionally transform a UI object represent the stick knob. + if (knob != null) + { + var viewportPosition = stickRect.center; + if (control.control is StickControl stick) + viewportPosition += stick.ReadValue() * stickViewport; + PlaceAtViewport(knob, canvas, viewportPosition, camera); + } + } + + /// + /// Places a RectTransform at given viewport coordinates inside a Canvas. + /// + /// The UI element to move. + /// The parent canvas. + /// Normalized viewport coordinates. + /// The camera that defines the viewport. + private static void PlaceAtViewport(RectTransform child, Canvas canvas, Vector2 viewportPos, Camera camera) + { + // Convert viewport coordinates to screen coordinates (pixels). + Vector2 screenPos = camera.ViewportToScreenPoint(viewportPos); + + // Convert screen coordinates to local point in canvas. + var canvasRect = canvas.GetComponent(); + RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRect, screenPos, canvas.worldCamera, out var localPos); + + // Apply position to child. + child.anchoredPosition = localPos; + } + + /// + /// Places and sizes a RectTransform to exactly match a viewport-space rect. + /// Works regardless of pivot or anchors. + /// + /// The UI RectTransform to place. + /// The parent canvas. + /// Rect in viewport coords (x,y,width,height) with 0–1 range. + /// The camera defining the viewport. + public static void PlaceAtViewportRect(RectTransform rect, Canvas canvas, Rect viewportRect, Camera camera) + { + RectTransform canvasRect = canvas.GetComponent(); + + // Convert bottom-left and top-right corners from viewport to screen + Vector2 screenBL = camera.ViewportToScreenPoint(new Vector2(viewportRect.xMin, viewportRect.yMin)); + Vector2 screenTR = camera.ViewportToScreenPoint(new Vector2(viewportRect.xMax, viewportRect.yMax)); + + // Convert to local canvas space + Vector2 localBL, localTR; + RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRect, screenBL, canvas.worldCamera, out localBL); + RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRect, screenTR, canvas.worldCamera, out localTR); + + // Compute size and center + Vector2 size = localTR - localBL; + Vector2 center = (localTR + localBL) * 0.5f; + + // Apply to RectTransform, ignoring pivot/anchors + rect.localPosition = center; + rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Mathf.Abs(size.x)); + rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, Mathf.Abs(size.y)); + } + + private static Texture2D GenerateCircleTexture(int textureSize, float radius, Gradient gradient) + { + Texture2D tex = new Texture2D(textureSize, textureSize, TextureFormat.RGBA32, false); + + // Transparent background + Color32[] pixels = new Color32[textureSize * textureSize]; + for (int i = 0; i < pixels.Length; i++) + pixels[i] = new Color32(0, 0, 0, 0); + + // Circle parameters + var center = new Vector2(textureSize / 2f, textureSize / 2f); + var squareRadius = radius * radius; + + // Draw circle + for (var y = 0; y < textureSize; y++) + { + for (var x = 0; x < textureSize; x++) + { + Vector2 pos = new Vector2(x, y); + var magnitude = (pos - center).magnitude; + if (magnitude <= radius) + { + float t = magnitude / radius; + pixels[y * textureSize + x] = gradient.Evaluate(t); + } + // TODO Should be partial + } + } + + // Apply to texture + tex.SetPixels32(pixels); + tex.Apply(); + + return tex; + } +} diff --git a/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs.meta b/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs.meta new file mode 100644 index 0000000000..9a3551b151 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 556fd135abfe64c75a42dcd0c1a98b85 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/ScreenGizmos.cs b/Assets/Samples/RebindingUI/OnScreen/ScreenGizmos.cs new file mode 100644 index 0000000000..c17b1a4ee6 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/ScreenGizmos.cs @@ -0,0 +1,60 @@ +using UnityEngine; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + public static class ScreenGizmos + { + public static void DrawGizmoCircle(Vector2 center, float radius) + { + for (var i = 0; i < 32; i++) + { + var radians = i / 32f * Mathf.PI * 2; + var nextRadian = (i + 1) / 32f * Mathf.PI * 2; + Gizmos.DrawLine( + new Vector3(center.x + Mathf.Cos(radians) * radius, center.y + Mathf.Sin(radians) * radius, 0), + new Vector3(center.x + Mathf.Cos(nextRadian) * radius, center.y + Mathf.Sin(nextRadian) * radius, 0)); + } + } + + public static void DrawLine( + Camera camera, + Vector3 startPixelPos, + Vector3 endPixelPos) + { + if (camera == null) + return; + var startWorld = PixelToCameraClipPlane(camera, startPixelPos); + var endWorld = PixelToCameraClipPlane(camera, endPixelPos); + Gizmos.DrawLine(startWorld, endWorld); + } + + public static void DrawLine( + Canvas canvas, + Camera camera, + Vector3 startPixelPos, + Vector3 endPixelPos) + { + if (camera == null || canvas == null) + return; + var startWorld = PixelToCameraClipPlane(camera, startPixelPos * canvas.scaleFactor); + var endWorld = PixelToCameraClipPlane(camera, endPixelPos * canvas.scaleFactor); + Gizmos.DrawLine(startWorld, endWorld); + } + + /// + /// Converts the to world space + /// near the near clip plane. The + /// z component of the + /// will be overriden. + /// + private static Vector3 PixelToCameraClipPlane( + Camera camera, + Vector3 screenPos) + { + // The z-position defines the distance to the camera + // when using Camera.ScreenToWorldPoint. + screenPos.z = camera.nearClipPlane + 0.001f; + return camera.ScreenToWorldPoint(screenPos); + } + } +} diff --git a/Assets/Samples/RebindingUI/OnScreen/ScreenGizmos.cs.meta b/Assets/Samples/RebindingUI/OnScreen/ScreenGizmos.cs.meta new file mode 100644 index 0000000000..19450c3750 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/ScreenGizmos.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0439fdadbd614e9484addfeeb23d877e +timeCreated: 1758957159 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/TapDetector.cs b/Assets/Samples/RebindingUI/OnScreen/TapDetector.cs index e5ab95e4f3..e558ca9080 100644 --- a/Assets/Samples/RebindingUI/OnScreen/TapDetector.cs +++ b/Assets/Samples/RebindingUI/OnScreen/TapDetector.cs @@ -2,7 +2,7 @@ namespace UnityEngine.InputSystem.Samples.RebindUI { - class TapDetector : ITouchProcessor + internal class TapDetector : ITouchProcessor { private Vector2 m_InitialPosition; private double m_InitialTime; @@ -17,7 +17,7 @@ public TapDetector(float threshold) m_Valid = true; } - public void OnTouchBegin(ChangeMonitor context, in TouchState[] touches, int count, int index) + public void OnTouchBegin(Detector context, in TouchState[] touches, int count, int index) { if (count == 1) { @@ -31,25 +31,25 @@ public void OnTouchBegin(ChangeMonitor context, in TouchState[] touches, int cou } } - public void OnTouchEnd(ChangeMonitor context, in TouchState[] touches, int count, int index) + public void OnTouchEnd(Detector context, in TouchState[] touches, int count, int index) { if (m_Valid && IsWithinMargin(touches[index].position)) { GestureEvent @event = new GestureEvent( delta: touches[index].position - m_InitialPosition, duration: Time.realtimeSinceStartupAsDouble - m_InitialTime, - flags: GestureFlags.TapGesture, start: m_InitialPosition); + flags: GestureEvent.Flags.TapGesture, start: m_InitialPosition); context.FireEvent(in @event); } } - public void OnTouchMoved(ChangeMonitor context, in TouchState[] touches, int count, int index) + public void OnTouchMoved(Detector context, in TouchState[] touches, int count, int index) { if (m_Valid && !IsWithinMargin(touches[index].position)) m_Valid = false; } - public void OnTouchCanceled(ChangeMonitor context, in TouchState[] touches, int count, int index) + public void OnTouchCanceled(Detector context, in TouchState[] touches, int count, int index) { if (m_Valid) m_Valid = false; diff --git a/Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs b/Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs new file mode 100644 index 0000000000..32a64b314e --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs @@ -0,0 +1,57 @@ +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + internal static class UnitConverter + { + private const float kMillimetersPerInch = 25.4f; + private const string kWarningMessage = "Screen.dpi not available, assuming 96 DPI."; + + private static float EffectivePpi(float ppi) => ppi <= 0.0f ? 96.0f : ppi; + private static float PixelsToMillimetersFactor(float ppi) => kMillimetersPerInch / EffectivePpi(ppi); + private static float MillimetersToPixelsFactor(float ppi) => EffectivePpi(ppi) / kMillimetersPerInch; + + #region PixelsToMillimeters + + public static float PixelsToMillimeters(float pixels, float ppi) => pixels * PixelsToMillimetersFactor(ppi); + + public static float PixelsToMillimeters(float millimeters) => PixelsToMillimeters(millimeters, Screen.dpi); + + /// + /// Converts a pixel size to millimeters, based on Screen.dpi. + /// + /// Screen.dpi may not be available on some platforms. In such cases, 96 DPI is assumed. + public static Vector2 PixelsToMillimeters(Vector2 pixels) => PixelsToMillimeters(pixels, Screen.dpi); + + + /// + /// Converts a size in pixels to millimeters based on the given PPI (Pixels-per-inch). + /// + /// The size in pixels (screen-space). + /// Pixels-per-inch (PPI). If this is zero or negative DefaultPixelsPerInch will be used. + /// + public static Vector2 PixelsToMillimeters(Vector2 pixels, float ppi) => pixels * PixelsToMillimetersFactor(ppi); + + #endregion + + #region MillimetersToPixels + + public static float MillimetersToPixels(float millimeters, float ppi) => millimeters * MillimetersToPixelsFactor(ppi); + + public static float MillimetersToPixels(float millimeters) => MillimetersToPixels(millimeters, Screen.dpi); + + /// + /// Converts a size in millimeters to pixels based on the given PPI (Pixels-per-inch). + /// + /// The size in millimeters + /// Pixels-per-inch (PPI). If this is zero or negative kDefaultPixelsPerInch will be used. + /// Size expressed in pixels. + public static Vector2 MillimetersToPixels(Vector2 millimeters, float ppi) => millimeters * MillimetersToPixelsFactor(ppi); + + /// + /// Converts a size in millimeters to pixels, based on Screen.dpi. + /// + /// Screen.dpi may not be available on some platforms. In such cases, 96 DPI is assumed. + public static Vector2 MillimetersToPixels(Vector2 millimeters) => MillimetersToPixels(millimeters, Screen.dpi); + + #endregion + } +} diff --git a/Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs.meta b/Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs.meta new file mode 100644 index 0000000000..f577292506 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fdccf1abd7ab4e049878b55f322dbb46 +timeCreated: 1758954668 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity index c9246bce18..95186a2c74 100644 --- a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity +++ b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity @@ -2070,6 +2070,81 @@ GameObject: type: 3} m_PrefabInstance: {fileID: 6680292651237943329} m_PrefabAsset: {fileID: 0} +--- !u!1 &585912950 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 585912951} + - component: {fileID: 585912953} + - component: {fileID: 585912952} + m_Layer: 0 + m_Name: Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &585912951 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 585912950} + 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: 1837333070} + 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: -470.9299, y: -264.94998} + m_SizeDelta: {x: 403.65424, y: 227.10002} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &585912952 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 585912950} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 0.6320754, g: 0.2653524, b: 0.46309918, a: 0.32941177} + 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: 0} + m_Type: 0 + 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 &585912953 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 585912950} + m_CullTransparentMesh: 1 --- !u!1 &589143014 GameObject: m_ObjectHideFlags: 0 @@ -3247,6 +3322,78 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 800914094} m_CullTransparentMesh: 0 +--- !u!1 &804746254 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 804746255} + - component: {fileID: 804746257} + - component: {fileID: 804746258} + m_Layer: 0 + m_Name: Frame + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &804746255 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 804746254} + 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: 2008570242} + 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: 470.92993, y: -264.95} + m_SizeDelta: {x: 154.04202, y: 154.04208} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &804746257 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 804746254} + m_CullTransparentMesh: 1 +--- !u!114 &804746258 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 804746254} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.5019608} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 --- !u!1001 &825336765 PrefabInstance: m_ObjectHideFlags: 0 @@ -3708,7 +3855,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 @@ -3732,6 +3879,7 @@ RectTransform: - {fileID: 5139313} - {fileID: 2040634063} - {fileID: 1628222610} + - {fileID: 2044918824} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -3814,6 +3962,78 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 862809802} m_CullTransparentMesh: 1 +--- !u!1 &877015847 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 877015848} + - component: {fileID: 877015850} + - component: {fileID: 877015851} + m_Layer: 0 + m_Name: Frame + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &877015848 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877015847} + 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: 1837333070} + 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: -470.92993, y: -264.95} + m_SizeDelta: {x: 154.04208, y: 154.04208} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &877015850 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877015847} + m_CullTransparentMesh: 1 +--- !u!114 &877015851 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877015847} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.5019608} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 --- !u!1 &899779638 GameObject: m_ObjectHideFlags: 0 @@ -4483,6 +4703,81 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1044043760} m_CullTransparentMesh: 0 +--- !u!1 &1053028837 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1053028838} + - component: {fileID: 1053028840} + - component: {fileID: 1053028839} + m_Layer: 0 + m_Name: Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1053028838 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1053028837} + 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: 2008570242} + 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: 470.9299, y: -264.94998} + m_SizeDelta: {x: 403.65424, y: 227.10002} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1053028839 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1053028837} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 0.6320754, g: 0.2653524, b: 0.46309918, a: 0.32941177} + 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: 0} + m_Type: 0 + 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 &1053028840 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1053028837} + m_CullTransparentMesh: 1 --- !u!1 &1063908416 GameObject: m_ObjectHideFlags: 0 @@ -5709,22 +6004,96 @@ RectTransform: type: 3} m_PrefabInstance: {fileID: 481729234} m_PrefabAsset: {fileID: 0} ---- !u!114 &1405789171 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 6680292650503350826, guid: f25dcd618d3acd64795bf8bb32edb6c9, - type: 3} - m_PrefabInstance: {fileID: 1199058182} +--- !u!1 &1332072487 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: cc11d99b1a6682f4cbc4aba1fcd9ac5d, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!224 &1414988296 stripped + serializedVersion: 6 + m_Component: + - component: {fileID: 1332072488} + - component: {fileID: 1332072490} + - component: {fileID: 1332072491} + m_Layer: 0 + m_Name: Knob + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1332072488 RectTransform: - m_CorrespondingSourceObject: {fileID: 6680292650503350825, guid: f25dcd618d3acd64795bf8bb32edb6c9, - type: 3} + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1332072487} + 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: 1755332690} + - {fileID: 1617448063} + m_Father: {fileID: 1837333070} + 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: -470.9299, y: -264.94998} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1332072490 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1332072487} + m_CullTransparentMesh: 1 +--- !u!114 &1332072491 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1332072487} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.5019608} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!114 &1405789171 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 6680292650503350826, guid: f25dcd618d3acd64795bf8bb32edb6c9, + type: 3} + m_PrefabInstance: {fileID: 1199058182} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cc11d99b1a6682f4cbc4aba1fcd9ac5d, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!224 &1414988296 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 6680292650503350825, guid: f25dcd618d3acd64795bf8bb32edb6c9, + type: 3} m_PrefabInstance: {fileID: 6680292651237943329} m_PrefabAsset: {fileID: 0} --- !u!114 &1414988297 stripped @@ -5873,6 +6242,142 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1424978754} m_CullTransparentMesh: 0 +--- !u!1 &1457964753 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1457964754} + - component: {fileID: 1457964756} + - component: {fileID: 1457964755} + m_Layer: 0 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1457964754 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1457964753} + 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: 1740936516} + 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: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1457964755 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1457964753} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI + 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_text: "\u2194" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2164260863 + m_fontColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 64 + m_fontSizeBase: 64 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 4096 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1457964756 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1457964753} + m_CullTransparentMesh: 1 --- !u!1 &1469567784 GameObject: m_ObjectHideFlags: 0 @@ -6326,6 +6831,142 @@ RectTransform: type: 3} m_PrefabInstance: {fileID: 1611735621} m_PrefabAsset: {fileID: 0} +--- !u!1 &1617448062 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1617448063} + - component: {fileID: 1617448065} + - component: {fileID: 1617448064} + m_Layer: 0 + m_Name: Text (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1617448063 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1617448062} + 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: 1332072488} + 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: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1617448064 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1617448062} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI + 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_text: "\u2195" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2164260863 + m_fontColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 64 + m_fontSizeBase: 64 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 4096 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1617448065 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1617448062} + m_CullTransparentMesh: 1 --- !u!1 &1617608008 GameObject: m_ObjectHideFlags: 0 @@ -7436,6 +8077,215 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1737030748} m_CullTransparentMesh: 0 +--- !u!1 &1740936515 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1740936516} + - component: {fileID: 1740936518} + - component: {fileID: 1740936519} + m_Layer: 0 + m_Name: Knob + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1740936516 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1740936515} + 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: 1457964754} + m_Father: {fileID: 2008570242} + 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: 470.92996, y: -264.94998} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1740936518 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1740936515} + m_CullTransparentMesh: 1 +--- !u!114 &1740936519 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1740936515} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.5019608} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!1 &1755332689 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1755332690} + - component: {fileID: 1755332692} + - component: {fileID: 1755332691} + m_Layer: 0 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1755332690 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1755332689} + 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: 1332072488} + 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: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1755332691 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1755332689} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI + 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_text: "\u2194" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2164260863 + m_fontColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 64 + m_fontSizeBase: 64 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 4096 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1755332692 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1755332689} + m_CullTransparentMesh: 1 --- !u!1 &1801770802 GameObject: m_ObjectHideFlags: 0 @@ -7863,6 +8713,86 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1836782273} m_CullTransparentMesh: 0 +--- !u!1 &1837333069 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1837333070} + - component: {fileID: 1837333072} + - component: {fileID: 1837333071} + m_Layer: 0 + m_Name: LeftStick + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1837333070 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1837333069} + 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: 585912951} + - {fileID: 877015848} + - {fileID: 1332072488} + m_Father: {fileID: 2044918824} + 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 &1837333071 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1837333069} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 556fd135abfe64c75a42dcd0c1a98b85, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.InputSystem.RebindingUI::OnScreenControlUI + canvas: {fileID: 861395294} + camera: {fileID: 1183078598} + control: {fileID: 1837333072} + area: {fileID: 585912951} + bounds: {fileID: 877015848} + knob: {fileID: 1332072488} +--- !u!114 &1837333072 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1837333069} + 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.3 + height: 0.3 + m_ControlPath: /leftStick + m_Curve: 0 + m_StickRadiusMillimeters: 7.2 --- !u!1 &1853629577 GameObject: m_ObjectHideFlags: 0 @@ -8540,6 +9470,86 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1953054435} m_CullTransparentMesh: 0 +--- !u!1 &2008570241 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2008570242} + - component: {fileID: 2008570244} + - component: {fileID: 2008570243} + m_Layer: 0 + m_Name: RightStick + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2008570242 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2008570241} + 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: 1053028838} + - {fileID: 804746255} + - {fileID: 1740936516} + m_Father: {fileID: 2044918824} + 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 &2008570243 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2008570241} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 556fd135abfe64c75a42dcd0c1a98b85, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.InputSystem.RebindingUI::OnScreenControlUI + canvas: {fileID: 861395294} + camera: {fileID: 1183078598} + control: {fileID: 2008570244} + area: {fileID: 1053028838} + bounds: {fileID: 804746255} + knob: {fileID: 1740936516} +--- !u!114 &2008570244 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2008570241} + 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.7 + y: 0 + width: 0.3 + height: 0.3 + m_ControlPath: /rightStick + m_Curve: 0 + m_StickRadiusMillimeters: 7.2 --- !u!1 &2040634062 GameObject: m_ObjectHideFlags: 0 @@ -8595,8 +9605,6 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 2044918824} - - component: {fileID: 2044918823} - - component: {fileID: 2044918825} - component: {fileID: 2044918822} - component: {fileID: 2044918826} m_Layer: 0 @@ -8628,65 +9636,27 @@ MonoBehaviour: m_ControlPath: /buttonEast m_Curve: 0 m_StickRadiusMillimeters: 7.2 ---- !u!114 &2044918823 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2044918821} - 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.5 - height: 1 - m_ControlPath: /leftStick - m_Curve: 0 - m_StickRadiusMillimeters: 7.2 ---- !u!4 &2044918824 -Transform: +--- !u!224 &2044918824 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2044918821} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: -0} + 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_Children: + - {fileID: 1837333070} + - {fileID: 2008570242} + m_Father: {fileID: 861395295} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &2044918825 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2044918821} - 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.5 - y: 0 - width: 0.5 - height: 0.5 - m_ControlPath: /rightStick - m_Curve: 0 - m_StickRadiusMillimeters: 7.2 + 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 &2044918826 MonoBehaviour: m_ObjectHideFlags: 0 @@ -9346,4 +10316,3 @@ SceneRoots: - {fileID: 58438681} - {fileID: 780148237} - {fileID: 51853244} - - {fileID: 2044918824} diff --git a/Assets/Samples/RebindingUI/RequireTouchscreen.cs b/Assets/Samples/RebindingUI/RequireTouchscreen.cs index 3b01b008f1..800e848ca1 100644 --- a/Assets/Samples/RebindingUI/RequireTouchscreen.cs +++ b/Assets/Samples/RebindingUI/RequireTouchscreen.cs @@ -28,7 +28,7 @@ private void OnDeviceChanged(InputDevice device, InputDeviceChange change) private void UpdateState() { var touchscreenIsPresent = Touchscreen.current != null; - var activeInHierarchy = gameObject.activeSelf; + var activeInHierarchy = gameObject.activeInHierarchy || gameObject.activeSelf; if (activeInHierarchy && !touchscreenIsPresent) gameObject.SetActive(false); else if (!activeInHierarchy && touchscreenIsPresent) From 1bc2c53879e5782dd2b5addecaccd6d24f249b12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Sat, 27 Sep 2025 23:23:28 +0200 Subject: [PATCH 12/22] Minor changes to on screen controls. --- .../OnScreen/CustomOnScreenControl.cs | 28 +++++++++++++++++-- .../RebindingUI/OnScreen/OnScreenControlUI.cs | 7 +++-- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs b/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs index 89c60ef2fb..c54a939846 100644 --- a/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs +++ b/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs @@ -102,6 +102,7 @@ public Curve curve /// /// Gets or sets the on-screen stick radius in millimeters. /// + /// Physical gamepads analog sticks have mechanical displacements of 7-8 millimeters. /// If attempting to set the stick radius to a negative value. public float stickRadiusMillimeters { @@ -115,6 +116,14 @@ public float stickRadiusMillimeters } } + public Vector2 stickCenter + { + get => m_Actuated ? m_StickCenter : m_NormalizedBounds.center; + } + + private Vector2 m_StickCenter; + private bool m_Actuated; + [Header("Bounds")] [Tooltip("The geometric clipping area shape")] [SerializeField] @@ -249,6 +258,9 @@ private void ChangeDevice(Touchscreen current) private void OnGestureEvent(in GestureEvent gestureEvent) { + // TODO We cannot only use drag for this, we need to also know when it gets "activated" so we + // can set stick position at that point + // For button control, we consider the whole clip region as a button area. if (control is ButtonControl) { @@ -266,12 +278,22 @@ private void OnGestureEvent(in GestureEvent gestureEvent) if (gestureEvent.flags.HasFlag(GestureEvent.Flags.PhaseStart) || gestureEvent.flags.HasFlag(GestureEvent.Flags.PhaseChange)) { - // A DualSense has a mechanical displacement of ~7.4 mm. - // A DualShock has a mechanical displacement of ~6.9 mm. - var deltaMillimeters = UnitConverter.PixelsToMillimeters(gestureEvent.delta); var stickRadius = Vector2.ClampMagnitude(deltaMillimeters, m_StickRadiusMillimeters); value = stickRadius / m_StickRadiusMillimeters; + + if (!m_Actuated) + { + m_Actuated = true; + m_StickCenter = new Vector2(gestureEvent.start.x / Display.displays[0].renderingWidth, + gestureEvent.start.y / Display.displays[0].renderingHeight); + //m_StickCenter = gestureEvent.start; // TODO Convert to normalized + } + } + else + { + m_StickCenter = m_NormalizedBounds.center; + m_Actuated = false; } value = m_Curve.Transform(value); diff --git a/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs b/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs index 92a92ecc1e..b290105768 100644 --- a/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs +++ b/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs @@ -61,7 +61,7 @@ void OnEnable() if (bounds != null) { - var rawImage = knob.GetComponent(); + var rawImage = bounds.GetComponent(); if (rawImage != null /*&& rawImage.texture == null*/) { var g = new Gradient @@ -116,9 +116,10 @@ void Update() var normalizedBounds = control.bounds; var stickRadiusPixels = UnitConverter.MillimetersToPixels(control.stickRadiusMillimeters); + var stickCenter = control.stickCenter; var stickViewport = camera.ScreenToViewportPoint(new Vector2(stickRadiusPixels, stickRadiusPixels)); - var stickRect = new Rect(normalizedBounds.center.x - stickViewport.x, - normalizedBounds.center.y - stickViewport.y, stickViewport.x * 2, stickViewport.y * 2); + var stickRect = new Rect(stickCenter.x - stickViewport.x, + stickCenter.y - stickViewport.y, stickViewport.x * 2, stickViewport.y * 2); // Optionally transform a UI object to represent the interactable area in viewport space. if (area != null) From 96b7c1efc7c9037dcad560d46063ebb0c314fc21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Sun, 28 Sep 2025 09:33:45 +0200 Subject: [PATCH 13/22] Fixed an issue where drag gesture wouldn't trigger directly when threshold is zero --- .../OnScreen/CustomOnScreenControl.cs | 2 +- .../RebindingUI/OnScreen/DragDetector.cs | 9 +- .../RebindingUI/OnScreen/GestureEvent.cs | 25 ++ .../RebindingUI/OnScreen/OnScreenControlUI.cs | 46 +- .../RebindingUI/RebindingUISampleScene.unity | 421 ++++++++++++++++-- 5 files changed, 423 insertions(+), 80 deletions(-) diff --git a/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs b/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs index c54a939846..5423d1fc2d 100644 --- a/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs +++ b/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs @@ -168,7 +168,7 @@ protected override void OnEnable() if (control is ButtonControl) m_Detector = new Detector(1, new ActiveDetector()); else if (control is StickControl) - m_Detector = new Detector(1, new DragDetector(threshold)); + m_Detector = new Detector(1, new DragDetector(0.0f)); else throw new Exception($"Unsupported control type: {control.GetType()}"); diff --git a/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs b/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs index 4538909014..11633be536 100644 --- a/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs +++ b/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs @@ -23,6 +23,13 @@ public void OnTouchBegin(Detector context, in TouchState[] touches, int count, i { m_InitialPosition = touches[index].position; m_InitialTime = Time.realtimeSinceStartupAsDouble; + + // Require that we move outside "dead zone" before we consider the drag to start. + if (IsWithinMargin(touches[index].position)) + return; + + m_Valid = true; + Fire(context, touches, count, index, GestureEvent.Flags.PhaseStart); } else if (m_Valid) { @@ -78,7 +85,7 @@ private void Fire(Detector context, in TouchState[] touches, int count, int inde private bool IsWithinMargin(Vector2 point) { var sqrMagnitude = (point - m_InitialPosition).sqrMagnitude; - return sqrMagnitude <= m_ThresholdSqr; + return sqrMagnitude < m_ThresholdSqr; } } } diff --git a/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs b/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs index 6102e87c7d..1ad999e307 100644 --- a/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs +++ b/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs @@ -39,9 +39,24 @@ public enum Flags /// Active = 1 << 3, + /// + /// Indicates that the interaction of the associated continuous gesture started. + /// PhaseStart = 1 << 28, + + /// + /// Indicates that the interaction of the associated continuous gesture was updated and changed. + /// PhaseChange = 1 << 29, + + /// + /// Indicates that the interaction of the associated continuous gesture ended. + /// PhaseEnd = 1 << 30, + + /// + /// Indicates that the interaction of the associated continuous gesture was cancelled. + /// PhaseCancel = 1 << 31, } @@ -50,6 +65,13 @@ public enum Flags public readonly Vector2 delta; public readonly double duration; + /// + /// Constructs a new gesture event. + /// + /// The delta of the gesture event. + /// The duration of the gesture event. + /// Flags indicating what type of event it is. + /// The initial absolute position of the gesture event. public GestureEvent(Vector2 delta, double duration, Flags flags, Vector2 start) { this.delta = delta; @@ -58,6 +80,9 @@ public GestureEvent(Vector2 delta, double duration, Flags flags, Vector2 start) this.start = start; } + /// + /// Converts the event to string representation. + /// public override string ToString() { var sb = new StringBuilder(); diff --git a/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs b/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs index b290105768..1064ecdbdf 100644 --- a/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs +++ b/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs @@ -6,7 +6,9 @@ // Should warn about not having a canvas or parent canvas assigned. // Should warn about ray-casted UI consuming events. - +/// +/// A passive UI visualization of an on-screen control in Unity UI (UGUI). +/// [ExecuteInEditMode] public class OnScreenControlUI : MonoBehaviour { @@ -17,41 +19,6 @@ public class OnScreenControlUI : MonoBehaviour public RectTransform bounds; public RectTransform knob; - private void OnDrawGizmosSelected() - { - // This will not produce meaningful results unless we have a rect transform (ISXB-915, ISXB-916). - var parentRectTransform = transform.parent as RectTransform; - if (parentRectTransform == null) - return; - - Gizmos.matrix = parentRectTransform.localToWorldMatrix; - - var startPos = parentRectTransform.anchoredPosition; - - /*var startPos = parentRectTransform.anchoredPosition; - if (Application.isPlaying) - startPos = m_StartPos; -*/ - Gizmos.color = new Color32(84, 173, 219, 255); - - var center = startPos; - /*if (Application.isPlaying && m_Behaviour == Behaviour.ExactPositionWithDynamicOrigin) - center = m_PointerDownPos;*/ - - var radius = UnitConverter.MillimetersToPixels(control.stickRadiusMillimeters); - ScreenGizmos.DrawGizmoCircle(center, radius); - - //if (m_Behaviour != Behaviour.ExactPositionWithDynamicOrigin) return; - - //Gizmos.color = new Color32(158, 84, 219, 255); - //DrawGizmoCircle(startPos, m_DynamicOriginRange); - } - - // Start is called once before the first execution of Update after the MonoBehaviour is created - void Start() - { - } - void OnEnable() { if (canvas == null) @@ -118,8 +85,11 @@ void Update() var stickRadiusPixels = UnitConverter.MillimetersToPixels(control.stickRadiusMillimeters); var stickCenter = control.stickCenter; var stickViewport = camera.ScreenToViewportPoint(new Vector2(stickRadiusPixels, stickRadiusPixels)); - var stickRect = new Rect(stickCenter.x - stickViewport.x, - stickCenter.y - stickViewport.y, stickViewport.x * 2, stickViewport.y * 2); + var stickRect = new Rect( + x: stickCenter.x - stickViewport.x, + y: stickCenter.y - stickViewport.y, + width: stickViewport.x * 2, + height: stickViewport.y * 2); // Optionally transform a UI object to represent the interactable area in viewport space. if (area != null) diff --git a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity index 95186a2c74..b6ed98796e 100644 --- a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity +++ b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity @@ -1018,6 +1018,85 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 125360816} m_CullTransparentMesh: 0 +--- !u!1 &143773844 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 143773845} + - component: {fileID: 143773847} + - component: {fileID: 143773846} + m_Layer: 0 + m_Name: ChangeButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &143773845 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 143773844} + 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: 901700405} + - {fileID: 1090088429} + m_Father: {fileID: 2044918824} + 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 &143773846 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 143773844} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 556fd135abfe64c75a42dcd0c1a98b85, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.InputSystem.RebindingUI::OnScreenControlUI + canvas: {fileID: 861395294} + camera: {fileID: 1183078598} + control: {fileID: 143773847} + area: {fileID: 901700405} + bounds: {fileID: 1090088429} + knob: {fileID: 0} +--- !u!114 &143773847 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 143773844} + 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.86 + y: 0.2 + width: 0.15 + height: 0.25 + m_ControlPath: /buttonEast + m_Curve: 0 + m_StickRadiusMillimeters: 7.2 --- !u!1 &221984824 GameObject: m_ObjectHideFlags: 0 @@ -2087,7 +2166,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &585912951 RectTransform: m_ObjectHideFlags: 0 @@ -2104,8 +2183,8 @@ RectTransform: 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: -470.9299, y: -264.94998} - m_SizeDelta: {x: 403.65424, y: 227.10002} + m_AnchoredPosition: {x: -573.2329, y: -264.95} + m_SizeDelta: {x: 491.34253, y: 227.1} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &585912952 MonoBehaviour: @@ -2121,7 +2200,7 @@ MonoBehaviour: m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image m_Material: {fileID: 0} m_Color: {r: 0.6320754, g: 0.2653524, b: 0.46309918, a: 0.32941177} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: @@ -3356,8 +3435,8 @@ RectTransform: 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: 470.92993, y: -264.95} - m_SizeDelta: {x: 154.04202, y: 154.04208} + m_AnchoredPosition: {x: 573.2329, y: -264.94998} + m_SizeDelta: {x: 153.08234, y: 153.08234} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &804746257 CanvasRenderer: @@ -3381,7 +3460,7 @@ MonoBehaviour: m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 0.5019608} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: @@ -3996,8 +4075,8 @@ RectTransform: 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: -470.92993, y: -264.95} - m_SizeDelta: {x: 154.04208, y: 154.04208} + m_AnchoredPosition: {x: -573.2329, y: -264.94998} + m_SizeDelta: {x: 153.08228, y: 153.08234} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &877015850 CanvasRenderer: @@ -4021,7 +4100,7 @@ MonoBehaviour: m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 0.5019608} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: @@ -4113,6 +4192,81 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 899779638} m_CullTransparentMesh: 0 +--- !u!1 &901700404 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 901700405} + - component: {fileID: 901700407} + - component: {fileID: 901700406} + m_Layer: 0 + m_Name: Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &901700405 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 901700404} + 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: 143773845} + 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: 712.44666, y: -132.47499} + m_SizeDelta: {x: 245.6712, y: 189.24997} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &901700406 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 901700404} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 0.6320754, g: 0.2653524, b: 0.46309918, a: 0.32941177} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + 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 &901700407 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 901700404} + m_CullTransparentMesh: 1 --- !u!1001 &920225868 PrefabInstance: m_ObjectHideFlags: 0 @@ -4720,7 +4874,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &1053028838 RectTransform: m_ObjectHideFlags: 0 @@ -4737,8 +4891,8 @@ RectTransform: 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: 470.9299, y: -264.94998} - m_SizeDelta: {x: 403.65424, y: 227.10002} + m_AnchoredPosition: {x: 573.2329, y: -264.95} + m_SizeDelta: {x: 491.34253, y: 227.1} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1053028839 MonoBehaviour: @@ -4877,6 +5031,79 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: cc11d99b1a6682f4cbc4aba1fcd9ac5d, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &1090088428 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1090088429} + - component: {fileID: 1090088431} + - component: {fileID: 1090088430} + m_Layer: 0 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1090088429 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1090088428} + 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: 2124655858} + m_Father: {fileID: 143773845} + 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: 712.44666, y: -132.47502} + m_SizeDelta: {x: 153.08221, y: 153.0823} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1090088430 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1090088428} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.5019608} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1090088431 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1090088428} + m_CullTransparentMesh: 1 --- !u!1001 &1099885699 PrefabInstance: m_ObjectHideFlags: 0 @@ -6040,7 +6267,7 @@ RectTransform: 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: -470.9299, y: -264.94998} + m_AnchoredPosition: {x: -573.2329, y: -264.94998} m_SizeDelta: {x: 100, y: 100} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &1332072490 @@ -6065,7 +6292,7 @@ MonoBehaviour: m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 0.5019608} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: @@ -8112,7 +8339,7 @@ RectTransform: 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: 470.92996, y: -264.94998} + m_AnchoredPosition: {x: 573.233, y: -264.94998} m_SizeDelta: {x: 100, y: 100} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &1740936518 @@ -8137,7 +8364,7 @@ MonoBehaviour: m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 0.5019608} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: @@ -9605,7 +9832,6 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 2044918824} - - component: {fileID: 2044918822} - component: {fileID: 2044918826} m_Layer: 0 m_Name: OnScreenControls @@ -9614,28 +9840,6 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &2044918822 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2044918821} - 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.5 - y: 0.5 - width: 0.5 - height: 0.5 - m_ControlPath: /buttonEast - m_Curve: 0 - m_StickRadiusMillimeters: 7.2 --- !u!224 &2044918824 RectTransform: m_ObjectHideFlags: 0 @@ -9650,6 +9854,7 @@ RectTransform: m_Children: - {fileID: 1837333070} - {fileID: 2008570242} + - {fileID: 143773845} m_Father: {fileID: 861395295} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} @@ -9806,6 +10011,142 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2095398990} m_CullTransparentMesh: 0 +--- !u!1 &2124655857 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2124655858} + - component: {fileID: 2124655860} + - component: {fileID: 2124655859} + m_Layer: 0 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2124655858 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2124655857} + 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: 1090088429} + 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: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2124655859 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2124655857} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI + 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_text: Change + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2164260863 + m_fontColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 25 + m_fontSizeBase: 25 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &2124655860 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2124655857} + m_CullTransparentMesh: 1 --- !u!1001 &965552502757445288 PrefabInstance: m_ObjectHideFlags: 0 From d6ce1a091f62c1bfa61c3b09d066ac7c6860b297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Sun, 28 Sep 2025 20:18:16 +0200 Subject: [PATCH 14/22] Code cleanup --- .../Samples/RebindingUI/OnScreen/AreaShape.cs | 5 ++ .../OnScreen/CustomOnScreenControl.cs | 3 +- .../Samples/RebindingUI/OnScreen/Detector.cs | 28 ++++--- .../RebindingUI/OnScreen/ITouchProcessor.cs | 3 + .../RebindingUI/OnScreen/OnScreenControlUI.cs | 5 +- .../RebindingUI/OnScreen/PhysicalBounds.cs | 80 +++++++++++++++++++ .../OnScreen/PhysicalBounds.cs.meta | 3 + .../RebindingUI/OnScreen/UnitConverter.cs | 73 ++++++++--------- .../RebindingUI/RebindingUISampleScene.unity | 18 ++--- 9 files changed, 156 insertions(+), 62 deletions(-) create mode 100644 Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs create mode 100644 Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs.meta diff --git a/Assets/Samples/RebindingUI/OnScreen/AreaShape.cs b/Assets/Samples/RebindingUI/OnScreen/AreaShape.cs index e17e5ea31e..e36d4a5434 100644 --- a/Assets/Samples/RebindingUI/OnScreen/AreaShape.cs +++ b/Assets/Samples/RebindingUI/OnScreen/AreaShape.cs @@ -9,5 +9,10 @@ public enum AreaShape /// A rectangular clipping area is used (default). /// Rectangle = 0, + + /// + /// A ellipse shaped (or circular) clipping area is used. + /// + Ellipse = 1, } } diff --git a/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs b/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs index 5423d1fc2d..b51ff32b86 100644 --- a/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs +++ b/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs @@ -278,7 +278,8 @@ private void OnGestureEvent(in GestureEvent gestureEvent) if (gestureEvent.flags.HasFlag(GestureEvent.Flags.PhaseStart) || gestureEvent.flags.HasFlag(GestureEvent.Flags.PhaseChange)) { - var deltaMillimeters = UnitConverter.PixelsToMillimeters(gestureEvent.delta); + var deltaMillimeters = gestureEvent.delta * UnitConverter.PixelsToMillimetersConversionFactor( + UnitConverter.EffectivePixelDensity(Screen.dpi)); var stickRadius = Vector2.ClampMagnitude(deltaMillimeters, m_StickRadiusMillimeters); value = stickRadius / m_StickRadiusMillimeters; diff --git a/Assets/Samples/RebindingUI/OnScreen/Detector.cs b/Assets/Samples/RebindingUI/OnScreen/Detector.cs index 75d8b07f7e..62a3787bf9 100644 --- a/Assets/Samples/RebindingUI/OnScreen/Detector.cs +++ b/Assets/Samples/RebindingUI/OnScreen/Detector.cs @@ -14,31 +14,39 @@ protected Detector(int maxTouches) Reset(Rect.zero, AreaShape.Rectangle, null); } - public virtual void Reset(Rect bounds, AreaShape shape, Detector.GestureEventHandler handler) + public virtual void Reset(Rect bounds, AreaShape shape, GestureEventHandler handler) { m_Handler = handler; m_Bounds = bounds; + m_Shape = shape; m_GestureFlags = GestureEvent.Flags.None; m_Count = 0; } protected bool Contains(in TouchState touch) { + // TODO Consider transforming touch into normalized instead? E.g. touch / renderingSize + + var display = Display.displays[touch.displayIndex]; + var absoluteBounds = new Rect( + x: m_Bounds.xMin * display.renderingWidth, + y: m_Bounds.yMin * display.renderingHeight, + width: m_Bounds.width * display.renderingWidth, + height: m_Bounds.height * display.renderingHeight); + switch (m_Shape) { case AreaShape.Rectangle: { - // TODO Caching opportunities here - var display = Display.displays[touch.displayIndex]; - var width = display.renderingWidth; - var height = display.renderingHeight; - var absoluteBounds = new Rect( - x: m_Bounds.xMin * width, - y: m_Bounds.yMin * height, - width: m_Bounds.width * width, - height: m_Bounds.height * height); return absoluteBounds.Contains(touch.position); } + case AreaShape.Ellipse: + { + var delta = touch.position - absoluteBounds.center; + var radius = absoluteBounds.size / 2; + var value = (delta.x * delta.x) / (radius.x * radius.x) + (delta.y * delta.y) / (radius.y * radius.y); + return value <= 1f; + } } return false; diff --git a/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs b/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs index 3757e5a38e..5fe5af329d 100644 --- a/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs +++ b/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs @@ -2,6 +2,9 @@ namespace UnityEngine.InputSystem.Samples.RebindUI { + /// + /// Interface for a processor of touch events. + /// internal interface ITouchProcessor { void OnTouchBegin(Detector context, in TouchState[] touches, int count, int index); diff --git a/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs b/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs index 1064ecdbdf..d13fce0e61 100644 --- a/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs +++ b/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs @@ -13,7 +13,7 @@ public class OnScreenControlUI : MonoBehaviour { public Canvas canvas; - public Camera camera; + public new Camera camera; public CustomOnScreenControl control; public RectTransform area; public RectTransform bounds; @@ -82,7 +82,8 @@ void Update() return; var normalizedBounds = control.bounds; - var stickRadiusPixels = UnitConverter.MillimetersToPixels(control.stickRadiusMillimeters); + var stickRadiusPixels = control.stickRadiusMillimeters * UnitConverter.MillimetersToPixelsConversionFactor( + UnitConverter.EffectivePixelDensity(Screen.dpi)); var stickCenter = control.stickCenter; var stickViewport = camera.ScreenToViewportPoint(new Vector2(stickRadiusPixels, stickRadiusPixels)); var stickRect = new Rect( diff --git a/Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs b/Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs new file mode 100644 index 0000000000..daf269cd7c --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs @@ -0,0 +1,80 @@ +using Unity.Android.Gradle.Manifest; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + /// + /// Defines a 2D rect transform suitable for device-specific bounds. + /// + /// + /// This is useful to anchor interactive regions based on physical aspects of a device, in + /// particular touchscreen. When designing on-screen-controls, you want e.g. an on screen stick + /// to stay consistent in size across devices. This mimics the behavior of a physical device + /// where the mechanical offset of a gamepad stick wouldn't change depending on the screen size + /// or resolution. This is relevant since our physical ability as humans is limited to our limbs, e.g. + /// our number of fingers and their reaching length is fixed. + /// + /// When using a UI framework to visualize on-screen controls, you likely want to combine screen-based (pixels) + /// and physical layout (millimeters or inches). + /// + public struct PhysicalBounds + { + /// + /// Evaluates whether this transform bounding rectangle contains the associated viewport coordinate. + /// + /// Viewport coordinate (normalized). + /// true if bounds contains point, else false. + public bool ContainsViewportPoint(Vector2 point) + { + return ContainsPhysicalPoint(new Vector2(point.x * rect.width, point.y * rect.height)); + } + + /// + /// Evaluates whether this transform bounding rectangle contains the associated screen point. + /// + /// Screen point. + /// Pixels-per-inch (PPI) pixel density of the associated display. + /// Due to limited support for multiple displays, this may return incorrect results + /// since it will use DPI (rather PPI) reported by Screen and not individual displays. + /// true if bounds contains point, else false. + public bool ContainsScreenPoint(Vector2 screenPoint, float pixelsPerInch) + { + return ContainsPhysicalPoint(screenPoint * UnitConverter.PixelsToMillimetersConversionFactor(pixelsPerInch)); + } + + /// + /// Returns whether this transform bounding rectangle contains the associated physical point. + /// + /// Physical space point in millimeters. + /// + public bool ContainsPhysicalPoint(Vector2 point) + { + switch (shape) + { + case AreaShape.Rectangle: + return rect.Contains(point); + case AreaShape.Ellipse: + { + var delta = point - rect.center; + var radius = rect.size / 2; + var value = (delta.x * delta.x) / (radius.x * radius.x) + + (delta.y * delta.y) / (radius.y * radius.y); + return value <= 1f; + } + default: + return false; + } + } + + /// + /// A bounding rectangle in millimeters. + /// + [SerializeField] + private Rect rect; + + /// + /// The axis-aligned clipping shape. + /// + [SerializeField] + private AreaShape shape; + } +} diff --git a/Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs.meta b/Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs.meta new file mode 100644 index 0000000000..1740c71b84 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7faeb9323f4d411cbe3c445b8d079f96 +timeCreated: 1759049193 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs b/Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs index 32a64b314e..732fdd252b 100644 --- a/Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs +++ b/Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs @@ -1,57 +1,50 @@ +using System; + namespace UnityEngine.InputSystem.Samples.RebindUI { + /// + /// Conversion utility class for physical coordinate transforms. + /// internal static class UnitConverter { - private const float kMillimetersPerInch = 25.4f; - private const string kWarningMessage = "Screen.dpi not available, assuming 96 DPI."; - - private static float EffectivePpi(float ppi) => ppi <= 0.0f ? 96.0f : ppi; - private static float PixelsToMillimetersFactor(float ppi) => kMillimetersPerInch / EffectivePpi(ppi); - private static float MillimetersToPixelsFactor(float ppi) => EffectivePpi(ppi) / kMillimetersPerInch; - - #region PixelsToMillimeters - - public static float PixelsToMillimeters(float pixels, float ppi) => pixels * PixelsToMillimetersFactor(ppi); - - public static float PixelsToMillimeters(float millimeters) => PixelsToMillimeters(millimeters, Screen.dpi); - /// - /// Converts a pixel size to millimeters, based on Screen.dpi. + /// Conversion factor for millimeters per inch. /// - /// Screen.dpi may not be available on some platforms. In such cases, 96 DPI is assumed. - public static Vector2 PixelsToMillimeters(Vector2 pixels) => PixelsToMillimeters(pixels, Screen.dpi); - + /// + /// var millimeters = 10.0f; + /// Debug.Log($"{millimeters} mm is equal to {millimeters / MillimetersPerInch} inches."); + /// + public const float MillimetersPerInch = 25.4f; /// - /// Converts a size in pixels to millimeters based on the given PPI (Pixels-per-inch). + /// Returns a conversion factor for converting pixels to millimeters using the given pixel density. /// - /// The size in pixels (screen-space). - /// Pixels-per-inch (PPI). If this is zero or negative DefaultPixelsPerInch will be used. - /// - public static Vector2 PixelsToMillimeters(Vector2 pixels, float ppi) => pixels * PixelsToMillimetersFactor(ppi); - - #endregion - - #region MillimetersToPixels - - public static float MillimetersToPixels(float millimeters, float ppi) => millimeters * MillimetersToPixelsFactor(ppi); - - public static float MillimetersToPixels(float millimeters) => MillimetersToPixels(millimeters, Screen.dpi); + /// Pixel density expressed as pixels-per-inch (PPI). + /// Conversion ratio for converting pixels to millimeters. + public static float PixelsToMillimetersConversionFactor(float ppi) + { + if (ppi <= 0.0f) + throw new ArgumentOutOfRangeException($"Invalid pixel density: {ppi}"); + return MillimetersPerInch / ppi; + } /// - /// Converts a size in millimeters to pixels based on the given PPI (Pixels-per-inch). + /// Returns a conversion factor for converting millimeters to pixels using the given pixel density. /// - /// The size in millimeters - /// Pixels-per-inch (PPI). If this is zero or negative kDefaultPixelsPerInch will be used. - /// Size expressed in pixels. - public static Vector2 MillimetersToPixels(Vector2 millimeters, float ppi) => millimeters * MillimetersToPixelsFactor(ppi); + /// Pixel density expressed as pixels-per-inch (PPI). + /// Conversion ratio for converting millimeters to pixels. + public static float MillimetersToPixelsConversionFactor(float ppi) + { + if (ppi <= 0.0f) + throw new ArgumentOutOfRangeException($"Invalid pixel density: {ppi}"); + return ppi / MillimetersPerInch; + } /// - /// Converts a size in millimeters to pixels, based on Screen.dpi. + /// Given a pixel density, returns the same pixel density (if positive), or returns a fallback PPI of 96. /// - /// Screen.dpi may not be available on some platforms. In such cases, 96 DPI is assumed. - public static Vector2 MillimetersToPixels(Vector2 millimeters) => MillimetersToPixels(millimeters, Screen.dpi); - - #endregion + /// The candidate pixel density expressed as pixels-per-inch (PPI). + /// Returns if positive, otherwise 96 PPI. + public static float EffectivePixelDensity(float ppi) => ppi <= 0.0f ? 96.0f : ppi; } } diff --git a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity index b6ed98796e..0afc684701 100644 --- a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity +++ b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity @@ -1087,11 +1087,11 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 5514b68a2410f4ab8a2e19c8b963b6f3, type: 3} m_Name: m_EditorClassIdentifier: Unity.InputSystem.RebindingUI::UnityEngine.InputSystem.Samples.RebindUI.CustomOnScreenControl - m_Shape: 0 + m_Shape: 1 m_NormalizedBounds: serializedVersion: 2 x: 0.86 - y: 0.2 + y: 0.3 width: 0.15 height: 0.25 m_ControlPath: /buttonEast @@ -2166,7 +2166,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &585912951 RectTransform: m_ObjectHideFlags: 0 @@ -4209,7 +4209,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &901700405 RectTransform: m_ObjectHideFlags: 0 @@ -4226,8 +4226,8 @@ RectTransform: 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: 712.44666, y: -132.47499} - m_SizeDelta: {x: 245.6712, y: 189.24997} + m_AnchoredPosition: {x: 712.44666, y: -56.774994} + m_SizeDelta: {x: 245.6712, y: 189.25} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &901700406 MonoBehaviour: @@ -4874,7 +4874,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &1053028838 RectTransform: m_ObjectHideFlags: 0 @@ -5066,8 +5066,8 @@ RectTransform: 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: 712.44666, y: -132.47502} - m_SizeDelta: {x: 153.08221, y: 153.0823} + m_AnchoredPosition: {x: 712.44666, y: -56.774963} + m_SizeDelta: {x: 153.08221, y: 153.08237} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1090088430 MonoBehaviour: From 54ccf576a6ce05c85c0be7edfac72dafbb95ff40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Sun, 28 Sep 2025 21:12:58 +0200 Subject: [PATCH 15/22] Added inline doc --- Assets/Samples/RebindingUI/OnScreen/Detector.cs | 8 +++++++- .../Samples/RebindingUI/OnScreen/DragDetector.cs | 15 +++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Assets/Samples/RebindingUI/OnScreen/Detector.cs b/Assets/Samples/RebindingUI/OnScreen/Detector.cs index 62a3787bf9..c52223cf86 100644 --- a/Assets/Samples/RebindingUI/OnScreen/Detector.cs +++ b/Assets/Samples/RebindingUI/OnScreen/Detector.cs @@ -4,9 +4,15 @@ namespace UnityEngine.InputSystem.Samples.RebindUI { + // Note that gesture event handler delegate takes an 'in' reference when 'ref readonly' would be preferrable. + // The reason for this is that this construct isn't available until C# 12.0. + + /// + /// Base class for gesture detectors. + /// abstract class Detector : ITouchMonitor { - public delegate void GestureEventHandler(in GestureEvent gestureEvent); // ref readonly not available until C# 12.0 + public delegate void GestureEventHandler(in GestureEvent gestureEvent); protected Detector(int maxTouches) { diff --git a/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs b/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs index 11633be536..792bfed4af 100644 --- a/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs +++ b/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs @@ -2,10 +2,13 @@ namespace UnityEngine.InputSystem.Samples.RebindUI { - class DragDetector : ITouchProcessor + /// + /// A gesture detector processor for "drag" a.k.a. "translate/pan" gestures. + /// + internal class DragDetector : ITouchProcessor { - private double m_InitialTime; private Vector2 m_InitialPosition; + private double m_InitialTime; private readonly float m_ThresholdSqr; private bool m_Valid; @@ -17,6 +20,9 @@ public DragDetector(float threshold) m_Valid = false; } + #region ITouchProcessor implementation + + /// public void OnTouchBegin(Detector context, in TouchState[] touches, int count, int index) { if (count == 1) @@ -38,6 +44,7 @@ public void OnTouchBegin(Detector context, in TouchState[] touches, int count, i } } + /// public void OnTouchEnd(Detector context, in TouchState[] touches, int count, int index) { if (!m_Valid) @@ -47,6 +54,7 @@ public void OnTouchEnd(Detector context, in TouchState[] touches, int count, int m_Valid = false; } + /// public void OnTouchMoved(Detector context, in TouchState[] touches, int count, int index) { if (m_Valid) @@ -64,6 +72,7 @@ public void OnTouchMoved(Detector context, in TouchState[] touches, int count, i } } + /// public void OnTouchCanceled(Detector context, in TouchState[] touches, int count, int index) { if (m_Valid) @@ -73,6 +82,8 @@ public void OnTouchCanceled(Detector context, in TouchState[] touches, int count } } + #endregion + private void Fire(Detector context, in TouchState[] touches, int count, int index, GestureEvent.Flags phase) { GestureEvent @event = new GestureEvent( From 59778c6e811415edc932801167d9ad9887979581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Mon, 29 Sep 2025 19:24:06 +0200 Subject: [PATCH 16/22] More work on onscreen controls. --- .../Samples/RebindingUI/OnScreen/Button.png | Bin 0 -> 8865 bytes .../RebindingUI/OnScreen/Button.png.meta | 143 +++++ .../OnScreen/CustomOnScreenControl.cs | 36 +- .../Samples/RebindingUI/OnScreen/Detector.cs | 2 - .../Samples/RebindingUI/OnScreen/Editor.meta | 3 + .../OnScreen/Editor/OnScreenControlEditor.cs | 172 ++++++ .../Editor/OnScreenControlEditor.cs.meta | 3 + .../RebindingUI/OnScreen/Editor/Pixels.cs | 141 +++++ .../OnScreen/Editor/Pixels.cs.meta | 3 + .../OnScreen/Editor/TextureGenerator.cs | 231 ++++++++ .../OnScreen/Editor/TextureGenerator.cs.meta | 3 + .../RebindingUI/OnScreen/OnScreenControlUI.cs | 96 +-- .../RebindingUI/OnScreen/PhysicalBounds.cs | 4 +- .../RebindingUI/OnScreen/StickKnob.png | Bin 0 -> 10782 bytes .../RebindingUI/OnScreen/StickKnob.png.meta | 143 +++++ .../Samples/RebindingUI/OnScreen/StickRim.png | Bin 0 -> 7398 bytes .../RebindingUI/OnScreen/StickRim.png.meta | 143 +++++ .../RebindingUI/RebindingUISampleScene.unity | 558 ++++-------------- 18 files changed, 1150 insertions(+), 531 deletions(-) create mode 100644 Assets/Samples/RebindingUI/OnScreen/Button.png create mode 100644 Assets/Samples/RebindingUI/OnScreen/Button.png.meta create mode 100644 Assets/Samples/RebindingUI/OnScreen/Editor.meta create mode 100644 Assets/Samples/RebindingUI/OnScreen/Editor/OnScreenControlEditor.cs create mode 100644 Assets/Samples/RebindingUI/OnScreen/Editor/OnScreenControlEditor.cs.meta create mode 100644 Assets/Samples/RebindingUI/OnScreen/Editor/Pixels.cs create mode 100644 Assets/Samples/RebindingUI/OnScreen/Editor/Pixels.cs.meta create mode 100644 Assets/Samples/RebindingUI/OnScreen/Editor/TextureGenerator.cs create mode 100644 Assets/Samples/RebindingUI/OnScreen/Editor/TextureGenerator.cs.meta create mode 100644 Assets/Samples/RebindingUI/OnScreen/StickKnob.png create mode 100644 Assets/Samples/RebindingUI/OnScreen/StickKnob.png.meta create mode 100644 Assets/Samples/RebindingUI/OnScreen/StickRim.png create mode 100644 Assets/Samples/RebindingUI/OnScreen/StickRim.png.meta diff --git a/Assets/Samples/RebindingUI/OnScreen/Button.png b/Assets/Samples/RebindingUI/OnScreen/Button.png new file mode 100644 index 0000000000000000000000000000000000000000..43f722c0a1c11e51f22aef18202cff77f2d5746f GIT binary patch literal 8865 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 SBaWpf0I)tpulVk>H~$CVI9d<@ literal 0 HcmV?d00001 diff --git a/Assets/Samples/RebindingUI/OnScreen/Button.png.meta b/Assets/Samples/RebindingUI/OnScreen/Button.png.meta new file mode 100644 index 0000000000..c77602ff5f --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/Button.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 189aa5792364542f484e839c09ebeceb +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs b/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs index b51ff32b86..df3b7dd6f3 100644 --- a/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs +++ b/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs @@ -51,22 +51,6 @@ public Vector2 position } } - /// - /// Gets or sets the size of the geometric clipping area. - /// - public Vector2 size - { - get => m_NormalizedBounds.size; - set - { - if (m_NormalizedBounds.size.Equals(value)) - return; - - m_NormalizedBounds.size = value; - OnConfigurationChanged(); - } - } - /// /// Gets or sets the bounds of the geometric clipping area. /// @@ -163,14 +147,18 @@ protected override void OnEnable() { base.OnEnable(); - // TODO This should really be reacting to changes of control path and properties - const float threshold = 10.0f; - if (control is ButtonControl) - m_Detector = new Detector(1, new ActiveDetector()); - else if (control is StickControl) - m_Detector = new Detector(1, new DragDetector(0.0f)); - else - throw new Exception($"Unsupported control type: {control.GetType()}"); + // We cannot setup detector if we have no input control + var c = control; + if (c != null) + { + // TODO This should really be reacting to changes of control path and properties + if (c is ButtonControl) + m_Detector = new Detector(1, new ActiveDetector()); + else if (c is StickControl) + m_Detector = new Detector(1, new DragDetector(0.0f)); + else + throw new Exception($"Unsupported control type: {control.GetType()}"); + } ChangeDevice(); InputSystem.onDeviceChange += OnDeviceChange; diff --git a/Assets/Samples/RebindingUI/OnScreen/Detector.cs b/Assets/Samples/RebindingUI/OnScreen/Detector.cs index c52223cf86..953b1ad486 100644 --- a/Assets/Samples/RebindingUI/OnScreen/Detector.cs +++ b/Assets/Samples/RebindingUI/OnScreen/Detector.cs @@ -25,7 +25,6 @@ public virtual void Reset(Rect bounds, AreaShape shape, GestureEventHandler hand m_Handler = handler; m_Bounds = bounds; m_Shape = shape; - m_GestureFlags = GestureEvent.Flags.None; m_Count = 0; } @@ -76,7 +75,6 @@ public void FireEvent(in GestureEvent gestureEvent) //set => SetValue(key, value); protected Rect m_Bounds; protected AreaShape m_Shape; - private GestureEvent.Flags m_GestureFlags; private GestureEventHandler m_Handler; protected readonly TouchState[] m_Touches; protected int m_Count; diff --git a/Assets/Samples/RebindingUI/OnScreen/Editor.meta b/Assets/Samples/RebindingUI/OnScreen/Editor.meta new file mode 100644 index 0000000000..48163ffe09 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/Editor.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6caac7c70517462792075273433a77cc +timeCreated: 1759125976 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/Editor/OnScreenControlEditor.cs b/Assets/Samples/RebindingUI/OnScreen/Editor/OnScreenControlEditor.cs new file mode 100644 index 0000000000..8445b4f180 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/Editor/OnScreenControlEditor.cs @@ -0,0 +1,172 @@ +// This should be in an editor only assembly. + +#if UNITY_EDITOR + +using System; +using UnityEditor; +using UnityEngine.InputSystem.OnScreen; +using UnityEngine.UI; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + //[CustomEditor(typeof(OnScreenControlUI))] + public class OnScreenControlEditor : UnityEditor.Editor + { + #region Unity Editor Menu Extensions + + private const int Priority = 10; + private const int RigPriority = 21; // Note: Diff > 10 inserts separator + private const string PrimaryStickControlPath = "/leftStick"; + private const string SecondaryStickControlPath = "/rightStick"; + private const string PrimaryButtonControlPath = "/buttonSouth"; + private const string SecondaryButtonControlPath = "/buttonEast"; + private const string Menu = "GameObject/Input System/"; + + private enum UIIntegration + { + None = 0, + UGUI = 1, + UIElements = 2, + } + + [MenuItem(Menu + "On-Screen Button", false, Priority)] + private static void CreateOnScreenButton(MenuCommand menuCommand) + { + FinalizeGameObject(CreateButton(PrimaryButtonControlPath, UIIntegration.None), menuCommand.context); + } + + [MenuItem(Menu + "On-Screen Button (UI)", false, Priority)] + private static void CreateOnScreenButtonUI(MenuCommand menuCommand) + { + FinalizeGameObject(CreateButton(PrimaryButtonControlPath, UIIntegration.UGUI), menuCommand.context); + } + + [MenuItem(Menu + "On-Screen Stick", false, Priority)] + private static void CreateOnScreenStick(MenuCommand menuCommand) + { + var go = CreateStick(PrimaryStickControlPath, UIIntegration.None); + FinalizeGameObject(go, menuCommand.context); + } + + [MenuItem(Menu + "On-Screen Gamepad (1 Stick, 2 Buttons)", isValidateFunction: false, RigPriority)] + private static void CreateOnScreenGamepad1Stick2Buttons(MenuCommand menuCommand) + { + var go = CreateGamepad1Stick2Buttons(UIIntegration.None); + FinalizeGameObject(go: go, menuCommand.context); + } + + [MenuItem(Menu + "On-Screen Gamepad (2 Sticks, 2 Buttons)", isValidateFunction: false, RigPriority)] + private static void CreateOnScreenGamepad2Sticks2Buttons(MenuCommand menuCommand) + { + var go = CreateGamepad2Stick2Buttons(UIIntegration.None); + FinalizeGameObject(go, menuCommand.context); + } + + private static void FinalizeGameObject(GameObject go, Object parent) + { + // Ensure it gets parented correctly if a context object was selected + GameObjectUtility.SetParentAndAlign(go, parent as GameObject); + + // Register the creation in the undo system + Undo.RegisterCreatedObjectUndo(go, $"Create {go.name}"); + + // Select the newly created object + Selection.activeObject = go; + } + + private static GameObject CreateStick(string controlPath, UIIntegration uiIntegration, string name = "OnScreenStick") + { + // There is currently no difference between stick and button apart from path. + return CreateButton(controlPath, uiIntegration, name); + } + + private static GameObject CreateButton(string controlPath, UIIntegration uiIntegration, string name = "OnScreenButton") + { + var go = new GameObject(name: name); + + var control = go.AddComponent(); + control.curve = Curve.Linear; + control.stickRadiusMillimeters = 7.2f; + control.bounds = new Rect(0.0f, 0.5f, 0.5f, 0.0f); + control.controlPath = controlPath; + + switch (uiIntegration) + { + case UIIntegration.UGUI: + { + // When used with UGUI we want the on-screen control to be a canvas object + go.AddComponent(); + + var uiButtonGo = new GameObject("Button"); + var rectTransform = uiButtonGo.AddComponent(); + var uiButton = uiButtonGo.AddComponent(); + uiButton.color = new Color(0.5f, 0.5f, 0.5f, 0.5f); + uiButton.raycastTarget = false; + uiButton.transform.parent = go.transform; + + var controlUI = go.AddComponent(); + controlUI.control = control; + controlUI.bounds = rectTransform; + } + break; + case UIIntegration.UIElements: + throw new NotImplementedException("UIElements support not yet implemented"); + break; + case UIIntegration.None: + default: + break; + } + + return go; + } + + private static GameObject CreateGamepad1Stick2Buttons(UIIntegration uiIntegration) + { + var gamepad = new GameObject(MakeName("Gamepad 1-Stick 2-Buttons", uiIntegration)); + + var stick = CreateStick(PrimaryStickControlPath, uiIntegration); + stick.transform.SetParent(gamepad.transform); + + var primaryButton = CreateButton(PrimaryButtonControlPath, uiIntegration, "PrimaryButton"); + primaryButton.transform.SetParent(gamepad.transform); + + var secondaryButton = CreateButton(SecondaryButtonControlPath, uiIntegration, "SecondaryButton"); + secondaryButton.transform.SetParent(gamepad.transform); + + return gamepad; + } + + private static GameObject CreateGamepad2Stick2Buttons(UIIntegration uiIntegration) + { + var gamepad = new GameObject(MakeName("Gamepad 2-Sticks 2-Buttons", uiIntegration)); + + var primaryStick = CreateStick(PrimaryStickControlPath, uiIntegration, "Primary Stick"); + primaryStick.transform.SetParent(gamepad.transform); + + var secondaryStick = CreateStick(SecondaryStickControlPath, uiIntegration, "Secondary Stick"); + secondaryStick.transform.SetParent(gamepad.transform); + + var primaryButton = CreateButton(PrimaryButtonControlPath, uiIntegration, "PrimaryButton"); + primaryButton.transform.SetParent(gamepad.transform); + + var secondaryButton = CreateButton(SecondaryButtonControlPath, uiIntegration, "SecondaryButton"); + secondaryButton.transform.SetParent(gamepad.transform); + + return gamepad; + } + + private static string MakeName(string name, UIIntegration uiIntegration) + { + switch (uiIntegration) + { + case UIIntegration.UGUI: return name + " (UI)"; + case UIIntegration.None: return name + " (UI Elements)"; + default: return name; + } + } + + #endregion + } +} + +#endif // UNITY_EDITOR diff --git a/Assets/Samples/RebindingUI/OnScreen/Editor/OnScreenControlEditor.cs.meta b/Assets/Samples/RebindingUI/OnScreen/Editor/OnScreenControlEditor.cs.meta new file mode 100644 index 0000000000..4e0b6772e1 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/Editor/OnScreenControlEditor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: db11f8246c674ccf962ed7f4e16e0dba +timeCreated: 1759124094 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/Editor/Pixels.cs b/Assets/Samples/RebindingUI/OnScreen/Editor/Pixels.cs new file mode 100644 index 0000000000..7a0a28573a --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/Editor/Pixels.cs @@ -0,0 +1,141 @@ +#if UNITY_EDITOR + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + internal readonly struct Pixels + { + public Pixels(int width, int height) + { + Width = width; + Height = height; + Data = new Color[width * height]; + } + + public void Fill(Color color) + { + for (var i = 0; i < Data.Length; i++) + Data[i] = color; + } + + public void FillCircle(float innerRadius, + float outerRadius, Gradient gradient) + { + var center = new Vector2(Width / 2f, Height / 2f); + + // Softness in pixels for anti-aliased edges + const float edgeSoftness = 1.0f; + + for (var y = 0; y < Height; ++y) + { + for (var x = 0; x < Width; ++x) + { + var pos = new Vector2(x + 0.5f, y + 0.5f); // pixel center + var dist = (pos - center).magnitude; + + // Normalize distance between inner and outer radius + var t = Mathf.InverseLerp(innerRadius, outerRadius, dist); + + // Gradient only valid between inner/outer radius ± softness + if (dist <= outerRadius + edgeSoftness && dist >= innerRadius - edgeSoftness) + { + var c = gradient.Evaluate(Mathf.Clamp01(t)); + var alpha = 1f; + + // Fade near outer edge + if (dist > outerRadius - edgeSoftness) + alpha = Mathf.Clamp01((outerRadius - dist) / edgeSoftness); + + // Fade near inner edge (if > 0) + if (innerRadius > 0 && dist < innerRadius + edgeSoftness) + alpha = Mathf.Clamp01((dist - innerRadius) / edgeSoftness); + + c.a *= alpha; + Data[y * Width + x] = c; + } + } + } + } + + public void FillArrow(Vector2 tip, Vector2 baseCenter, float baseWidth, Color color) + { + var edgeSoftness = 1.0f; // pixels + + // Build triangle points + var dir = (tip - baseCenter).normalized; + var perp = new Vector2(-dir.y, dir.x); + var baseLeft = baseCenter - perp * (baseWidth * 0.5f); + var baseRight = baseCenter + perp * (baseWidth * 0.5f); + + var v0 = tip; + var v1 = baseLeft; + var v2 = baseRight; + + // Precompute edge vectors + var e0 = v1 - v0; + var e1 = v2 - v1; + var e2 = v0 - v2; + + for (var y = 0; y < Height; y++) + { + for (var x = 0; x < Width; x++) + { + var p = new Vector2(x + 0.5f, y + 0.5f); + + // Barycentric test (sign of cross products) + var c0 = Cross(e0, p - v0); + var c1 = Cross(e1, p - v1); + var c2 = Cross(e2, p - v2); + + var inside = (c0 >= 0 && c1 >= 0 && c2 >= 0) || + (c0 <= 0 && c1 <= 0 && c2 <= 0); + + if (!inside) + continue; + + // Distance to edges (for AA) + var d0 = DistanceToLine(p, v0, v1); + var d1 = DistanceToLine(p, v1, v2); + var d2 = DistanceToLine(p, v2, v0); + var minDist = Mathf.Min(d0, Mathf.Min(d1, d2)); + + var alpha = 1f; + if (minDist < edgeSoftness) + alpha = Mathf.Clamp01(minDist / edgeSoftness); + + var c = color; + c.a *= alpha; + + Data[y * Width + x] = c; + } + } + } + + private static float Cross(Vector2 a, Vector2 b) => a.x * b.y - a.y * b.x; + + private static float DistanceToLine(Vector2 p, Vector2 a, Vector2 b) + { + var ab = b - a; + var ap = p - a; + var t = Mathf.Clamp01(Vector2.Dot(ap, ab) / ab.sqrMagnitude); + var proj = a + t * ab; + return (p - proj).magnitude; + } + + public Texture2D ToTexture(string name) + { + var texture = new Texture2D(Width, Height, TextureFormat.RGBA32, false); + texture.filterMode = FilterMode.Bilinear; + texture.alphaIsTransparency = true; + texture.name = name; + texture.SetPixels(Data); + texture.Apply(); + return texture; + } + + public readonly Color[] Data; + public readonly int Width; + public readonly int Height; + } +} + +#endif // UNITY_EDITOR diff --git a/Assets/Samples/RebindingUI/OnScreen/Editor/Pixels.cs.meta b/Assets/Samples/RebindingUI/OnScreen/Editor/Pixels.cs.meta new file mode 100644 index 0000000000..00ce94a9fe --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/Editor/Pixels.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6b9449795f9b4c55bcabb9e40e763cf4 +timeCreated: 1759154900 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/Editor/TextureGenerator.cs b/Assets/Samples/RebindingUI/OnScreen/Editor/TextureGenerator.cs new file mode 100644 index 0000000000..856e5e6220 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/Editor/TextureGenerator.cs @@ -0,0 +1,231 @@ +#if UNITY_EDITOR + +using System; +using System.IO; +using UnityEditor; + +namespace UnityEngine.InputSystem.Samples.RebindUI +{ + /// + /// Edit-mode texture generation facilities to quickly get going without having to create textures when + /// adding on-screen controls to a new project where it is desirable to have visibile virtual controls. + /// + internal static class TextureGenerator + { + #region Unity Editor Menu Extensions + + private const string AssetExtension = ".asset"; + private const string PngExtension = ".png"; + private const int Priority = 10; + + [Flags] + private enum Direction + { + Up = 1, + Down = 2, + Left = 4, + Right = 8, + } + + [MenuItem("Assets/Create/Input System/On-Screen Button Texture", false, Priority)] + private static void CreateOnScreenButtonTexture(MenuCommand menuCommand) + { + CreateAsset(GenerateButton(), PngExtension); + } + + [MenuItem("Assets/Create/Input System/On-Screen Stick Rim Texture", false, Priority)] + private static void CreateOnScreenStickRimTexture(MenuCommand menuCommand) + { + CreateAsset(GenerateStickRim(), PngExtension); + } + + [MenuItem("Assets/Create/Input System/On-Screen Stick Knob Texture", false, Priority)] + private static void CreateOnScreenStickKnobTexture(MenuCommand menuCommand) + { + CreateAsset(GenerateStickKnob(), PngExtension); + } + + #endregion + + private static Texture2D CreateAsset(Texture2D texture, string extension) + { + Texture2D result = texture; + + // Get target path from Project window selection + var path = GetSelectedPathOrFallback(); + var assetPath = AssetDatabase.GenerateUniqueAssetPath(Path.Combine(path, texture.name + extension)); + + if (extension.Equals(PngExtension, StringComparison.InvariantCultureIgnoreCase)) + { + // Encode to PNG, refresh ADB and then import as texture asset + File.WriteAllBytes(assetPath, texture.EncodeToPNG()); + AssetDatabase.Refresh(); + result = AssetDatabase.LoadAssetAtPath(assetPath); + } + else if (extension.Equals(AssetExtension, StringComparison.InvariantCultureIgnoreCase)) + { + // Save the asset + AssetDatabase.CreateAsset(texture, assetPath); + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + } + else + { + throw new ArgumentOutOfRangeException("Unsupported extension: " + extension); + } + + // Select it + EditorUtility.FocusProjectWindow(); + Selection.activeObject = result; + + // Destroy provided in-memory texture if we had to reimport it + if (!ReferenceEquals(result, texture)) + Object.DestroyImmediate(texture); + + return result; + } + + // Determines the path for where to create the asset. + private static string GetSelectedPathOrFallback() + { + var path = "Assets"; + + foreach (var obj in Selection.GetFiltered(typeof(Object), SelectionMode.Assets)) + { + var selectedPath = AssetDatabase.GetAssetPath(obj); + if (string.IsNullOrEmpty(selectedPath)) + continue; + + if (Directory.Exists(selectedPath)) + { + path = selectedPath; + break; + } + + path = Path.GetDirectoryName(selectedPath); + break; + } + + return path; + } + + private static Texture2D GenerateButton(string name = "Button") + { + // Draw pixels + var textureSize = 128; + var padding = 2.0f; + var pixels = new Pixels(textureSize, textureSize); + pixels.Fill(new Color(0.0f, 0.0f, 0.0f, 0.0f)); + pixels.FillCircle(0.0f, textureSize / 2.0f - padding, new Gradient + { + colorKeys = new GradientColorKey[] + { + new(Grayscale(1.0f), 0.0f), + new(Grayscale(0.9f), 0.8f), + new(Grayscale(1.0f), 0.9f), + new(Grayscale(0.5f), 1.0f) + }, + mode = GradientMode.PerceptualBlend + }); + + return pixels.ToTexture(name); + } + + private static Texture2D GenerateStickKnob(string name = "StickKnob", Direction direction = + Direction.Up | Direction.Down | Direction.Left | Direction.Right) + { + // Draw pixels + var textureSize = 128; + var halfTextureSize = textureSize / 2.0f; + var padding = 2.0f; + var pixels = new Pixels(textureSize, textureSize); + pixels.Fill(new Color(0.0f, 0.0f, 0.0f, 0.0f)); + pixels.FillCircle(0.0f, halfTextureSize - padding, new Gradient + { + colorKeys = new GradientColorKey[] + { + new(Grayscale(0.9f), 0.0f), + new(Grayscale(0.8f), 0.8f), + new(Grayscale(0.9f), 0.9f), + new(Grayscale(0.4f), 1.0f), + }, + mode = GradientMode.PerceptualBlend + }); + pixels.FillCircle(0.0f, (halfTextureSize - padding) * 0.75f, new Gradient + { + colorKeys = new GradientColorKey[] + { + new(Grayscale(1.0f), 0.0f), + new(Grayscale(0.9f), 0.5f), + new(Grayscale(0.7f), 1.0f) + }, + mode = GradientMode.PerceptualBlend + }); + + var arrowOffset = halfTextureSize * 0.2f; + var arrowLength = halfTextureSize * 0.5f; + var arrowWidth = halfTextureSize * 0.3f; + var arrowColor = Grayscale(0.5f); + + if (direction.HasFlag(Direction.Right)) + { + pixels.FillArrow( + baseCenter: new Vector2(halfTextureSize + arrowOffset, halfTextureSize), + tip: new Vector2(halfTextureSize + arrowOffset + arrowOffset, halfTextureSize), + baseWidth: arrowWidth, color: arrowColor); + } + + if (direction.HasFlag(Direction.Left)) + { + pixels.FillArrow( + baseCenter: new Vector2(halfTextureSize - arrowOffset, halfTextureSize), + tip: new Vector2(halfTextureSize - arrowOffset - arrowOffset, halfTextureSize), + baseWidth: arrowWidth, color: arrowColor); + } + + if (direction.HasFlag(Direction.Up)) + { + pixels.FillArrow( + baseCenter: new Vector2(halfTextureSize, halfTextureSize + arrowOffset), + tip: new Vector2(halfTextureSize, halfTextureSize + arrowOffset + arrowOffset), + baseWidth: arrowWidth, color: arrowColor); + } + + if (direction.HasFlag(Direction.Down)) + { + pixels.FillArrow( + baseCenter: new Vector2(halfTextureSize, halfTextureSize - arrowOffset), + tip: new Vector2(halfTextureSize, halfTextureSize - arrowOffset - arrowOffset), + baseWidth: arrowWidth, color: arrowColor); + } + + return pixels.ToTexture(name); + } + + private static Texture2D GenerateStickRim(string name = "StickRim") + { + // Draw pixels + var textureSize = 128; + var padding = 2.0f; + var radius = 10.0f; + var pixels = new Pixels(textureSize, textureSize); + pixels.Fill(new Color(0.0f, 0.0f, 0.0f, 0.0f)); + pixels.FillCircle(textureSize / 2.0f - padding - radius, textureSize / 2.0f - padding, new Gradient + { + colorKeys = new GradientColorKey[] + { + new(Grayscale(0.5f), 0.0f), + new(Grayscale(1.0f), 0.5f), + new(Grayscale(0.5f), 1.0f) + }, + mode = GradientMode.PerceptualBlend + }); + + return pixels.ToTexture(name); + } + + private static Color Grayscale(float v, float alpha = 1.0f) => new Color(v, v, v, alpha); + } +} + +#endif // UNITY_EDITOR diff --git a/Assets/Samples/RebindingUI/OnScreen/Editor/TextureGenerator.cs.meta b/Assets/Samples/RebindingUI/OnScreen/Editor/TextureGenerator.cs.meta new file mode 100644 index 0000000000..dee18d5248 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/Editor/TextureGenerator.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a5335fce2bf1483c9dddb6567ec41487 +timeCreated: 1759128008 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs b/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs index d13fce0e61..7f180edc57 100644 --- a/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs +++ b/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs @@ -26,59 +26,59 @@ void OnEnable() if (camera == null) camera = Camera.main; - if (bounds != null) - { - var rawImage = bounds.GetComponent(); - if (rawImage != null /*&& rawImage.texture == null*/) - { - var g = new Gradient - { - colorKeys = new GradientColorKey[] - { - new(new Color(0.1f, 0.1f, 0.1f, 1.0f), 0.0f), - new(new Color(0.1f, 0.1f, 0.1f, 1.0f), 0.8f), - new(new Color(0.2f, 0.2f, 0.2f, 1.0f), 0.9f), - new(new Color(0.2f, 0.2f, 0.2f, 1.0f), 1.0f) - }, - mode = GradientMode.PerceptualBlend - }; - - var texture = GenerateCircleTexture(128, 64.0f, g); - texture.hideFlags = HideFlags.HideAndDontSave; - texture.filterMode = FilterMode.Bilinear; - bounds.GetComponent().texture = texture; - } - } - - if (knob != null) - { - var rawImage = knob.GetComponent(); - if (rawImage != null /*&& rawImage.texture == null*/) - { - var g = new Gradient - { - colorKeys = new GradientColorKey[] - { - new(new Color(0.3f, 0.3f, 0.3f, 1.0f), 0.0f), - new(new Color(0.3f, 0.3f, 0.3f, 1.0f), 0.5f), - new(new Color(0.5f, 0.5f, 0.5f, 1.0f), 0.9f), - new(new Color(0.2f, 0.2f, 0.2f, 1.0f), 1.0f) - }, - mode = GradientMode.PerceptualBlend - }; - - var texture = GenerateCircleTexture(128, 64.0f, g); - texture.hideFlags = HideFlags.HideAndDontSave; - texture.filterMode = FilterMode.Bilinear; - knob.GetComponent().texture = texture; - } - } + // if (bounds != null) + // { + // var rawImage = bounds.GetComponent(); + // if (rawImage != null /*&& rawImage.texture == null*/) + // { + // var g = new Gradient + // { + // colorKeys = new GradientColorKey[] + // { + // new(new Color(0.1f, 0.1f, 0.1f, 1.0f), 0.0f), + // new(new Color(0.1f, 0.1f, 0.1f, 1.0f), 0.8f), + // new(new Color(0.2f, 0.2f, 0.2f, 1.0f), 0.9f), + // new(new Color(0.2f, 0.2f, 0.2f, 1.0f), 1.0f) + // }, + // mode = GradientMode.PerceptualBlend + // }; + // + // var texture = GenerateCircleTexture(128, 64.0f, g); + // texture.hideFlags = HideFlags.HideAndDontSave; + // texture.filterMode = FilterMode.Bilinear; + // bounds.GetComponent().texture = texture; + // } + // } + // + // if (knob != null) + // { + // var rawImage = knob.GetComponent(); + // if (rawImage != null /*&& rawImage.texture == null*/) + // { + // var g = new Gradient + // { + // colorKeys = new GradientColorKey[] + // { + // new(new Color(0.3f, 0.3f, 0.3f, 1.0f), 0.0f), + // new(new Color(0.3f, 0.3f, 0.3f, 1.0f), 0.5f), + // new(new Color(0.5f, 0.5f, 0.5f, 1.0f), 0.9f), + // new(new Color(0.2f, 0.2f, 0.2f, 1.0f), 1.0f) + // }, + // mode = GradientMode.PerceptualBlend + // }; + // + // var texture = GenerateCircleTexture(128, 64.0f, g); + // texture.hideFlags = HideFlags.HideAndDontSave; + // texture.filterMode = FilterMode.Bilinear; + // knob.GetComponent().texture = texture; + // } + // } } void Update() { // If we do not have a control nor a camera, there is nothing we can visualize via UI. - if (control == null || camera == null) + if (control == null || camera == null || canvas == null) return; var normalizedBounds = control.bounds; diff --git a/Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs b/Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs index daf269cd7c..142763b18d 100644 --- a/Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs +++ b/Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs @@ -1,5 +1,3 @@ -using Unity.Android.Gradle.Manifest; - namespace UnityEngine.InputSystem.Samples.RebindUI { /// @@ -65,6 +63,8 @@ public bool ContainsPhysicalPoint(Vector2 point) } } + private RectTransform rectTransform; + /// /// A bounding rectangle in millimeters. /// diff --git a/Assets/Samples/RebindingUI/OnScreen/StickKnob.png b/Assets/Samples/RebindingUI/OnScreen/StickKnob.png new file mode 100644 index 0000000000000000000000000000000000000000..4d75ac1f82beef1ab79f3c23e94c3a0a132cb63c GIT binary patch literal 10782 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 HJ3sp$2IRIo literal 0 HcmV?d00001 diff --git a/Assets/Samples/RebindingUI/OnScreen/StickKnob.png.meta b/Assets/Samples/RebindingUI/OnScreen/StickKnob.png.meta new file mode 100644 index 0000000000..b16e81e448 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/StickKnob.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 459ffffd4a7054f34b940a52a8bbbade +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Samples/RebindingUI/OnScreen/StickRim.png b/Assets/Samples/RebindingUI/OnScreen/StickRim.png new file mode 100644 index 0000000000000000000000000000000000000000..5687d84a8a9d876df77428e35ee34c939086cc27 GIT binary patch literal 7398 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 Nj-Ih@$qh%`{{gX;04)Fj literal 0 HcmV?d00001 diff --git a/Assets/Samples/RebindingUI/OnScreen/StickRim.png.meta b/Assets/Samples/RebindingUI/OnScreen/StickRim.png.meta new file mode 100644 index 0000000000..78fedfa607 --- /dev/null +++ b/Assets/Samples/RebindingUI/OnScreen/StickRim.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: c7abdd8705af544ae94203014e0d9f9c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity index 0afc684701..12596f57fe 100644 --- a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity +++ b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity @@ -1090,13 +1090,13 @@ MonoBehaviour: m_Shape: 1 m_NormalizedBounds: serializedVersion: 2 - x: 0.86 + x: 0.9 y: 0.3 - width: 0.15 - height: 0.25 + width: 0.1 + height: 0.16 m_ControlPath: /buttonEast m_Curve: 0 - m_StickRadiusMillimeters: 7.2 + m_StickRadiusMillimeters: 5 --- !u!1 &221984824 GameObject: m_ObjectHideFlags: 0 @@ -2183,8 +2183,8 @@ RectTransform: 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: -573.2329, y: -264.95} - m_SizeDelta: {x: 491.34253, y: 227.1} + m_AnchoredPosition: {x: -472.21313, y: -264.95} + m_SizeDelta: {x: 314.80875, y: 227.1} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &585912952 MonoBehaviour: @@ -2199,7 +2199,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image m_Material: {fileID: 0} - m_Color: {r: 0.6320754, g: 0.2653524, b: 0.46309918, a: 0.32941177} + m_Color: {r: 0, g: 1, b: 0.29986382, a: 0.101960786} m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -3435,8 +3435,8 @@ RectTransform: 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: 573.2329, y: -264.94998} - m_SizeDelta: {x: 153.08234, y: 153.08234} + m_AnchoredPosition: {x: 472.21307, y: -264.94998} + m_SizeDelta: {x: 145.70618, y: 145.70624} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &804746257 CanvasRenderer: @@ -3459,14 +3459,14 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.5019608} m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: c7abdd8705af544ae94203014e0d9f9c, type: 3} m_UVRect: serializedVersion: 2 x: 0 @@ -4075,8 +4075,8 @@ RectTransform: 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: -573.2329, y: -264.94998} - m_SizeDelta: {x: 153.08228, y: 153.08234} + m_AnchoredPosition: {x: -472.2131, y: -264.94998} + m_SizeDelta: {x: 145.70624, y: 145.70624} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &877015850 CanvasRenderer: @@ -4099,14 +4099,14 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.5019608} m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: c7abdd8705af544ae94203014e0d9f9c, type: 3} m_UVRect: serializedVersion: 2 x: 0 @@ -4226,8 +4226,8 @@ RectTransform: 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: 712.44666, y: -56.774994} - m_SizeDelta: {x: 245.6712, y: 189.25} + m_AnchoredPosition: {x: 566.65576, y: -90.83999} + m_SizeDelta: {x: 125.92352, y: 121.12002} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &901700406 MonoBehaviour: @@ -4236,13 +4236,13 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 901700404} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image m_Material: {fileID: 0} - m_Color: {r: 0.6320754, g: 0.2653524, b: 0.46309918, a: 0.32941177} + m_Color: {r: 0, g: 0.73670626, b: 1, a: 0.101960786} m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -4250,7 +4250,7 @@ MonoBehaviour: m_PersistentCalls: m_Calls: [] m_Sprite: {fileID: 0} - m_Type: 0 + m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 @@ -4891,8 +4891,8 @@ RectTransform: 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: 573.2329, y: -264.95} - m_SizeDelta: {x: 491.34253, y: 227.1} + m_AnchoredPosition: {x: 472.21313, y: -264.95} + m_SizeDelta: {x: 314.80875, y: 227.1} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1053028839 MonoBehaviour: @@ -4907,7 +4907,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image m_Material: {fileID: 0} - m_Color: {r: 0.6320754, g: 0.2653524, b: 0.46309918, a: 0.32941177} + m_Color: {r: 0.6320754, g: 0.2653524, b: 0.46309918, a: 0.101960786} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -5066,8 +5066,8 @@ RectTransform: 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: 712.44666, y: -56.774963} - m_SizeDelta: {x: 153.08221, y: 153.08237} + m_AnchoredPosition: {x: 566.65576, y: -90.84001} + m_SizeDelta: {x: 101.184875, y: 101.184906} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1090088430 MonoBehaviour: @@ -5082,14 +5082,14 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.5019608} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: 189aa5792364542f484e839c09ebeceb, type: 3} m_UVRect: serializedVersion: 2 x: 0 @@ -6260,14 +6260,12 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1755332690} - - {fileID: 1617448063} + m_Children: [] m_Father: {fileID: 1837333070} 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: -573.2329, y: -264.94998} + m_AnchoredPosition: {x: -472.2131, y: -264.94998} m_SizeDelta: {x: 100, y: 100} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &1332072490 @@ -6291,14 +6289,14 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.5019608} m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: 459ffffd4a7054f34b940a52a8bbbade, type: 3} m_UVRect: serializedVersion: 2 x: 0 @@ -6469,142 +6467,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1424978754} m_CullTransparentMesh: 0 ---- !u!1 &1457964753 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1457964754} - - component: {fileID: 1457964756} - - component: {fileID: 1457964755} - m_Layer: 0 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1457964754 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1457964753} - 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: 1740936516} - 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: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1457964755 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1457964753} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI - 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_text: "\u2194" - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 2164260863 - m_fontColor: {r: 1, g: 1, b: 1, a: 0.5019608} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 64 - m_fontSizeBase: 64 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 4096 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_TextWrappingMode: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 0 - m_ActiveFontFeatures: 6e72656b - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_EmojiFallbackSupport: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1457964756 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1457964753} - m_CullTransparentMesh: 1 --- !u!1 &1469567784 GameObject: m_ObjectHideFlags: 0 @@ -6696,6 +6558,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!1 &1577491574 GameObject: m_ObjectHideFlags: 0 @@ -7058,142 +6978,6 @@ RectTransform: type: 3} m_PrefabInstance: {fileID: 1611735621} m_PrefabAsset: {fileID: 0} ---- !u!1 &1617448062 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1617448063} - - component: {fileID: 1617448065} - - component: {fileID: 1617448064} - m_Layer: 0 - m_Name: Text (1) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1617448063 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1617448062} - 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: 1332072488} - 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: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1617448064 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1617448062} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI - 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_text: "\u2195" - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 2164260863 - m_fontColor: {r: 1, g: 1, b: 1, a: 0.5019608} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 64 - m_fontSizeBase: 64 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 4096 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_TextWrappingMode: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 0 - m_ActiveFontFeatures: 6e72656b - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_EmojiFallbackSupport: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1617448065 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1617448062} - m_CullTransparentMesh: 1 --- !u!1 &1617608008 GameObject: m_ObjectHideFlags: 0 @@ -8333,13 +8117,12 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1457964754} + m_Children: [] m_Father: {fileID: 2008570242} 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: 573.233, y: -264.94998} + m_AnchoredPosition: {x: 472.2131, y: -264.94998} m_SizeDelta: {x: 100, y: 100} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &1740936518 @@ -8363,156 +8146,20 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.5019608} m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: 459ffffd4a7054f34b940a52a8bbbade, type: 3} m_UVRect: serializedVersion: 2 x: 0 y: 0 width: 1 height: 1 ---- !u!1 &1755332689 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1755332690} - - component: {fileID: 1755332692} - - component: {fileID: 1755332691} - m_Layer: 0 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1755332690 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1755332689} - 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: 1332072488} - 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: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1755332691 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1755332689} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI - 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_text: "\u2194" - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 2164260863 - m_fontColor: {r: 1, g: 1, b: 1, a: 0.5019608} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 64 - m_fontSizeBase: 64 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 4096 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_TextWrappingMode: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 0 - m_ActiveFontFeatures: 6e72656b - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_EmojiFallbackSupport: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1755332692 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1755332689} - m_CullTransparentMesh: 1 --- !u!1 &1801770802 GameObject: m_ObjectHideFlags: 0 @@ -9015,7 +8662,7 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 0 - width: 0.3 + width: 0.25 height: 0.3 m_ControlPath: /leftStick m_Curve: 0 @@ -9770,9 +9417,9 @@ MonoBehaviour: m_Shape: 0 m_NormalizedBounds: serializedVersion: 2 - x: 0.7 + x: 0.75 y: 0 - width: 0.3 + width: 0.25 height: 0.3 m_ControlPath: /rightStick m_Curve: 0 @@ -10046,7 +9693,7 @@ RectTransform: 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: 0} + m_SizeDelta: {x: 98.97, y: 33.68} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2124655859 MonoBehaviour: @@ -10068,7 +9715,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Change + m_text: "\u2248" m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} @@ -10077,8 +9724,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 2164260863 - m_fontColor: {r: 1, g: 1, b: 1, a: 0.5019608} + rgba: 4287861651 + m_fontColor: {r: 0.5754717, g: 0.5754717, b: 0.5754717, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -10095,8 +9742,8 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 25 - m_fontSizeBase: 25 + m_fontSize: 35.9 + m_fontSizeBase: 35.9 m_fontWeight: 400 m_enableAutoSizing: 0 m_fontSizeMin: 18 @@ -10657,3 +10304,4 @@ SceneRoots: - {fileID: 58438681} - {fileID: 780148237} - {fileID: 51853244} + - {fileID: 1492503865} From df6a2b8b5f34100cdc0b1425b2ce3e4fdbd39244 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Mon, 29 Sep 2025 19:59:28 +0200 Subject: [PATCH 17/22] Removed files that will be routed via other PRs --- .../RebindingUI/OnScreen/ActiveDetector.cs | 65 --- .../OnScreen/ActiveDetector.cs.meta | 3 - .../Samples/RebindingUI/OnScreen/AreaShape.cs | 18 - .../RebindingUI/OnScreen/AreaShape.cs.meta | 3 - .../Samples/RebindingUI/OnScreen/Button.png | Bin 8865 -> 0 bytes .../RebindingUI/OnScreen/Button.png.meta | 143 ------ Assets/Samples/RebindingUI/OnScreen/Curve.cs | 68 --- .../RebindingUI/OnScreen/Curve.cs.meta | 3 - .../OnScreen/CustomOnScreenControl.cs | 438 ------------------ .../OnScreen/CustomOnScreenControl.cs.meta | 2 - .../Samples/RebindingUI/OnScreen/Detector.cs | 195 -------- .../RebindingUI/OnScreen/Detector.cs.meta | 3 - .../RebindingUI/OnScreen/DragDetector.cs | 102 ---- .../RebindingUI/OnScreen/DragDetector.cs.meta | 3 - .../Samples/RebindingUI/OnScreen/Editor.meta | 3 - .../OnScreen/Editor/OnScreenControlEditor.cs | 172 ------- .../Editor/OnScreenControlEditor.cs.meta | 3 - .../RebindingUI/OnScreen/Editor/Pixels.cs | 141 ------ .../OnScreen/Editor/Pixels.cs.meta | 3 - .../OnScreen/Editor/TextureGenerator.cs | 231 --------- .../OnScreen/Editor/TextureGenerator.cs.meta | 3 - .../RebindingUI/OnScreen/GestureEvent.cs | 115 ----- .../RebindingUI/OnScreen/GestureEvent.cs.meta | 3 - .../RebindingUI/OnScreen/ITouchMonitor.cs | 9 - .../OnScreen/ITouchMonitor.cs.meta | 3 - .../RebindingUI/OnScreen/ITouchProcessor.cs | 15 - .../OnScreen/ITouchProcessor.cs.meta | 3 - .../RebindingUI/OnScreen/OnScreenControlUI.cs | 199 -------- .../OnScreen/OnScreenControlUI.cs.meta | 2 - .../RebindingUI/OnScreen/PhysicalBounds.cs | 80 ---- .../OnScreen/PhysicalBounds.cs.meta | 3 - .../RebindingUI/OnScreen/ScreenGizmos.cs | 60 --- .../RebindingUI/OnScreen/ScreenGizmos.cs.meta | 3 - .../RebindingUI/OnScreen/StickKnob.png | Bin 10782 -> 0 bytes .../RebindingUI/OnScreen/StickKnob.png.meta | 143 ------ .../Samples/RebindingUI/OnScreen/StickRim.png | Bin 7398 -> 0 bytes .../RebindingUI/OnScreen/StickRim.png.meta | 143 ------ .../RebindingUI/OnScreen/TapDetector.cs | 64 --- .../RebindingUI/OnScreen/TapDetector.cs.meta | 3 - .../RebindingUI/OnScreen/UnitConverter.cs | 50 -- .../OnScreen/UnitConverter.cs.meta | 3 - 41 files changed, 2503 deletions(-) delete mode 100644 Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs delete mode 100644 Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/AreaShape.cs delete mode 100644 Assets/Samples/RebindingUI/OnScreen/AreaShape.cs.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/Button.png delete mode 100644 Assets/Samples/RebindingUI/OnScreen/Button.png.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/Curve.cs delete mode 100644 Assets/Samples/RebindingUI/OnScreen/Curve.cs.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs delete mode 100644 Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/Detector.cs delete mode 100644 Assets/Samples/RebindingUI/OnScreen/Detector.cs.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/DragDetector.cs delete mode 100644 Assets/Samples/RebindingUI/OnScreen/DragDetector.cs.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/Editor.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/Editor/OnScreenControlEditor.cs delete mode 100644 Assets/Samples/RebindingUI/OnScreen/Editor/OnScreenControlEditor.cs.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/Editor/Pixels.cs delete mode 100644 Assets/Samples/RebindingUI/OnScreen/Editor/Pixels.cs.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/Editor/TextureGenerator.cs delete mode 100644 Assets/Samples/RebindingUI/OnScreen/Editor/TextureGenerator.cs.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs delete mode 100644 Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs delete mode 100644 Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs delete mode 100644 Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs delete mode 100644 Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs delete mode 100644 Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/ScreenGizmos.cs delete mode 100644 Assets/Samples/RebindingUI/OnScreen/ScreenGizmos.cs.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/StickKnob.png delete mode 100644 Assets/Samples/RebindingUI/OnScreen/StickKnob.png.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/StickRim.png delete mode 100644 Assets/Samples/RebindingUI/OnScreen/StickRim.png.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/TapDetector.cs delete mode 100644 Assets/Samples/RebindingUI/OnScreen/TapDetector.cs.meta delete mode 100644 Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs delete mode 100644 Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs.meta diff --git a/Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs b/Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs deleted file mode 100644 index 0f44dcefe2..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs +++ /dev/null @@ -1,65 +0,0 @@ -using UnityEngine.InputSystem.LowLevel; - -namespace UnityEngine.InputSystem.Samples.RebindUI -{ - internal class ActiveDetector : ITouchProcessor - { - private Vector2 m_InitialPosition = Vector2.zero; - private double m_InitialTime = 0; - private bool m_Valid = true; - - public void OnTouchBegin(Detector context, in TouchState[] touches, int count, int index) - { - if (count == 1) - { - m_InitialPosition = touches[index].position; - m_InitialTime = Time.realtimeSinceStartupAsDouble; - m_Valid = true; - - GestureEvent @event = new GestureEvent( - delta: Vector2.zero, - duration: 0.0, - flags: GestureEvent.Flags.Active | GestureEvent.Flags.PhaseStart, - start: m_InitialPosition - ); - context.FireEvent(in @event); - } - else - { - m_Valid = false; - } - } - - public void OnTouchEnd(Detector context, in TouchState[] touches, int count, int index) - { - if (m_Valid) - { - GestureEvent @event = new GestureEvent( - delta: touches[index].position - m_InitialPosition, - duration: Time.realtimeSinceStartupAsDouble - m_InitialTime, - flags: GestureEvent.Flags.Active | GestureEvent.Flags.PhaseEnd, start: m_InitialPosition); - context.FireEvent(in @event); - } - } - - public void OnTouchMoved(Detector context, in TouchState[] touches, int count, int index) - { - // Ignored - } - - public void OnTouchCanceled(Detector context, in TouchState[] touches, int count, int index) - { - if (m_Valid) - { - m_Valid = false; - - var @event = new GestureEvent( - delta: touches[index].position - m_InitialPosition, - duration: Time.realtimeSinceStartupAsDouble - m_InitialTime, - flags: GestureEvent.Flags.Active | GestureEvent.Flags.PhaseCancel, - start: m_InitialPosition); - context.FireEvent(in @event); - } - } - } -} diff --git a/Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs.meta b/Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs.meta deleted file mode 100644 index a62a124ee1..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/ActiveDetector.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 4d488485897e442d9b8455eb311c09b5 -timeCreated: 1758906025 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/AreaShape.cs b/Assets/Samples/RebindingUI/OnScreen/AreaShape.cs deleted file mode 100644 index e36d4a5434..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/AreaShape.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace UnityEngine.InputSystem.Samples.RebindUI -{ - /// - /// Specifies the geometric shape of the touch clipping area. - /// - public enum AreaShape - { - /// - /// A rectangular clipping area is used (default). - /// - Rectangle = 0, - - /// - /// A ellipse shaped (or circular) clipping area is used. - /// - Ellipse = 1, - } -} diff --git a/Assets/Samples/RebindingUI/OnScreen/AreaShape.cs.meta b/Assets/Samples/RebindingUI/OnScreen/AreaShape.cs.meta deleted file mode 100644 index 1181b6bb36..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/AreaShape.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: ac3cfbb9cf3e41b194a245cf1464f287 -timeCreated: 1758920079 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/Button.png b/Assets/Samples/RebindingUI/OnScreen/Button.png deleted file mode 100644 index 43f722c0a1c11e51f22aef18202cff77f2d5746f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8865 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 SBaWpf0I)tpulVk>H~$CVI9d<@ diff --git a/Assets/Samples/RebindingUI/OnScreen/Button.png.meta b/Assets/Samples/RebindingUI/OnScreen/Button.png.meta deleted file mode 100644 index c77602ff5f..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/Button.png.meta +++ /dev/null @@ -1,143 +0,0 @@ -fileFormatVersion: 2 -guid: 189aa5792364542f484e839c09ebeceb -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - flipGreenChannel: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - vTOnly: 0 - ignoreMipmapLimit: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 1 - aniso: 1 - mipBias: 0 - wrapU: 0 - wrapV: 0 - wrapW: 0 - nPOTScale: 1 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 1 - singleChannelComponent: 0 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - swizzle: 50462976 - cookieLightType: 0 - platformSettings: - - serializedVersion: 4 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Standalone - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Android - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: iOS - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - customData: - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spriteCustomMetadata: - entries: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Samples/RebindingUI/OnScreen/Curve.cs b/Assets/Samples/RebindingUI/OnScreen/Curve.cs deleted file mode 100644 index 8b0c8c9df5..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/Curve.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; - -namespace UnityEngine.InputSystem.Samples.RebindUI -{ - /// - /// Represents a response curve for mapping normalized values onto the normalized value axis. - /// - public enum Curve - { - /// - /// Linear curve f(x) = x. - /// - Linear, - - /// - /// Quadratic curve f(x) = x^2. - /// - Quadratic, - - /// - /// Cubic curve f(x) = x^3. - /// - Cubic, - } - - /// - /// Extension methods for . - /// - internal static class CurveExtensions - { - /// - /// Apply response curve shaping to vlaue . - /// - /// The response curve. - /// The normalized value to be transformed. - /// Transformed normalized value. - /// If is outside valid range. - public static float Transform(this Curve curve, float v) - { - switch (curve) - { - case Curve.Linear: - return v; - case Curve.Quadratic: - return v * v; - case Curve.Cubic: - return v * v * v; - default: - throw new ArgumentOutOfRangeException(nameof(curve)); - } - } - - /// - /// Apply response curve shaping to vector . - /// - /// The provided vector is first transformed to polar form, then the vector length is scaled - /// before it is finally converted back to euclidean space. - /// The response curve. - /// A normalized Euclidean vector to be transformed. - /// Transformed normalized Euclidean vector. - public static Vector2 Transform(this Curve curve, Vector2 v) - { - var r = curve.Transform(v.magnitude); - var theta = Mathf.Atan2(v.y, v.x); - return new Vector2(r * Mathf.Cos(theta), r * Mathf.Sin(theta)); - } - } -} diff --git a/Assets/Samples/RebindingUI/OnScreen/Curve.cs.meta b/Assets/Samples/RebindingUI/OnScreen/Curve.cs.meta deleted file mode 100644 index 6cf28fca77..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/Curve.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 15c021c605ca4243bddb86ddad37dc2b -timeCreated: 1758909648 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs b/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs deleted file mode 100644 index df3b7dd6f3..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs +++ /dev/null @@ -1,438 +0,0 @@ -using System; -using UnityEditor; -using UnityEngine.InputSystem.Controls; -using UnityEngine.InputSystem.Layouts; -using UnityEngine.InputSystem.LowLevel; - -// TODO Consider if we should ditch shape control on this one? Only if we want a square shaped stick it does matter. -// We could call that joystick in that case. -// TODO Consider not using viewport coordinates for bounds. Instead we want a bounding rect in physical screen space. -// This is similar but make more sense. -// TODO Consider support for 1D sticks -// TODO Consider support for d-pad. - -namespace UnityEngine.InputSystem.Samples.RebindUI -{ - // TODO Should maybe be split into GestureArea and OnScreenControl - // TODO Might need to handle delta state events - public class CustomOnScreenControl : UnityEngine.InputSystem.OnScreen.OnScreenControl - { - #region Properties - - /// - /// Gets or set the geometric shape of the touch clipping area. - /// - private AreaShape shape - { - get => m_Shape; - set - { - if (m_Shape == value) - return; - - m_Shape = value; - OnConfigurationChanged(); - } - } - - /// - /// Gets or sets the geometric clipping area position. - /// - public Vector2 position - { - get => m_NormalizedBounds.position; - set - { - if (m_NormalizedBounds.position.Equals(value)) - return; - - m_NormalizedBounds.position = value; - OnConfigurationChanged(); - } - } - - /// - /// Gets or sets the bounds of the geometric clipping area. - /// - public Rect bounds - { - get => m_NormalizedBounds; - set - { - if (m_NormalizedBounds.Equals(value)) - return; - - m_NormalizedBounds = value; - OnConfigurationChanged(); - } - } - - /// - /// Gets or sets the mapping curve. - /// - public Curve curve - { - get => m_Curve; - set - { - if (m_Curve.Equals(value)) - return; - - m_Curve = value; - OnConfigurationChanged(); - } - } - - /// - /// Gets or sets the on-screen stick radius in millimeters. - /// - /// Physical gamepads analog sticks have mechanical displacements of 7-8 millimeters. - /// If attempting to set the stick radius to a negative value. - public float stickRadiusMillimeters - { - get => m_StickRadiusMillimeters; - set - { - if (value < 0.0f) - throw new ArgumentOutOfRangeException("stickRadiusMillimeters must be greater or equal to zero."); - - m_StickRadiusMillimeters = value; - } - } - - public Vector2 stickCenter - { - get => m_Actuated ? m_StickCenter : m_NormalizedBounds.center; - } - - private Vector2 m_StickCenter; - private bool m_Actuated; - - [Header("Bounds")] - [Tooltip("The geometric clipping area shape")] - [SerializeField] - private AreaShape m_Shape = AreaShape.Rectangle; - - [Tooltip("The geometric clipping area shape")] - [SerializeField] private Rect m_NormalizedBounds; - - [Header("Control")] - [Tooltip("The output control path")] - [InputControl(layout = "Vector2")] - [SerializeField] - private string m_ControlPath; - - [Tooltip("Response curve to be applied to the control value")] - [SerializeField] - private Curve m_Curve = Curve.Linear; - - [Tooltip("The stick radius in millimeters when used as an on-screen stick. " + - "This defaults to 7.2 millimeters which is similar to the mechanical stick displacement of popular " + - "gamepads.")] - [SerializeField] - private float m_StickRadiusMillimeters = 7.2f; - - protected override string controlPathInternal - { - get => m_ControlPath; - set => m_ControlPath = value; - } - - private Touchscreen m_Touchscreen; - private Detector m_Detector; - - #endregion // Properties - - protected override void OnEnable() - { - base.OnEnable(); - - // We cannot setup detector if we have no input control - var c = control; - if (c != null) - { - // TODO This should really be reacting to changes of control path and properties - if (c is ButtonControl) - m_Detector = new Detector(1, new ActiveDetector()); - else if (c is StickControl) - m_Detector = new Detector(1, new DragDetector(0.0f)); - else - throw new Exception($"Unsupported control type: {control.GetType()}"); - } - - ChangeDevice(); - InputSystem.onDeviceChange += OnDeviceChange; - } - - protected override void OnDisable() - { - InputSystem.onDeviceChange -= OnDeviceChange; - - base.OnDisable(); - } - - private void OnDeviceChange(InputDevice device, InputDeviceChange change) - { - switch (change) - { - case InputDeviceChange.Added: - // We can ignore added devices if its an unrelated device. - if (device is Touchscreen) - ChangeDevice(); - break; - case InputDeviceChange.Removed: - // We can ignore removed device if its not the device we are using. - if (device == m_Touchscreen) - ChangeDevice(); - break; - case InputDeviceChange.Reconnected: - ChangeDevice(); - break; - case InputDeviceChange.Disconnected: - // We can ignore disconnect event if it is an unrelated device - if (device == m_Touchscreen) - ChangeDevice(); - break; - case InputDeviceChange.Enabled: - // A touchscreen got enabled so we attempt to change device - if (device is Touchscreen) - ChangeDevice(); - break; - case InputDeviceChange.Disabled: - // We can ignore disable events if it is an unrelated device - if (device == m_Touchscreen) - ChangeDevice(); - break; - case InputDeviceChange.ConfigurationChanged: - case InputDeviceChange.UsageChanged: - OnConfigurationChanged(); - break; - case InputDeviceChange.HardReset: - // The device was reset, we currently ignore this and rely on event propagation. - break; - case InputDeviceChange.SoftReset: - // The device was reset, we currently ignore this and rely on event propagation. - break; - default: - Debug.LogWarning($"Unhandled device change, device={device}, change={change}."); - break; - } - } - - private void ChangeDevice() => ChangeDevice(Touchscreen.current); - - private void ChangeDevice(Touchscreen current) - { - // If touchscreen device have not changed, return immediately. - if (m_Touchscreen == current) - return; - - // Stop monitoring the previous device - if (m_Touchscreen != null && m_Detector != null) - InputState.RemoveChangeMonitor(m_Touchscreen, m_Detector); - - // Update current device - m_Touchscreen = current; - - // Start monitoring the new device - if (m_Detector != null) - { - m_Detector.Reset(m_NormalizedBounds, m_Shape, OnGestureEvent); - - if (current != null && m_Detector != null) - InputState.AddChangeMonitor(current, m_Detector); - } - } - - private void OnGestureEvent(in GestureEvent gestureEvent) - { - // TODO We cannot only use drag for this, we need to also know when it gets "activated" so we - // can set stick position at that point - - // For button control, we consider the whole clip region as a button area. - if (control is ButtonControl) - { - var value = (gestureEvent.flags.HasFlag(GestureEvent.Flags.PhaseStart) ? 1.0f : 0.0f); - value = m_Curve.Transform(value); - SendValueToControl(value); - } - // For stick control, we map drag gesture delta as stick actuation from initial press point - // and reset virtual stick back to zero if touch ends or is cancelled. Note that we transform - // pixels to physical distance since on-screen controls are expected to be consistent regardless - // of the displays physical size. - else if (control is StickControl && gestureEvent.flags.HasFlag(GestureEvent.Flags.DragGesture)) - { - var value = Vector2.zero; - if (gestureEvent.flags.HasFlag(GestureEvent.Flags.PhaseStart) || - gestureEvent.flags.HasFlag(GestureEvent.Flags.PhaseChange)) - { - var deltaMillimeters = gestureEvent.delta * UnitConverter.PixelsToMillimetersConversionFactor( - UnitConverter.EffectivePixelDensity(Screen.dpi)); - var stickRadius = Vector2.ClampMagnitude(deltaMillimeters, m_StickRadiusMillimeters); - value = stickRadius / m_StickRadiusMillimeters; - - if (!m_Actuated) - { - m_Actuated = true; - m_StickCenter = new Vector2(gestureEvent.start.x / Display.displays[0].renderingWidth, - gestureEvent.start.y / Display.displays[0].renderingHeight); - //m_StickCenter = gestureEvent.start; // TODO Convert to normalized - } - } - else - { - m_StickCenter = m_NormalizedBounds.center; - m_Actuated = false; - } - - value = m_Curve.Transform(value); - SendValueToControl(value); - } - } - -// private static Material mat; - - // public void OnRenderObject() - // { - // if (!mat) - // { - // Shader shader = Shader.Find("Hidden/Internal-Colored"); - // mat = new Material(shader); - // mat.hideFlags = HideFlags.HideAndDontSave; - // // Turn on alpha blending - // mat.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); - // mat.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); - // // Turn backface culling off - // mat.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off); - // // Turn off depth writes - // mat.SetInt("_ZWrite", 0); - // return; - // } - // GL.PushMatrix(); - // mat.SetPass(0); - // GL.LoadOrtho(); - // - // GL.Begin(GL.QUADS); - // - // GL.Color(new Color(1.0f, 0.0f, 0.0f, 0.5f)); - // GL.Vertex3(m_NormalizedBounds.xMin, m_NormalizedBounds.yMin, 0); - // GL.Vertex3(m_NormalizedBounds.xMin, m_NormalizedBounds.yMax, 0); - // GL.Vertex3(m_NormalizedBounds.xMax, m_NormalizedBounds.yMax, 0); - // GL.Vertex3(m_NormalizedBounds.xMax, m_NormalizedBounds.yMin, 0); - // - // GL.End(); - // GL.PopMatrix(); - // } - - private void OnConfigurationChanged() - { - // TODO Handle configuration change - } - - // TODO Fix SendValueToControl instead - // private void ChangeValueOfControl(TValue value) where TValue : struct - // { - // var x = base.control; - // if (x == null) - // return; - // if (x is not InputControl) - // { - // throw new ArgumentException($"The control path {controlPath} yields a control of type "+ - // "{m_Control.GetType().Name} which is not an InputControl with value type " + - // "{typeof(TValue).Name}", nameof(value)); - // } - // - // m - // } - - // private void Foo(in Camera camera, in Vector3 position) - // { - // var orthoSize = camera.orthographicSize; - // var horizontalExtent = orthoSize * camera.aspect; - // return (position.x >= -horizontalExtent - margin) && - // (position.x <= horizontalExtent + margin) && - // (position.y >= -orthoSize - margin) && - // (position.y <= orthoSize + margin); - // } - - private Rect GetScreenSpaceRect(Rect rect, int displayIndex) - { - var display = Display.displays[displayIndex]; - var width = display.renderingWidth; - var height = display.renderingHeight; - return new Rect( - x: rect.xMin * width, - y: rect.yMin * height, - width: rect.width * width, - height: rect.height * height); - } - - private void OnDrawGizmos() - { - Gizmos.color = new Color(1f, 1.0f, 0.0f, 0.75f); - ScreenGizmos.DrawLine(Camera.current, new Vector2(0, 0), new Vector2(1000, 1000)); - //Gizmos.DrawLine(new Vector3(0,0,0), new Vector3(10000,0,0)); - //Gizmos.DrawCube(Vector3.zero, new Vector3(5,5,1e-3f)); - // - // // Start drawing in screen coordinates. - // Handles.BeginGUI(); - // - // // Get screen space rect - // //var r = GetScreenSpaceRect(m_NormalizedBounds, Display.activeEditorGameViewTarget); - // - // var r = new Rect(x: 0, y: -20, width: 500, height: 500); - // - // // Transform to GUI coordinates - // - // - // // Draw a solid rectangle with an outline. - // Color backgroundColor = new Color(1.0f, 0.0f, 0.0f, 0.25f); - // Handles.DrawSolidRectangleWithOutline(r, backgroundColor, Color.white); - // - // // End drawing in screen coordinates. - // Handles.EndGUI(); - } - - void OnDrawGizmosSelected() - { - //Gizmos.color = new Color(1f, 1.0f, 0.0f, 0.75f); - - // Convert the local coordinate values into world - // coordinates for the matrix transformation. - //Gizmos.matrix = transform.localToWorldMatrix; - //Gizmos.DrawCube(Vector3.zero, Vector3.one); - - //Gizmos.DrawWireCube(new Vector3(m_Bounds.center.x, m_Bounds.center.y, 0.01f), new Vector3(m_Bounds.size.x, m_Bounds.size.y, 0.01f)); - } - } - - //#if UNITY_EDITOR - - - //[CustomEditor(typeof(CustomOnScreenControl))] - // internal class CustomOnScreenControlEditor : UnityEditor.Editor - // { - // public void OnEnable() - // { - // m_ControlPathInternal = serializedObject.FindProperty("m_ControlPath"); - // m_Bounds = serializedObject.FindProperty("m_NormalizedBounds"); - // } - // - // public override void OnInspectorGUI() - // { - // EditorGUI.BeginChangeCheck(); - // - // Debug.Log(m_Bounds); - // //EditorGUILayout.PropertyField(m_Bounds); - // EditorGUILayout.PropertyField(m_ControlPathInternal); - // - // if (EditorGUI.EndChangeCheck()) - // serializedObject.ApplyModifiedProperties(); - // } - // - // private SerializedProperty m_ControlPathInternal; - // private SerializedProperty m_Bounds; - // } - - //#endif // UNITY_EDITOR -} diff --git a/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs.meta b/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs.meta deleted file mode 100644 index 81892fc140..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/CustomOnScreenControl.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 5514b68a2410f4ab8a2e19c8b963b6f3 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/Detector.cs b/Assets/Samples/RebindingUI/OnScreen/Detector.cs deleted file mode 100644 index 953b1ad486..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/Detector.cs +++ /dev/null @@ -1,195 +0,0 @@ -using System; -using UnityEngine.InputSystem.LowLevel; -using UnityEngine.InputSystem.OnScreen; - -namespace UnityEngine.InputSystem.Samples.RebindUI -{ - // Note that gesture event handler delegate takes an 'in' reference when 'ref readonly' would be preferrable. - // The reason for this is that this construct isn't available until C# 12.0. - - /// - /// Base class for gesture detectors. - /// - abstract class Detector : ITouchMonitor - { - public delegate void GestureEventHandler(in GestureEvent gestureEvent); - - protected Detector(int maxTouches) - { - m_Touches = new TouchState[maxTouches]; - Reset(Rect.zero, AreaShape.Rectangle, null); - } - - public virtual void Reset(Rect bounds, AreaShape shape, GestureEventHandler handler) - { - m_Handler = handler; - m_Bounds = bounds; - m_Shape = shape; - m_Count = 0; - } - - protected bool Contains(in TouchState touch) - { - // TODO Consider transforming touch into normalized instead? E.g. touch / renderingSize - - var display = Display.displays[touch.displayIndex]; - var absoluteBounds = new Rect( - x: m_Bounds.xMin * display.renderingWidth, - y: m_Bounds.yMin * display.renderingHeight, - width: m_Bounds.width * display.renderingWidth, - height: m_Bounds.height * display.renderingHeight); - - switch (m_Shape) - { - case AreaShape.Rectangle: - { - return absoluteBounds.Contains(touch.position); - } - case AreaShape.Ellipse: - { - var delta = touch.position - absoluteBounds.center; - var radius = absoluteBounds.size / 2; - var value = (delta.x * delta.x) / (radius.x * radius.x) + (delta.y * delta.y) / (radius.y * radius.y); - return value <= 1f; - } - } - - return false; - } - - protected int FindTouch(int touchId) - { - for (var i = 0; i < m_Count; ++i) - if (m_Touches[i].touchId == touchId) - return i; - return -1; - } - - public void FireEvent(in GestureEvent gestureEvent) - { - m_Handler.Invoke(in gestureEvent); - } - - public ref readonly TouchState this[int index] => ref m_Touches[index]; // TODO Make sure no defensive copy is created - - //set => SetValue(key, value); - protected Rect m_Bounds; - protected AreaShape m_Shape; - private GestureEventHandler m_Handler; - protected readonly TouchState[] m_Touches; - protected int m_Count; - - public abstract void NotifyControlStateChanged(InputControl control, double time, InputEventPtr eventPtr, - long monitorIndex); - - public abstract void NotifyTimerExpired(InputControl control, double time, long monitorIndex, - int timerIndex); - } - - // TODO This class is doing way too much error checking. Underlying implementation should be correct but - // there seem to be some kind of bug resulting in duplicate callbacks. - internal class Detector : Detector, ITouchMonitor - where TProcessor : ITouchProcessor - { - private TProcessor m_Processor; - - public Detector(int maxTouches, TProcessor processor) - : base(maxTouches) - { - m_Processor = processor; - } - - /*public static Detector Create(int maxTouches, TProcessor processor) - { - return new Detector(maxTouches, processor); - }*/ - - public override void Reset(Rect bounds, AreaShape shape, Detector.GestureEventHandler handler) - { - // Make sure we cancel any pending touches. This way processor do not need a reset method. - for (var i = m_Count; i != 0; --i) - m_Processor.OnTouchCanceled(this, m_Touches, m_Count, m_Count - 1); - - // Reset base - base.Reset(bounds, shape, handler); - } - - public override void NotifyControlStateChanged(InputControl control, double time, InputEventPtr eventPtr, long monitorIndex) - { - // Ignore state change if it is not a touch state - if (!OnScreenUnsafeHelpers.TryGetStateCopy(eventPtr, TouchState.Format, out var state)) - return; - - // Intentionally left commented to aid debugging - //Debug.Log($"monitorIndex: {monitorIndex}, id: {state.touchId}, phase: {state.phase}, position: {state.position}"); - - // Delegate touch phase events - int index; - switch (state.phase) - { - case TouchPhase.Began: - // Only add the point for tracking if we do not violate max point constraint. - if (FindTouch(state.touchId) < 0 && m_Count < m_Touches.Length && Contains(state)) - { - index = m_Count++; - m_Touches[index] = state; - - m_Processor.OnTouchBegin(this, m_Touches, m_Count, index); - } - break; - - case TouchPhase.Ended: - index = FindTouch(state.touchId); - if (index < 0) - break; - - m_Processor.OnTouchEnd(this, m_Touches, m_Count, index); - - // Remove point - if (index != m_Count - 1) - { - Array.Copy(m_Touches, index + 1, - m_Touches, index, m_Count - index - 1); - } - --m_Count; - break; - - case TouchPhase.Canceled: - index = FindTouch(state.touchId); - if (index < 0) - break; - - m_Processor.OnTouchCanceled(this, m_Touches, m_Count, index); - - // TODO Need to remove or will we get end?! - break; - - case TouchPhase.Moved: - index = FindTouch(state.touchId); - if (index < 0) - { - if (m_Count < m_Touches.Length && Contains(state)) - { - // TODO Handle as an addition - } - - break; // Unexpected or not tracked by this processor - } - - m_Touches[index] = state; - - // TODO Handle capture - - m_Processor.OnTouchMoved(this, m_Touches, m_Count, index); - break; - - case TouchPhase.Stationary: // Not used by touchscreen - case TouchPhase.None: // Default initialized (no meaning) - default: - break; - } - } - - public override void NotifyTimerExpired(InputControl control, double time, long monitorIndex, int timerIndex) {} - } -} diff --git a/Assets/Samples/RebindingUI/OnScreen/Detector.cs.meta b/Assets/Samples/RebindingUI/OnScreen/Detector.cs.meta deleted file mode 100644 index 4ae7e6bc48..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/Detector.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: e4aa0ac8504b4e7494c61fb19aefd489 -timeCreated: 1758895723 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs b/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs deleted file mode 100644 index 792bfed4af..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs +++ /dev/null @@ -1,102 +0,0 @@ -using UnityEngine.InputSystem.LowLevel; - -namespace UnityEngine.InputSystem.Samples.RebindUI -{ - /// - /// A gesture detector processor for "drag" a.k.a. "translate/pan" gestures. - /// - internal class DragDetector : ITouchProcessor - { - private Vector2 m_InitialPosition; - private double m_InitialTime; - private readonly float m_ThresholdSqr; - private bool m_Valid; - - public DragDetector(float threshold) - { - m_InitialTime = 0; - m_InitialPosition = Vector2.zero; - m_ThresholdSqr = threshold * threshold; - m_Valid = false; - } - - #region ITouchProcessor implementation - - /// - public void OnTouchBegin(Detector context, in TouchState[] touches, int count, int index) - { - if (count == 1) - { - m_InitialPosition = touches[index].position; - m_InitialTime = Time.realtimeSinceStartupAsDouble; - - // Require that we move outside "dead zone" before we consider the drag to start. - if (IsWithinMargin(touches[index].position)) - return; - - m_Valid = true; - Fire(context, touches, count, index, GestureEvent.Flags.PhaseStart); - } - else if (m_Valid) - { - m_Valid = false; - Fire(context, touches, count, index, GestureEvent.Flags.PhaseCancel); - } - } - - /// - public void OnTouchEnd(Detector context, in TouchState[] touches, int count, int index) - { - if (!m_Valid) - return; - - Fire(context, touches, count, index, GestureEvent.Flags.PhaseEnd); - m_Valid = false; - } - - /// - public void OnTouchMoved(Detector context, in TouchState[] touches, int count, int index) - { - if (m_Valid) - { - Fire(context, touches, count, index, GestureEvent.Flags.PhaseChange); - } - else - { - // Require that we move outside "dead zone" before we consider the drag to start. - if (IsWithinMargin(touches[index].position)) - return; - - m_Valid = true; - Fire(context, touches, count, index, GestureEvent.Flags.PhaseStart); - } - } - - /// - public void OnTouchCanceled(Detector context, in TouchState[] touches, int count, int index) - { - if (m_Valid) - { - m_Valid = false; - Fire(context, touches, count, index, GestureEvent.Flags.PhaseCancel); - } - } - - #endregion - - private void Fire(Detector context, in TouchState[] touches, int count, int index, GestureEvent.Flags phase) - { - GestureEvent @event = new GestureEvent( - delta: touches[index].position - m_InitialPosition, - duration: Time.realtimeSinceStartupAsDouble - m_InitialTime, - flags: GestureEvent.Flags.DragGesture | phase, start: m_InitialPosition); - context.FireEvent(in @event); - } - - private bool IsWithinMargin(Vector2 point) - { - var sqrMagnitude = (point - m_InitialPosition).sqrMagnitude; - return sqrMagnitude < m_ThresholdSqr; - } - } -} diff --git a/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs.meta b/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs.meta deleted file mode 100644 index 1bc9b75129..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/DragDetector.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: d1f619de762d44f4ab27642006b28191 -timeCreated: 1758895643 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/Editor.meta b/Assets/Samples/RebindingUI/OnScreen/Editor.meta deleted file mode 100644 index 48163ffe09..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/Editor.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 6caac7c70517462792075273433a77cc -timeCreated: 1759125976 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/Editor/OnScreenControlEditor.cs b/Assets/Samples/RebindingUI/OnScreen/Editor/OnScreenControlEditor.cs deleted file mode 100644 index 8445b4f180..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/Editor/OnScreenControlEditor.cs +++ /dev/null @@ -1,172 +0,0 @@ -// This should be in an editor only assembly. - -#if UNITY_EDITOR - -using System; -using UnityEditor; -using UnityEngine.InputSystem.OnScreen; -using UnityEngine.UI; - -namespace UnityEngine.InputSystem.Samples.RebindUI -{ - //[CustomEditor(typeof(OnScreenControlUI))] - public class OnScreenControlEditor : UnityEditor.Editor - { - #region Unity Editor Menu Extensions - - private const int Priority = 10; - private const int RigPriority = 21; // Note: Diff > 10 inserts separator - private const string PrimaryStickControlPath = "/leftStick"; - private const string SecondaryStickControlPath = "/rightStick"; - private const string PrimaryButtonControlPath = "/buttonSouth"; - private const string SecondaryButtonControlPath = "/buttonEast"; - private const string Menu = "GameObject/Input System/"; - - private enum UIIntegration - { - None = 0, - UGUI = 1, - UIElements = 2, - } - - [MenuItem(Menu + "On-Screen Button", false, Priority)] - private static void CreateOnScreenButton(MenuCommand menuCommand) - { - FinalizeGameObject(CreateButton(PrimaryButtonControlPath, UIIntegration.None), menuCommand.context); - } - - [MenuItem(Menu + "On-Screen Button (UI)", false, Priority)] - private static void CreateOnScreenButtonUI(MenuCommand menuCommand) - { - FinalizeGameObject(CreateButton(PrimaryButtonControlPath, UIIntegration.UGUI), menuCommand.context); - } - - [MenuItem(Menu + "On-Screen Stick", false, Priority)] - private static void CreateOnScreenStick(MenuCommand menuCommand) - { - var go = CreateStick(PrimaryStickControlPath, UIIntegration.None); - FinalizeGameObject(go, menuCommand.context); - } - - [MenuItem(Menu + "On-Screen Gamepad (1 Stick, 2 Buttons)", isValidateFunction: false, RigPriority)] - private static void CreateOnScreenGamepad1Stick2Buttons(MenuCommand menuCommand) - { - var go = CreateGamepad1Stick2Buttons(UIIntegration.None); - FinalizeGameObject(go: go, menuCommand.context); - } - - [MenuItem(Menu + "On-Screen Gamepad (2 Sticks, 2 Buttons)", isValidateFunction: false, RigPriority)] - private static void CreateOnScreenGamepad2Sticks2Buttons(MenuCommand menuCommand) - { - var go = CreateGamepad2Stick2Buttons(UIIntegration.None); - FinalizeGameObject(go, menuCommand.context); - } - - private static void FinalizeGameObject(GameObject go, Object parent) - { - // Ensure it gets parented correctly if a context object was selected - GameObjectUtility.SetParentAndAlign(go, parent as GameObject); - - // Register the creation in the undo system - Undo.RegisterCreatedObjectUndo(go, $"Create {go.name}"); - - // Select the newly created object - Selection.activeObject = go; - } - - private static GameObject CreateStick(string controlPath, UIIntegration uiIntegration, string name = "OnScreenStick") - { - // There is currently no difference between stick and button apart from path. - return CreateButton(controlPath, uiIntegration, name); - } - - private static GameObject CreateButton(string controlPath, UIIntegration uiIntegration, string name = "OnScreenButton") - { - var go = new GameObject(name: name); - - var control = go.AddComponent(); - control.curve = Curve.Linear; - control.stickRadiusMillimeters = 7.2f; - control.bounds = new Rect(0.0f, 0.5f, 0.5f, 0.0f); - control.controlPath = controlPath; - - switch (uiIntegration) - { - case UIIntegration.UGUI: - { - // When used with UGUI we want the on-screen control to be a canvas object - go.AddComponent(); - - var uiButtonGo = new GameObject("Button"); - var rectTransform = uiButtonGo.AddComponent(); - var uiButton = uiButtonGo.AddComponent(); - uiButton.color = new Color(0.5f, 0.5f, 0.5f, 0.5f); - uiButton.raycastTarget = false; - uiButton.transform.parent = go.transform; - - var controlUI = go.AddComponent(); - controlUI.control = control; - controlUI.bounds = rectTransform; - } - break; - case UIIntegration.UIElements: - throw new NotImplementedException("UIElements support not yet implemented"); - break; - case UIIntegration.None: - default: - break; - } - - return go; - } - - private static GameObject CreateGamepad1Stick2Buttons(UIIntegration uiIntegration) - { - var gamepad = new GameObject(MakeName("Gamepad 1-Stick 2-Buttons", uiIntegration)); - - var stick = CreateStick(PrimaryStickControlPath, uiIntegration); - stick.transform.SetParent(gamepad.transform); - - var primaryButton = CreateButton(PrimaryButtonControlPath, uiIntegration, "PrimaryButton"); - primaryButton.transform.SetParent(gamepad.transform); - - var secondaryButton = CreateButton(SecondaryButtonControlPath, uiIntegration, "SecondaryButton"); - secondaryButton.transform.SetParent(gamepad.transform); - - return gamepad; - } - - private static GameObject CreateGamepad2Stick2Buttons(UIIntegration uiIntegration) - { - var gamepad = new GameObject(MakeName("Gamepad 2-Sticks 2-Buttons", uiIntegration)); - - var primaryStick = CreateStick(PrimaryStickControlPath, uiIntegration, "Primary Stick"); - primaryStick.transform.SetParent(gamepad.transform); - - var secondaryStick = CreateStick(SecondaryStickControlPath, uiIntegration, "Secondary Stick"); - secondaryStick.transform.SetParent(gamepad.transform); - - var primaryButton = CreateButton(PrimaryButtonControlPath, uiIntegration, "PrimaryButton"); - primaryButton.transform.SetParent(gamepad.transform); - - var secondaryButton = CreateButton(SecondaryButtonControlPath, uiIntegration, "SecondaryButton"); - secondaryButton.transform.SetParent(gamepad.transform); - - return gamepad; - } - - private static string MakeName(string name, UIIntegration uiIntegration) - { - switch (uiIntegration) - { - case UIIntegration.UGUI: return name + " (UI)"; - case UIIntegration.None: return name + " (UI Elements)"; - default: return name; - } - } - - #endregion - } -} - -#endif // UNITY_EDITOR diff --git a/Assets/Samples/RebindingUI/OnScreen/Editor/OnScreenControlEditor.cs.meta b/Assets/Samples/RebindingUI/OnScreen/Editor/OnScreenControlEditor.cs.meta deleted file mode 100644 index 4e0b6772e1..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/Editor/OnScreenControlEditor.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: db11f8246c674ccf962ed7f4e16e0dba -timeCreated: 1759124094 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/Editor/Pixels.cs b/Assets/Samples/RebindingUI/OnScreen/Editor/Pixels.cs deleted file mode 100644 index 7a0a28573a..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/Editor/Pixels.cs +++ /dev/null @@ -1,141 +0,0 @@ -#if UNITY_EDITOR - -namespace UnityEngine.InputSystem.Samples.RebindUI -{ - internal readonly struct Pixels - { - public Pixels(int width, int height) - { - Width = width; - Height = height; - Data = new Color[width * height]; - } - - public void Fill(Color color) - { - for (var i = 0; i < Data.Length; i++) - Data[i] = color; - } - - public void FillCircle(float innerRadius, - float outerRadius, Gradient gradient) - { - var center = new Vector2(Width / 2f, Height / 2f); - - // Softness in pixels for anti-aliased edges - const float edgeSoftness = 1.0f; - - for (var y = 0; y < Height; ++y) - { - for (var x = 0; x < Width; ++x) - { - var pos = new Vector2(x + 0.5f, y + 0.5f); // pixel center - var dist = (pos - center).magnitude; - - // Normalize distance between inner and outer radius - var t = Mathf.InverseLerp(innerRadius, outerRadius, dist); - - // Gradient only valid between inner/outer radius ± softness - if (dist <= outerRadius + edgeSoftness && dist >= innerRadius - edgeSoftness) - { - var c = gradient.Evaluate(Mathf.Clamp01(t)); - var alpha = 1f; - - // Fade near outer edge - if (dist > outerRadius - edgeSoftness) - alpha = Mathf.Clamp01((outerRadius - dist) / edgeSoftness); - - // Fade near inner edge (if > 0) - if (innerRadius > 0 && dist < innerRadius + edgeSoftness) - alpha = Mathf.Clamp01((dist - innerRadius) / edgeSoftness); - - c.a *= alpha; - Data[y * Width + x] = c; - } - } - } - } - - public void FillArrow(Vector2 tip, Vector2 baseCenter, float baseWidth, Color color) - { - var edgeSoftness = 1.0f; // pixels - - // Build triangle points - var dir = (tip - baseCenter).normalized; - var perp = new Vector2(-dir.y, dir.x); - var baseLeft = baseCenter - perp * (baseWidth * 0.5f); - var baseRight = baseCenter + perp * (baseWidth * 0.5f); - - var v0 = tip; - var v1 = baseLeft; - var v2 = baseRight; - - // Precompute edge vectors - var e0 = v1 - v0; - var e1 = v2 - v1; - var e2 = v0 - v2; - - for (var y = 0; y < Height; y++) - { - for (var x = 0; x < Width; x++) - { - var p = new Vector2(x + 0.5f, y + 0.5f); - - // Barycentric test (sign of cross products) - var c0 = Cross(e0, p - v0); - var c1 = Cross(e1, p - v1); - var c2 = Cross(e2, p - v2); - - var inside = (c0 >= 0 && c1 >= 0 && c2 >= 0) || - (c0 <= 0 && c1 <= 0 && c2 <= 0); - - if (!inside) - continue; - - // Distance to edges (for AA) - var d0 = DistanceToLine(p, v0, v1); - var d1 = DistanceToLine(p, v1, v2); - var d2 = DistanceToLine(p, v2, v0); - var minDist = Mathf.Min(d0, Mathf.Min(d1, d2)); - - var alpha = 1f; - if (minDist < edgeSoftness) - alpha = Mathf.Clamp01(minDist / edgeSoftness); - - var c = color; - c.a *= alpha; - - Data[y * Width + x] = c; - } - } - } - - private static float Cross(Vector2 a, Vector2 b) => a.x * b.y - a.y * b.x; - - private static float DistanceToLine(Vector2 p, Vector2 a, Vector2 b) - { - var ab = b - a; - var ap = p - a; - var t = Mathf.Clamp01(Vector2.Dot(ap, ab) / ab.sqrMagnitude); - var proj = a + t * ab; - return (p - proj).magnitude; - } - - public Texture2D ToTexture(string name) - { - var texture = new Texture2D(Width, Height, TextureFormat.RGBA32, false); - texture.filterMode = FilterMode.Bilinear; - texture.alphaIsTransparency = true; - texture.name = name; - texture.SetPixels(Data); - texture.Apply(); - return texture; - } - - public readonly Color[] Data; - public readonly int Width; - public readonly int Height; - } -} - -#endif // UNITY_EDITOR diff --git a/Assets/Samples/RebindingUI/OnScreen/Editor/Pixels.cs.meta b/Assets/Samples/RebindingUI/OnScreen/Editor/Pixels.cs.meta deleted file mode 100644 index 00ce94a9fe..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/Editor/Pixels.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 6b9449795f9b4c55bcabb9e40e763cf4 -timeCreated: 1759154900 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/Editor/TextureGenerator.cs b/Assets/Samples/RebindingUI/OnScreen/Editor/TextureGenerator.cs deleted file mode 100644 index 856e5e6220..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/Editor/TextureGenerator.cs +++ /dev/null @@ -1,231 +0,0 @@ -#if UNITY_EDITOR - -using System; -using System.IO; -using UnityEditor; - -namespace UnityEngine.InputSystem.Samples.RebindUI -{ - /// - /// Edit-mode texture generation facilities to quickly get going without having to create textures when - /// adding on-screen controls to a new project where it is desirable to have visibile virtual controls. - /// - internal static class TextureGenerator - { - #region Unity Editor Menu Extensions - - private const string AssetExtension = ".asset"; - private const string PngExtension = ".png"; - private const int Priority = 10; - - [Flags] - private enum Direction - { - Up = 1, - Down = 2, - Left = 4, - Right = 8, - } - - [MenuItem("Assets/Create/Input System/On-Screen Button Texture", false, Priority)] - private static void CreateOnScreenButtonTexture(MenuCommand menuCommand) - { - CreateAsset(GenerateButton(), PngExtension); - } - - [MenuItem("Assets/Create/Input System/On-Screen Stick Rim Texture", false, Priority)] - private static void CreateOnScreenStickRimTexture(MenuCommand menuCommand) - { - CreateAsset(GenerateStickRim(), PngExtension); - } - - [MenuItem("Assets/Create/Input System/On-Screen Stick Knob Texture", false, Priority)] - private static void CreateOnScreenStickKnobTexture(MenuCommand menuCommand) - { - CreateAsset(GenerateStickKnob(), PngExtension); - } - - #endregion - - private static Texture2D CreateAsset(Texture2D texture, string extension) - { - Texture2D result = texture; - - // Get target path from Project window selection - var path = GetSelectedPathOrFallback(); - var assetPath = AssetDatabase.GenerateUniqueAssetPath(Path.Combine(path, texture.name + extension)); - - if (extension.Equals(PngExtension, StringComparison.InvariantCultureIgnoreCase)) - { - // Encode to PNG, refresh ADB and then import as texture asset - File.WriteAllBytes(assetPath, texture.EncodeToPNG()); - AssetDatabase.Refresh(); - result = AssetDatabase.LoadAssetAtPath(assetPath); - } - else if (extension.Equals(AssetExtension, StringComparison.InvariantCultureIgnoreCase)) - { - // Save the asset - AssetDatabase.CreateAsset(texture, assetPath); - AssetDatabase.SaveAssets(); - AssetDatabase.Refresh(); - } - else - { - throw new ArgumentOutOfRangeException("Unsupported extension: " + extension); - } - - // Select it - EditorUtility.FocusProjectWindow(); - Selection.activeObject = result; - - // Destroy provided in-memory texture if we had to reimport it - if (!ReferenceEquals(result, texture)) - Object.DestroyImmediate(texture); - - return result; - } - - // Determines the path for where to create the asset. - private static string GetSelectedPathOrFallback() - { - var path = "Assets"; - - foreach (var obj in Selection.GetFiltered(typeof(Object), SelectionMode.Assets)) - { - var selectedPath = AssetDatabase.GetAssetPath(obj); - if (string.IsNullOrEmpty(selectedPath)) - continue; - - if (Directory.Exists(selectedPath)) - { - path = selectedPath; - break; - } - - path = Path.GetDirectoryName(selectedPath); - break; - } - - return path; - } - - private static Texture2D GenerateButton(string name = "Button") - { - // Draw pixels - var textureSize = 128; - var padding = 2.0f; - var pixels = new Pixels(textureSize, textureSize); - pixels.Fill(new Color(0.0f, 0.0f, 0.0f, 0.0f)); - pixels.FillCircle(0.0f, textureSize / 2.0f - padding, new Gradient - { - colorKeys = new GradientColorKey[] - { - new(Grayscale(1.0f), 0.0f), - new(Grayscale(0.9f), 0.8f), - new(Grayscale(1.0f), 0.9f), - new(Grayscale(0.5f), 1.0f) - }, - mode = GradientMode.PerceptualBlend - }); - - return pixels.ToTexture(name); - } - - private static Texture2D GenerateStickKnob(string name = "StickKnob", Direction direction = - Direction.Up | Direction.Down | Direction.Left | Direction.Right) - { - // Draw pixels - var textureSize = 128; - var halfTextureSize = textureSize / 2.0f; - var padding = 2.0f; - var pixels = new Pixels(textureSize, textureSize); - pixels.Fill(new Color(0.0f, 0.0f, 0.0f, 0.0f)); - pixels.FillCircle(0.0f, halfTextureSize - padding, new Gradient - { - colorKeys = new GradientColorKey[] - { - new(Grayscale(0.9f), 0.0f), - new(Grayscale(0.8f), 0.8f), - new(Grayscale(0.9f), 0.9f), - new(Grayscale(0.4f), 1.0f), - }, - mode = GradientMode.PerceptualBlend - }); - pixels.FillCircle(0.0f, (halfTextureSize - padding) * 0.75f, new Gradient - { - colorKeys = new GradientColorKey[] - { - new(Grayscale(1.0f), 0.0f), - new(Grayscale(0.9f), 0.5f), - new(Grayscale(0.7f), 1.0f) - }, - mode = GradientMode.PerceptualBlend - }); - - var arrowOffset = halfTextureSize * 0.2f; - var arrowLength = halfTextureSize * 0.5f; - var arrowWidth = halfTextureSize * 0.3f; - var arrowColor = Grayscale(0.5f); - - if (direction.HasFlag(Direction.Right)) - { - pixels.FillArrow( - baseCenter: new Vector2(halfTextureSize + arrowOffset, halfTextureSize), - tip: new Vector2(halfTextureSize + arrowOffset + arrowOffset, halfTextureSize), - baseWidth: arrowWidth, color: arrowColor); - } - - if (direction.HasFlag(Direction.Left)) - { - pixels.FillArrow( - baseCenter: new Vector2(halfTextureSize - arrowOffset, halfTextureSize), - tip: new Vector2(halfTextureSize - arrowOffset - arrowOffset, halfTextureSize), - baseWidth: arrowWidth, color: arrowColor); - } - - if (direction.HasFlag(Direction.Up)) - { - pixels.FillArrow( - baseCenter: new Vector2(halfTextureSize, halfTextureSize + arrowOffset), - tip: new Vector2(halfTextureSize, halfTextureSize + arrowOffset + arrowOffset), - baseWidth: arrowWidth, color: arrowColor); - } - - if (direction.HasFlag(Direction.Down)) - { - pixels.FillArrow( - baseCenter: new Vector2(halfTextureSize, halfTextureSize - arrowOffset), - tip: new Vector2(halfTextureSize, halfTextureSize - arrowOffset - arrowOffset), - baseWidth: arrowWidth, color: arrowColor); - } - - return pixels.ToTexture(name); - } - - private static Texture2D GenerateStickRim(string name = "StickRim") - { - // Draw pixels - var textureSize = 128; - var padding = 2.0f; - var radius = 10.0f; - var pixels = new Pixels(textureSize, textureSize); - pixels.Fill(new Color(0.0f, 0.0f, 0.0f, 0.0f)); - pixels.FillCircle(textureSize / 2.0f - padding - radius, textureSize / 2.0f - padding, new Gradient - { - colorKeys = new GradientColorKey[] - { - new(Grayscale(0.5f), 0.0f), - new(Grayscale(1.0f), 0.5f), - new(Grayscale(0.5f), 1.0f) - }, - mode = GradientMode.PerceptualBlend - }); - - return pixels.ToTexture(name); - } - - private static Color Grayscale(float v, float alpha = 1.0f) => new Color(v, v, v, alpha); - } -} - -#endif // UNITY_EDITOR diff --git a/Assets/Samples/RebindingUI/OnScreen/Editor/TextureGenerator.cs.meta b/Assets/Samples/RebindingUI/OnScreen/Editor/TextureGenerator.cs.meta deleted file mode 100644 index dee18d5248..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/Editor/TextureGenerator.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: a5335fce2bf1483c9dddb6567ec41487 -timeCreated: 1759128008 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs b/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs deleted file mode 100644 index 1ad999e307..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System; -using System.Text; - -namespace UnityEngine.InputSystem.Samples.RebindUI -{ - /// - /// A gesture event. - /// - public readonly struct GestureEvent - { - /// - /// Gesture event flags. - /// - [Flags] - public enum Flags - { - /// - /// No gesture flags, indicates an invalid or default constructed gesture event. - /// - None = 0, - - /// - /// The event is a tap gesture. - /// - TapGesture = 1 << 0, - - /// - /// The event is a press-and-hold (also known as long tap) gesture. - /// - PressAndHoldGesture = 1 << 1, - - /// - /// The event is a drag gesture. - /// - DragGesture = 1 << 2, - - /// - /// The event is an active gesture. - /// - Active = 1 << 3, - - /// - /// Indicates that the interaction of the associated continuous gesture started. - /// - PhaseStart = 1 << 28, - - /// - /// Indicates that the interaction of the associated continuous gesture was updated and changed. - /// - PhaseChange = 1 << 29, - - /// - /// Indicates that the interaction of the associated continuous gesture ended. - /// - PhaseEnd = 1 << 30, - - /// - /// Indicates that the interaction of the associated continuous gesture was cancelled. - /// - PhaseCancel = 1 << 31, - } - - public readonly Flags flags; - public readonly Vector2 start; - public readonly Vector2 delta; - public readonly double duration; - - /// - /// Constructs a new gesture event. - /// - /// The delta of the gesture event. - /// The duration of the gesture event. - /// Flags indicating what type of event it is. - /// The initial absolute position of the gesture event. - public GestureEvent(Vector2 delta, double duration, Flags flags, Vector2 start) - { - this.delta = delta; - this.duration = duration; - this.flags = flags; - this.start = start; - } - - /// - /// Converts the event to string representation. - /// - public override string ToString() - { - var sb = new StringBuilder(); - if (flags.HasFlag(Flags.TapGesture)) - Append(sb, "Tap"); - if (flags.HasFlag(Flags.PressAndHoldGesture)) - Append(sb, "PressAndHold"); - if (flags.HasFlag(Flags.DragGesture)) - Append(sb, "Drag"); - if (flags.HasFlag(Flags.PhaseCancel)) - Append(sb, "PhaseCancel"); - if (flags.HasFlag(Flags.PhaseStart)) - Append(sb, "PhaseStart"); - if (flags.HasFlag(Flags.PhaseChange)) - Append(sb, "PhaseChange"); - if (flags.HasFlag(Flags.PhaseEnd)) - Append(sb, "PhaseEnd"); - return $"GestureEvent{{delta: {delta}, duration: {duration}, start: {start}, flags: {sb}}}"; - } - - private static void Append(StringBuilder sb, string s) - { - if (sb.Length != 0) - sb.Append(", "); - sb.Append(s); - } - - // TODO Consider including a transform for direct manipulation - } -} diff --git a/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs.meta b/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs.meta deleted file mode 100644 index 2dbd399b88..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/GestureEvent.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 7e233c17090c47cca81f36ac0fbfdbc0 -timeCreated: 1758896699 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs b/Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs deleted file mode 100644 index 1d67085461..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs +++ /dev/null @@ -1,9 +0,0 @@ -using UnityEngine.InputSystem.LowLevel; - -namespace UnityEngine.InputSystem.Samples.RebindUI -{ - internal interface ITouchMonitor : IInputStateChangeMonitor - { - void Reset(Rect bounds, AreaShape shape, Detector.GestureEventHandler handler); - } -} diff --git a/Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs.meta b/Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs.meta deleted file mode 100644 index a6ea75798e..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/ITouchMonitor.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: e0289fdf031b4efc96d6d89b9cced828 -timeCreated: 1758895694 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs b/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs deleted file mode 100644 index 5fe5af329d..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs +++ /dev/null @@ -1,15 +0,0 @@ -using UnityEngine.InputSystem.LowLevel; - -namespace UnityEngine.InputSystem.Samples.RebindUI -{ - /// - /// Interface for a processor of touch events. - /// - internal interface ITouchProcessor - { - void OnTouchBegin(Detector context, in TouchState[] touches, int count, int index); - void OnTouchEnd(Detector context, in TouchState[] touches, int count, int index); - void OnTouchMoved(Detector context, in TouchState[] touches, int count, int index); - void OnTouchCanceled(Detector context, in TouchState[] touches, int count, int index); - } -} diff --git a/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs.meta b/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs.meta deleted file mode 100644 index 931d5ed725..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/ITouchProcessor.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: bc06ca24beb747348546bc744798b26d -timeCreated: 1758895602 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs b/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs deleted file mode 100644 index 7f180edc57..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs +++ /dev/null @@ -1,199 +0,0 @@ -using UnityEngine; -using UnityEngine.InputSystem.Controls; -using UnityEngine.InputSystem.Samples.RebindUI; -using UnityEngine.UI; - -// Should warn about not having a canvas or parent canvas assigned. -// Should warn about ray-casted UI consuming events. - -/// -/// A passive UI visualization of an on-screen control in Unity UI (UGUI). -/// -[ExecuteInEditMode] -public class OnScreenControlUI : MonoBehaviour -{ - public Canvas canvas; - public new Camera camera; - public CustomOnScreenControl control; - public RectTransform area; - public RectTransform bounds; - public RectTransform knob; - - void OnEnable() - { - if (canvas == null) - canvas = GetComponentInParent(); - if (camera == null) - camera = Camera.main; - - // if (bounds != null) - // { - // var rawImage = bounds.GetComponent(); - // if (rawImage != null /*&& rawImage.texture == null*/) - // { - // var g = new Gradient - // { - // colorKeys = new GradientColorKey[] - // { - // new(new Color(0.1f, 0.1f, 0.1f, 1.0f), 0.0f), - // new(new Color(0.1f, 0.1f, 0.1f, 1.0f), 0.8f), - // new(new Color(0.2f, 0.2f, 0.2f, 1.0f), 0.9f), - // new(new Color(0.2f, 0.2f, 0.2f, 1.0f), 1.0f) - // }, - // mode = GradientMode.PerceptualBlend - // }; - // - // var texture = GenerateCircleTexture(128, 64.0f, g); - // texture.hideFlags = HideFlags.HideAndDontSave; - // texture.filterMode = FilterMode.Bilinear; - // bounds.GetComponent().texture = texture; - // } - // } - // - // if (knob != null) - // { - // var rawImage = knob.GetComponent(); - // if (rawImage != null /*&& rawImage.texture == null*/) - // { - // var g = new Gradient - // { - // colorKeys = new GradientColorKey[] - // { - // new(new Color(0.3f, 0.3f, 0.3f, 1.0f), 0.0f), - // new(new Color(0.3f, 0.3f, 0.3f, 1.0f), 0.5f), - // new(new Color(0.5f, 0.5f, 0.5f, 1.0f), 0.9f), - // new(new Color(0.2f, 0.2f, 0.2f, 1.0f), 1.0f) - // }, - // mode = GradientMode.PerceptualBlend - // }; - // - // var texture = GenerateCircleTexture(128, 64.0f, g); - // texture.hideFlags = HideFlags.HideAndDontSave; - // texture.filterMode = FilterMode.Bilinear; - // knob.GetComponent().texture = texture; - // } - // } - } - - void Update() - { - // If we do not have a control nor a camera, there is nothing we can visualize via UI. - if (control == null || camera == null || canvas == null) - return; - - var normalizedBounds = control.bounds; - var stickRadiusPixels = control.stickRadiusMillimeters * UnitConverter.MillimetersToPixelsConversionFactor( - UnitConverter.EffectivePixelDensity(Screen.dpi)); - var stickCenter = control.stickCenter; - var stickViewport = camera.ScreenToViewportPoint(new Vector2(stickRadiusPixels, stickRadiusPixels)); - var stickRect = new Rect( - x: stickCenter.x - stickViewport.x, - y: stickCenter.y - stickViewport.y, - width: stickViewport.x * 2, - height: stickViewport.y * 2); - - // Optionally transform a UI object to represent the interactable area in viewport space. - if (area != null) - PlaceAtViewportRect(area, canvas, normalizedBounds, camera); - - // Optionally transform a UI object to represent the stick bounds. - if (bounds != null) - PlaceAtViewportRect(bounds, canvas, stickRect, camera); - - // Optionally transform a UI object represent the stick knob. - if (knob != null) - { - var viewportPosition = stickRect.center; - if (control.control is StickControl stick) - viewportPosition += stick.ReadValue() * stickViewport; - PlaceAtViewport(knob, canvas, viewportPosition, camera); - } - } - - /// - /// Places a RectTransform at given viewport coordinates inside a Canvas. - /// - /// The UI element to move. - /// The parent canvas. - /// Normalized viewport coordinates. - /// The camera that defines the viewport. - private static void PlaceAtViewport(RectTransform child, Canvas canvas, Vector2 viewportPos, Camera camera) - { - // Convert viewport coordinates to screen coordinates (pixels). - Vector2 screenPos = camera.ViewportToScreenPoint(viewportPos); - - // Convert screen coordinates to local point in canvas. - var canvasRect = canvas.GetComponent(); - RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRect, screenPos, canvas.worldCamera, out var localPos); - - // Apply position to child. - child.anchoredPosition = localPos; - } - - /// - /// Places and sizes a RectTransform to exactly match a viewport-space rect. - /// Works regardless of pivot or anchors. - /// - /// The UI RectTransform to place. - /// The parent canvas. - /// Rect in viewport coords (x,y,width,height) with 0–1 range. - /// The camera defining the viewport. - public static void PlaceAtViewportRect(RectTransform rect, Canvas canvas, Rect viewportRect, Camera camera) - { - RectTransform canvasRect = canvas.GetComponent(); - - // Convert bottom-left and top-right corners from viewport to screen - Vector2 screenBL = camera.ViewportToScreenPoint(new Vector2(viewportRect.xMin, viewportRect.yMin)); - Vector2 screenTR = camera.ViewportToScreenPoint(new Vector2(viewportRect.xMax, viewportRect.yMax)); - - // Convert to local canvas space - Vector2 localBL, localTR; - RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRect, screenBL, canvas.worldCamera, out localBL); - RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRect, screenTR, canvas.worldCamera, out localTR); - - // Compute size and center - Vector2 size = localTR - localBL; - Vector2 center = (localTR + localBL) * 0.5f; - - // Apply to RectTransform, ignoring pivot/anchors - rect.localPosition = center; - rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Mathf.Abs(size.x)); - rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, Mathf.Abs(size.y)); - } - - private static Texture2D GenerateCircleTexture(int textureSize, float radius, Gradient gradient) - { - Texture2D tex = new Texture2D(textureSize, textureSize, TextureFormat.RGBA32, false); - - // Transparent background - Color32[] pixels = new Color32[textureSize * textureSize]; - for (int i = 0; i < pixels.Length; i++) - pixels[i] = new Color32(0, 0, 0, 0); - - // Circle parameters - var center = new Vector2(textureSize / 2f, textureSize / 2f); - var squareRadius = radius * radius; - - // Draw circle - for (var y = 0; y < textureSize; y++) - { - for (var x = 0; x < textureSize; x++) - { - Vector2 pos = new Vector2(x, y); - var magnitude = (pos - center).magnitude; - if (magnitude <= radius) - { - float t = magnitude / radius; - pixels[y * textureSize + x] = gradient.Evaluate(t); - } - // TODO Should be partial - } - } - - // Apply to texture - tex.SetPixels32(pixels); - tex.Apply(); - - return tex; - } -} diff --git a/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs.meta b/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs.meta deleted file mode 100644 index 9a3551b151..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/OnScreenControlUI.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 556fd135abfe64c75a42dcd0c1a98b85 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs b/Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs deleted file mode 100644 index 142763b18d..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs +++ /dev/null @@ -1,80 +0,0 @@ -namespace UnityEngine.InputSystem.Samples.RebindUI -{ - /// - /// Defines a 2D rect transform suitable for device-specific bounds. - /// - /// - /// This is useful to anchor interactive regions based on physical aspects of a device, in - /// particular touchscreen. When designing on-screen-controls, you want e.g. an on screen stick - /// to stay consistent in size across devices. This mimics the behavior of a physical device - /// where the mechanical offset of a gamepad stick wouldn't change depending on the screen size - /// or resolution. This is relevant since our physical ability as humans is limited to our limbs, e.g. - /// our number of fingers and their reaching length is fixed. - /// - /// When using a UI framework to visualize on-screen controls, you likely want to combine screen-based (pixels) - /// and physical layout (millimeters or inches). - /// - public struct PhysicalBounds - { - /// - /// Evaluates whether this transform bounding rectangle contains the associated viewport coordinate. - /// - /// Viewport coordinate (normalized). - /// true if bounds contains point, else false. - public bool ContainsViewportPoint(Vector2 point) - { - return ContainsPhysicalPoint(new Vector2(point.x * rect.width, point.y * rect.height)); - } - - /// - /// Evaluates whether this transform bounding rectangle contains the associated screen point. - /// - /// Screen point. - /// Pixels-per-inch (PPI) pixel density of the associated display. - /// Due to limited support for multiple displays, this may return incorrect results - /// since it will use DPI (rather PPI) reported by Screen and not individual displays. - /// true if bounds contains point, else false. - public bool ContainsScreenPoint(Vector2 screenPoint, float pixelsPerInch) - { - return ContainsPhysicalPoint(screenPoint * UnitConverter.PixelsToMillimetersConversionFactor(pixelsPerInch)); - } - - /// - /// Returns whether this transform bounding rectangle contains the associated physical point. - /// - /// Physical space point in millimeters. - /// - public bool ContainsPhysicalPoint(Vector2 point) - { - switch (shape) - { - case AreaShape.Rectangle: - return rect.Contains(point); - case AreaShape.Ellipse: - { - var delta = point - rect.center; - var radius = rect.size / 2; - var value = (delta.x * delta.x) / (radius.x * radius.x) + - (delta.y * delta.y) / (radius.y * radius.y); - return value <= 1f; - } - default: - return false; - } - } - - private RectTransform rectTransform; - - /// - /// A bounding rectangle in millimeters. - /// - [SerializeField] - private Rect rect; - - /// - /// The axis-aligned clipping shape. - /// - [SerializeField] - private AreaShape shape; - } -} diff --git a/Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs.meta b/Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs.meta deleted file mode 100644 index 1740c71b84..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/PhysicalBounds.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 7faeb9323f4d411cbe3c445b8d079f96 -timeCreated: 1759049193 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/ScreenGizmos.cs b/Assets/Samples/RebindingUI/OnScreen/ScreenGizmos.cs deleted file mode 100644 index c17b1a4ee6..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/ScreenGizmos.cs +++ /dev/null @@ -1,60 +0,0 @@ -using UnityEngine; - -namespace UnityEngine.InputSystem.Samples.RebindUI -{ - public static class ScreenGizmos - { - public static void DrawGizmoCircle(Vector2 center, float radius) - { - for (var i = 0; i < 32; i++) - { - var radians = i / 32f * Mathf.PI * 2; - var nextRadian = (i + 1) / 32f * Mathf.PI * 2; - Gizmos.DrawLine( - new Vector3(center.x + Mathf.Cos(radians) * radius, center.y + Mathf.Sin(radians) * radius, 0), - new Vector3(center.x + Mathf.Cos(nextRadian) * radius, center.y + Mathf.Sin(nextRadian) * radius, 0)); - } - } - - public static void DrawLine( - Camera camera, - Vector3 startPixelPos, - Vector3 endPixelPos) - { - if (camera == null) - return; - var startWorld = PixelToCameraClipPlane(camera, startPixelPos); - var endWorld = PixelToCameraClipPlane(camera, endPixelPos); - Gizmos.DrawLine(startWorld, endWorld); - } - - public static void DrawLine( - Canvas canvas, - Camera camera, - Vector3 startPixelPos, - Vector3 endPixelPos) - { - if (camera == null || canvas == null) - return; - var startWorld = PixelToCameraClipPlane(camera, startPixelPos * canvas.scaleFactor); - var endWorld = PixelToCameraClipPlane(camera, endPixelPos * canvas.scaleFactor); - Gizmos.DrawLine(startWorld, endWorld); - } - - /// - /// Converts the to world space - /// near the near clip plane. The - /// z component of the - /// will be overriden. - /// - private static Vector3 PixelToCameraClipPlane( - Camera camera, - Vector3 screenPos) - { - // The z-position defines the distance to the camera - // when using Camera.ScreenToWorldPoint. - screenPos.z = camera.nearClipPlane + 0.001f; - return camera.ScreenToWorldPoint(screenPos); - } - } -} diff --git a/Assets/Samples/RebindingUI/OnScreen/ScreenGizmos.cs.meta b/Assets/Samples/RebindingUI/OnScreen/ScreenGizmos.cs.meta deleted file mode 100644 index 19450c3750..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/ScreenGizmos.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 0439fdadbd614e9484addfeeb23d877e -timeCreated: 1758957159 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/StickKnob.png b/Assets/Samples/RebindingUI/OnScreen/StickKnob.png deleted file mode 100644 index 4d75ac1f82beef1ab79f3c23e94c3a0a132cb63c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10782 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 HJ3sp$2IRIo diff --git a/Assets/Samples/RebindingUI/OnScreen/StickKnob.png.meta b/Assets/Samples/RebindingUI/OnScreen/StickKnob.png.meta deleted file mode 100644 index b16e81e448..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/StickKnob.png.meta +++ /dev/null @@ -1,143 +0,0 @@ -fileFormatVersion: 2 -guid: 459ffffd4a7054f34b940a52a8bbbade -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - flipGreenChannel: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - vTOnly: 0 - ignoreMipmapLimit: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 1 - aniso: 1 - mipBias: 0 - wrapU: 0 - wrapV: 0 - wrapW: 0 - nPOTScale: 1 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 1 - singleChannelComponent: 0 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - swizzle: 50462976 - cookieLightType: 0 - platformSettings: - - serializedVersion: 4 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Standalone - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Android - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: iOS - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - customData: - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spriteCustomMetadata: - entries: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Samples/RebindingUI/OnScreen/StickRim.png b/Assets/Samples/RebindingUI/OnScreen/StickRim.png deleted file mode 100644 index 5687d84a8a9d876df77428e35ee34c939086cc27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7398 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 Nj-Ih@$qh%`{{gX;04)Fj diff --git a/Assets/Samples/RebindingUI/OnScreen/StickRim.png.meta b/Assets/Samples/RebindingUI/OnScreen/StickRim.png.meta deleted file mode 100644 index 78fedfa607..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/StickRim.png.meta +++ /dev/null @@ -1,143 +0,0 @@ -fileFormatVersion: 2 -guid: c7abdd8705af544ae94203014e0d9f9c -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - flipGreenChannel: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - vTOnly: 0 - ignoreMipmapLimit: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 1 - aniso: 1 - mipBias: 0 - wrapU: 0 - wrapV: 0 - wrapW: 0 - nPOTScale: 1 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 1 - singleChannelComponent: 0 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - swizzle: 50462976 - cookieLightType: 0 - platformSettings: - - serializedVersion: 4 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Standalone - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Android - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: iOS - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - customData: - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spriteCustomMetadata: - entries: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Samples/RebindingUI/OnScreen/TapDetector.cs b/Assets/Samples/RebindingUI/OnScreen/TapDetector.cs deleted file mode 100644 index e558ca9080..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/TapDetector.cs +++ /dev/null @@ -1,64 +0,0 @@ -using UnityEngine.InputSystem.LowLevel; - -namespace UnityEngine.InputSystem.Samples.RebindUI -{ - internal class TapDetector : ITouchProcessor - { - private Vector2 m_InitialPosition; - private double m_InitialTime; - private readonly float m_ThresholdSqr; - private bool m_Valid; - - public TapDetector(float threshold) - { - m_ThresholdSqr = threshold * threshold; - m_InitialPosition = Vector2.zero; - m_InitialTime = 0; - m_Valid = true; - } - - public void OnTouchBegin(Detector context, in TouchState[] touches, int count, int index) - { - if (count == 1) - { - m_InitialPosition = touches[index].position; - m_InitialTime = Time.realtimeSinceStartupAsDouble; - m_Valid = true; - } - else - { - m_Valid = false; - } - } - - public void OnTouchEnd(Detector context, in TouchState[] touches, int count, int index) - { - if (m_Valid && IsWithinMargin(touches[index].position)) - { - GestureEvent @event = new GestureEvent( - delta: touches[index].position - m_InitialPosition, - duration: Time.realtimeSinceStartupAsDouble - m_InitialTime, - flags: GestureEvent.Flags.TapGesture, start: m_InitialPosition); - context.FireEvent(in @event); - } - } - - public void OnTouchMoved(Detector context, in TouchState[] touches, int count, int index) - { - if (m_Valid && !IsWithinMargin(touches[index].position)) - m_Valid = false; - } - - public void OnTouchCanceled(Detector context, in TouchState[] touches, int count, int index) - { - if (m_Valid) - m_Valid = false; - } - - private bool IsWithinMargin(Vector2 point) - { - var sqrMagnitude = (point - m_InitialPosition).sqrMagnitude; - return sqrMagnitude <= m_ThresholdSqr; - } - } -} diff --git a/Assets/Samples/RebindingUI/OnScreen/TapDetector.cs.meta b/Assets/Samples/RebindingUI/OnScreen/TapDetector.cs.meta deleted file mode 100644 index 97cf6ff3ca..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/TapDetector.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 172bea12883c486ea051f49339fe4fd5 -timeCreated: 1758895544 \ No newline at end of file diff --git a/Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs b/Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs deleted file mode 100644 index 732fdd252b..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; - -namespace UnityEngine.InputSystem.Samples.RebindUI -{ - /// - /// Conversion utility class for physical coordinate transforms. - /// - internal static class UnitConverter - { - /// - /// Conversion factor for millimeters per inch. - /// - /// - /// var millimeters = 10.0f; - /// Debug.Log($"{millimeters} mm is equal to {millimeters / MillimetersPerInch} inches."); - /// - public const float MillimetersPerInch = 25.4f; - - /// - /// Returns a conversion factor for converting pixels to millimeters using the given pixel density. - /// - /// Pixel density expressed as pixels-per-inch (PPI). - /// Conversion ratio for converting pixels to millimeters. - public static float PixelsToMillimetersConversionFactor(float ppi) - { - if (ppi <= 0.0f) - throw new ArgumentOutOfRangeException($"Invalid pixel density: {ppi}"); - return MillimetersPerInch / ppi; - } - - /// - /// Returns a conversion factor for converting millimeters to pixels using the given pixel density. - /// - /// Pixel density expressed as pixels-per-inch (PPI). - /// Conversion ratio for converting millimeters to pixels. - public static float MillimetersToPixelsConversionFactor(float ppi) - { - if (ppi <= 0.0f) - throw new ArgumentOutOfRangeException($"Invalid pixel density: {ppi}"); - return ppi / MillimetersPerInch; - } - - /// - /// Given a pixel density, returns the same pixel density (if positive), or returns a fallback PPI of 96. - /// - /// The candidate pixel density expressed as pixels-per-inch (PPI). - /// Returns if positive, otherwise 96 PPI. - public static float EffectivePixelDensity(float ppi) => ppi <= 0.0f ? 96.0f : ppi; - } -} diff --git a/Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs.meta b/Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs.meta deleted file mode 100644 index f577292506..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen/UnitConverter.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: fdccf1abd7ab4e049878b55f322dbb46 -timeCreated: 1758954668 \ No newline at end of file From e0a8e1e585a6246ebe955b0e3e2baa55ef267056 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Mon, 29 Sep 2025 20:00:08 +0200 Subject: [PATCH 18/22] Removed undesirable object from scene --- .../RebindingUI/RebindingUISampleScene.unity | 1758 +---------------- 1 file changed, 101 insertions(+), 1657 deletions(-) diff --git a/Assets/Samples/RebindingUI/RebindingUISampleScene.unity b/Assets/Samples/RebindingUI/RebindingUISampleScene.unity index 12596f57fe..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 @@ -493,124 +496,6 @@ MonoBehaviour: m_EditorClassIdentifier: colorOutputFrequency: 10 rumbleOutputFrequency: 10 ---- !u!1 &58438677 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 58438681} - - component: {fileID: 58438680} - - component: {fileID: 58438679} - - component: {fileID: 58438678} - - component: {fileID: 58438682} - m_Layer: 0 - m_Name: OnScreenControls - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!114 &58438678 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 58438677} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} - m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.CanvasScaler - m_UiScaleMode: 2 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 - m_PresetInfoIsWorld: 0 ---- !u!114 &58438679 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 58438677} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} - m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.GraphicRaycaster - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!223 &58438680 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 58438677} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 0 - m_Camera: {fileID: 0} - m_PlaneDistance: 100 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_VertexColorAlwaysGammaSpace: 0 - m_AdditionalShaderChannelsFlag: 0 - m_UpdateRectTransformForStandalone: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!224 &58438681 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 58438677} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1883433308} - - {fileID: 688012660} - - {fileID: 1577491575} - - {fileID: 447384400} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &58438682 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 58438677} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d629571aa8e184bd3b6d1e6cb1bf2116, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.InputSystem.RebindingUI::RequireTouchscreen --- !u!1001 &67962919 PrefabInstance: m_ObjectHideFlags: 0 @@ -1018,85 +903,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 125360816} m_CullTransparentMesh: 0 ---- !u!1 &143773844 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 143773845} - - component: {fileID: 143773847} - - component: {fileID: 143773846} - m_Layer: 0 - m_Name: ChangeButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &143773845 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 143773844} - 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: 901700405} - - {fileID: 1090088429} - m_Father: {fileID: 2044918824} - 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 &143773846 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 143773844} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 556fd135abfe64c75a42dcd0c1a98b85, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.InputSystem.RebindingUI::OnScreenControlUI - canvas: {fileID: 861395294} - camera: {fileID: 1183078598} - control: {fileID: 143773847} - area: {fileID: 901700405} - bounds: {fileID: 1090088429} - knob: {fileID: 0} ---- !u!114 &143773847 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 143773844} - 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: 1 - m_NormalizedBounds: - serializedVersion: 2 - x: 0.9 - y: 0.3 - width: 0.1 - height: 0.16 - m_ControlPath: /buttonEast - m_Curve: 0 - m_StickRadiusMillimeters: 5 --- !u!1 &221984824 GameObject: m_ObjectHideFlags: 0 @@ -1718,95 +1524,6 @@ RectTransform: type: 3} m_PrefabInstance: {fileID: 331853781} m_PrefabAsset: {fileID: 0} ---- !u!1 &447384399 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 447384400} - - component: {fileID: 447384403} - - component: {fileID: 447384402} - - component: {fileID: 447384401} - m_Layer: 5 - m_Name: ChangeButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &447384400 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 447384399} - 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: 58438681} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: -25, y: 100} - m_SizeDelta: {x: 40, y: 40} - m_Pivot: {x: 1, y: 0} ---- !u!114 &447384401 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 447384399} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6d54531977ecb194c95e2d3aa7a5d72a, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.OnScreen.OnScreenButton - m_ControlPath: /buttonEast ---- !u!114 &447384402 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 447384399} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image - m_Material: {fileID: 0} - m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.2509804} - 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: 21300000, guid: d08c52c09554ca8418a86627f4bd14e1, type: 3} - m_Type: 0 - 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 &447384403 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 447384399} - m_CullTransparentMesh: 1 --- !u!1001 &481729234 PrefabInstance: m_ObjectHideFlags: 0 @@ -2149,7 +1866,7 @@ GameObject: type: 3} m_PrefabInstance: {fileID: 6680292651237943329} m_PrefabAsset: {fileID: 0} ---- !u!1 &585912950 +--- !u!1 &589143014 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2157,57 +1874,65 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 585912951} - - component: {fileID: 585912953} - - component: {fileID: 585912952} - m_Layer: 0 - m_Name: Area + - component: {fileID: 589143015} + - component: {fileID: 589143017} + - component: {fileID: 589143016} + - component: {fileID: 589143018} + m_Layer: 5 + m_Name: Gamepad m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &585912951 +--- !u!224 &589143015 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 585912950} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 589143014} + 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: 1837333070} + m_Children: + - {fileID: 356416661} + - {fileID: 331853782} + - {fileID: 725406578} + - {fileID: 720160215} + - {fileID: 982377776} + - {fileID: 852899507} + - {fileID: 67962920} + m_Father: {fileID: 1820892250} 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: -472.21313, y: -264.95} - m_SizeDelta: {x: 314.80875, y: 227.1} + 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 &585912952 +--- !u!114 &589143016 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 585912950} - m_Enabled: 1 + m_GameObject: {fileID: 589143014} + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0, g: 1, b: 0.29986382, a: 0.101960786} - 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_Sprite: {fileID: 0} - m_Type: 0 + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 @@ -2216,99 +1941,16 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &585912953 +--- !u!222 &589143017 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 585912950} - m_CullTransparentMesh: 1 ---- !u!1 &589143014 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 589143015} - - component: {fileID: 589143017} - - component: {fileID: 589143016} - - component: {fileID: 589143018} - m_Layer: 5 - m_Name: Gamepad - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &589143015 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 589143014} - 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: 356416661} - - {fileID: 331853782} - - {fileID: 725406578} - - {fileID: 720160215} - - {fileID: 982377776} - - {fileID: 852899507} - - {fileID: 67962920} - 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 &589143016 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 589143014} - m_Enabled: 0 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_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 &589143017 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 589143014} - m_CullTransparentMesh: 0 ---- !u!114 &589143018 -MonoBehaviour: + m_GameObject: {fileID: 589143014} + m_CullTransparentMesh: 0 +--- !u!114 &589143018 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} @@ -2592,131 +2234,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 685041074} m_CullTransparentMesh: 1 ---- !u!1 &688012659 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 688012660} - - component: {fileID: 688012663} - - component: {fileID: 688012662} - - component: {fileID: 688012661} - - component: {fileID: 688012664} - m_Layer: 5 - m_Name: RightStick - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &688012660 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 688012659} - 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: 58438681} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: -25, y: 20} - m_SizeDelta: {x: 40, y: 40} - m_Pivot: {x: 1, y: 0} ---- !u!114 &688012661 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 688012659} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image - m_Material: {fileID: 0} - m_Color: {r: 0.75, g: 0.75, b: 0.75, a: 0.2509804} - 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: 21300000, guid: 04f2711270cd5b64099d2ca2f99529de, type: 3} - m_Type: 0 - 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 &688012662 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 688012659} - m_CullTransparentMesh: 1 ---- !u!114 &688012663 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 688012659} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e9d677f1681015749b15c436eec6d880, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.OnScreen.OnScreenStick - m_MovementRange: 25 - m_DynamicOriginRange: 100 - m_ControlPath: /rightStick - m_Behaviour: 2 - m_UseIsolatedInputActions: 0 - m_PointerDownAction: - m_Name: - m_Type: 0 - m_ExpectedControlType: - m_Id: aa9c528a-7f8d-4f95-a0d7-e0d86e736c25 - m_Processors: - m_Interactions: - m_SingletonActionBindings: [] - m_Flags: 0 - m_PointerMoveAction: - m_Name: - m_Type: 0 - m_ExpectedControlType: - m_Id: 58f22a70-1f1b-4e3f-a15e-259d6e4f5e3b - m_Processors: - m_Interactions: - m_SingletonActionBindings: [] - m_Flags: 0 ---- !u!114 &688012664 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 688012659} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6d54531977ecb194c95e2d3aa7a5d72a, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.OnScreen.OnScreenButton - m_ControlPath: /buttonSouth --- !u!224 &696388013 stripped RectTransform: m_CorrespondingSourceObject: {fileID: 4997344956118145359, guid: a6b634f465c284d30ac5a7dd706644da, @@ -3401,78 +2918,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 800914094} m_CullTransparentMesh: 0 ---- !u!1 &804746254 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 804746255} - - component: {fileID: 804746257} - - component: {fileID: 804746258} - m_Layer: 0 - m_Name: Frame - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &804746255 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 804746254} - 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: 2008570242} - 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: 472.21307, y: -264.94998} - m_SizeDelta: {x: 145.70618, y: 145.70624} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &804746257 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 804746254} - m_CullTransparentMesh: 1 ---- !u!114 &804746258 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 804746254} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage - m_Material: {fileID: 0} - m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.5019608} - m_RaycastTarget: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 2800000, guid: c7abdd8705af544ae94203014e0d9f9c, type: 3} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 --- !u!1001 &825336765 PrefabInstance: m_ObjectHideFlags: 0 @@ -3958,7 +3403,6 @@ RectTransform: - {fileID: 5139313} - {fileID: 2040634063} - {fileID: 1628222610} - - {fileID: 2044918824} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -4041,7 +3485,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 862809802} m_CullTransparentMesh: 1 ---- !u!1 &877015847 +--- !u!1 &899779638 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4049,122 +3493,50 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 877015848} - - component: {fileID: 877015850} - - component: {fileID: 877015851} - m_Layer: 0 - m_Name: Frame + - component: {fileID: 899779639} + - component: {fileID: 899779641} + - component: {fileID: 899779640} + m_Layer: 5 + m_Name: Title m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &877015848 +--- !u!224 &899779639 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 877015847} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 899779638} + 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: 1837333070} + m_Father: {fileID: 1820892250} 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: -472.2131, y: -264.94998} - m_SizeDelta: {x: 145.70624, y: 145.70624} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: -37.1} + m_SizeDelta: {x: 264.7, y: 62.400024} m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &877015850 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 877015847} - m_CullTransparentMesh: 1 ---- !u!114 &877015851 +--- !u!114 &899779640 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 877015847} + m_GameObject: {fileID: 899779638} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage + m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.5019608} - m_RaycastTarget: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 2800000, guid: c7abdd8705af544ae94203014e0d9f9c, type: 3} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!1 &899779638 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 899779639} - - component: {fileID: 899779641} - - component: {fileID: 899779640} - m_Layer: 5 - m_Name: Title - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &899779639 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 899779638} - 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: 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: 0, y: -37.1} - m_SizeDelta: {x: 264.7, y: 62.400024} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &899779640 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 899779638} - 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: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + 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: @@ -4192,81 +3564,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 899779638} m_CullTransparentMesh: 0 ---- !u!1 &901700404 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 901700405} - - component: {fileID: 901700407} - - component: {fileID: 901700406} - m_Layer: 0 - m_Name: Area - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &901700405 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 901700404} - 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: 143773845} - 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: 566.65576, y: -90.83999} - m_SizeDelta: {x: 125.92352, y: 121.12002} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &901700406 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 901700404} - m_Enabled: 0 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image - m_Material: {fileID: 0} - m_Color: {r: 0, g: 0.73670626, b: 1, a: 0.101960786} - m_RaycastTarget: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 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 &901700407 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 901700404} - m_CullTransparentMesh: 1 --- !u!1001 &920225868 PrefabInstance: m_ObjectHideFlags: 0 @@ -4857,81 +4154,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1044043760} m_CullTransparentMesh: 0 ---- !u!1 &1053028837 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1053028838} - - component: {fileID: 1053028840} - - component: {fileID: 1053028839} - m_Layer: 0 - m_Name: Area - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1053028838 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1053028837} - 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: 2008570242} - 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: 472.21313, y: -264.95} - m_SizeDelta: {x: 314.80875, y: 227.1} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1053028839 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1053028837} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image - m_Material: {fileID: 0} - m_Color: {r: 0.6320754, g: 0.2653524, b: 0.46309918, a: 0.101960786} - 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: 0} - m_Type: 0 - 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 &1053028840 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1053028837} - m_CullTransparentMesh: 1 --- !u!1 &1063908416 GameObject: m_ObjectHideFlags: 0 @@ -5031,79 +4253,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: cc11d99b1a6682f4cbc4aba1fcd9ac5d, type: 3} m_Name: m_EditorClassIdentifier: ---- !u!1 &1090088428 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1090088429} - - component: {fileID: 1090088431} - - component: {fileID: 1090088430} - m_Layer: 0 - m_Name: Button - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1090088429 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1090088428} - 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: 2124655858} - m_Father: {fileID: 143773845} - 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: 566.65576, y: -90.84001} - m_SizeDelta: {x: 101.184875, y: 101.184906} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1090088430 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1090088428} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage - m_Material: {fileID: 0} - m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.5019608} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 2800000, guid: 189aa5792364542f484e839c09ebeceb, type: 3} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1090088431 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1090088428} - m_CullTransparentMesh: 1 --- !u!1001 &1099885699 PrefabInstance: m_ObjectHideFlags: 0 @@ -6231,7 +5380,37 @@ RectTransform: type: 3} m_PrefabInstance: {fileID: 481729234} m_PrefabAsset: {fileID: 0} ---- !u!1 &1332072487 +--- !u!114 &1405789171 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 6680292650503350826, guid: f25dcd618d3acd64795bf8bb32edb6c9, + type: 3} + m_PrefabInstance: {fileID: 1199058182} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cc11d99b1a6682f4cbc4aba1fcd9ac5d, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!224 &1414988296 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 6680292650503350825, guid: f25dcd618d3acd64795bf8bb32edb6c9, + type: 3} + m_PrefabInstance: {fileID: 6680292651237943329} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1414988297 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 6680292650503350826, guid: f25dcd618d3acd64795bf8bb32edb6c9, + type: 3} + m_PrefabInstance: {fileID: 6680292651237943329} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cc11d99b1a6682f4cbc4aba1fcd9ac5d, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &1424978754 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6239,114 +5418,12 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1332072488} - - component: {fileID: 1332072490} - - component: {fileID: 1332072491} - m_Layer: 0 - m_Name: Knob - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1332072488 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1332072487} - 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: 1837333070} - 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: -472.2131, y: -264.94998} - m_SizeDelta: {x: 100, y: 100} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &1332072490 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1332072487} - m_CullTransparentMesh: 1 ---- !u!114 &1332072491 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1332072487} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage - m_Material: {fileID: 0} - m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.5019608} - m_RaycastTarget: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 2800000, guid: 459ffffd4a7054f34b940a52a8bbbade, type: 3} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!114 &1405789171 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 6680292650503350826, guid: f25dcd618d3acd64795bf8bb32edb6c9, - type: 3} - m_PrefabInstance: {fileID: 1199058182} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: cc11d99b1a6682f4cbc4aba1fcd9ac5d, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!224 &1414988296 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 6680292650503350825, guid: f25dcd618d3acd64795bf8bb32edb6c9, - type: 3} - m_PrefabInstance: {fileID: 6680292651237943329} - m_PrefabAsset: {fileID: 0} ---- !u!114 &1414988297 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 6680292650503350826, guid: f25dcd618d3acd64795bf8bb32edb6c9, - type: 3} - m_PrefabInstance: {fileID: 6680292651237943329} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: cc11d99b1a6682f4cbc4aba1fcd9ac5d, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &1424978754 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1424978755} - - component: {fileID: 1424978758} - - component: {fileID: 1424978757} - - component: {fileID: 1424978756} - m_Layer: 5 - m_Name: ResetToDefaultButton + - component: {fileID: 1424978755} + - component: {fileID: 1424978758} + - component: {fileID: 1424978757} + - component: {fileID: 1424978756} + m_Layer: 5 + m_Name: ResetToDefaultButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -6616,95 +5693,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 100, y: 100} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1577491574 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1577491575} - - component: {fileID: 1577491578} - - component: {fileID: 1577491577} - - component: {fileID: 1577491576} - m_Layer: 5 - m_Name: FireButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1577491575 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1577491574} - 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: 58438681} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: -25, y: 60} - m_SizeDelta: {x: 40, y: 40} - m_Pivot: {x: 1, y: 0} ---- !u!114 &1577491576 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1577491574} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6d54531977ecb194c95e2d3aa7a5d72a, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.OnScreen.OnScreenButton - m_ControlPath: /rightTrigger ---- !u!114 &1577491577 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1577491574} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image - m_Material: {fileID: 0} - m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.2509804} - 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: 21300000, guid: 87dce22414624c74d90f8bfc4bf3582f, type: 3} - m_Type: 0 - 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 &1577491578 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1577491574} - m_CullTransparentMesh: 1 --- !u!114 &1582852134 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 6680292650503350826, guid: f25dcd618d3acd64795bf8bb32edb6c9, @@ -7078,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 @@ -7129,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 @@ -8088,78 +7073,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1737030748} m_CullTransparentMesh: 0 ---- !u!1 &1740936515 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1740936516} - - component: {fileID: 1740936518} - - component: {fileID: 1740936519} - m_Layer: 0 - m_Name: Knob - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1740936516 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1740936515} - 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: 2008570242} - 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: 472.2131, y: -264.94998} - m_SizeDelta: {x: 100, y: 100} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &1740936518 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1740936515} - m_CullTransparentMesh: 1 ---- !u!114 &1740936519 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1740936515} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.RawImage - m_Material: {fileID: 0} - m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.5019608} - m_RaycastTarget: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 2800000, guid: 459ffffd4a7054f34b940a52a8bbbade, type: 3} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 --- !u!1 &1801770802 GameObject: m_ObjectHideFlags: 0 @@ -8587,86 +7500,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1836782273} m_CullTransparentMesh: 0 ---- !u!1 &1837333069 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1837333070} - - component: {fileID: 1837333072} - - component: {fileID: 1837333071} - m_Layer: 0 - m_Name: LeftStick - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1837333070 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1837333069} - 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: 585912951} - - {fileID: 877015848} - - {fileID: 1332072488} - m_Father: {fileID: 2044918824} - 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 &1837333071 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1837333069} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 556fd135abfe64c75a42dcd0c1a98b85, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.InputSystem.RebindingUI::OnScreenControlUI - canvas: {fileID: 861395294} - camera: {fileID: 1183078598} - control: {fileID: 1837333072} - area: {fileID: 585912951} - bounds: {fileID: 877015848} - knob: {fileID: 1332072488} ---- !u!114 &1837333072 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1837333069} - 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.25 - height: 0.3 - m_ControlPath: /leftStick - m_Curve: 0 - m_StickRadiusMillimeters: 7.2 --- !u!1 &1853629577 GameObject: m_ObjectHideFlags: 0 @@ -9142,117 +7975,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1880645688} m_CullTransparentMesh: 0 ---- !u!1 &1883433307 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1883433308} - - component: {fileID: 1883433311} - - component: {fileID: 1883433310} - - component: {fileID: 1883433309} - m_Layer: 5 - m_Name: LeftStick - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1883433308 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1883433307} - 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: 58438681} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 25, y: 20} - m_SizeDelta: {x: 40, y: 40} - m_Pivot: {x: 0, y: 0} ---- !u!114 &1883433309 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1883433307} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image - m_Material: {fileID: 0} - m_Color: {r: 0.75, g: 0.75, b: 0.75, a: 0.2509804} - 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: 21300000, guid: 7e177675a5fc16248b6e164ef7a7f2a6, type: 3} - m_Type: 0 - 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 &1883433310 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1883433307} - m_CullTransparentMesh: 1 ---- !u!114 &1883433311 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1883433307} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e9d677f1681015749b15c436eec6d880, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.OnScreen.OnScreenStick - m_MovementRange: 25 - m_DynamicOriginRange: 100 - m_ControlPath: /leftStick - m_Behaviour: 2 - m_UseIsolatedInputActions: 0 - m_PointerDownAction: - m_Name: - m_Type: 0 - m_ExpectedControlType: - m_Id: aa9c528a-7f8d-4f95-a0d7-e0d86e736c25 - m_Processors: - m_Interactions: - m_SingletonActionBindings: [] - m_Flags: 0 - m_PointerMoveAction: - m_Name: - m_Type: 0 - m_ExpectedControlType: - m_Id: 58f22a70-1f1b-4e3f-a15e-259d6e4f5e3b - m_Processors: - m_Interactions: - m_SingletonActionBindings: [] - m_Flags: 0 --- !u!224 &1883834775 stripped RectTransform: m_CorrespondingSourceObject: {fileID: 6968172690644006903, guid: f25dcd618d3acd64795bf8bb32edb6c9, @@ -9344,86 +8066,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1953054435} m_CullTransparentMesh: 0 ---- !u!1 &2008570241 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2008570242} - - component: {fileID: 2008570244} - - component: {fileID: 2008570243} - m_Layer: 0 - m_Name: RightStick - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2008570242 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2008570241} - 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: 1053028838} - - {fileID: 804746255} - - {fileID: 1740936516} - m_Father: {fileID: 2044918824} - 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 &2008570243 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2008570241} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 556fd135abfe64c75a42dcd0c1a98b85, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.InputSystem.RebindingUI::OnScreenControlUI - canvas: {fileID: 861395294} - camera: {fileID: 1183078598} - control: {fileID: 2008570244} - area: {fileID: 1053028838} - bounds: {fileID: 804746255} - knob: {fileID: 1740936516} ---- !u!114 &2008570244 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2008570241} - 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.75 - y: 0 - width: 0.25 - height: 0.3 - m_ControlPath: /rightStick - m_Curve: 0 - m_StickRadiusMillimeters: 7.2 --- !u!1 &2040634062 GameObject: m_ObjectHideFlags: 0 @@ -9470,67 +8112,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2040634062} m_CullTransparentMesh: 1 ---- !u!1 &2044918821 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2044918824} - - component: {fileID: 2044918826} - m_Layer: 0 - m_Name: OnScreenControls - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2044918824 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2044918821} - 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: 1837333070} - - {fileID: 2008570242} - - {fileID: 143773845} - m_Father: {fileID: 861395295} - 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 &2044918826 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2044918821} - 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.5 - y: 0 - width: 0.5 - height: 0.5 - m_ControlPath: /rightTrigger - m_Curve: 0 - m_StickRadiusMillimeters: 7.2 --- !u!1 &2052415374 GameObject: m_ObjectHideFlags: 0 @@ -9658,142 +8239,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2095398990} m_CullTransparentMesh: 0 ---- !u!1 &2124655857 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2124655858} - - component: {fileID: 2124655860} - - component: {fileID: 2124655859} - m_Layer: 0 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2124655858 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2124655857} - 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: 1090088429} - 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: 98.97, y: 33.68} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &2124655859 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2124655857} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI - 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_text: "\u2248" - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4287861651 - m_fontColor: {r: 0.5754717, g: 0.5754717, b: 0.5754717, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 35.9 - m_fontSizeBase: 35.9 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_TextWrappingMode: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 0 - m_ActiveFontFeatures: 6e72656b - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_EmojiFallbackSupport: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &2124655860 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2124655857} - m_CullTransparentMesh: 1 --- !u!1001 &965552502757445288 PrefabInstance: m_ObjectHideFlags: 0 @@ -10301,7 +8746,6 @@ SceneRoots: - {fileID: 1183078599} - {fileID: 1618329840} - {fileID: 861395295} - - {fileID: 58438681} - {fileID: 780148237} - {fileID: 51853244} - {fileID: 1492503865} From ccfd3289edfada07ea600c090c74dbc2a1a28d5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Mon, 29 Sep 2025 20:33:28 +0200 Subject: [PATCH 19/22] Removed meta file --- Assets/Samples/RebindingUI/OnScreen.meta | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 Assets/Samples/RebindingUI/OnScreen.meta diff --git a/Assets/Samples/RebindingUI/OnScreen.meta b/Assets/Samples/RebindingUI/OnScreen.meta deleted file mode 100644 index 532915f28d..0000000000 --- a/Assets/Samples/RebindingUI/OnScreen.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 5b35834c37104fbbbe5b35fa3bae3ec4 -timeCreated: 1758895399 \ No newline at end of file From 9276825c4d8413007a70ef76b51864714b558cbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Mon, 6 Oct 2025 15:51:49 +0200 Subject: [PATCH 20/22] Undo changes not related to rebind sample extension. --- .../Plugins/OnScreen/OnScreenControl.cs | 23 +++++++- .../Plugins/OnScreen/OnScreenHelpers.cs | 58 ------------------- .../Plugins/OnScreen/OnScreenHelpers.cs.meta | 3 - 3 files changed, 21 insertions(+), 63 deletions(-) delete mode 100644 Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenHelpers.cs delete mode 100644 Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenHelpers.cs.meta diff --git a/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenControl.cs b/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenControl.cs index ce0fedbcbf..06b464802f 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenControl.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenControl.cs @@ -203,8 +203,7 @@ protected void SendValueToControl(TValue value) ////FIXME: this gives us a one-frame lag (use InputState.Change instead?) m_InputEventPtr.internalTime = InputRuntime.s_Instance.currentTime; control.WriteValueIntoEvent(value, m_InputEventPtr); - //InputSystem.QueueEvent(m_InputEventPtr); - InputState.Change(m_Control.m_Device, m_InputEventPtr); + InputSystem.QueueEvent(m_InputEventPtr); } protected void SentDefaultValueToControl() @@ -347,4 +346,24 @@ internal string GetWarningMessage() return $"{GetType()} needs to be attached as a child to a UI Canvas and have a RectTransform component to function properly."; } } + + internal static class UGUIOnScreenControlUtils + { + public static RectTransform GetCanvasRectTransform(Transform transform) + { + var parentTransform = transform.parent; + return parentTransform != null ? transform.parent.GetComponentInParent() : null; + } + } + +#if UNITY_EDITOR + internal static class UGUIOnScreenControlEditorUtils + { + public static void ShowWarningIfNotPartOfCanvasHierarchy(OnScreenControl target) + { + if (UGUIOnScreenControlUtils.GetCanvasRectTransform(target.transform) == null) + UnityEditor.EditorGUILayout.HelpBox(target.GetWarningMessage(), UnityEditor.MessageType.Warning); + } + } +#endif } diff --git a/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenHelpers.cs b/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenHelpers.cs deleted file mode 100644 index 0eeabb3bd5..0000000000 --- a/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenHelpers.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using UnityEngine.InputSystem.LowLevel; - -namespace UnityEngine.InputSystem.OnScreen -{ - // Current implementation has UGUI dependencies (ISXB-915, ISXB-916) - - internal static class UGUIOnScreenControlUtils - { - public static RectTransform GetCanvasRectTransform(Transform transform) - { - var parentTransform = transform.parent; - return parentTransform != null ? transform.parent.GetComponentInParent() : null; - } - } - - // TODO Reconsider this before landing anything, there seems to be no way to access accumulated state without unsafe code? - public static class OnScreenUnsafeHelpers - { - public static bool TryGetStateCopy(InputEventPtr eventPtr, int format, out T touchState) where T : unmanaged - { - try - { - if (eventPtr == null || eventPtr.type != format) - { - unsafe - { - var stateEvent = (StateEvent*)eventPtr.ToPointer(); - if (stateEvent->stateFormat == TouchState.Format) - { - touchState = *(T*)stateEvent->state; - return true; - } - } - } - } - catch (Exception e) - { - Console.WriteLine(e); - throw; - } - - touchState = default(T); - return false; - } - } - -#if UNITY_EDITOR - internal static class UGUIOnScreenControlEditorUtils - { - public static void ShowWarningIfNotPartOfCanvasHierarchy(OnScreenControl target) - { - if (UGUIOnScreenControlUtils.GetCanvasRectTransform(target.transform) == null) - UnityEditor.EditorGUILayout.HelpBox(target.GetWarningMessage(), UnityEditor.MessageType.Warning); - } - } -#endif -} diff --git a/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenHelpers.cs.meta b/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenHelpers.cs.meta deleted file mode 100644 index 43505b5247..0000000000 --- a/Packages/com.unity.inputsystem/InputSystem/Plugins/OnScreen/OnScreenHelpers.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: b04044ee8dfc48409d1d55a48af5cb77 -timeCreated: 1758782539 \ No newline at end of file From 0bd835914a7f5d1fcd40add172b46ed67f430a5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Mon, 6 Oct 2025 16:14:24 +0200 Subject: [PATCH 21/22] Updated changelog --- Packages/com.unity.inputsystem/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Packages/com.unity.inputsystem/CHANGELOG.md b/Packages/com.unity.inputsystem/CHANGELOG.md index ce6fe06286..5f369c5cdd 100644 --- a/Packages/com.unity.inputsystem/CHANGELOG.md +++ b/Packages/com.unity.inputsystem/CHANGELOG.md @@ -14,6 +14,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. From 403e7d0d353664c732212c36efac6cae979da852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Akan=20Sidenvall?= Date: Mon, 6 Oct 2025 16:24:37 +0200 Subject: [PATCH 22/22] Slight improvements to README file --- Assets/Samples/RebindingUI/README.md | 34 ++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/Assets/Samples/RebindingUI/README.md b/Assets/Samples/RebindingUI/README.md index 76e28a1c84..b0a65c2d39 100644 --- a/Assets/Samples/RebindingUI/README.md +++ b/Assets/Samples/RebindingUI/README.md @@ -1,17 +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. -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. +The [RebindSaveLoad](./RebindSaveLoad.cs) script demonstrates how to persist user rebinds in `PlayerPrefs` and how +to restore them. -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. +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. -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. +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/).