【问题标题】:How to implement scaling behavior without scaling the texture?如何在不缩放纹理的情况下实现缩放行为?
【发布时间】:2020-05-16 06:49:54
【问题描述】:

美好的一天!所以问题是如何实现下一个行为:我在 2D 项目中有游戏对象随着时间的推移向一侧缩放(实际上在两侧缩放但也向缩放方向移动)你可以在下面的 gif 上看到它(不允许直接粘贴 GIF)

Scaling of platform below the player

如果我附加纹理(精灵?),它也会随着对象缩放——这不是我想要做的。一种解决方案是在纹理检查器中设置 ClampRepeat 参数。但这对我来说也是不能接受的。我不知道如何准确地解释我想要做什么......但是让我们想象一下我的最终纹理是不可见的,并且在对象缩放期间该纹理的新部分变得可见。你可以在下一张 gif 中看到这种行为。

Actual behavior that i need

我想我需要某种实现它的着色器,所以请向我提供该脚本(我对着色器编码完全陌生,只知道基础知识)。考虑到我将为将附加到缩放对象的纹理设置动画,也许它也会影响着色器脚本。干杯。

【问题讨论】:

    标签: c# unity3d graphics shader cg


    【解决方案1】:

    如果您不打算在地板的左侧/右侧定义开始/结束,您可以使用着色器中的世界 x 位置作为 uv.x 坐标,并带有将循环的纹理。请记住,如果您打算在任何时候旋转地板,则此方法不适用于地板,并且涉及更多。

    下面的代码应该适用于您正在寻找的一个非常基本的示例(请注意顶点着色器部分)。

    struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };
    
            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };
    
            sampler2D _MainTex;
    
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = float2(v.vertex.x, v.uv.y);
                return o;
            }
    
            fixed4 frag (v2f i) : SV_Target
            {
                return tex2D(_MainTex, i.uv);
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      相关资源
      最近更新 更多