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(); if (!_image) _image = GetComponent(); 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; } } }