默认设置导入图片为 Sprite
在项目路径下新建文件夹 Assets/Editor 创建DefaultSpriteImporter.cs
using UnityEditor;
public class DefaultSpriteImporter : AssetPostprocessor{ void OnPreprocessTexture() { // 获取当前 Texture 的导入器 TextureImporter importer = (TextureImporter)assetImporter;
// 设置默认类型为 Sprite importer.textureType = TextureImporterType.Sprite; }}
也可以批量选中更改
Image和RawImage的区别
Image和RawImage都是用来显示图片的组件,但是它们的区别在于:
- Image:Image组件仅支持Sprite类型资源(如精灵图或图集中的子图),可以设置图片的缩放模式,拉伸、填充、适应等,并且可以设置图片的颜色。
- RawImage:RawImage组件只能显示原始图片,不支持缩放、拉伸、填充等操作,并且只能显示纯色。
性能与适用场景:
- Image:推荐用于常规UI元素(按钮、图标等),尤其是需要图集优化、九宫格适配或填充动画的场景
- RawImage:适用于需动态更新纹理的场景(如AR/VR中的实时图像、背景图),或需要直接操作Texture的底层需求。
Image的各个属性
Source Image:设置图片资源,可以是Sprite类型资源,也可以是Texture类型资源。
Color:设置图片的颜色。
Meterial:设置图片的材质。
Raycast Target:设置图片是否可以被射线检测。
Raycast Padding:设置图片的射线检测范围。
Maskable:设置图片是否可以蒙版。
Image Type:设置图片的类型,可以是Simple、Sliced、Tiled、Filled。
- Simple:图片不做任何处理,显示原图。
- Use Sprite Mesh:勾选后,图片会使用精灵网格,可以减少绘制的面数,提高性能。
- Preserve Aspect Ratio:勾选后,图片会保持纵横比,不失真。
- Sliced:图片被切割成多张小图,可以设置切割方向、间隔、填充等。 (点击Sprite, 在Inspector中点击Sprite Editor)
- Pixeles Per Unit:设置每单位像素的切割数量。
- Tiled:图片平铺,可以设置平铺方向、间隔、填充等。
- Filled:图片被填充成矩形,可以设置填充方向、间隔、填充等。
RawImage的属性
Texture:设置图片资源,只能是Texture类型资源。
Color:设置图片的颜色。
Meterial:设置图片的材质。
Raycast Target:设置图片是否可以被射线检测。
Raycast Padding:设置图片的射线检测范围。
Maskable:设置图片是否可以蒙版。
UV Rect:设置图片的UV范围。
圆形头像 (推荐)
github:https://github.com/kirevdokimov/Unity-UI-Rounded-Corners/tree/master
先添加Image/RawImage组件, 然后添加ImageWithRoundedCorners组件。
ImageWithIndependentRoundedCorners 可以分别设置4个角的圆角。
使用shader实现圆形头像 (可以用来学习shader的编写)
-
创建shader文件 放入 Assets/Resources/Shaders/RoundShape.shader shader 文件在最下面
-
创建材质文件 Round Material, 放入 Assets/Resources/Materials
-
打开材质文件,选择shader为 UI/RoundShape
-
创建图片组件,设置材质。
Shader "UI/RoundShape"{ Properties { [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} _Color ("Tint", Color) = (1,1,1,1)
_RoundRadius("Round Radius", Range(0,0.5)) = 0.5 _Width("Width", Float) = 100 _Height("Height", Float) = 100 }
SubShader { Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" "CanUseSpriteAtlas"="True" }
Stencil { Ref [_Stencil] Comp [_StencilComp] Pass [_StencilOp] ReadMask [_StencilReadMask] WriteMask [_StencilWriteMask] }
Cull Off Lighting Off ZWrite Off Blend SrcAlpha OneMinusSrcAlpha
Pass { Name "Default" CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 2.0
#include "UnityCG.cginc" #include "UnityUI.cginc"
#pragma multi_compile __ UNITY_UI_ALPHACLIP
struct appdata_t { float4 vertex : POSITION; float4 color : COLOR; float2 texcoord : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID };
struct v2f { float4 vertex : SV_POSITION; fixed4 color : COLOR; float2 texcoord : TEXCOORD0; float4 worldPosition : TEXCOORD1; UNITY_VERTEX_OUTPUT_STEREO };
fixed4 _Color; fixed4 _TextureSampleAdd; float4 _MainTex_ST; float4 _ClipRect; float _RoundRadius; float _Width; float _Height;
v2f vert(appdata_t IN) { v2f OUT; UNITY_SETUP_INSTANCE_ID(IN); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT); OUT.worldPosition = IN.vertex; OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);
//OUT.texcoord = IN.texcoord; OUT.texcoord = TRANSFORM_TEX(IN.texcoord, _MainTex); OUT.color = IN.color * _Color; return OUT; }
sampler2D _MainTex;
fixed4 frag(v2f IN) : SV_Target { half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;
color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
#ifdef UNITY_UI_ALPHACLIP clip (color.a - 0.001); #endif
float aspect = _Height/_Width;
float2 center = float2(abs(round(IN.texcoord.x) - _RoundRadius*aspect),abs(round(IN.texcoord.y) - _RoundRadius)); float dis = distance(fixed2(IN.texcoord.x * _Width,IN.texcoord.y * _Height),fixed2(center.x * _Width,center.y * _Height));
float pwidth = fwidth(dis); float alpha = saturate((_RoundRadius * _Height - dis) / pwidth);
//float alpha = step(dis,_RoundRadius * _Height); float a = color.a* alpha;
float oy = max(step(IN.texcoord.y,_RoundRadius),step((1-_RoundRadius),IN.texcoord.y)); float ox = max(step(IN.texcoord.x,_RoundRadius*aspect),step((1-_RoundRadius*aspect),IN.texcoord.x)); color.a = ox * (oy * a + (1-oy) * color.a) + (1-ox) * color.a;
return color;
} ENDCG } }}