From a4931995d0f051433350fe28782fa727771eac4c Mon Sep 17 00:00:00 2001 From: VDH Date: Mon, 6 Apr 2026 15:47:21 +0700 Subject: [PATCH] hide ui and add zoom cam --- .../Prefab/FreeLook Camera.prefab | 62 ++++----- Assets/PerfectWorld/Prefab/UI/Canvas.prefab | 73 +++++++++++ .../Scripts/Camera/CameraController.cs | 121 +++++++++++++++++- Assets/Prefabs/UI/SkillUI.prefab | 8 +- .../EditorAttributesSettings.asset | 17 +++ 5 files changed, 239 insertions(+), 42 deletions(-) create mode 100644 ProjectSettings/EditorAttributes/EditorAttributesSettings.asset diff --git a/Assets/PerfectWorld/Prefab/FreeLook Camera.prefab b/Assets/PerfectWorld/Prefab/FreeLook Camera.prefab index 6c049cf559..3717d0cd06 100644 --- a/Assets/PerfectWorld/Prefab/FreeLook Camera.prefab +++ b/Assets/PerfectWorld/Prefab/FreeLook Camera.prefab @@ -12,8 +12,8 @@ GameObject: - component: {fileID: 2923694103221183510} - component: {fileID: 864878593467321995} - component: {fileID: 3005089224860696078} - - component: {fileID: 9220823260634167621} - component: {fileID: 6720462472486200866} + - component: {fileID: 9220823260634167621} m_Layer: 0 m_Name: FreeLook Camera m_TagString: Untagged @@ -171,6 +171,36 @@ MonoBehaviour: Time: 0 Smoothing: 0 IgnoreY: 0 +--- !u!114 &6720462472486200866 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5860545600847923144} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ca7de3aefa901374ba29464584a3109a, type: 3} + m_Name: + m_EditorClassIdentifier: + CameraRadius: 0.4 + Decollision: + Enabled: 0 + ObstacleLayers: + serializedVersion: 2 + m_Bits: 1 + UseFollowTarget: + Enabled: 0 + YOffset: 0 + Damping: 0.5 + SmoothingTime: 0 + TerrainResolution: + Enabled: 1 + TerrainLayers: + serializedVersion: 2 + m_Bits: 200 + MaximumRaycast: 5 + Damping: 0.25 --- !u!114 &9220823260634167621 MonoBehaviour: m_ObjectHideFlags: 0 @@ -229,33 +259,3 @@ MonoBehaviour: DecelTime: 0 PlayerIndex: -1 AutoEnableInputs: 0 ---- !u!114 &6720462472486200866 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5860545600847923144} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ca7de3aefa901374ba29464584a3109a, type: 3} - m_Name: - m_EditorClassIdentifier: - CameraRadius: 0.4 - Decollision: - Enabled: 0 - ObstacleLayers: - serializedVersion: 2 - m_Bits: 1 - UseFollowTarget: - Enabled: 0 - YOffset: 0 - Damping: 0.5 - SmoothingTime: 0 - TerrainResolution: - Enabled: 1 - TerrainLayers: - serializedVersion: 2 - m_Bits: 200 - MaximumRaycast: 5 - Damping: 0.25 diff --git a/Assets/PerfectWorld/Prefab/UI/Canvas.prefab b/Assets/PerfectWorld/Prefab/UI/Canvas.prefab index fe0d5c4750..b51625e4b2 100644 --- a/Assets/PerfectWorld/Prefab/UI/Canvas.prefab +++ b/Assets/PerfectWorld/Prefab/UI/Canvas.prefab @@ -111,6 +111,22 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 6641252726352799703} m_Modifications: + - target: {fileID: 129645434728095412, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 129645434728095412, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 129645434728095412, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 129645434728095412, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} - target: {fileID: 1464374634028484465, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} propertyPath: m_text value: @@ -175,6 +191,22 @@ PrefabInstance: propertyPath: m_AnchoredPosition.y value: 28.228401 objectReference: {fileID: 0} + - target: {fileID: 3951120581356990872, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3951120581356990872, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3951120581356990872, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3951120581356990872, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} - target: {fileID: 3984476637502251390, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} propertyPath: m_fontSize value: 17 @@ -383,6 +415,42 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 7087492923537698131, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7087492923537698131, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7087492923537698131, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7087492923537698131, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7708887638066944733, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7924665791547601326, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7924665791547601326, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7924665791547601326, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7924665791547601326, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} - target: {fileID: 8086917028654197348, guid: 76408ccdbeb4c654291462fcff24a8c5, type: 3} propertyPath: m_Type value: 3 @@ -486,9 +554,14 @@ MonoBehaviour: expText: {fileID: 9091953190536401803} nameText: {fileID: 6716045574192280964} levelText: {fileID: 3632374887765724611} + spText: {fileID: 0} healthImage: {fileID: 4133230328392276113} manaImage: {fileID: 246901321761552071} expImage: {fileID: 7351517459147011958} + apImage: {fileID: 0} + apToggles: [] + buffIconPrefab: {fileID: 0} + m_btnOpenCharacter: {fileID: 0} neededExp: 0 --- !u!114 &1313768687643874887 stripped MonoBehaviour: diff --git a/Assets/PerfectWorld/Scripts/Camera/CameraController.cs b/Assets/PerfectWorld/Scripts/Camera/CameraController.cs index 0ec9ac5b52..07a774047a 100644 --- a/Assets/PerfectWorld/Scripts/Camera/CameraController.cs +++ b/Assets/PerfectWorld/Scripts/Camera/CameraController.cs @@ -1,7 +1,6 @@ using Unity.Cinemachine; using UnityEngine; using UnityEngine.EventSystems; -using UnityEngine.Serialization; namespace BrewMonster { @@ -16,6 +15,18 @@ namespace BrewMonster [SerializeField] private float verticalRotationPerScreen = 500f; [SerializeField, HideInInspector] private bool _migratedDeadZoneToNormalized; + [Header("Zoom (orbit scale)")] + [Tooltip("RadialAxis scales camera distance: effective distance = Orbital Follow Radius × this value.")] + [SerializeField] private bool enableZoom = true; + [SerializeField] private float orbitScaleMin = 0.5f; + [SerializeField] private float orbitScaleMax = 2f; + [SerializeField] private float defaultOrbitScale = 1f; + [SerializeField] private float zoomSensitivityScroll = 0.15f; + [SerializeField] private float zoomSensitivityPinch = 0.004f; + + private float _lastPinchDistance; + private bool _pinchZoomActive; + public CinemachineOrbitalFollow Orbital { get => orbital;} void OnEnable() @@ -24,6 +35,11 @@ namespace BrewMonster MigrateLegacyDeadZone(); } + private void Start() + { + SyncRadialAxisRange(); + } + public void OnDrag(PointerEventData eventData) { if (!fingerDown || orbital == null) @@ -57,6 +73,88 @@ namespace BrewMonster private void OnValidate() { MigrateLegacyDeadZone(); + orbitScaleMin = Mathf.Max(0.01f, orbitScaleMin); + orbitScaleMax = Mathf.Max(orbitScaleMin, orbitScaleMax); + defaultOrbitScale = Mathf.Clamp(defaultOrbitScale, orbitScaleMin, orbitScaleMax); + SyncRadialAxisRange(); + } + + /// Keeps Cinemachine RadialAxis range in sync with serialized min/max. + private void SyncRadialAxisRange() + { + if (orbital == null) + { + return; + } + + float min = Mathf.Min(orbitScaleMin, orbitScaleMax); + float max = Mathf.Max(orbitScaleMin, orbitScaleMax); + var radial = orbital.RadialAxis; + var range = radial.Range; + range.x = min; + range.y = max; + radial.Range = range; + radial.Value = radial.ClampValue(radial.Value); + orbital.RadialAxis = radial; + } + + private void ResetFollowCameraAxes() + { + if (orbital == null) + { + return; + } + + orbital.HorizontalAxis.Value = 208; + orbital.VerticalAxis.Value = -268; + SyncRadialAxisRange(); + var radial = orbital.RadialAxis; + radial.Value = radial.ClampValue(defaultOrbitScale); + orbital.RadialAxis = radial; + } + + private void ApplyRadialZoomDelta(float delta) + { + if (!enableZoom || orbital == null || Mathf.Abs(delta) < 1e-6f) + { + return; + } + + var radial = orbital.RadialAxis; + radial.Value = radial.ClampValue(radial.Value + delta); + orbital.RadialAxis = radial; + } + + private void UpdatePinchZoom() + { + if (!enableZoom || orbital == null) + { + _pinchZoomActive = false; + return; + } + + if (Input.touchCount == 2) + { + Touch t0 = Input.GetTouch(0); + Touch t1 = Input.GetTouch(1); + float dist = Vector2.Distance(t0.position, t1.position); + if (!_pinchZoomActive) + { + _pinchZoomActive = true; + _lastPinchDistance = dist; + } + else + { + float delta = dist - _lastPinchDistance; + _lastPinchDistance = dist; + // Pinch outward increases distance → larger scale + ApplyRadialZoomDelta(delta * zoomSensitivityPinch); + } + } + else + { + _pinchZoomActive = false; + } } private void MigrateLegacyDeadZone() @@ -86,24 +184,33 @@ namespace BrewMonster { _cinemachineCamera.Follow = CECGameRun.Instance.GetHostPlayer().PointCam; _cinemachineCamera.ForceCameraPosition(CECGameRun.Instance.GetHostPlayer().PointCam.position, Quaternion.identity); - orbital.HorizontalAxis.Value = 208; - orbital.VerticalAxis.Value = -268; + ResetFollowCameraAxes(); } else { _cinemachineCamera.Follow = CECGameRun.Instance.GetHostPlayer().transform; _cinemachineCamera.ForceCameraPosition(CECGameRun.Instance.GetHostPlayer().ObjectPosition, Quaternion.identity); - orbital.HorizontalAxis.Value = 208; - orbital.VerticalAxis.Value = -268; + ResetFollowCameraAxes(); } } + +#if UNITY_EDITOR || UNITY_STANDALONE || UNITY_WEBGL + if (enableZoom && orbital != null) + { + float scroll = Input.mouseScrollDelta.y; + if (Mathf.Abs(scroll) > Mathf.Epsilon) + { + ApplyRadialZoomDelta(scroll * zoomSensitivityScroll); + } + } +#endif + UpdatePinchZoom(); } public void UpdateFollowObject(Transform followObject) { _cinemachineCamera.Follow = followObject; _cinemachineCamera.ForceCameraPosition(followObject.position, Quaternion.identity); - orbital.HorizontalAxis.Value = 208; - orbital.VerticalAxis.Value = -268; + ResetFollowCameraAxes(); } } } diff --git a/Assets/Prefabs/UI/SkillUI.prefab b/Assets/Prefabs/UI/SkillUI.prefab index 355f446242..0d140c6bf8 100644 --- a/Assets/Prefabs/UI/SkillUI.prefab +++ b/Assets/Prefabs/UI/SkillUI.prefab @@ -8087,7 +8087,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &8029283128219612690 RectTransform: m_ObjectHideFlags: 0 @@ -8104,9 +8104,9 @@ RectTransform: - {fileID: 3703262150164293383} m_Father: {fileID: 3016923604946316301} 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_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 83.16, y: -292.4765} m_SizeDelta: {x: 166.32, y: 130.2924} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &5150156580756960231 diff --git a/ProjectSettings/EditorAttributes/EditorAttributesSettings.asset b/ProjectSettings/EditorAttributes/EditorAttributesSettings.asset new file mode 100644 index 0000000000..dcf07a7fc4 --- /dev/null +++ b/ProjectSettings/EditorAttributes/EditorAttributesSettings.asset @@ -0,0 +1,17 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 53 + 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: 8dd9412a94724634791c4076fdf86e3b, type: 3} + m_Name: + m_EditorClassIdentifier: + disableBuildValidation: 0 + assetPreviewLoadTime: 20 + customUnitDefinitions: []