| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- using System;
- using UnityEngine;
- using UnityEngine.UI;
- namespace JCUnityLib.UI
- {
- [ExecuteAlways]
- [RequireComponent(typeof(Image))]
- public class RectBorder : MonoBehaviour
- {
- const string _SHADER_NAME = "JC/UI/RectBorder";
- RectTransform _rectTransform;
- Image _image;
- public float borderRaduis = 20;
- public RectBorderRadiusSwitch borderRadiusSwitch = new RectBorderRadiusSwitch(true, true, true, true);
- public float borderWidth = 2;
- public Color borderColor = Color.black;
- void Update()
- {
- if (!_rectTransform) _rectTransform = GetComponent<RectTransform>();
- if (!_image) _image = GetComponent<Image>();
- if (_image.material == null || _image.material.shader.name != _SHADER_NAME)
- _image.material = new Material(Shader.Find(_SHADER_NAME));
- Material imageMaterial = _image.material;
- if (!imageMaterial) return;
- imageMaterial.SetFloat("_NodeWidth", _rectTransform.rect.width);
- imageMaterial.SetFloat("_NodeHeight", _rectTransform.rect.height);
- imageMaterial.SetFloat("_BorderRadius", borderRaduis);
- imageMaterial.SetFloat("_BorderWidth", borderWidth);
- imageMaterial.SetColor("_BorderColor", borderColor);
- int borderRadiusSwitchVal = 0;
- if (borderRadiusSwitch.LeftTop) borderRadiusSwitchVal += 1;
- if (borderRadiusSwitch.RightTop) borderRadiusSwitchVal += 2;
- if (borderRadiusSwitch.RightBottom) borderRadiusSwitchVal += 4;
- if (borderRadiusSwitch.LeftBottom) borderRadiusSwitchVal += 8;
- imageMaterial.SetInt("_BorderRadiusSwitch", borderRadiusSwitchVal);
- }
- }
- [Serializable]
- public struct RectBorderRadiusSwitch
- {
- public bool LeftTop;
- public bool RightTop;
- public bool RightBottom;
- public bool LeftBottom;
- public RectBorderRadiusSwitch(bool lt = true, bool rt = true, bool rb = true, bool lb = true)
- {
- LeftTop = lt;
- RightTop = rt;
- RightBottom = rb;
- LeftBottom = lb;
- }
- }
- }
|