【问题标题】:How to change Sprite uv in Unity?如何在 Unity 中更改 Sprite uv?
【发布时间】:2019-02-22 15:58:18
【问题描述】:

我写了以下脚本:

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

【问题讨论】:

  • 您不能直接更改uv。来自docs.unity3d.com/ScriptReference/Sprite.OverrideGeometry.htmlSprite UVs are calculated automatically by mapping the provided geometry onto the Sprite texture.
  • 我可以创建一个可以改变 UV 的材质或类似的东西吗?我是 Unity 新手,但我相信应该有一种正常的方式来做到这一点。
  • 需要做的是根据一些输入以编程方式更改 UV。这不是静态设置。
  • 渲染我想要的纹理部分:)
  • Here is a workaround using a MeshRenderer on a plane 改为; Here 是一个更复杂的解决方案,包括一个自定义着色器,它可能是你正在尝试的东西.. 没有测试它

标签: c# unity3d sprite uv-mapping


【解决方案1】:

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

  1. 创建一个新的Shader并命名为BlendVertexColorWithUV

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

  4. BlendVertexColorWithUV 拖到此材质上

  5. 将此材质分配给使用SpriteRenderer的对象

  6. SpriteRendererDrawMode设置为Tiled

  7. TileMode设置为Continous

注意:我在抓取时实际上犯了一个错误:您将Sprite分配给SpriteRenderer而不是材料!您实际上可以保留材质 Blanc,只需调整 TilingOffset 值。

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

public Material textureToAnimate;
public Vector2 uvOffset;

....

textureToAnimate.mainTextureOffset = uvOffset;

【讨论】:

  • 使用具有透明度的精灵来执行此操作。要使其工作,您必须将纹理中的 MeshType 更改为全矩形而不是多边形。当我说精灵生成一种网格时,这就是我在上面的评论中所指的。
  • 设置 uv 偏移量不同于将 uv 数组设置为变量。我认为 OP 想改变 uv 数组....
  • 关于@Programmer 所说的,您仍然需要更改大小选项以使其确定最后 2 个 uv 的放置位置。
  • @Eddge 我在抓取时实际上犯了一个错误:您将 Sprite 设置为 SpriteRenderer 而不是材质!它对我来说与透明精灵一样有效。在 Sprite 设置中选择 SimplePolygon 也没有任何区别。也可以使用材质中的 Tiling 更改大小
  • @Programmer 当然你是对的,如果你想“变形”你的 UV 映射而不是仅仅选择应该映射的部分,这可能不起作用
【解决方案2】:

我刚刚使用了Quad,可以设置uvsverticestriangles。所以基本上从 Sprite 获取了所有信息(uv、顶点)并将其传输到Quad

【讨论】:

  • Unity中有很多东西被称为Quad。在 Unity 2019 中,有一个 3D 四边形对象。你也可以创建一个空的游戏对象,然后向它添加一个网格。然后向该网格添加四边形纹理。你指的是哪个四边形?
猜你喜欢
  • 2017-01-19
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多