ValidateJigsaw.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. namespace JCUnityLib.UI
  6. {
  7. [ExecuteAlways]
  8. [RequireComponent(typeof(Image))]
  9. public class ValidateJigsaw : MonoBehaviour
  10. {
  11. const string _SHADER_NAME = "JC/UI/ValidateJigsaw";
  12. RectTransform _rectTransform;
  13. Image _image;
  14. public Color gapColor = Color.black;
  15. public Color gapBorderColor = Color.white;
  16. public float gapBorderWidth = 0.5f;
  17. public float gapSize = 20;
  18. public Vector2 originalPosition = new Vector2(40, 40);
  19. public Vector2 currentPosition = new Vector2(10, 40);
  20. void Update()
  21. {
  22. if (!_rectTransform) _rectTransform = GetComponent<RectTransform>();
  23. if (!_image) _image = GetComponent<Image>();
  24. if (_image.material == null || _image.material.shader.name != _SHADER_NAME)
  25. _image.material = new Material(Shader.Find(_SHADER_NAME));
  26. Material imageMaterial = _image.material;
  27. if (!imageMaterial) return;
  28. imageMaterial.SetFloat("_NodeWidth", _rectTransform.rect.width);
  29. imageMaterial.SetFloat("_NodeHeight", _rectTransform.rect.height);
  30. imageMaterial.SetColor("_GapColor", gapColor);
  31. imageMaterial.SetColor("_GapBorderColor", gapBorderColor);
  32. imageMaterial.SetFloat("_GapBorderWidth", gapBorderWidth);
  33. imageMaterial.SetFloat("_GapSize", gapSize);
  34. imageMaterial.SetVector("_OriginalPosition", originalPosition);
  35. imageMaterial.SetVector("_CurrentPosition", currentPosition);
  36. }
  37. public void SetCurrentPositionByPercent(float value)
  38. {
  39. currentPosition.x = (_rectTransform.rect.width - gapSize) * value;
  40. }
  41. public void InitRandomPosition()
  42. {
  43. if (!_rectTransform) _rectTransform = GetComponent<RectTransform>();
  44. float minX = _rectTransform.rect.width * 0.2f + gapSize;
  45. float maxX = _rectTransform.rect.width * 0.9f - gapSize;
  46. float minY = _rectTransform.rect.height * 0.1f;
  47. float maxY = _rectTransform.rect.height * 0.9f - gapSize;
  48. originalPosition.x = minX + (maxX - minX) * Random.value;
  49. originalPosition.y = minY + (maxY - minY) * Random.value;
  50. currentPosition.x = 0;
  51. currentPosition.y = originalPosition.y;
  52. }
  53. public bool IsFit()
  54. {
  55. if (!_rectTransform) _rectTransform = GetComponent<RectTransform>();
  56. return Mathf.Abs(currentPosition.x - originalPosition.x) / (_rectTransform.rect.width - gapSize) < 0.0125;
  57. }
  58. }
  59. }