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
相关产品推荐
相关产品推荐

