我写了以下脚本:
public class SpriteUV : MonoBehaviour
{
private SpriteRenderer _spriteRenderer;
private Sprite _sprite;
[SerializeField] public Vector2[] _uv = new Vector2 [4]
{
new Vector2(0.4f, 0.5f),
new Vector2(0.6f, 0.5f),
new Vector2(0.4f, 0.35f),
new Vector2(0.6f, 0.35f)
};
void Start ()
{
_spriteRenderer = GetComponent<SpriteRenderer>();
_sprite = _spriteRenderer.sprite;
}
// Update is called once per frame
void Update ()
{
_sprite.uv = _uv;
}
}
但是这有一个错误,它表明
Sprite.uv
没有设置器(从 文档 中不明显)我如何更改精灵以映射纹理的不同部分?
这是一个与
SpriteRenderer
一起使用的解决方案,用于至少选择要显示的 Sprite 的矩形部分。 (如果您需要完全不同的映射,程序员如何在评论中正确地指出这不能“变形”您的 UV。)
新建一个Shader并命名为
BlendVertexColorWithUV
在 VisualStudio(或任何文本编辑器)中打开它并输入以下代码
来源
// unlit, vertex color, alpha blended, offset uv's
// cull off
Shader "BlendVertexColorWithUV"
{
Properties
{
_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
}
SubShader
{
Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
ZWrite Off Lighting Off Cull Off Fog { Mode Off } Blend SrcAlpha OneMinusSrcAlpha
LOD 110
Pass
{
CGPROGRAM
#pragma vertex vert_vct
#pragma fragment frag_mult
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
struct vin_vct
{
float4 vertex : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD0;
};
struct v2f_vct
{
float4 vertex : POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
};
v2f_vct vert_vct(vin_vct v)
{
v2f_vct o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.color = v.color;
o.texcoord = TRANSFORM_TEX (v.texcoord, _MainTex);;
return o;
}
fixed4 frag_mult(v2f_vct i) : COLOR
{
fixed4 col = tex2D(_MainTex, i.texcoord) * i.color;
return col;
}
ENDCG
}
}
SubShader
{
Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Cull Off Fog { Mode Off }
LOD 100
BindChannels
{
Bind "Vertex", vertex
Bind "TexCoord", texcoord
Bind "Color", color
}
Pass
{
Lighting Off
SetTexture [_MainTex] { combine texture * primary }
}
}
}
创建新材质
将
BlendVertexColorWithUV
拖到这个材质上将此材质分配给使用
SpriteRenderer
将
SpriteRenderer
的DrawMode
设置为Tiled
将
TileMode
设置为Continous
注意:其实我在抓取的时候犯了一个错误:你把
Sprite
赋给了SpriteRenderer
,而不是赋给了素材!您实际上可以保留材料 Blanc,只需调整 Tiling
和 Offset
值即可。
现在您可以调整精灵在材质中的偏移量,例如通过使用脚本
public Material textureToAnimate;
public Vector2 uvOffset;
....
textureToAnimate.mainTextureOffset = uvOffset;
我刚用过
Quad
,可以设置uvs
、vertices
和triangles
。所以基本上从 Sprite 获取了所有信息(uv,顶点)并将其传输到 Quad
。
现在有一个更直接的方法,如果你通过 Unity 添加额外的 Sprite2D 包:
sprite.SetVertexAttribute<Vector2>(VertexAttribute.TexCoord0, uv);
唯一需要注意的是它需要一个本机数组,但您可以在调用后立即 Dispose() 它。 等效地有一个 Get() 方法。