我写了下面的脚本:
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
没有 setter (从 the documentation 看不明显)我如何更改 Sprite 以映射纹理的不同部分?
最佳答案
这是一个与 SpriteRenderer
一起使用的解决方案,用于至少选择要显示的 Sprite 的矩形部分。 (如果您需要完全不同的映射,程序员如何在评论中正确地说明这不能“变形”您的 UV。)
创建一个新的着色器并将其命名为
BlendVertexColorWithUV
在 VisualStudio(或任何文本编辑器)中打开它并在下面的代码中输入
Source// 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 } } } }
创建新 Material
将
BlendVertexColorWithUV
拖到该 Material 上将此 Material 分配给使用
SpriteRenderer
的对象
将
SpriteRenderer
的DrawMode
设置为Tiled
将
TileMode
设置为Continous
注意:我实际上在抓取时犯了一个错误:您将 Sprite
分配给了 SpriteRenderer
而不是 Material !您实际上可以保留 Material Blanc,只需调整 Tiling
和 Offset
值即可。
现在您可以调整 Sprite 在 Material 中的偏移量,例如通过使用脚本
public Material textureToAnimate;
public Vector2 uvOffset;
....
textureToAnimate.mainTextureOffset = uvOffset;
关于c# - 如何在 Unity 中更改 Sprite uv?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52389547/