├── .gitignore ├── Assets ├── AnnularSlider.meta └── AnnularSlider │ ├── Prefabs.meta │ ├── Prefabs │ ├── AnnularSlider.prefab │ └── AnnularSlider.prefab.meta │ ├── Scenes.meta │ ├── Scenes │ ├── AngleCalculator.unity │ ├── AngleCalculator.unity.meta │ ├── Demo1.unity │ ├── Demo1.unity.meta │ ├── Demo2.unity │ ├── Demo2.unity.meta │ ├── Demo3.unity │ ├── Demo3.unity.meta │ ├── Demo4.unity │ └── Demo4.unity.meta │ ├── Scripts.meta │ ├── Scripts │ ├── Core.meta │ ├── Core │ │ ├── AnnularSlider.cs │ │ ├── AnnularSlider.cs.meta │ │ ├── Editor.meta │ │ └── Editor │ │ │ ├── AnnularSliderEditor.cs │ │ │ └── AnnularSliderEditor.cs.meta │ ├── Test.meta │ └── Test │ │ ├── AngleCalculator.cs │ │ └── AngleCalculator.cs.meta │ ├── Sprites.meta │ └── Sprites │ ├── Annular.png │ ├── Annular.png.meta │ ├── Circle.png │ ├── Circle.png.meta │ ├── Handle.png │ └── Handle.png.meta ├── ProjectSettings ├── AudioManager.asset ├── ClusterInputManager.asset ├── DynamicsManager.asset ├── EditorBuildSettings.asset ├── EditorSettings.asset ├── GraphicsSettings.asset ├── InputManager.asset ├── NavMeshAreas.asset ├── NetworkManager.asset ├── Physics2DSettings.asset ├── ProjectSettings.asset ├── ProjectVersion.txt ├── QualitySettings.asset ├── TagManager.asset ├── TimeManager.asset └── UnityConnectSettings.asset └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | /Library 2 | /Packages 3 | /Temp 4 | /obj 5 | /*.sln 6 | /*.csproj 7 | -------------------------------------------------------------------------------- /Assets/AnnularSlider.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 265b38e0a088b2a4e88207e4b2d06951 3 | folderAsset: yes 4 | timeCreated: 1605498944 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Prefabs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6722ee8c12b8ba241abe724e59a1c3c3 3 | folderAsset: yes 4 | timeCreated: 1605341876 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Prefabs/AnnularSlider.prefab: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/Assets/AnnularSlider/Prefabs/AnnularSlider.prefab -------------------------------------------------------------------------------- /Assets/AnnularSlider/Prefabs/AnnularSlider.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7660791ff75889244bd665fe398ff56c 3 | timeCreated: 1605499076 4 | licenseType: Pro 5 | NativeFormatImporter: 6 | mainObjectFileID: 100100000 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scenes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 27e8f9b308e376049a9e4cf3c43b381d 3 | folderAsset: yes 4 | timeCreated: 1605341868 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scenes/AngleCalculator.unity: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/Assets/AnnularSlider/Scenes/AngleCalculator.unity -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scenes/AngleCalculator.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 904b534465c398440b9cf40ab10bae83 3 | timeCreated: 1618276977 4 | licenseType: Pro 5 | DefaultImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scenes/Demo1.unity: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/Assets/AnnularSlider/Scenes/Demo1.unity -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scenes/Demo1.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7b3d6cb9bd9b76e47af4e859a236bbb3 3 | timeCreated: 1605342122 4 | licenseType: Pro 5 | DefaultImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scenes/Demo2.unity: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/Assets/AnnularSlider/Scenes/Demo2.unity -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scenes/Demo2.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 23be634700c915f4ab87e0ec8f9e3248 3 | timeCreated: 1605342122 4 | licenseType: Pro 5 | DefaultImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scenes/Demo3.unity: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/Assets/AnnularSlider/Scenes/Demo3.unity -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scenes/Demo3.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0085e77fd517e9043b86404ed47c4a3b 3 | timeCreated: 1605342122 4 | licenseType: Pro 5 | DefaultImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scenes/Demo4.unity: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/Assets/AnnularSlider/Scenes/Demo4.unity -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scenes/Demo4.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ffae7cc4970fdb24db02654fe9b76750 3 | timeCreated: 1605342122 4 | licenseType: Pro 5 | DefaultImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 14c12f97d2c346e4ba028ade518428ab 3 | folderAsset: yes 4 | timeCreated: 1605341862 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scripts/Core.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 678e91d90a5552849ab3c8a839fe2254 3 | folderAsset: yes 4 | timeCreated: 1605344284 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scripts/Core/AnnularSlider.cs: -------------------------------------------------------------------------------- 1 | /************************************************************************* 2 | * Copyright © 2020 Great1217. All rights reserved. 3 | *------------------------------------------------------------------------ 4 | * File : AnnularSlider.cs 5 | * Description : Null. 6 | *------------------------------------------------------------------------ 7 | * Author : Great1217 8 | * Version : 0.1.0 9 | * Date : 13/11/2020 10 | * Description : Initial development version. 11 | *************************************************************************/ 12 | 13 | using System; 14 | using System.Collections.Generic; 15 | using UnityEngine; 16 | using UnityEngine.Events; 17 | using UnityEngine.EventSystems; 18 | using UnityEngine.UI; 19 | 20 | [RequireComponent(typeof(RectTransform)), ExecuteInEditMode] 21 | public class AnnularSlider : Selectable, IDragHandler, ICanvasElement 22 | { 23 | [Serializable] 24 | public class DragEvent : UnityEvent 25 | { 26 | } 27 | 28 | [Serializable] 29 | public class DragValueEvent : UnityEvent 30 | { 31 | } 32 | 33 | [SerializeField] private Image _fillImage; 34 | [SerializeField] private Image.Origin360 _fillOrigin; 35 | [SerializeField] private bool _clockwise; 36 | [SerializeField] private bool _wholeNumbers; 37 | [SerializeField] private float _minValue; 38 | [SerializeField] private float _maxValue = 1f; 39 | [SerializeField] private float _maxAngle = 360f; 40 | [SerializeField] private float _value; 41 | 42 | [SerializeField] private RectTransform _handleRect; 43 | [SerializeField] private float _radius = 10f; 44 | [SerializeField] private bool _towardCenter; 45 | 46 | [SerializeField] private DragValueEvent _onValueChanged = new DragValueEvent(); 47 | [SerializeField] private DragEvent _onBeginDragged = new DragEvent(); 48 | [SerializeField] private DragEvent _onDragging = new DragEvent(); 49 | [SerializeField] private DragEvent _onEndDragged = new DragEvent(); 50 | 51 | private bool _delayedUpdateVisuals; 52 | 53 | public Image FillImage 54 | { 55 | get { return _fillImage; } 56 | set 57 | { 58 | if (SetClass(ref _fillImage, value)) 59 | { 60 | UpdateCachedReferences(); 61 | UpdateVisuals(); 62 | } 63 | } 64 | } 65 | 66 | public Image.Origin360 FillOrigin 67 | { 68 | get { return _fillOrigin; } 69 | set 70 | { 71 | if (SetStruct(ref _fillOrigin, value)) 72 | { 73 | UpdateVisuals(); 74 | } 75 | } 76 | } 77 | 78 | public bool Clockwise 79 | { 80 | get { return _clockwise; } 81 | set 82 | { 83 | if (SetStruct(ref _clockwise, value)) 84 | { 85 | UpdateVisuals(); 86 | } 87 | } 88 | } 89 | 90 | public bool WholeNumbers 91 | { 92 | get { return _wholeNumbers; } 93 | set 94 | { 95 | if (SetStruct(ref _wholeNumbers, value)) 96 | { 97 | UpdateValue(_value); 98 | UpdateVisuals(); 99 | } 100 | } 101 | } 102 | 103 | public float MinValue 104 | { 105 | get { return _minValue; } 106 | set 107 | { 108 | if (SetStruct(ref _minValue, value)) 109 | { 110 | UpdateValue(_value); 111 | UpdateVisuals(); 112 | } 113 | } 114 | } 115 | 116 | public float MaxValue 117 | { 118 | get { return _maxValue; } 119 | set 120 | { 121 | if (SetStruct(ref _maxValue, value)) 122 | { 123 | UpdateValue(_value); 124 | UpdateVisuals(); 125 | } 126 | } 127 | } 128 | 129 | public float MaxAngle 130 | { 131 | get { return _maxAngle; } 132 | set 133 | { 134 | if (SetStruct(ref _maxAngle, value)) 135 | { 136 | UpdateVisuals(); 137 | } 138 | } 139 | } 140 | 141 | public float Value 142 | { 143 | get 144 | { 145 | if (_wholeNumbers) return Mathf.Round(_value); 146 | return _value; 147 | } 148 | 149 | set { UpdateValue(value); } 150 | } 151 | 152 | public RectTransform HandleRect 153 | { 154 | get { return _handleRect; } 155 | set 156 | { 157 | if (SetClass(ref _handleRect, value)) 158 | { 159 | UpdateVisuals(); 160 | } 161 | } 162 | } 163 | 164 | public float Radius 165 | { 166 | get { return _radius; } 167 | set 168 | { 169 | if (SetStruct(ref _radius, value)) 170 | { 171 | UpdateVisuals(); 172 | } 173 | } 174 | } 175 | 176 | public bool TowardCenter 177 | { 178 | get { return _towardCenter; } 179 | set 180 | { 181 | if (SetStruct(ref _towardCenter, value)) 182 | { 183 | UpdateVisuals(); 184 | } 185 | } 186 | } 187 | 188 | public DragValueEvent OnValueChanged 189 | { 190 | get { return _onValueChanged; } 191 | set { _onValueChanged = value; } 192 | } 193 | 194 | public DragEvent OnBeginDragged 195 | { 196 | get { return _onBeginDragged; } 197 | set { _onBeginDragged = value; } 198 | } 199 | 200 | public DragEvent OnDragging 201 | { 202 | get { return _onDragging; } 203 | set { _onDragging = value; } 204 | } 205 | 206 | public DragEvent OnEndDragged 207 | { 208 | get { return _onEndDragged; } 209 | set { _onEndDragged = value; } 210 | } 211 | 212 | public float NormalizedValue 213 | { 214 | get 215 | { 216 | if (Mathf.Approximately(_minValue, _maxValue)) return 0; 217 | return Mathf.InverseLerp(_minValue, _maxValue, Value); 218 | } 219 | set { Value = Mathf.Lerp(_minValue, _maxValue, value); } 220 | } 221 | 222 | protected override void OnEnable() 223 | { 224 | base.OnEnable(); 225 | UpdateCachedReferences(); 226 | UpdateValue(_value, false); 227 | UpdateVisuals(); 228 | } 229 | 230 | #if UNITY_EDITOR 231 | protected override void OnValidate() 232 | { 233 | base.OnValidate(); 234 | 235 | if (WholeNumbers) 236 | { 237 | _minValue = Mathf.Round(_minValue); 238 | _maxValue = Mathf.Round(_maxValue); 239 | } 240 | 241 | //Onvalidate is called before OnEnabled. We need to make sure not to touch any other objects before OnEnable is run. 242 | if (IsActive()) 243 | { 244 | UpdateCachedReferences(); 245 | UpdateValue(_value, false); 246 | _delayedUpdateVisuals = true; 247 | } 248 | 249 | 250 | if (!UnityEditor.PrefabUtility.IsComponentAddedToPrefabInstance(this) && !Application.isPlaying) 251 | CanvasUpdateRegistry.RegisterCanvasElementForLayoutRebuild(this); 252 | } 253 | #endif 254 | 255 | protected virtual void Update() 256 | { 257 | if (_delayedUpdateVisuals) 258 | { 259 | _delayedUpdateVisuals = false; 260 | UpdateVisuals(); 261 | } 262 | } 263 | 264 | public override void OnPointerDown(PointerEventData eventData) 265 | { 266 | if (MayEvent(eventData)) 267 | { 268 | OnBeginDragged.Invoke(); 269 | //Debug.Log("OnBeginDragged"); 270 | } 271 | } 272 | 273 | public void OnDrag(PointerEventData eventData) 274 | { 275 | if (!MayEvent(eventData)) return; 276 | _onDragging.Invoke(); 277 | 278 | Vector2 localPoint; 279 | if (RectTransformUtility.ScreenPointToLocalPointInRectangle(_fillImage.rectTransform, eventData.position, eventData.pressEventCamera, out localPoint)) 280 | { 281 | //根据鼠标在rect的位置=>求出角度(相对于X轴右侧 180°表示)=>相对于起始点的角度(360° 表示)=>_fillImage.fillAmount、_handleRect.localPosition 282 | var angle = GetAngleFromFillOrigin(localPoint); //相对角度 [0f-360f] 283 | //超出最大角度时,等于相近的边界值 284 | if (angle > _maxAngle) 285 | { 286 | angle = angle - _maxAngle < 360 - angle ? _maxAngle : 0f; 287 | } 288 | 289 | NormalizedValue = angle / _maxAngle; 290 | UpdateVisuals(); 291 | } 292 | } 293 | 294 | public override void OnPointerUp(PointerEventData eventData) 295 | { 296 | if (MayEvent(eventData)) 297 | { 298 | OnEndDragged.Invoke(); 299 | //Debug.Log("OnEndDragged"); 300 | } 301 | } 302 | 303 | public void Rebuild(CanvasUpdate executing) 304 | { 305 | } 306 | 307 | public void LayoutComplete() 308 | { 309 | } 310 | 311 | public void GraphicUpdateComplete() 312 | { 313 | } 314 | 315 | /// 316 | /// 返回是否可交互 317 | /// 318 | /// 319 | private bool MayEvent(PointerEventData eventData) 320 | { 321 | return IsActive() && IsInteractable() && eventData.button == PointerEventData.InputButton.Left; 322 | } 323 | 324 | /// 325 | /// 更新缓存引用 326 | /// 327 | private void UpdateCachedReferences() 328 | { 329 | if (_fillImage) 330 | { 331 | _fillImage.type = Image.Type.Filled; 332 | _fillImage.fillMethod = Image.FillMethod.Radial360; 333 | _fillImage.fillOrigin = (int) _fillOrigin; 334 | _fillImage.fillClockwise = _clockwise; 335 | } 336 | } 337 | 338 | /// 339 | /// 更新视觉效果 340 | /// 341 | private void UpdateVisuals() 342 | { 343 | #if UNITY_EDITOR 344 | if (!Application.isPlaying) 345 | UpdateCachedReferences(); 346 | #endif 347 | 348 | var angle = NormalizedValue * _maxAngle; 349 | 350 | if (_fillImage) 351 | { 352 | _fillImage.fillAmount = angle / 360f; 353 | } 354 | 355 | if (_handleRect) 356 | { 357 | _handleRect.transform.localPosition = GetPointFromFillOrigin(ref angle); 358 | if (_towardCenter) 359 | { 360 | _handleRect.transform.localEulerAngles = new Vector3(0f, 0f, angle); 361 | } 362 | } 363 | } 364 | 365 | /// 366 | /// 更新Value 367 | /// 368 | /// 369 | /// 370 | private void UpdateValue(float value, bool sendCallback = true) 371 | { 372 | value = Mathf.Clamp(value, _minValue, _maxValue); 373 | if (_wholeNumbers) value = Mathf.Round(value); 374 | if (_value.Equals(value)) return; 375 | _value = value; 376 | 377 | UpdateVisuals(); 378 | if (sendCallback) 379 | { 380 | _onValueChanged.Invoke(_value); 381 | //Debug.Log("OnValueChanged" + _value); 382 | } 383 | } 384 | 385 | /// 386 | /// 返回基于起始点的角度(0°~360°) 387 | /// 388 | /// 389 | /// 390 | /// 391 | private float GetAngleFromFillOrigin(Vector2 point) 392 | { 393 | var angle = Mathf.Atan2(point.y, point.x) * Mathf.Rad2Deg; //相对于X轴右侧(FillOrigin.Right)的角度 394 | //转换为相对于起始点的角度 395 | switch (_fillOrigin) 396 | { 397 | case Image.Origin360.Bottom: 398 | angle = _clockwise ? 270 - angle : 90 + angle; 399 | break; 400 | case Image.Origin360.Right: 401 | angle = _clockwise ? -angle : angle; 402 | break; 403 | case Image.Origin360.Top: 404 | angle = _clockwise ? 90 - angle : 270 + angle; 405 | break; 406 | case Image.Origin360.Left: 407 | angle = _clockwise ? 180 - angle : 180 + angle; 408 | break; 409 | default: 410 | throw new ArgumentOutOfRangeException(); 411 | } 412 | 413 | //转 360 °表示 414 | if (angle > 360) 415 | { 416 | angle -= 360; 417 | } 418 | 419 | if (angle < 0) 420 | { 421 | angle += 360; 422 | } 423 | 424 | return angle; 425 | } 426 | 427 | /// 428 | /// 返回基于起始点、角度、半径的位置 429 | /// 430 | /// 431 | /// 432 | /// 433 | private Vector2 GetPointFromFillOrigin(ref float angle) 434 | { 435 | //转化为相对于X轴右侧(FillOrigin.Right)的角度 436 | switch (_fillOrigin) 437 | { 438 | case Image.Origin360.Bottom: 439 | angle = _clockwise ? 270 - angle : angle - 90; 440 | break; 441 | case Image.Origin360.Right: 442 | angle = _clockwise ? -angle : angle; 443 | break; 444 | case Image.Origin360.Top: 445 | angle = _clockwise ? 90 - angle : 90 + angle; 446 | break; 447 | case Image.Origin360.Left: 448 | angle = _clockwise ? 180 - angle : 180 + angle; 449 | break; 450 | default: 451 | throw new ArgumentOutOfRangeException(); 452 | } 453 | 454 | var radian = angle * Mathf.Deg2Rad; 455 | return new Vector2(Mathf.Cos(radian) * _radius, Mathf.Sin(radian) * _radius); 456 | } 457 | 458 | private static bool SetStruct(ref T setValue, T value) where T : struct 459 | { 460 | if (EqualityComparer.Default.Equals(setValue, value)) return false; 461 | setValue = value; 462 | return true; 463 | } 464 | 465 | private static bool SetClass(ref T setValue, T value) where T : class 466 | { 467 | if (setValue == null && value == null || setValue != null && setValue.Equals(value)) return false; 468 | setValue = value; 469 | return true; 470 | } 471 | } -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scripts/Core/AnnularSlider.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0af7417cb792fdb4891b6d58e2f3e819 3 | timeCreated: 1605341916 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scripts/Core/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5db2f357e7afd5c4db8fc8886a58324e 3 | folderAsset: yes 4 | timeCreated: 1605341893 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scripts/Core/Editor/AnnularSliderEditor.cs: -------------------------------------------------------------------------------- 1 | /************************************************************************* 2 | * Copyright © 2020 Great1217. All rights reserved. 3 | *------------------------------------------------------------------------ 4 | * File : AnnularSliderEditor.cs 5 | * Description : Null. 6 | *------------------------------------------------------------------------ 7 | * Author : Great1217 8 | * Version : 0.1.0 9 | * Date : 14/11/2020 10 | * Description : Initial development version. 11 | *************************************************************************/ 12 | 13 | using UnityEditor; 14 | using UnityEditor.UI; 15 | 16 | [CustomEditor(typeof(AnnularSlider), true), CanEditMultipleObjects] 17 | public class AnnularSliderEditor : SelectableEditor 18 | { 19 | private SerializedProperty _fillImage; 20 | private SerializedProperty _fillOrigin; 21 | private SerializedProperty _clockwise; 22 | private SerializedProperty _wholeNumbers; 23 | private SerializedProperty _minValue; 24 | private SerializedProperty _maxValue; 25 | private SerializedProperty _maxAngle; 26 | private SerializedProperty _value; 27 | 28 | private SerializedProperty _handleRect; 29 | private SerializedProperty _radius; 30 | private SerializedProperty _towardCenter; 31 | 32 | private SerializedProperty _onValueChanged; 33 | private SerializedProperty _onBeginDragged; 34 | private SerializedProperty _onDragging; 35 | private SerializedProperty _onEndDragged; 36 | 37 | protected override void OnEnable() 38 | { 39 | base.OnEnable(); 40 | _fillImage = serializedObject.FindProperty("_fillImage"); 41 | _fillOrigin = serializedObject.FindProperty("_fillOrigin"); 42 | _clockwise = serializedObject.FindProperty("_clockwise"); 43 | _wholeNumbers = serializedObject.FindProperty("_wholeNumbers"); 44 | _minValue = serializedObject.FindProperty("_minValue"); 45 | _maxValue = serializedObject.FindProperty("_maxValue"); 46 | _maxAngle = serializedObject.FindProperty("_maxAngle"); 47 | _value = serializedObject.FindProperty("_value"); 48 | 49 | _handleRect = serializedObject.FindProperty("_handleRect"); 50 | _radius = serializedObject.FindProperty("_radius"); 51 | _towardCenter = serializedObject.FindProperty("_towardCenter"); 52 | 53 | _onValueChanged = serializedObject.FindProperty("_onValueChanged"); 54 | _onBeginDragged = serializedObject.FindProperty("_onBeginDragged"); 55 | _onDragging = serializedObject.FindProperty("_onDragging"); 56 | _onEndDragged = serializedObject.FindProperty("_onEndDragged"); 57 | } 58 | 59 | public override void OnInspectorGUI() 60 | { 61 | base.OnInspectorGUI(); 62 | serializedObject.Update(); 63 | 64 | EditorGUILayout.Space(); 65 | EditorGUILayout.PropertyField(_fillImage); 66 | if (_fillImage.objectReferenceValue != null) 67 | { 68 | EditorGUI.indentLevel++; 69 | EditorGUILayout.PropertyField(_fillOrigin); 70 | EditorGUILayout.PropertyField(_clockwise); 71 | EditorGUILayout.PropertyField(_wholeNumbers); 72 | EditorGUILayout.PropertyField(_minValue); 73 | EditorGUILayout.PropertyField(_maxValue); 74 | EditorGUILayout.Slider(_maxAngle, 0f, 360f); 75 | EditorGUILayout.Slider(_value, _minValue.floatValue, _maxValue.floatValue); 76 | EditorGUI.indentLevel--; 77 | } 78 | 79 | EditorGUILayout.Space(); 80 | EditorGUILayout.PropertyField(_handleRect); 81 | if (_handleRect.objectReferenceValue != null) 82 | { 83 | EditorGUI.indentLevel++; 84 | EditorGUILayout.PropertyField(_radius); 85 | EditorGUILayout.PropertyField(_towardCenter); 86 | EditorGUI.indentLevel--; 87 | } 88 | 89 | EditorGUILayout.Space(); 90 | EditorGUILayout.PropertyField(_onValueChanged); 91 | EditorGUILayout.PropertyField(_onBeginDragged); 92 | EditorGUILayout.PropertyField(_onDragging); 93 | EditorGUILayout.PropertyField(_onEndDragged); 94 | 95 | serializedObject.ApplyModifiedProperties(); 96 | } 97 | } -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scripts/Core/Editor/AnnularSliderEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4dfd24737139a0d47bfd51fcd271c985 3 | timeCreated: 1605343731 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scripts/Test.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e43abfd6a6ef5c446bcd26c96857d5e1 3 | folderAsset: yes 4 | timeCreated: 1618276956 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scripts/Test/AngleCalculator.cs: -------------------------------------------------------------------------------- 1 | /************************************************************************* 2 | * Copyright © 2021 Great1217. All rights reserved. 3 | *------------------------------------------------------------------------ 4 | * File : Test.cs 5 | * Description : Null. 6 | *------------------------------------------------------------------------ 7 | * Author : Great1217 8 | * Version : 0.1.0 9 | * Date : 13/04/2021 10 | * Description : Initial development version. 11 | *************************************************************************/ 12 | 13 | using UnityEngine; 14 | using UnityEngine.UI; 15 | 16 | public class AngleCalculator : MonoBehaviour 17 | { 18 | [System.Serializable] 19 | public class KeyPoint 20 | { 21 | [SerializeField] private Text _textS0; 22 | [SerializeField] private Text _textS1; 23 | [SerializeField] private Text _textO0; 24 | [SerializeField] private Text _textO1; 25 | private int _angleS0; 26 | private int _angleS1; 27 | private int _angleO0; 28 | private int _angleO1; 29 | 30 | public void Standard_ResetAngle(int index, bool clockwise) 31 | { 32 | var angle = index * 90; //0~270 33 | SetAngle(angle, out _angleS0, out _angleS1, clockwise); 34 | 35 | 36 | _textS0.text = _angleS0.ToString(); 37 | _textS1.text = _angleS1.ToString(); 38 | } 39 | 40 | public void Operation_ResetAngle(int index, bool clockwise) 41 | { 42 | var angle = index * 90; //0~270 43 | SetAngle(angle, out _angleO0, out _angleO1, clockwise); 44 | 45 | _textO0.text = _angleO0.ToString(); 46 | _textO1.text = _angleO1.ToString(); 47 | } 48 | 49 | public void Operation_AddAngleOffset(int offset, bool clockwise) 50 | { 51 | var angle = ClampAngle(_angleO0 + offset); 52 | SetAngle(angle, out _angleO0, out _angleO1, clockwise); 53 | 54 | _textO0.text = _angleO0.ToString(); 55 | _textO1.text = _angleO1.ToString(); 56 | } 57 | 58 | private void SetAngle(int angle, out int angleA, out int angleB, bool clockwise) 59 | { 60 | if (angle == 0 || angle == 360) 61 | { 62 | if (clockwise) 63 | { 64 | angleA = 360; 65 | angleB = 0; 66 | } 67 | else 68 | { 69 | angleA = 0; 70 | angleB = 360; 71 | } 72 | } 73 | else 74 | { 75 | angleA = angleB = angle; 76 | } 77 | } 78 | } 79 | 80 | private const int PointCount = 4; 81 | private readonly int[] PointOrderStandard = {0, 1, 2, 3}; 82 | private readonly int[] PointOrderOperation = {0, 1, 2, 3}; 83 | 84 | [SerializeField] private KeyPoint[] _points = new KeyPoint[PointCount]; 85 | 86 | [Header("standard")] [SerializeField] private Toggle _clockwiseS; 87 | [SerializeField] private Text _clockwiseSText; 88 | [SerializeField] private Toggle _right; 89 | [SerializeField] private Toggle _bottom; 90 | [SerializeField] private Toggle _left; 91 | [SerializeField] private Toggle _top; 92 | 93 | [Header("operation")] [SerializeField] private Toggle _clockwiseO; 94 | [SerializeField] private Text _clockwiseOText; 95 | [SerializeField] private Button _add90; 96 | [SerializeField] private Button _add180; 97 | [SerializeField] private Button _minus90; 98 | [SerializeField] private Button _minus180; 99 | [SerializeField] private Button _reset; 100 | [SerializeField] private Text _debug; 101 | 102 | private Toggle _currentOriginPoint; 103 | 104 | private void Start() 105 | { 106 | _clockwiseS.onValueChanged.AddListener(Standard_ResetClockWise); 107 | _right.onValueChanged.AddListener(b => 108 | { 109 | _currentOriginPoint = _right; 110 | Standard_ResetOriginPoint(b, PointOrderStandard[0]); 111 | }); 112 | _bottom.onValueChanged.AddListener(b => 113 | { 114 | _currentOriginPoint = _bottom; 115 | Standard_ResetOriginPoint(b, PointOrderStandard[1]); 116 | }); 117 | _left.onValueChanged.AddListener(b => 118 | { 119 | _currentOriginPoint = _left; 120 | Standard_ResetOriginPoint(b, PointOrderStandard[2]); 121 | }); 122 | _top.onValueChanged.AddListener(b => 123 | { 124 | _currentOriginPoint = _top; 125 | Standard_ResetOriginPoint(b, PointOrderStandard[3]); 126 | }); 127 | 128 | _clockwiseO.onValueChanged.AddListener(Operation_ResetClockWise); 129 | _add90.onClick.AddListener(() => Operation_AddAngleOffset(90)); 130 | _add180.onClick.AddListener(() => Operation_AddAngleOffset(180)); 131 | _minus90.onClick.AddListener(() => Operation_AddAngleOffset(-90)); 132 | _minus180.onClick.AddListener(() => Operation_AddAngleOffset(-180)); 133 | _reset.onClick.AddListener(Operation_ResetAngle); 134 | 135 | _right.isOn = true; 136 | Operation_ResetAngle(); 137 | } 138 | 139 | /// 140 | /// 标准角度-重置顺时针或逆时针 141 | /// 142 | /// 143 | private void Standard_ResetClockWise(bool clockwise) 144 | { 145 | _clockwiseSText.text = clockwise ? "Clockwise" : "Anticlockwise"; 146 | 147 | //重置顺序 148 | for (int i = 0; i < PointCount; i++) 149 | { 150 | PointOrderStandard[i] = GetClockwiseIndex(PointOrderStandard[i]); 151 | } 152 | 153 | //重置起点 154 | _currentOriginPoint.onValueChanged.Invoke(true); 155 | //重置角度 156 | Operation_ResetAngle(); 157 | } 158 | 159 | /// 160 | /// 标准角度-重置起点 161 | /// 162 | /// 163 | /// 164 | private void Standard_ResetOriginPoint(bool set, int index) 165 | { 166 | if (!set) return; 167 | 168 | var offset = PointCount - index; 169 | for (int i = 0; i < PointCount; i++) 170 | { 171 | var offsetIndex = (i + offset) % PointCount; 172 | _points[PointOrderStandard[i]].Standard_ResetAngle(offsetIndex, _clockwiseS.isOn); 173 | } 174 | } 175 | 176 | /// 177 | /// 操作角度-重置顺时针或逆时针 178 | /// 179 | /// 180 | private void Operation_ResetClockWise(bool clockwise) 181 | { 182 | _clockwiseOText.text = clockwise ? "Clockwise" : "Anticlockwise"; 183 | 184 | //重置顺序 185 | for (int i = 0; i < PointCount; i++) 186 | { 187 | PointOrderOperation[i] = GetClockwiseIndex(PointOrderOperation[i]); 188 | } 189 | 190 | //重置角度 191 | Operation_ResetAngle(); 192 | } 193 | 194 | /// 195 | /// 操作角度-重置角度 196 | /// 重置回最原始(起点为右侧)的角度 197 | /// 198 | private void Operation_ResetAngle() 199 | { 200 | for (int i = 0; i < PointCount; i++) 201 | { 202 | _points[i].Operation_ResetAngle(PointOrderOperation[i], _clockwiseO.isOn); 203 | } 204 | 205 | _debug.text = ""; 206 | } 207 | 208 | /// 209 | /// 操作角度-添加角度偏移 210 | /// 211 | /// 212 | private void Operation_AddAngleOffset(int offset) 213 | { 214 | for (int i = 0; i < PointCount; i++) 215 | { 216 | _points[i].Operation_AddAngleOffset(offset, _clockwiseO.isOn); 217 | } 218 | 219 | if (offset > 0) 220 | { 221 | _debug.text += "+"; 222 | } 223 | 224 | _debug.text += offset.ToString(); 225 | } 226 | 227 | /// 228 | /// 顺时针和逆时针互转 229 | /// 230 | /// 231 | /// 232 | private static int GetClockwiseIndex(int index) 233 | { 234 | return (PointCount - index) % PointCount; 235 | } 236 | 237 | /// 238 | /// 限制角度 239 | /// 240 | /// 241 | /// 242 | private static int ClampAngle(int angle) 243 | { 244 | if (angle < 0) 245 | { 246 | angle += 360; 247 | } 248 | else if (angle > 360) 249 | { 250 | angle -= 360; 251 | } 252 | 253 | return angle; 254 | } 255 | } -------------------------------------------------------------------------------- /Assets/AnnularSlider/Scripts/Test/AngleCalculator.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bdb10229b0901db47b55917e383f958a 3 | timeCreated: 1618277676 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Sprites.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: aea34ffc450be5a44a9e7e724fa03f8a 3 | folderAsset: yes 4 | timeCreated: 1605342176 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Sprites/Annular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/Assets/AnnularSlider/Sprites/Annular.png -------------------------------------------------------------------------------- /Assets/AnnularSlider/Sprites/Annular.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b2e9f75e3d5649f4a92f59df01d985fb 3 | timeCreated: 1605498194 4 | licenseType: Pro 5 | TextureImporter: 6 | fileIDToRecycleName: {} 7 | serializedVersion: 4 8 | mipmaps: 9 | mipMapMode: 0 10 | enableMipMap: 0 11 | sRGBTexture: 1 12 | linearTexture: 0 13 | fadeOut: 0 14 | borderMipMap: 0 15 | mipMapFadeDistanceStart: 1 16 | mipMapFadeDistanceEnd: 3 17 | bumpmap: 18 | convertToNormalMap: 0 19 | externalNormalMap: 0 20 | heightScale: 0.25 21 | normalMapFilter: 0 22 | isReadable: 0 23 | grayScaleToAlpha: 0 24 | generateCubemap: 6 25 | cubemapConvolution: 0 26 | seamlessCubemap: 0 27 | textureFormat: 1 28 | maxTextureSize: 2048 29 | textureSettings: 30 | filterMode: -1 31 | aniso: -1 32 | mipBias: -1 33 | wrapMode: 1 34 | nPOTScale: 0 35 | lightmap: 0 36 | compressionQuality: 50 37 | spriteMode: 1 38 | spriteExtrude: 1 39 | spriteMeshType: 1 40 | alignment: 0 41 | spritePivot: {x: 0.5, y: 0.5} 42 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 43 | spritePixelsToUnits: 100 44 | alphaUsage: 1 45 | alphaIsTransparency: 1 46 | spriteTessellationDetail: -1 47 | textureType: 8 48 | textureShape: 1 49 | maxTextureSizeSet: 0 50 | compressionQualitySet: 0 51 | textureFormatSet: 0 52 | platformSettings: 53 | - buildTarget: DefaultTexturePlatform 54 | maxTextureSize: 2048 55 | textureFormat: -1 56 | textureCompression: 1 57 | compressionQuality: 50 58 | crunchedCompression: 1 59 | allowsAlphaSplitting: 0 60 | overridden: 0 61 | - buildTarget: Standalone 62 | maxTextureSize: 2048 63 | textureFormat: -1 64 | textureCompression: 1 65 | compressionQuality: 50 66 | crunchedCompression: 1 67 | allowsAlphaSplitting: 0 68 | overridden: 0 69 | spriteSheet: 70 | serializedVersion: 2 71 | sprites: [] 72 | outline: [] 73 | spritePackingTag: 74 | userData: 75 | assetBundleName: 76 | assetBundleVariant: 77 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Sprites/Circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/Assets/AnnularSlider/Sprites/Circle.png -------------------------------------------------------------------------------- /Assets/AnnularSlider/Sprites/Circle.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: abd08203399cf824bb1db37dd9861536 3 | timeCreated: 1618280862 4 | licenseType: Pro 5 | TextureImporter: 6 | fileIDToRecycleName: {} 7 | serializedVersion: 4 8 | mipmaps: 9 | mipMapMode: 0 10 | enableMipMap: 0 11 | sRGBTexture: 1 12 | linearTexture: 0 13 | fadeOut: 0 14 | borderMipMap: 0 15 | mipMapFadeDistanceStart: 1 16 | mipMapFadeDistanceEnd: 3 17 | bumpmap: 18 | convertToNormalMap: 0 19 | externalNormalMap: 0 20 | heightScale: 0.25 21 | normalMapFilter: 0 22 | isReadable: 0 23 | grayScaleToAlpha: 0 24 | generateCubemap: 6 25 | cubemapConvolution: 0 26 | seamlessCubemap: 0 27 | textureFormat: 1 28 | maxTextureSize: 2048 29 | textureSettings: 30 | filterMode: -1 31 | aniso: -1 32 | mipBias: -1 33 | wrapMode: 1 34 | nPOTScale: 0 35 | lightmap: 0 36 | compressionQuality: 50 37 | spriteMode: 1 38 | spriteExtrude: 1 39 | spriteMeshType: 1 40 | alignment: 0 41 | spritePivot: {x: 0.5, y: 0.5} 42 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 43 | spritePixelsToUnits: 100 44 | alphaUsage: 1 45 | alphaIsTransparency: 1 46 | spriteTessellationDetail: -1 47 | textureType: 8 48 | textureShape: 1 49 | maxTextureSizeSet: 0 50 | compressionQualitySet: 0 51 | textureFormatSet: 0 52 | platformSettings: 53 | - buildTarget: DefaultTexturePlatform 54 | maxTextureSize: 2048 55 | textureFormat: -1 56 | textureCompression: 1 57 | compressionQuality: 50 58 | crunchedCompression: 1 59 | allowsAlphaSplitting: 0 60 | overridden: 0 61 | - buildTarget: Standalone 62 | maxTextureSize: 2048 63 | textureFormat: -1 64 | textureCompression: 1 65 | compressionQuality: 50 66 | crunchedCompression: 1 67 | allowsAlphaSplitting: 0 68 | overridden: 0 69 | spriteSheet: 70 | serializedVersion: 2 71 | sprites: [] 72 | outline: [] 73 | spritePackingTag: 74 | userData: 75 | assetBundleName: 76 | assetBundleVariant: 77 | -------------------------------------------------------------------------------- /Assets/AnnularSlider/Sprites/Handle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/Assets/AnnularSlider/Sprites/Handle.png -------------------------------------------------------------------------------- /Assets/AnnularSlider/Sprites/Handle.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d4469449e3cb0564d995ec1733121953 3 | timeCreated: 1605505107 4 | licenseType: Pro 5 | TextureImporter: 6 | fileIDToRecycleName: {} 7 | serializedVersion: 4 8 | mipmaps: 9 | mipMapMode: 0 10 | enableMipMap: 0 11 | sRGBTexture: 1 12 | linearTexture: 0 13 | fadeOut: 0 14 | borderMipMap: 0 15 | mipMapFadeDistanceStart: 1 16 | mipMapFadeDistanceEnd: 3 17 | bumpmap: 18 | convertToNormalMap: 0 19 | externalNormalMap: 0 20 | heightScale: 0.25 21 | normalMapFilter: 0 22 | isReadable: 0 23 | grayScaleToAlpha: 0 24 | generateCubemap: 6 25 | cubemapConvolution: 0 26 | seamlessCubemap: 0 27 | textureFormat: 1 28 | maxTextureSize: 2048 29 | textureSettings: 30 | filterMode: -1 31 | aniso: -1 32 | mipBias: -1 33 | wrapMode: 1 34 | nPOTScale: 0 35 | lightmap: 0 36 | compressionQuality: 50 37 | spriteMode: 1 38 | spriteExtrude: 1 39 | spriteMeshType: 1 40 | alignment: 0 41 | spritePivot: {x: 0.5, y: 0.5} 42 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 43 | spritePixelsToUnits: 100 44 | alphaUsage: 1 45 | alphaIsTransparency: 1 46 | spriteTessellationDetail: -1 47 | textureType: 8 48 | textureShape: 1 49 | maxTextureSizeSet: 0 50 | compressionQualitySet: 0 51 | textureFormatSet: 0 52 | platformSettings: 53 | - buildTarget: DefaultTexturePlatform 54 | maxTextureSize: 2048 55 | textureFormat: -1 56 | textureCompression: 1 57 | compressionQuality: 50 58 | crunchedCompression: 1 59 | allowsAlphaSplitting: 0 60 | overridden: 0 61 | - buildTarget: Standalone 62 | maxTextureSize: 2048 63 | textureFormat: -1 64 | textureCompression: 1 65 | compressionQuality: 50 66 | crunchedCompression: 1 67 | allowsAlphaSplitting: 0 68 | overridden: 0 69 | spriteSheet: 70 | serializedVersion: 2 71 | sprites: [] 72 | outline: [] 73 | spritePackingTag: 74 | userData: 75 | assetBundleName: 76 | assetBundleVariant: 77 | -------------------------------------------------------------------------------- /ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/ProjectSettings/AudioManager.asset -------------------------------------------------------------------------------- /ProjectSettings/ClusterInputManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/ProjectSettings/ClusterInputManager.asset -------------------------------------------------------------------------------- /ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/ProjectSettings/DynamicsManager.asset -------------------------------------------------------------------------------- /ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/ProjectSettings/EditorBuildSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/ProjectSettings/EditorSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/ProjectSettings/GraphicsSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/ProjectSettings/InputManager.asset -------------------------------------------------------------------------------- /ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/ProjectSettings/NavMeshAreas.asset -------------------------------------------------------------------------------- /ProjectSettings/NetworkManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/ProjectSettings/NetworkManager.asset -------------------------------------------------------------------------------- /ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/ProjectSettings/Physics2DSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/ProjectSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/ProjectSettings/ProjectSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 5.6.6f2 2 | -------------------------------------------------------------------------------- /ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/ProjectSettings/QualitySettings.asset -------------------------------------------------------------------------------- /ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/ProjectSettings/TagManager.asset -------------------------------------------------------------------------------- /ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/ProjectSettings/TimeManager.asset -------------------------------------------------------------------------------- /ProjectSettings/UnityConnectSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GREAT1217/Unity_AnnularSlider/18f885fcb4d9b589a500321a1e26f9e6e2b7c13c/ProjectSettings/UnityConnectSettings.asset -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Unity_AnnularSlider 2 | > - [**ReadMe**](https://blog.csdn.net/GREAT1217/article/details/109961096) 3 | > - **ContactMe:** tenstars@foxmail.com 4 | --------------------------------------------------------------------------------