Unity中如何将矩形Sprite转换为圆形显示?
将Sprite转为圆形显示的几种实用方法
下面是几种能快速实现Sprite圆形显示的方案,按需选择:
方法一:使用Mask遮罩(最简单直观)
- 创建一个圆形Image作为遮罩:
- 在Sprite所在的GameObject下新建一个Image对象
- 给这个Image选择圆形Sprite(或用代码生成圆形纹理),颜色随意(遮罩仅识别Alpha通道)
- 给该Image添加
Mask组件,取消勾选「Show Mask Graphic」(避免遮罩图形本身显示)
- 将头像Sprite所在的Image/SpriteRenderer放到Mask对象的子节点下,确保两者RectTransform的大小、位置完全对齐
- 完成设置后,仅遮罩圆形区域内的Sprite内容会显示,外部将被自动裁剪
方法二:使用自定义Shader(性能更优,适合大量头像场景)
如果项目中存在大量圆形头像,Shader方案比Mask性能更出色(Mask会额外增加Draw Call),以下是基础圆形裁剪Shader:
Shader "Custom/CircleSprite" { Properties { _MainTex ("Sprite Texture", 2D) = "white" {} _Color ("Tint", Color) = (1,1,1,1) _Radius ("Circle Radius", Range(0, 0.5)) = 0.5 _Center ("Circle Center", Vector) = (0.5,0.5,0,0) } SubShader { Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" "CanUseSpriteAtlas"="True" } Cull Off Lighting Off ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata_t { float4 vertex : POSITION; float4 color : COLOR; float2 texcoord : TEXCOORD0; }; struct v2f { float4 vertex : SV_POSITION; fixed4 color : COLOR; float2 texcoord : TEXCOORD0; }; fixed4 _Color; sampler2D _MainTex; float _Radius; float2 _Center; v2f vert(appdata_t IN) { v2f OUT; OUT.vertex = UnityObjectToClipPos(IN.vertex); OUT.texcoord = IN.texcoord; OUT.color = IN.color * _Color; return OUT; } fixed4 frag(v2f IN) : SV_Target { fixed4 col = tex2D(_MainTex, IN.texcoord) * IN.color; float2 dist = IN.texcoord - _Center; float len = length(dist); col.a *= step(len, _Radius); return col; } ENDCG } } }
使用步骤:
- 将上述代码保存为
CircleSprite.shader并导入Unity - 给Sprite对应的材质选择该自定义Shader
- 在材质面板调整
Circle Radius和Center参数,适配头像尺寸
方法三:代码裁剪纹理(适合需要导出圆形纹理的场景)
如果需要直接生成圆形纹理文件而非实时裁剪,可使用C#代码处理:
using UnityEngine; using System.IO; public class SpriteCircleCutter : MonoBehaviour { public Sprite originalSprite; public float circleRadius = 0.5f; public Vector2 circleCenter = new Vector2(0.5f, 0.5f); public void CutToCircle() { Texture2D originalTex = originalSprite.texture; Texture2D circleTex = new Texture2D(originalTex.width, originalTex.height, TextureFormat.RGBA32, false); for (int x = 0; x < originalTex.width; x++) { for (int y = 0; y < originalTex.height; y++) { float uvX = (float)x / originalTex.width; float uvY = (float)y / originalTex.height; float dist = Vector2.Distance(new Vector2(uvX, uvY), circleCenter); Color pixelColor = originalTex.GetPixel(x, y); if (dist > circleRadius) { pixelColor.a = 0; } circleTex.SetPixel(x, y, pixelColor); } } circleTex.Apply(); Sprite circleSprite = Sprite.Create(circleTex, originalSprite.rect, originalSprite.pivot); GetComponent<SpriteRenderer>().sprite = circleSprite; // 可选:保存纹理到本地 // byte[] bytes = circleTex.EncodeToPNG(); // File.WriteAllBytes(Application.persistentDataPath + "/circle_avatar.png", bytes); } }
使用步骤:
- 将脚本挂载到带有SpriteRenderer的GameObject上
- 赋值
originalSprite,调整参数后调用CutToCircle()方法即可完成裁剪
内容的提问来源于stack exchange,提问作者Jerrox
相关产品推荐
相关产品推荐

