ArenMook

Circular widget in NGUI

May 18th, 2023 (edited)
1,444
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.10 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3.  
  4. public class CustomSprite : UISprite
  5. {
  6.     public override void OnFill (List<Vector3> verts, List<Vector2> uvs, List<Color> cols)
  7.     {
  8.         var tex = mainTexture;
  9.         if (tex == null) return;
  10.         if (mSprite == null && GetAtlasSprite() == null) return;
  11.  
  12.         var outer = new Rect(mSprite.x, mSprite.y, mSprite.width, mSprite.height);
  13.         var inner = new Rect(mSprite.x + mSprite.borderLeft, mSprite.y + mSprite.borderTop,
  14.             mSprite.width - mSprite.borderLeft - mSprite.borderRight,
  15.             mSprite.height - mSprite.borderBottom - mSprite.borderTop);
  16.  
  17.         outer = NGUIMath.ConvertToTexCoords(outer, tex.width, tex.height);
  18.         inner = NGUIMath.ConvertToTexCoords(inner, tex.width, tex.height);
  19.  
  20.         var uv0 = new Vector2(inner.xMin, outer.yMin);
  21.         var uv1 = new Vector2(inner.xMax, outer.yMax);
  22.  
  23.         var offset = verts.Count;
  24.         var po = pivotOffset;
  25.         var x0 = -po.x * mWidth;
  26.         var y0 = -po.y * mHeight;
  27.         var x1 = x0 + mWidth;
  28.         var y1 = y0 + mHeight;
  29.  
  30.         var v = new Vector4(x0, y0, x1, y1);
  31.         var c = drawingColor;
  32.         var centerV = new Vector3((v.x + v.z) * 0.5f, (v.y + v.w) * 0.5f, 0f);
  33.  
  34.         const float c_thickness = 0.1f;
  35.         const int c_slices = 90;
  36.  
  37.         var pi2 = Mathf.PI * 2f;
  38.  
  39.         for (int i = 0; i < c_slices; ++i)
  40.         {
  41.             var a0 = ((float)i / c_slices) * pi2;
  42.             var a1 = ((float)(i + 1) / c_slices) * pi2;
  43.  
  44.             var c0 = Mathf.Cos(a0) * 0.5f + 0.5f;
  45.             var c1 = Mathf.Cos(a1) * 0.5f + 0.5f;
  46.             var s0 = Mathf.Sin(a0) * 0.5f + 0.5f;
  47.             var s1 = Mathf.Sin(a1) * 0.5f + 0.5f;
  48.  
  49.             var v0 = new Vector3(Mathf.Lerp(v.x, v.z, c0), Mathf.Lerp(v.y, v.w, s0), 0f);
  50.             var v1 = new Vector3(Mathf.Lerp(v.x, v.z, c1), Mathf.Lerp(v.y, v.w, s1), 0f);
  51.             var v2 = Vector3.Lerp(v0, centerV, c_thickness);
  52.             var v3 = Vector3.Lerp(v1, centerV, c_thickness);
  53.  
  54.             verts.Add(v0);
  55.             verts.Add(v2);
  56.             verts.Add(v3);
  57.             verts.Add(v1);
  58.  
  59.             uvs.Add(uv1);
  60.             uvs.Add(new Vector2(uv1.x, uv0.y));
  61.             uvs.Add(uv0);
  62.             uvs.Add(new Vector2(uv0.x, uv1.y));
  63.  
  64.             for (int b = 0; b < 4; ++b) cols.Add(c);
  65.         }
  66.  
  67.         if (onPostFill != null) onPostFill(this, offset, verts, uvs, cols);
  68.     }
  69. }
  70.  
Advertisement
Comments
Add Comment
Please, Sign In to add comment