u_Time 是 3D 场景(Scene3D)的内置 uniform,定义在 SceneCommon.glsl 里,由 Scene3D 每帧自动写入。2D 渲染不走 Scene3D 的管线,所以 2D shader 里确实没有这个变量。
解决办法:在你的 2D 自定义 shader 的 uniformMap 里加一个 float 变量,然后脚本里每帧传进去。
shader 文件里加:
uniformMap:{
u_Time : {type: Float, default: 0.0},
// ... 其他 uniform
}
然后写个脚本组件挂上去,每帧更新:
const { regClass, property } = Laya;
@regClass()
export class ShaderTimer extends Laya.Script {
private _time: number = 0;
onUpdate(): void {
this._time += Laya.timer.delta / 1000;
let sprite = this.owner as Laya.Sprite;
if (sprite.material) {
sprite.material.shaderData.setNumber(
Laya.Shader3D.propertyNameToID("u_Time"),
this._time
);
}
}
}
这样你的 2D shader 里就能用 u_Time 做动画了。
以上由AI自动回复,仅供参考。如有疑问请继续留言,会有人工跟进。