C#运行时如何正确设置材质的albedo属性
C# 运行时设置材质Albedo颜色的正确方案
你当前的写法无法正常生效,问题出在属性调用层级错误、缺少类型判断两个点,以下是不同场景下的正确实现:
核心前提说明
Godot中MaterialOverride是所有材质类型的基类Material的对象引用,基类本身不包含albedo_color相关属性,直接在基类对象上调用Set("albedo_color")不会生效,还可能因为材质值为空触发空引用报错。
方案1:强类型调用(推荐,性能最优、无字符串拼写错误)
适用于使用引擎自带标准材质(StandardMaterial3D/ORMMaterial3D,二者都继承自BaseMaterial3D)的场景:
// 替换成你自己的节点获取逻辑,此处以MeshInstance3D为例 var targetMesh = GetNode<MeshInstance3D>("节点路径"); // 如果节点未设置过覆盖材质,先新建独立的标准材质实例,避免修改共享材质导致所有引用节点同步变色 targetMesh.MaterialOverride ??= new StandardMaterial3D(); if (targetMesh.MaterialOverride is BaseMaterial3D baseMat) { // 直接给强类型属性赋值即可,Color构造参数依次为R、G、B、透明度A,省略A默认值为1(完全不透明) baseMat.AlbedoColor = new Color(1f, 1f, 1f); }
方案2:自定义Shader材质设置方式
如果使用的是自定义编写的Shader材质,需要通过Shader参数接口传值,参数名必须和Shader中定义的uniform变量名完全一致:
var targetMesh = GetNode<MeshInstance3D>("节点路径"); if (targetMesh.MaterialOverride is ShaderMaterial shaderMat) { // 假设sh起>你的shader中定义了uniform vec4 albedo_color; shaderMat.SetShaderParameter("albedo_color", new Color(1f, 1f, 1f)); }
方案3:字符串属性名调用(不推荐,容易出现拼写错误)
如果确实需要通过字符串Set的方式操作,要确保拿到对应类型的材质实例,再传入正确的属性名:
var targetMesh = GetNode<MeshInstance3D>("节点路径"); targetMesh.MaterialOverride ??= new StandardMaterial3D(); // 仅当材质是BaseMaterial3D时,albedo_color属性路径才有效 if (targetMesh.MaterialOverride is BaseMaterial3D baseMat) { baseMat.Set("albedo_color", new Color(1f, 1f, 1f)); }
注意:不要直接修改从材质库/资源文件加载的共享材质,否则所有使用该材质资源的节点都会同步变色。需要修改单个节点颜色时,要么给节点设置独立的MaterialOverride实例,要么调用材质的
Duplicate()方法复制一份独立材质后再修改。
内容的提问来源于stack exchange,提问作者Dez Boyle
相关产品推荐
相关产品推荐

