NicerOutline.cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using System.Collections.Generic;
  4. [AddComponentMenu("UI/Effects/Nicer Outline", 15)]
  5. public class NicerOutline : BaseMeshEffect
  6. {
  7. [SerializeField] private Color effectColor = new Color(0f, 0f, 0f, 1f);
  8. [SerializeField] private float effectDistanceX = 2f;
  9. [SerializeField] private float effectDistanceY = 2f;
  10. [Range(4,12)] [SerializeField] private int samplingRate = 10;
  11. private static readonly List<UIVertex> vertexList = new List<UIVertex>();
  12. private static readonly List<UIVertex> tempVertexList = new List<UIVertex>();
  13. public override void ModifyMesh(VertexHelper vh)
  14. {
  15. if (!IsActive()) return;
  16. vertexList.Clear();
  17. tempVertexList.Clear();
  18. vh.GetUIVertexStream(vertexList);
  19. int count = vertexList.Count;
  20. for (int j = 0; j < samplingRate; j++)
  21. {
  22. for (int i = 0; i < count; i++)
  23. {
  24. UIVertex v = vertexList[i];
  25. float angle = j * Mathf.PI * 2f / samplingRate;
  26. Vector2 offset = new Vector2(Mathf.Cos(angle) * effectDistanceX, Mathf.Sin(angle) * effectDistanceY);
  27. UIVertex outlinedVert = new UIVertex();
  28. outlinedVert.position = v.position + (Vector3)offset;
  29. outlinedVert.normal = v.normal;
  30. outlinedVert.tangent = v.tangent;
  31. outlinedVert.uv0 = v.uv0;
  32. outlinedVert.uv1 = v.uv1;
  33. outlinedVert.color = effectColor;
  34. tempVertexList.Add(outlinedVert);
  35. }
  36. }
  37. tempVertexList.AddRange(vertexList);
  38. vh.Clear();
  39. vh.AddUIVertexTriangleStream(tempVertexList);
  40. }
  41. }