我正在为《城市:天际线》制作Seasons Mod。我的方法很好,我找到了一种方法,可以通过使用

mat.SetTexture("_TerrainGrassDiffuse", grassTexture);

这样就可以了,但是我不想在两个赛季之间进行艰难的抉择。所以我想出了一个主意:在雪和草之间徘徊。 Google搜索了很多,但是我没有提出任何可行的建议。所以我想要一个在一定的时间内褪色并在草地上逐渐褪色的lerp,所以我认为lerp就在这里。我无权访问着色器,导致其成为mod,因此我需要对其进行反编译。
我尝试使用
someMat.Lerp();
,但我不知道someMat需要使用哪种 Material 。
感谢帮助!

最佳答案

首先,我想指出someMat.Lerp();,而不是,是解决您问题的方法。 material Lerp()函数用于更改颜色,同时保留原始的着色器和纹理。正如您希望保留纹理一样,情况并非如此。

此外,我认为没有一种方法可以统一纹理。但是看来您可以使用着色器来规避此问题。经过短暂的搜索后,我发现了这个UnityScript解决方案source,其中有一个简单且不错的着色器实现的解决方案示例

着色器和相关代码示例也可以在下面看到。

public void Update ()
{
     changeCount = changeCount - 0.05;

     textureObject.renderer.material.SetFloat( "_Blend", changeCount );
      if(changeCount <= 0) {
           triggerChange = false;
           changeCount = 1.0;
           textureObject.renderer.material.SetTexture ("_Texture2", newTexture);
           textureObject.renderer.material.SetFloat( "_Blend", 1);
      }

 }
}

以及博客中给出的示例着色器:
Shader "TextureChange" {
Properties {
_Blend ("Blend", Range (0, 1) ) = 0.5
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Texture 1", 2D) = "white" {}
_Texture2 ("Texture 2", 2D) = ""
_BumpMap ("Normalmap", 2D) = "bump" {}
}

SubShader {
Tags { "RenderType"="Opaque" }
LOD 300
Pass {
    SetTexture[_MainTex]
    SetTexture[_Texture2] {
        ConstantColor (0,0,0, [_Blend])
        Combine texture Lerp(constant) previous
    }
  }

 CGPROGRAM
 #pragma surface surf Lambert

sampler2D _MainTex;
sampler2D _BumpMap;
fixed4 _Color;
sampler2D _Texture2;
float _Blend;

struct Input {
    float2 uv_MainTex;
    float2 uv_BumpMap;
    float2 uv_Texture2;

};

void surf (Input IN, inout SurfaceOutput o) {
    fixed4 t1 = tex2D(_MainTex, IN.uv_MainTex) * _Color;
    fixed4 t2 = tex2D (_Texture2, IN.uv_MainTex) * _Color;

    o.Albedo = lerp(t1, t2, _Blend);
    o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
}
ENDCG
}

FallBack "Diffuse"
}

关于c# - 地形地面,城市中的p草和雪: Skylines,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33782280/

10-13 02:00