Как изменить Sprite uv в Unity? - PullRequest
       28

Как изменить Sprite uv в Unity?

0 голосов
/ 18 сентября 2018

Я написал следующий скрипт:

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 не имеет установщика (не очевидно из документации ) Как я могу изменитьспрайт для отображения другой части текстуры?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Я только что использовал Quad, для которого вы можете установить uvs, vertices и triangles.Таким образом, в основном получил всю информацию (уф, вершины) от Sprite и передал ее в Quad.

0 голосов
/ 18 сентября 2018

Это решение, которое работает с SpriteRenderer, по крайней мере, для выбора прямоугольной части спрайта, которую вы хотите показать.(Как правильно указал программист в комментариях, это не может «деформировать» ваш UV, если вам нужно совершенно другое отображение.)

  1. Создайте новый шейдер и назовите его 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. Установите SpriteRenderer DrawMode на Tiled

  7. Установите TileMode на Continous

enter image description here

Примечание. Во время захвата я действительно допустил ошибку: Вы назначаете Sprite на SpriteRenderer, а не на материал!Вы можете фактически оставить материал Blanc и просто настроить значения Tiling и Offset.

Теперь вы можете отрегулировать смещение спрайта в материале, например, используя скрипт

public Material textureToAnimate;
public Vector2 uvOffset;

....

textureToAnimate.mainTextureOffset = uvOffset;
...