RectBorder.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.UI;
  4. namespace JCUnityLib.UI
  5. {
  6. [ExecuteAlways]
  7. [RequireComponent(typeof(Image))]
  8. public class RectBorder : MonoBehaviour
  9. {
  10. const string _SHADER_NAME = "JC/UI/RectBorder";
  11. RectTransform _rectTransform;
  12. Image _image;
  13. public float borderRaduis = 20;
  14. public RectBorderRadiusSwitch borderRadiusSwitch = new RectBorderRadiusSwitch(true, true, true, true);
  15. public float borderWidth = 2;
  16. public Color borderColor = Color.black;
  17. void Update()
  18. {
  19. if (!_rectTransform) _rectTransform = GetComponent<RectTransform>();
  20. if (!_image) _image = GetComponent<Image>();
  21. if (_image.material == null || _image.material.shader.name != _SHADER_NAME)
  22. _image.material = new Material(Shader.Find(_SHADER_NAME));
  23. Material imageMaterial = _image.material;
  24. if (!imageMaterial) return;
  25. imageMaterial.SetFloat("_NodeWidth", _rectTransform.rect.width);
  26. imageMaterial.SetFloat("_NodeHeight", _rectTransform.rect.height);
  27. imageMaterial.SetFloat("_BorderRadius", borderRaduis);
  28. imageMaterial.SetFloat("_BorderWidth", borderWidth);
  29. imageMaterial.SetColor("_BorderColor", borderColor);
  30. int borderRadiusSwitchVal = 0;
  31. if (borderRadiusSwitch.LeftTop) borderRadiusSwitchVal += 1;
  32. if (borderRadiusSwitch.RightTop) borderRadiusSwitchVal += 2;
  33. if (borderRadiusSwitch.RightBottom) borderRadiusSwitchVal += 4;
  34. if (borderRadiusSwitch.LeftBottom) borderRadiusSwitchVal += 8;
  35. imageMaterial.SetInt("_BorderRadiusSwitch", borderRadiusSwitchVal);
  36. }
  37. }
  38. [Serializable]
  39. public struct RectBorderRadiusSwitch
  40. {
  41. public bool LeftTop;
  42. public bool RightTop;
  43. public bool RightBottom;
  44. public bool LeftBottom;
  45. public RectBorderRadiusSwitch(bool lt = true, bool rt = true, bool rb = true, bool lb = true)
  46. {
  47. LeftTop = lt;
  48. RightTop = rt;
  49. RightBottom = rb;
  50. LeftBottom = lb;
  51. }
  52. }
  53. }