如何在 Unity 中更改 Sprite uv?

问题描述 投票:0回答:3

我写了以下脚本:

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
没有设置器(从 文档 中不明显)我如何更改精灵以映射纹理的不同部分?

c# unity3d sprite uv-mapping
3个回答
4
投票

这是一个与

SpriteRenderer
一起使用的解决方案,用于至少选择要显示的 Sprite 的矩形部分。 (如果您需要完全不同的映射,程序员如何在评论中正确地指出这不能“变形”您的 UV。)

  1. 新建一个Shader并命名为

    BlendVertexColorWithUV

  2. 在 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 } 
             }
         }
     }
    
  3. 创建新材质

  4. BlendVertexColorWithUV
    拖到这个材质上

  5. 将此材质分配给使用

    SpriteRenderer

  6. 的对象
  7. SpriteRenderer
    DrawMode
    设置为
    Tiled

  8. TileMode
    设置为
    Continous

注意:其实我在抓取的时候犯了一个错误:你把

Sprite
赋给了
SpriteRenderer
,而不是赋给了素材!您实际上可以保留材料 Blanc,只需调整
Tiling
Offset
值即可。

现在您可以调整精灵在材质中的偏移量,例如通过使用脚本

public Material textureToAnimate;
public Vector2 uvOffset;

....

textureToAnimate.mainTextureOffset = uvOffset;

0
投票

我刚用过

Quad
,可以设置
uvs
vertices
triangles
。所以基本上从 Sprite 获取了所有信息(uv,顶点)并将其传输到
Quad


0
投票

现在有一个更直接的方法,如果你通过 Unity 添加额外的 Sprite2D 包:

sprite.SetVertexAttribute<Vector2>(VertexAttribute.TexCoord0, uv);

唯一需要注意的是它需要一个本机数组,但您可以在调用后立即 Dispose() 它。 等效地有一个 Get() 方法。

© www.soinside.com 2019 - 2024. All rights reserved.