【Unity】代码创建扇形圆环Sprite

需要扇形或扇形圆环的时候,在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));
    }
}
发布了104 篇原创文章 · 获赞 74 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_39108767/article/details/105444520