usingSystem;
usingUnityEngine;
usingUnityEngine.UI;
publicclassUICircle:RawImage
{
constintFILL_PERCENT=100;
floatthickness=5;
[SerializeField][Range(4,360)]
int_segments=36;
publicintsegments{
get{return_segments;}
set{
if(_segments!=value){
_segments=value;
SetVerticesDirty();
#if
UNITY_EDITOR
UnityEditor.EditorUtility.SetDirty(transform);
#endif
}
}
}
protectedoverridevoidOnRectTransformDimensionsChange()
{
base.OnRectTransformDimensionsChange();
this.thickness=(float)Mathf.Clamp(this.thickness,0,rectTransform.rect.width/2);
}
protectedoverridevoidOnPopulateMesh(VertexHelpervh)
{
floatouter=-rectTransform.pivot.x
*rectTransform.rect.width;
floatinner=-rectTransform.pivot.x
*rectTransform.rect.width+this.thickness;
vh.Clear();
Vector2prevX=Vector2.zero;
Vector2prevY=Vector2.zero;
Vector2uv0=newVector2(0,0);
Vector2uv1=newVector2(0,1);
Vector2uv2=newVector2(1,1);
Vector2uv3=newVector2(1,0);
Vector2pos0;
Vector2pos1;
Vector2pos2;
Vector2pos3;
floattw=rectTransform.rect.width;
floatth=rectTransform.rect.height;
floatangleByStep=(FILL_PERCENT/100f*(Mathf.PI
*2f))/segments;
floatcurrentAngle=0f;
for(inti=0;i<segments+1;i++)
{
floatc=Mathf.Cos(currentAngle);
floats=Mathf.Sin(currentAngle);
StepThroughPointsAndFill(outer,inner,refprevX,refprevY,outpos0,outpos1,outpos2,outpos3,c,s);
uv0=newVector2(pos0.x/tw+0.5f,pos0.y/th+0.5f);
uv1=newVector2(pos1.x/tw+0.5f,pos1.y/th+0.5f);
uv2=newVector2(pos2.x/tw+0.5f,pos2.y/th+0.5f);
uv3=newVector2(pos3.x/tw+0.5f,pos3.y/th+0.5f);
vh.AddUIVertexQuad(SetVbo(new[]{pos0,pos1,pos2,pos3},new[]{uv0,uv1,uv2,uv3}));
currentAngle+=angleByStep;
}
}
privatevoidStepThroughPointsAndFill(floatouter,floatinner,refVector2prevX,refVector2prevY,outVector2pos0,outVector2pos1,outVector2pos2,outVector2pos3,floatc,floats)
{
pos0=prevX;
pos1=newVector2(outer
*c,outer
*s);
pos2=Vector2.zero;
pos3=Vector2.zero;
prevX=pos1;
prevY=pos2;
}
protectedUIVertex[]SetVbo(Vector2[]vertices,Vector2[]uvs)
{
UIVertex[]vbo=newUIVertex[4];
for(inti=0;i<vertices.Length;i++)
{
varvert=UIVertex.simpleVert;
vert.color=color;
vert.position=vertices[i];
vert.uv0=uvs[i];
vbo[i]=vert;
}
returnvbo;
}
}