diff --git a/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XR Origin.prefab b/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XR Origin.prefab index dfc152dd..09170d2c 100644 --- a/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XR Origin.prefab +++ b/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XR Origin.prefab @@ -119,7 +119,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &2888630431832822380 RectTransform: m_ObjectHideFlags: 0 @@ -128,7 +128,7 @@ RectTransform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 674832405591274748} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 6.199966} + m_LocalPosition: {x: 0, y: 0, z: 6} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -137,8 +137,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: 198, y: 29.999985} - m_SizeDelta: {x: 178.01, y: 338.4} + m_AnchoredPosition: {x: 25.8, y: -57.9} + m_SizeDelta: {x: 485, y: 46.5} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &7009866660814900916 CanvasRenderer: @@ -168,9 +168,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: 'Warning: - - High speeds may cause nausea' + m_text: High speeds may cause nausea! m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: d564a6b9a8a781b438125b614edcc297, type: 2} m_sharedMaterial: {fileID: 2467261418627247352, guid: d564a6b9a8a781b438125b614edcc297, @@ -205,7 +203,7 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 - m_HorizontalAlignment: 1 + m_HorizontalAlignment: 4 m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 @@ -236,7 +234,7 @@ MonoBehaviour: m_VertexBufferAutoSizeReduction: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} + m_margin: {x: 1.8959656, y: 6.638962, z: 3.9048767, w: 1.7601442} m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 m_hasFontAssetChanged: 0 @@ -582,6 +580,7 @@ Transform: - {fileID: 7867682990484010893} - {fileID: 385502688868600332} - {fileID: 8911245181170312639} + - {fileID: 4369549003892251738} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -711,8 +710,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: -371.7, y: 0.000015258789} - m_SizeDelta: {x: 469.55, y: 50.48} + m_AnchoredPosition: {x: -429.3, y: 0.000015258789} + m_SizeDelta: {x: 319.7, y: 50.48} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &1756154180137300123 CanvasRenderer: @@ -808,7 +807,7 @@ MonoBehaviour: m_VertexBufferAutoSizeReduction: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} + m_margin: {x: 2.8457031, y: 0, z: 2.8460312, w: 0} m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 m_hasFontAssetChanged: 0 @@ -1140,6 +1139,129 @@ RectTransform: m_AnchoredPosition: {x: -5.404525, y: 60.661545} m_SizeDelta: {x: 100, y: 100} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1647071810007517722 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4369549003892251738} + - component: {fileID: 18611445735460691} + - component: {fileID: 8343075384873062513} + - component: {fileID: 5285357331933866282} + - component: {fileID: 1310480035629572623} + - component: {fileID: 1510780549024052800} + - component: {fileID: 4307275810096043329} + m_Layer: 12 + m_Name: Settings + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4369549003892251738 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1647071810007517722} + 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: 5343771095006709614} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &18611445735460691 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1647071810007517722} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 26a0dd79a025e5041a41f576b1aa4968, type: 3} + m_Name: + m_EditorClassIdentifier: + turnOffButton: {fileID: 3645818974320619446} + turnOnButton: {fileID: 1311809556432207317} + moveSpeedSlider: {fileID: 6956878155406096985} + locomotion: {fileID: 1565464911732960072} +--- !u!114 &8343075384873062513 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1647071810007517722} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ebe1ab889a9bed940995d4f47bc743ef, type: 3} + m_Name: + m_EditorClassIdentifier: + target: 0 + slider: {fileID: 7370795858478176567} +--- !u!114 &5285357331933866282 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1647071810007517722} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ebe1ab889a9bed940995d4f47bc743ef, type: 3} + m_Name: + m_EditorClassIdentifier: + target: 3 + slider: {fileID: 8524569723447833986} +--- !u!114 &1310480035629572623 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1647071810007517722} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ebe1ab889a9bed940995d4f47bc743ef, type: 3} + m_Name: + m_EditorClassIdentifier: + target: 5 + slider: {fileID: 3954205046647893400} +--- !u!114 &1510780549024052800 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1647071810007517722} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ebe1ab889a9bed940995d4f47bc743ef, type: 3} + m_Name: + m_EditorClassIdentifier: + target: 4 + slider: {fileID: 7262865820799039206} +--- !u!114 &4307275810096043329 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1647071810007517722} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ebe1ab889a9bed940995d4f47bc743ef, type: 3} + m_Name: + m_EditorClassIdentifier: + target: 1 + slider: {fileID: 512852062931003448} --- !u!1 &1694677102371321062 GameObject: m_ObjectHideFlags: 0 @@ -2219,7 +2341,6 @@ GameObject: - component: {fileID: 5495779272626688296} - component: {fileID: 270386226070323618} - component: {fileID: 7370795858478176567} - - component: {fileID: 9192465668386235667} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -2346,19 +2467,6 @@ MonoBehaviour: minValue: 0 maxValue: 1 slideareaOffsetMultiplier: 0.9 ---- !u!114 &9192465668386235667 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3421967330093517364} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ebe1ab889a9bed940995d4f47bc743ef, type: 3} - m_Name: - m_EditorClassIdentifier: - target: 0 --- !u!1 &3434260850308121859 GameObject: m_ObjectHideFlags: 0 @@ -2412,7 +2520,6 @@ GameObject: - component: {fileID: 5857106340495004348} - component: {fileID: 467034009919322666} - component: {fileID: 3954205046647893400} - - component: {fileID: 8737582689073729793} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -2539,19 +2646,6 @@ MonoBehaviour: minValue: 0 maxValue: 1 slideareaOffsetMultiplier: 0.9 ---- !u!114 &8737582689073729793 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3504227185401202113} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ebe1ab889a9bed940995d4f47bc743ef, type: 3} - m_Name: - m_EditorClassIdentifier: - target: 5 --- !u!1 &3847096334227967442 GameObject: m_ObjectHideFlags: 0 @@ -3036,7 +3130,7 @@ RectTransform: m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -1849.8, y: 30} - m_SizeDelta: {x: 90.1, y: 50.5} + m_SizeDelta: {x: 89, y: 50.5} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &1344781521441133505 CanvasRenderer: @@ -3539,7 +3633,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: -2404.8, y: 34.7} + m_AnchoredPosition: {x: -2600, y: 34.7} m_SizeDelta: {x: 220, y: 49.6} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &2306375091028476275 @@ -3605,7 +3699,7 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 - m_HorizontalAlignment: 1 + m_HorizontalAlignment: 4 m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 @@ -3636,7 +3730,7 @@ MonoBehaviour: m_VertexBufferAutoSizeReduction: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} + m_margin: {x: 14.186401, y: 0, z: -0.9451599, w: 0} m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 m_hasFontAssetChanged: 0 @@ -3655,7 +3749,6 @@ GameObject: - component: {fileID: 4467346825075014904} - component: {fileID: 1078020185355697329} - component: {fileID: 7262865820799039206} - - component: {fileID: 8463522706283787556} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -3782,19 +3875,6 @@ MonoBehaviour: minValue: 0 maxValue: 1 slideareaOffsetMultiplier: 0.9 ---- !u!114 &8463522706283787556 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5731468542189211806} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ebe1ab889a9bed940995d4f47bc743ef, type: 3} - m_Name: - m_EditorClassIdentifier: - target: 4 --- !u!1 &5770108565631511295 GameObject: m_ObjectHideFlags: 0 @@ -5429,13 +5509,14 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6798620428918177696} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 26a0dd79a025e5041a41f576b1aa4968, type: 3} m_Name: m_EditorClassIdentifier: turnOffButton: {fileID: 3645818974320619446} turnOnButton: {fileID: 1311809556432207317} + moveSpeedSlider: {fileID: 6956878155406096985} locomotion: {fileID: 1565464911732960072} --- !u!1 &6976341305452677775 GameObject: @@ -5463,7 +5544,7 @@ RectTransform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6976341305452677775} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 1.0000267} + m_LocalPosition: {x: 0, y: 0, z: 1} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -5472,8 +5553,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: -406.48022, y: 260} - m_SizeDelta: {x: 383.04, y: 50.5} + m_AnchoredPosition: {x: -446.3, y: 255.3} + m_SizeDelta: {x: 327.3, y: 50.5} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &8334943640923905114 CanvasRenderer: @@ -5569,7 +5650,7 @@ MonoBehaviour: m_VertexBufferAutoSizeReduction: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} + m_margin: {x: 0, y: 0, z: 0.9477234, w: 0} m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 m_hasFontAssetChanged: 0 @@ -5625,7 +5706,6 @@ GameObject: - component: {fileID: 7392776148620295955} - component: {fileID: 623723497249906612} - component: {fileID: 8524569723447833986} - - component: {fileID: 2518031444015721236} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -5752,19 +5832,6 @@ MonoBehaviour: minValue: 0 maxValue: 1 slideareaOffsetMultiplier: 0.9 ---- !u!114 &2518031444015721236 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7116268483853744053} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ebe1ab889a9bed940995d4f47bc743ef, type: 3} - m_Name: - m_EditorClassIdentifier: - target: 3 --- !u!1 &7137625347935658456 GameObject: m_ObjectHideFlags: 0 @@ -6850,7 +6917,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: -2404.8, y: 30} + m_AnchoredPosition: {x: -2424, y: 30} m_SizeDelta: {x: 186.1, y: 50.5} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &6159749963066026057 @@ -6916,7 +6983,7 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 - m_HorizontalAlignment: 1 + m_HorizontalAlignment: 4 m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 @@ -6966,7 +7033,6 @@ GameObject: - component: {fileID: 4806540607707404536} - component: {fileID: 1263225200033619485} - component: {fileID: 512852062931003448} - - component: {fileID: 5185990981600041478} m_Layer: 5 m_Name: Button m_TagString: Untagged @@ -7093,19 +7159,6 @@ MonoBehaviour: minValue: 0 maxValue: 1 slideareaOffsetMultiplier: 0.9 ---- !u!114 &5185990981600041478 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7795711801980221647} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ebe1ab889a9bed940995d4f47bc743ef, type: 3} - m_Name: - m_EditorClassIdentifier: - target: 1 --- !u!1 &7941339244779152679 GameObject: m_ObjectHideFlags: 0 @@ -7851,7 +7904,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: -3755, y: 30} + m_AnchoredPosition: {x: -3897, y: 30} m_SizeDelta: {x: 131.9, y: 50.5} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &7891019527381773321 diff --git a/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/AbstractSlider.cs b/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/AbstractSlider.cs new file mode 100644 index 00000000..72b202f5 --- /dev/null +++ b/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/AbstractSlider.cs @@ -0,0 +1,112 @@ +using System.Collections; +using System.Collections.Generic; +using TMPro; +using UnityEngine; +using UnityEngine.EventSystems; + +abstract public class AbstractSlider : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler +{ + + public RectTransform sliderBackground; // Assign in Inspector + public float minValue = 0f; + public float maxValue = 1f; + public float slideareaOffsetMultiplier = 0.9f; + public float CurrentValue { get; private set; } + public float CurrentNormalizedValue { get; private set; } + + private RectTransform handleRect; + private Vector2 backgroundStart; + private float backgroundWidth; + + public System.Action OnValueChanged; + + private void OnEnable() + { + if (null == handleRect) + { + handleRect = GetComponent(); + } + + if (sliderBackground != null) + { + backgroundStart = sliderBackground.position; + backgroundWidth = sliderBackground.rect.width; + } + + UpdateHandlePosition(); + } + + virtual public void OnBeginDrag(PointerEventData eventData) + { + UpdateSlider(eventData); + } + + virtual public void OnDrag(PointerEventData eventData) + { + UpdateSlider(eventData); + } + + virtual public void OnEndDrag(PointerEventData eventData) + { + UpdateSlider(eventData, true); + EventSystem.current.SetSelectedGameObject(null); + } + + virtual public void SetHandleValue(float unnormalizedValue) + { + SetValuesFromValue(unnormalizedValue); + UpdateHandlePosition(); + } + + virtual public void SetHandleNormalizedValue(float normalizedValue) + { + SetValuesFromNormalizedValue(normalizedValue); + UpdateHandlePosition(); + } + + virtual protected void UpdateHandlePosition() + { + if (null == handleRect) return; // The options menu might not be opened yet + + float halfWidth = sliderBackground.rect.width * 0.5f; + float limit = halfWidth * slideareaOffsetMultiplier; + + float x = Mathf.Lerp(-limit, limit, CurrentNormalizedValue); + handleRect.localPosition = new Vector3(x, handleRect.localPosition.y, 0); + } + + virtual protected void UpdateSlider(PointerEventData eventData, bool draggingEnded = false) + { + Vector2 localPoint; + RectTransformUtility.ScreenPointToLocalPointInRectangle(sliderBackground, eventData.position, eventData.pressEventCamera, out localPoint); + float halfWidth = sliderBackground.rect.width * 0.5f; + + // Only allow dragging within 90% of the slider width, centered + float limit = halfWidth * slideareaOffsetMultiplier; + float clampedX = Mathf.Clamp(localPoint.x, -limit, limit); + + + Vector3 newPosition = new Vector3(clampedX, handleRect.localPosition.y, handleRect.localPosition.z); + handleRect.localPosition = newPosition; + + // Normalize within the limited 90% range + float normalized = (clampedX + limit) / (limit * 2f); + SetValuesFromValue(Mathf.Lerp(minValue, maxValue, normalized)); + + OnValueChanged?.Invoke(CurrentValue, draggingEnded); + + } + + protected void SetValuesFromNormalizedValue(float normalizedValue) + { + CurrentNormalizedValue = normalizedValue; + CurrentValue = CurrentNormalizedValue * (maxValue - minValue) + minValue; + } + + protected void SetValuesFromValue(float unnormalizedValue) + { + CurrentValue = unnormalizedValue; + CurrentNormalizedValue = (CurrentValue - minValue) / (maxValue - minValue); + } + +} diff --git a/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/AbstractSlider.cs.meta b/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/AbstractSlider.cs.meta new file mode 100644 index 00000000..98a10830 --- /dev/null +++ b/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/AbstractSlider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8fe704cafb6cf2441a62a6497d58f229 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/AudioSliderDragHandler.cs b/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/AudioSliderDragHandler.cs index f7b776f7..707028c7 100644 --- a/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/AudioSliderDragHandler.cs +++ b/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/AudioSliderDragHandler.cs @@ -4,87 +4,8 @@ using TMPro; using UnityEngine; using UnityEngine.EventSystems; -public class AudioSliderDragHandler : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler +public class AudioSliderDragHandler : AbstractSlider, IBeginDragHandler, IDragHandler, IEndDragHandler { - public RectTransform sliderBackground; // Assign in Inspector - public float minValue = 0f; - public float maxValue = 1f; - public float slideareaOffsetMultiplier = 0.9f; - public float CurrentValue { get; private set; } - - private RectTransform handleRect; - private Vector2 backgroundStart; - private float backgroundWidth; - - public System.Action OnValueChanged; - - void Awake() - { - handleRect = GetComponent(); - - if (sliderBackground != null) - { - backgroundStart = sliderBackground.position; - backgroundWidth = sliderBackground.rect.width; - } - - } - - public void OnBeginDrag(PointerEventData eventData) - { - UpdateSlider(eventData); - } - - public void SetHandlePosition(float normalizedValue) - { - float halfWidth = sliderBackground.rect.width * 0.5f; - float limit = halfWidth * slideareaOffsetMultiplier; - - float x = Mathf.Lerp(-limit, limit, normalizedValue); - handleRect.localPosition = new Vector3(x, handleRect.localPosition.y, 0); - - CurrentValue = normalizedValue; - } - - - public void OnDrag(PointerEventData eventData) - { - UpdateSlider(eventData); - } - - public void OnEndDrag(PointerEventData eventData) - { - UpdateSlider(eventData); - //notify FMOD - } - private void UpdateSlider(PointerEventData eventData) - { - - //Debug.Log("UpDating Slider"); - Vector2 localPoint; - RectTransformUtility.ScreenPointToLocalPointInRectangle(sliderBackground, eventData.position, eventData.pressEventCamera, out localPoint); - - float halfWidth = sliderBackground.rect.width * 0.5f; - - - - // Only allow dragging within 90% of the slider width, centered - float limit = halfWidth * slideareaOffsetMultiplier; - float clampedX = Mathf.Clamp(localPoint.x, -limit, limit); - - Vector3 newPosition = new Vector3(clampedX, handleRect.localPosition.y, handleRect.localPosition.z); - handleRect.localPosition = newPosition; - - // Normalize within the limited 90% range - float normalized = (clampedX + limit) / (limit * 2f); - //Debug.Log(normalized); - CurrentValue = Mathf.Lerp(minValue, maxValue, normalized); - - //Debug.Log(warningThreshholdValue); - OnValueChanged?.Invoke(CurrentValue); - - - } } diff --git a/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/Continuos locomotion Conf.cs b/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/Continuos locomotion Conf.cs index 30c2e8da..c7c07f1d 100644 --- a/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/Continuos locomotion Conf.cs +++ b/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/Continuos locomotion Conf.cs @@ -9,6 +9,7 @@ public class ContinuoslocomotionConfigurator : MonoBehaviour { public Button turnOffButton; public Button turnOnButton; + public MoveSliderDragHandler moveSpeedSlider; public ContinuousMoveProviderBase locomotion; // Events for listeners @@ -19,13 +20,21 @@ public class ContinuoslocomotionConfigurator : MonoBehaviour { turnOnButton.onClick.AddListener(enableLocomotion); turnOffButton.onClick.AddListener(disableLocomotion); - turnOffButton.gameObject.SetActive(false); + + bool isContinuousLocomotion = ConfigManager.instance.GetIsContinuousLocomotion(); + turnOffButton.gameObject.SetActive(isContinuousLocomotion); + locomotion.enabled = isContinuousLocomotion; + + float continuousLocomotionSpeed = ConfigManager.instance.GetContinuousLocomotionSpeed(); + moveSpeedSlider.SetHandleValue(continuousLocomotionSpeed); + locomotion.moveSpeed = continuousLocomotionSpeed; } public void UpdateSpeed(float speed) { locomotion.moveSpeed = speed; OnSpeedChanged?.Invoke(speed); + WriteToConfig(); } private void enableLocomotion() @@ -35,6 +44,7 @@ public class ContinuoslocomotionConfigurator : MonoBehaviour turnOnButton.gameObject.SetActive(false); turnOffButton.gameObject.SetActive(true); OnLocomotionToggled?.Invoke(true); + WriteToConfig(); } private void disableLocomotion() @@ -44,5 +54,12 @@ public class ContinuoslocomotionConfigurator : MonoBehaviour turnOnButton.gameObject.SetActive(true); turnOffButton.gameObject.SetActive(false); OnLocomotionToggled?.Invoke(false); + WriteToConfig(); + } + + protected void WriteToConfig() + { + ConfigManager.instance.SetIsContinuousLocomotion(locomotion.enabled); + ConfigManager.instance.SetContinuousLocomotionSpeed(locomotion.moveSpeed); } } diff --git a/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/MoveSliderDragHandler.cs b/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/MoveSliderDragHandler.cs index 7ce5d983..0167718e 100644 --- a/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/MoveSliderDragHandler.cs +++ b/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/MoveSliderDragHandler.cs @@ -3,82 +3,35 @@ using UnityEngine.UI; using UnityEngine.EventSystems; using TMPro; -public class MoveSliderDragHandler : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler +public class MoveSliderDragHandler : AbstractSlider, IDragHandler, IBeginDragHandler, IEndDragHandler { - public RectTransform sliderBackground; // Assign in Inspector - public float minValue = 2f; - public float maxValue = 5f; - public float slideareaOffsetMultiplier = 0.9f; public TMP_Text warningText; public float warningThreshholdValue = 0.65f; - public float CurrentValue { get; private set; } public ContinuoslocomotionConfigurator configurator; - private RectTransform handleRect; - private Vector2 backgroundStart; - private float backgroundWidth; - - void Awake() + override public void OnEndDrag(PointerEventData eventData) { - handleRect = GetComponent(); - - if (sliderBackground != null) - { - backgroundStart = sliderBackground.position; - backgroundWidth = sliderBackground.rect.width; - } - - } - - public void OnBeginDrag(PointerEventData eventData) - { - UpdateSlider(eventData); - } - - public void OnDrag(PointerEventData eventData) - { - UpdateSlider(eventData); - } - - public void OnEndDrag(PointerEventData eventData) - { - UpdateSlider(eventData); + base.OnEndDrag(eventData); configurator.UpdateSpeed(CurrentValue); - - EventSystem.current.SetSelectedGameObject(null); } - private void UpdateSlider(PointerEventData eventData) + + override protected void UpdateSlider(PointerEventData eventData, bool draggingEnded = false) { - Debug.Log("UpDating Slider"); - Vector2 localPoint; - RectTransformUtility.ScreenPointToLocalPointInRectangle(sliderBackground, eventData.position, eventData.pressEventCamera, out localPoint); + base.UpdateSlider(eventData, draggingEnded); + DisplayWarningTextIfNecessary(); + } - float halfWidth = sliderBackground.rect.width * 0.5f; + override protected void UpdateHandlePosition() + { + base.UpdateHandlePosition(); + DisplayWarningTextIfNecessary(); + } - - - // Only allow dragging within 90% of the slider width, centered - float limit = halfWidth * slideareaOffsetMultiplier; - float clampedX = Mathf.Clamp(localPoint.x, -limit, limit); - - Vector3 newPosition = new Vector3(clampedX, handleRect.localPosition.y, handleRect.localPosition.z); - handleRect.localPosition = newPosition; - - // Normalize within the limited 90% range - float normalized = (clampedX + limit) / (limit * 2f); - //Debug.Log(normalized); - CurrentValue = Mathf.Lerp(minValue, maxValue, normalized); - - // Displaying the warning. - - if (CurrentValue > (warningThreshholdValue*(maxValue - minValue) + minValue)) warningText.gameObject.SetActive(true); - + protected void DisplayWarningTextIfNecessary() + { + if (CurrentValue > (warningThreshholdValue * (maxValue - minValue) + minValue)) warningText.gameObject.SetActive(true); else warningText.gameObject.SetActive(false); - - //Debug.Log(warningThreshholdValue); - - } } diff --git a/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/SliderToVCA.cs b/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/SliderToVCA.cs index 84077268..d8071b45 100644 --- a/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/SliderToVCA.cs +++ b/Assets/_PROJECT/Components/NewHandPresence/Prefabs/XROrigin Scripts/SliderToVCA.cs @@ -13,76 +13,81 @@ public class SliderToVCA : MonoBehaviour } public VCATarget target; - private AudioSliderDragHandler slider; + public AudioSliderDragHandler slider; private void Awake() { - slider = GetComponent(); slider.OnValueChanged += ApplyVolume; } private void Start() -{ - float initialValue = GetInitialValueFromAudioManager(); - slider.SetHandlePosition(initialValue); // we will add this function -} - - -private float GetInitialValueFromAudioManager() -{ - switch (target) { - case VCATarget.Master: - return AudioManager.Instance.MasterVolume; - case VCATarget.Ambiences: - return AudioManager.Instance.AmbienceVolume; - case VCATarget.Music: - return AudioManager.Instance.MusicVolume; - case VCATarget.SFX: - return AudioManager.Instance.SFXVolume; - case VCATarget.UI: - return AudioManager.Instance.UIVolume; - case VCATarget.Voiceovers: - return AudioManager.Instance.VoiceoverVolume; - default: - return 0.5f; - } -} - - private void Update() - { - // Constantly push slider value to the VCA - ApplyVolume(slider.CurrentValue); - //Debug.Log("CurrentValue: " + slider.CurrentValue); + float initialValue = GetInitialValue(); + slider.SetHandleValue(initialValue); } - private void ApplyVolume(float value) + + private float GetInitialValue() { + switch (target) + { + case VCATarget.Master: + return ConfigManager.instance.getVolumeMaster(); + case VCATarget.Ambiences: + return ConfigManager.instance.getVolumeAmbient(); + case VCATarget.Music: + return ConfigManager.instance.getVolumeMusic(); + case VCATarget.SFX: + return ConfigManager.instance.getVolumeSFX(); + case VCATarget.UI: + return ConfigManager.instance.getVolumeUI(); + case VCATarget.Voiceovers: + return ConfigManager.instance.getVolumeVO(); + default: + return 0.5f; + } + } + + private void Update() + { + // Constantly push slider value to the VCA + ApplyVolume(slider.CurrentValue, false); + //Debug.Log("CurrentValue: " + slider.CurrentValue); + } + + private void ApplyVolume(float value, bool isLastChange) + { switch (target) { case VCATarget.Master: AudioManager.Instance.SetMasterVCA(value); - //Debug.LogError(value); - break; + if (isLastChange) ConfigManager.instance.SetVolumeMaster(value); + break; case VCATarget.Ambiences: AudioManager.Instance.SetAmbientVCA(value); + if (isLastChange) ConfigManager.instance.SetVolumeAmbient(value); break; case VCATarget.Music: AudioManager.Instance.SetMusicVCA(value); + if (isLastChange) ConfigManager.instance.SetVolumeMusic(value); break; case VCATarget.SFX: AudioManager.Instance.SetSFXVCA(value); + if (isLastChange) ConfigManager.instance.SetVolumeSFX(value); break; case VCATarget.UI: AudioManager.Instance.SetUIVCA(value); + if (isLastChange) ConfigManager.instance.SetVolumeUI(value); break; case VCATarget.Voiceovers: AudioManager.Instance.SetVoiceoverVCA(value); + if (isLastChange) ConfigManager.instance.SetVolumeVO(value); break; } } + } diff --git a/Assets/_PROJECT/Managers/ConfigManager.cs b/Assets/_PROJECT/Managers/ConfigManager.cs index a123c4ca..d82ae904 100644 --- a/Assets/_PROJECT/Managers/ConfigManager.cs +++ b/Assets/_PROJECT/Managers/ConfigManager.cs @@ -1,11 +1,11 @@ using FishNet.Component.Spawning; -using SimpleJSON; using System.Collections; using System.Collections.Generic; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using UnityEngine; using Valve.Newtonsoft.Json; +using static ConfigManager; public class ConfigManager : MonoBehaviour { @@ -14,8 +14,15 @@ public class ConfigManager : MonoBehaviour [System.Serializable] public class Config { - public bool isContinuousLocomotion; - public float masterVolume; + public bool isContinuousLocomotion = false; + public float continuousLocomotionSpeed = 0.5f; + public float volumeMaster = 0.5f; + public float volumeAmbient = 0.5f; + public float volumeMusic = 0.5f; + public float volumeSFX = 0.5f; + public float volumeUI = 0.5f; + public float volumeVO = 0.5f; + } protected Config currentConfig = new Config(); protected string configFileName = "config.json"; @@ -48,15 +55,18 @@ public class ConfigManager : MonoBehaviour if (!File.Exists(configFilePath)) { fileStream = File.Create(configFilePath); + fileStream.Close(); } else { - fileStream = new FileStream(configFilePath, FileMode.Open, FileAccess.Write, FileShare.ReadWrite); + //fileStream = new FileStream(configFilePath, FileMode.Open, FileAccess.Write, FileShare.ReadWrite); } - StreamWriter writer = new StreamWriter(fileStream); - writer.Write(JsonUtility.ToJson(currentConfig)); - writer.Close(); - fileStream.Close(); + //StreamWriter writer = new StreamWriter(fileStream); + //writer.Write(JsonUtility.ToJson(currentConfig)); + //writer.Close(); + //fileStream.Close(); + string json = JsonUtility.ToJson(currentConfig, true); + File.WriteAllText(configFilePath, json); } @@ -68,21 +78,16 @@ public class ConfigManager : MonoBehaviour if (!File.Exists(configFilePath)) { Debug.LogError("Config file was not found and could not be created: " + configFilePath); - return null; + return currentConfig; } } - - - FileStream fileStream = new FileStream(configFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + Config config = JsonUtility.FromJson(File.ReadAllText(configFilePath)); + + /*FileStream fileStream = new FileStream(configFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); StreamReader reader = new StreamReader(fileStream); Config config = JsonUtility.FromJson(reader.ReadToEnd()); reader.Close(); - fileStream.Close(); - - //Config config = JsonUtility.FromJson(File.ReadAllText(configFilePath)); - - Debug.Log(config.isContinuousLocomotion); - Debug.Log(config.masterVolume); + fileStream.Close();*/ return config; } @@ -106,15 +111,80 @@ public class ConfigManager : MonoBehaviour SaveConfigToFile(); } - - public float getMasterVolume() + public float GetContinuousLocomotionSpeed() { - return currentConfig.masterVolume; + return currentConfig.continuousLocomotionSpeed; } - public void SetMasterVolume(float masterVolume) + public void SetContinuousLocomotionSpeed(float continuousLocomotionSpeed) { - currentConfig.masterVolume = masterVolume; + currentConfig.continuousLocomotionSpeed = continuousLocomotionSpeed; + SaveConfigToFile(); + } + + public float getVolumeMaster() + { + + return currentConfig.volumeMaster; + } + public void SetVolumeMaster(float masterVolume) + { + currentConfig.volumeMaster = masterVolume; + SaveConfigToFile(); + } + + public float getVolumeAmbient() + { + + return currentConfig.volumeAmbient; + } + public void SetVolumeAmbient(float ambientVolume) + { + currentConfig.volumeAmbient = ambientVolume; + SaveConfigToFile(); + } + + public float getVolumeMusic() + { + + return currentConfig.volumeMusic; + } + public void SetVolumeMusic(float musicVolume) + { + currentConfig.volumeMusic = musicVolume; + SaveConfigToFile(); + } + + public float getVolumeSFX() + { + + return currentConfig.volumeSFX; + } + public void SetVolumeSFX(float sfxVolume) + { + currentConfig.volumeSFX = sfxVolume; + SaveConfigToFile(); + } + + public float getVolumeUI() + { + + return currentConfig.volumeUI; + } + public void SetVolumeUI(float uiVolume) + { + currentConfig.volumeUI = uiVolume; + SaveConfigToFile(); + } + + public float getVolumeVO() + { + + return currentConfig.volumeVO; + } + public void SetVolumeVO(float voVolume) + { + currentConfig.volumeVO = voVolume; SaveConfigToFile(); } }