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

Unity编辑模式下通过脚本实例化材质是否为不良实践?

Unity编辑模式下材质实例化的问题与优化疑惑

场景背景

我正在开发一款包含约500个可亮灭图标的游戏, gameplay中可通过布尔值切换图标亮/暗("on"/"off")状态。我编写了一个编辑模式下手动运行的脚本,用于程序化实例化每个图标GameObject、设置材质,并将材质的亮灯效果切换为"关闭"状态。

编辑器抛出错误提示:编辑模式下编辑材质会导致材质泄漏到场景中。我认为使用SharedMaterial的建议并不适用,因为游戏启动前我需要亮/暗状态混合的图标。

我的疑问与考量

  • 我的材质使用方式是否不符合Unity预期?尽管当前功能可用,但Unity是不是不允许实例化并修改材质?有帖子指出该提示应设为警告而非错误。
  • 我是否误解了SharedMaterials?除非我希望同类型的所有图标同步亮灭,否则实例化材质才是正确做法。
  • 这个错误是不是Unity用来提醒新手避免误改资源,而非禁止实例化材质?我看到很多用户吐槽这个错误,但他们的场景和我的略有不同。
  • 是否应该制作"开启"和"关闭"两种材质直接切换,而非修改材质属性?之前旧项目这么做过,但不确定这是不是最优方案。
  • 我使用URP(通用渲染管线),采用的批处理机制明确要求直接修改材质属性,而非使用MaterialPropertyBlocks。
  • 所有材质均为自定义Shader Graph制作,兼容上述批处理机制。

性能问题

游戏运行速度正常,但编辑模式下实例化500个图标需耗时约10分钟,这个速度难以接受,我正在优化,但不确定是否是材质实例化导致的性能瓶颈。

相关代码

private void ChangeMaterialProperty(bool enabled)
{
    Material[] materials = iconMeshRenderer.materials;
    for (int i = 0; i < materials.Length; i++)
    {
        if (enabled)
            materials[i].SetFloat(_Unpowered, 0);
        else
            materials[i].SetFloat(_Unpowered, 1);
    }
    iconMeshRenderer.materials = materials;
}

内容的提问来源于stack exchange,提问作者Walledhouse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 06:44:51