LightGlueCursorSettingsUI.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using LightGlue.Unity.Game;
  4. namespace LightGlue.Unity.UI
  5. {
  6. /// <summary>
  7. /// 光标/跟随平滑设置的场景 UI 控制器。
  8. /// - 通过 Toggle、Slider 修改 LightGlueCursorSettings 的参数,并自动保存到本地。
  9. /// - 需在场景中挂到设置面板根节点,并绑定对应的 UI 组件。
  10. /// </summary>
  11. public class LightGlueCursorSettingsUI : MonoBehaviour
  12. {
  13. [Header("设置数据源")]
  14. [Tooltip("留空则使用 LightGlueCursorSettings.Instance")]
  15. public LightGlueCursorSettings cursorSettings;
  16. [Header("标记器跟随")]
  17. [Tooltip("标记器平滑开关")]
  18. public Toggle markerSmoothToggle;
  19. [Tooltip("标记器跟随速度 Slider(建议 min=1, max=300)")]
  20. public Slider markerLerpSlider;
  21. [Tooltip("标记器跟随速度数值显示(可选)")]
  22. public Text markerLerpValueText;
  23. [Tooltip("标记器抖动阈值 Slider(建议 min=0, max=50)")]
  24. public Slider markerJitterSlider;
  25. [Tooltip("标记器抖动阈值数值显示(可选)")]
  26. public Text markerJitterValueText;
  27. [Header("相机朝向跟随")]
  28. [Tooltip("相机旋转平滑开关")]
  29. public Toggle cameraSmoothToggle;
  30. [Tooltip("相机旋转速度 Slider(建议 min=1, max=300)")]
  31. public Slider cameraLerpSlider;
  32. [Tooltip("相机旋转速度数值显示(可选)")]
  33. public Text cameraLerpValueText;
  34. [Tooltip("相机旋转抖动阈值 Slider(建议 min=0, max=10,单位度)")]
  35. public Slider cameraJitterSlider;
  36. [Tooltip("相机旋转抖动阈值数值显示(可选)")]
  37. public Text cameraJitterValueText;
  38. [Header("按钮")]
  39. [Tooltip("恢复默认并保存按钮")]
  40. public Button resetToDefaultButton;
  41. [Tooltip("保存到本地按钮(若希望手动保存可绑定;不绑定时各控件修改后会自动保存)")]
  42. public Button saveButton;
  43. [Header("Slider 范围(用于恢复默认时设置 Slider 的 value)")]
  44. [Tooltip("标记器速度 Slider 的 min/max,用于 Refresh 时正确显示")]
  45. public Vector2 markerLerpRange = new Vector2(1f, 300f);
  46. public Vector2 markerJitterRange = new Vector2(0f, 50f);
  47. public Vector2 cameraLerpRange = new Vector2(1f, 300f);
  48. public Vector2 cameraJitterRange = new Vector2(0f, 10f);
  49. [Header("本地存储")]
  50. [Tooltip("滑块/开关修改后,到自动保存到本地之间的时间间隔(秒)")]
  51. public float autoSaveIntervalSeconds = 0.5f;
  52. private bool _ignoreChanges;
  53. private bool _pendingSave;
  54. private float _lastChangeTime;
  55. private void Start()
  56. {
  57. if (cursorSettings == null)
  58. cursorSettings = LightGlueCursorSettings.Instance;
  59. if (cursorSettings == null)
  60. {
  61. Debug.LogWarning("[LightGlueCursorSettingsUI] 未找到 LightGlueCursorSettings,请确保场景或预制中存在该组件。");
  62. return;
  63. }
  64. BindListeners();
  65. RefreshUIFromSettings();
  66. }
  67. private void Update()
  68. {
  69. if (!_pendingSave || cursorSettings == null)
  70. return;
  71. if (Time.unscaledTime - _lastChangeTime >= autoSaveIntervalSeconds)
  72. {
  73. cursorSettings.SaveToLocal();
  74. _pendingSave = false;
  75. }
  76. }
  77. private void BindListeners()
  78. {
  79. if (markerSmoothToggle != null)
  80. markerSmoothToggle.onValueChanged.AddListener(OnMarkerSmoothChanged);
  81. if (markerLerpSlider != null)
  82. markerLerpSlider.onValueChanged.AddListener(OnMarkerLerpChanged);
  83. if (markerJitterSlider != null)
  84. markerJitterSlider.onValueChanged.AddListener(OnMarkerJitterChanged);
  85. if (cameraSmoothToggle != null)
  86. cameraSmoothToggle.onValueChanged.AddListener(OnCameraSmoothChanged);
  87. if (cameraLerpSlider != null)
  88. cameraLerpSlider.onValueChanged.AddListener(OnCameraLerpChanged);
  89. if (cameraJitterSlider != null)
  90. cameraJitterSlider.onValueChanged.AddListener(OnCameraJitterChanged);
  91. if (resetToDefaultButton != null)
  92. resetToDefaultButton.onClick.AddListener(OnResetToDefaultClicked);
  93. if (saveButton != null)
  94. saveButton.onClick.AddListener(OnSaveClicked);
  95. }
  96. /// <summary>
  97. /// 根据当前 LightGlueCursorSettings 刷新所有 UI 显示(不触发保存)。
  98. /// </summary>
  99. public void RefreshUIFromSettings()
  100. {
  101. if (cursorSettings == null) return;
  102. _ignoreChanges = true;
  103. try
  104. {
  105. if (markerSmoothToggle != null)
  106. markerSmoothToggle.isOn = cursorSettings.markerEnableSmoothFollow;
  107. if (markerLerpSlider != null)
  108. {
  109. markerLerpSlider.minValue = markerLerpRange.x;
  110. markerLerpSlider.maxValue = markerLerpRange.y;
  111. markerLerpSlider.value = cursorSettings.markerPositionLerpSpeed;
  112. }
  113. if (markerJitterSlider != null)
  114. {
  115. markerJitterSlider.minValue = markerJitterRange.x;
  116. markerJitterSlider.maxValue = markerJitterRange.y;
  117. markerJitterSlider.value = cursorSettings.markerJitterThresholdPixels;
  118. }
  119. if (cameraSmoothToggle != null)
  120. cameraSmoothToggle.isOn = cursorSettings.cameraAimEnableSmoothRotation;
  121. if (cameraLerpSlider != null)
  122. {
  123. cameraLerpSlider.minValue = cameraLerpRange.x;
  124. cameraLerpSlider.maxValue = cameraLerpRange.y;
  125. cameraLerpSlider.value = cursorSettings.cameraAimRotationLerpSpeed;
  126. }
  127. if (cameraJitterSlider != null)
  128. {
  129. cameraJitterSlider.minValue = cameraJitterRange.x;
  130. cameraJitterSlider.maxValue = cameraJitterRange.y;
  131. cameraJitterSlider.value = cursorSettings.cameraAimRotationJitterThresholdDeg;
  132. }
  133. UpdateValueLabels();
  134. }
  135. finally
  136. {
  137. _ignoreChanges = false;
  138. }
  139. }
  140. private void UpdateValueLabels()
  141. {
  142. if (markerLerpValueText != null && markerLerpSlider != null)
  143. markerLerpValueText.text = cursorSettings != null ? cursorSettings.markerPositionLerpSpeed.ToString("F0") : markerLerpSlider.value.ToString("F0");
  144. if (markerJitterValueText != null && markerJitterSlider != null)
  145. markerJitterValueText.text = cursorSettings != null ? cursorSettings.markerJitterThresholdPixels.ToString("F1") : markerJitterSlider.value.ToString("F1");
  146. if (cameraLerpValueText != null && cameraLerpSlider != null)
  147. cameraLerpValueText.text = cursorSettings != null ? cursorSettings.cameraAimRotationLerpSpeed.ToString("F0") : cameraLerpSlider.value.ToString("F0");
  148. if (cameraJitterValueText != null && cameraJitterSlider != null)
  149. cameraJitterValueText.text = cursorSettings != null ? cursorSettings.cameraAimRotationJitterThresholdDeg.ToString("F2") : cameraJitterSlider.value.ToString("F2");
  150. }
  151. private void ApplyAndSave()
  152. {
  153. if (cursorSettings == null || _ignoreChanges) return;
  154. _pendingSave = true;
  155. _lastChangeTime = Time.unscaledTime;
  156. }
  157. private void OnMarkerSmoothChanged(bool value)
  158. {
  159. if (_ignoreChanges || cursorSettings == null) return;
  160. cursorSettings.markerEnableSmoothFollow = value;
  161. ApplyAndSave();
  162. }
  163. private void OnMarkerLerpChanged(float value)
  164. {
  165. if (_ignoreChanges || cursorSettings == null) return;
  166. cursorSettings.markerPositionLerpSpeed = value;
  167. if (markerLerpValueText != null) markerLerpValueText.text = value.ToString("F0");
  168. ApplyAndSave();
  169. }
  170. private void OnMarkerJitterChanged(float value)
  171. {
  172. if (_ignoreChanges || cursorSettings == null) return;
  173. cursorSettings.markerJitterThresholdPixels = value;
  174. if (markerJitterValueText != null) markerJitterValueText.text = value.ToString("F1");
  175. ApplyAndSave();
  176. }
  177. private void OnCameraSmoothChanged(bool value)
  178. {
  179. if (_ignoreChanges || cursorSettings == null) return;
  180. cursorSettings.cameraAimEnableSmoothRotation = value;
  181. ApplyAndSave();
  182. }
  183. private void OnCameraLerpChanged(float value)
  184. {
  185. if (_ignoreChanges || cursorSettings == null) return;
  186. cursorSettings.cameraAimRotationLerpSpeed = value;
  187. if (cameraLerpValueText != null) cameraLerpValueText.text = value.ToString("F0");
  188. ApplyAndSave();
  189. }
  190. private void OnCameraJitterChanged(float value)
  191. {
  192. if (_ignoreChanges || cursorSettings == null) return;
  193. cursorSettings.cameraAimRotationJitterThresholdDeg = value;
  194. if (cameraJitterValueText != null) cameraJitterValueText.text = value.ToString("F2");
  195. ApplyAndSave();
  196. }
  197. private void OnResetToDefaultClicked()
  198. {
  199. if (cursorSettings == null) return;
  200. cursorSettings.ResetToDefaultAndSave();
  201. RefreshUIFromSettings();
  202. _pendingSave = false;
  203. }
  204. private void OnSaveClicked()
  205. {
  206. if (cursorSettings == null) return;
  207. cursorSettings.SaveToLocal();
  208. _pendingSave = false;
  209. }
  210. }
  211. }