需要扇形或扇形圆环的时候,在UGUI中,可以直接使用扇形的图片,也可以给Image添加一张圆形或圆环的图片,ImageType设置为Filled模式,FillMethod选择Radial360,动态调整扇形角度实现扇形的圆或圆环。
在2D的Sprite中,SpriteRenderer 组件不能动态调整扇形角度甚至直径,下面代码是动态生成指定半径/角度的扇形圆环sprite:
public class CircleSpriteTest : MonoBehaviour
{
//空白区域色值
[SerializeField] Color emptyColor = new Color(0, 0, 0, 0);
//圆环区域色值
[SerializeField] Color testCircleColor = new Color(1, 0, 0, 0.5f);
//圆环内径/外径
[SerializeField] int testMinRadius = 80;
[SerializeField] int testMaxRadius = 100;
//扇形角度
[SerializeField] float testCircleAngle = 90;
SpriteRenderer spriteRender;
private void Awake()
{
spriteRender = GetComponent<SpriteRenderer>();
if (spriteRender == null)
spriteRender = gameObject.AddComponent<SpriteRenderer>();
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
spriteRender.sprite = CreateSprite(testMinRadius, testMaxRadius, testCircleAngle / 2, testCircleColor);
}
/// <summary>
/// 绘制扇形圆环,生成Sprite
/// </summary>
/// <param name="minRadius">圆环内径,值为0即是实心圆</param>
/// <param name="maxRadius">圆环外径</param>
/// <param name="circleAngle">1/2扇形弧度,值>=180度即是整园</param>
Sprite CreateSprite(int minRadius, int maxRadius, float halfAngle, Color circleColor)
{
//图片尺寸
int spriteSize = maxRadius * 2;
//创建Texture2D
Texture2D texture2D = new Texture2D(spriteSize, spriteSize);
//图片中心像素点坐标
Vector2 centerPixel = new Vector2(spriteSize / 2, spriteSize / 2);
//
Vector2 tempPixel;
float tempAngle, tempDisSqr;
if (halfAngle > 0 && halfAngle < 360)
{
//遍历像素点,绘制扇形圆环
for (int x = 0; x < spriteSize; x++)
{
for (int y = 0; y < spriteSize; y++)
{
//以中心作为起点,获取像素点向量
tempPixel.x = x - centerPixel.x;
tempPixel.y = y - centerPixel.y;
//是否在半径范围内
tempDisSqr = tempPixel.sqrMagnitude;
if (tempDisSqr >= minRadius * minRadius && tempDisSqr <= maxRadius * maxRadius)
{
//是否在角度范围内
tempAngle = Vector2.Angle(Vector2.up, tempPixel);
if (tempAngle < halfAngle || tempAngle > 360 - halfAngle)
{
//设置像素色值
texture2D.SetPixel(x, y, circleColor);
continue;
}
}
//设置为透明
texture2D.SetPixel(x, y, emptyColor);
}
}
}
else
{
//遍历像素点,绘制圆环
for (int x = 0; x < spriteSize; x++)
{
for (int y = 0; y < spriteSize; y++)
{
//以中心作为起点,获取像素点向量
tempPixel.x = x - centerPixel.x;
tempPixel.y = y - centerPixel.y;
//是否在半径范围内
tempDisSqr = tempPixel.sqrMagnitude;
if (tempDisSqr >= minRadius * minRadius && tempDisSqr <= maxRadius * maxRadius)
{
//设置像素色值
texture2D.SetPixel(x, y, circleColor);
continue;
}
//设置为透明
texture2D.SetPixel(x, y, emptyColor);
}
}
}
texture2D.Apply();
//创建Sprite
return Sprite.Create(texture2D, new Rect(0, 0, spriteSize, spriteSize), new Vector2(0.5f, 0.5f));
}
}