【问题标题】:Material property change via code doesn't show通过代码更改材料属性不显示
【发布时间】:2021-12-28 07:53:57
【问题描述】:

我正在使用 Unity 2020.3.3f1 (HDRP) 我有一个预制件(立方体),上面有发光材料。 按下鼠标按钮后,我希望它的发射强度增加 10。

我遇到的问题: Inspector 向我展示了 Intensity 实际上正在发生变化,但游戏并不代表这些变化(这意味着即使材质属性表明它会变得“更亮”)。

现在,当我通过 Inspector 手动增加数量时,即使增加了 0.1,突然之间,这些变化现在都可见了。

我想我现在什么都试过了……

简而言之,代码的样子:

public Material cubeMaterial;
private float intensity = 10;

if("mouseClick"){
intensity += 100;
cubeMaterial.setFloat("_EmissiveIntensity", intensity);
}

【问题讨论】:

  • 如果使用 xxx.material 访问材质,将创建一个新的材质,该材质不再引用其他渲染器上的材质。

标签: c# unity3d prefab


【解决方案1】:

我想您正在为您的材质使用默认的 HDRP/Lit 着色器。如果是这样,您可以通过“_EmissiveColor”着色器关键字访问您的立方体发射强度,如下所示:

cubeMaterial.GetColor("_EmissiveColor");

返回一个颜色值。

你可以用类似的方式修改它:

cubeMaterial.SetColor("_EmissiveColor", startingEmission * 1.1f);

一般来说,在使用 HDRP 材质着色器时,查找着色器关键字总是安全的,您可以通过在检查器中导航到您的材质,单击 kogwheel 并选择编辑着色器,这将打开 .shader 文件。

【讨论】:

  • 您好,感谢您的回答。根据您的意见,我找到了解决方案。但要为其他人澄清:cubeMaterial.GetColor("_EmissiveColor"); 返回一个 RGBA 值。要更改它,我们不能像上面引用的那样修改它,但我们可以简单地创建一个颜色:Color test = new Color(intensity, intensity, intensity, intensity); 并在游戏对象上使用 SetCoior。这行得通! :) 尽管我仍然认为这是奇怪的 Unity 行为,但编辑“_EmissiveIntensity”不起作用......
  • 糟糕,我的错,不知道为什么我说它返回一个浮点值,脑残,但无论如何,很高兴它有帮助!
【解决方案2】:

如果您只打算修改此游戏对象的材质,我建议您使用MaterialPropertyBlock 修改材质的属性。

如果不这样做,则会在幕后创建新材质,并可能导致内存问题。

为此,获取对游戏对象渲染器的引用,获取其属性块,修改它并重新分配修改后的属性块。

您可以通过documentation了解更多信息

希望有所帮助;)

【讨论】:

  • 好提示,我会阅读这个主题:)
猜你喜欢
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
相关资源
最近更新 更多