You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:57:16