Unity Shader实现图案滚动:无需外部脚本适配VRChat
Shader内部实现图案滚动替代C#脚本方案
完全可以在Shader内部通过Unity内置时间变量实现和原C#脚本一致的图案滚动效果,不需要外部脚本驱动,完美适配VRChat无法上传自定义脚本的限制。
修改步骤:
- 添加Shader参数:在Properties块中补充控制滚动的可配置项,对应原脚本的功能:
// 保留你原有Shader的所有参数... [Toggle(_ACT_X)] _ActX = "启用X轴滚动", Float = 1 _ScrollSpeedX = "X轴滚动速度", Range(0, 0.5) = 0.005 _MulX = "X轴方向倍率", Float = 1 [Toggle(_ACT_Y)] _ActY = "启用Y轴滚动", Float = 1 _ScrollSpeedY = "Y轴滚动速度", Range(0, 0.5) = 0.005 _MulY = "Y轴方向倍率", Float = 1 _PatternStr = "图案强度", Float = 0.2 _PatTex = "图案纹理", 2D = "white" {}
- 替换偏移计算逻辑:把原脚本控制的
_PatX/_PatY换成时间驱动的滚动偏移,修改Pass中的核心代码:
// 保留原有顶点着色器、编译指令等代码... #pragma shader_feature _ACT_X _ACT_Y uniform float _ScrollSpeedX; uniform float _MulX; uniform float _ScrollSpeedY; uniform float _MulY; uniform float _PatternStr; uniform sampler2D _PatTex; float4 frag(v2f i) : SV_Target { // 初始化滚动偏移 float2 scrollOffset = float2(0, 0); #if _ACT_X // 用时间计算X方向偏移,frac保证值循环在0-1区间(对应原脚本到128重置的效果) scrollOffset.x = frac(_Time.y * _ScrollSpeedX * _MulX); #endif #if _ACT_Y scrollOffset.y = frac(_Time.y * _ScrollSpeedY * _MulY); #endif // 采样图案纹理,应用偏移 float4 pattern = tex2D(_PatTex, i.uv + scrollOffset); // 保留你原有的亮度调整逻辑 float3 color = /* 这里是你原有材质颜色的计算代码 */; if (all(pattern.rgb == 1)) { color.rgb += float3(_PatternStr, _PatternStr, _PatternStr); } return float4(color, 1); } ENDCG
参数对应关系:
_ActX/_ActY:对应原脚本的ActX/ActY,控制是否开启对应轴的滚动_ScrollSpeedX/_ScrollSpeedY:对应原脚本的step,控制滚动的基础速度_MulX/_MulY:对应原脚本的MulX/MulY,控制滚动方向(负数反向)和速度倍率_Time.y:Unity内置的全局时间变量,自动累加流逝时间,替代原脚本的定时循环逻辑
注意事项:
- 确保你的
_PatTex纹理的Wrap Mode设置为Repeat,这样UV偏移超过1时会自动循环,和原脚本到128重置的效果完全一致 - 如果需要严格匹配原脚本的128阈值循环,可以把
frac()换成fmod(_Time.y * _ScrollSpeedX * _MulX, 128),但实际上纹理Repeat模式下,UV值超过1的部分会自动重复,用frac()更高效且效果一致
内容的提问来源于stack exchange,提问作者DefinitivVair0
相关产品推荐
相关产品推荐

