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

求助:GDScript设置ShaderMaterial参数后重新选中对象参数重置

问题描述

我使用以下GDScript代码设置当前选中的MeshInstance3D上所有ShaderMaterial的参数:

var node = currently_selected_MeshInstance3D
var materials = []
for i in range(node.get_surface_override_material_count()):
    var mat_or = node.get_surface_override_material(i)
    if mat_or and mat_or is ShaderMaterial and mat_or not in materials:
        materials.append(mat_or)
for material in materials:
    material.set_shader_parameter(param_name, param_value)

执行代码时参数可正确更新,3D视图对象同步显示变化,但取消选中再重新选中后,编辑器中ShaderMaterial参数恢复至执行前状态,视口对象仍使用更新后参数。

如何通过GDScript正确设置ShaderMaterial参数使其保持设置状态?


解决方案

问题根源是修改材质参数后,未通知Godot编辑器资源发生变更。编辑器需要感知资源修改,才会将其标记为"脏数据"(需保存),否则重新选中节点时会从原始资源数据读取参数,导致面板显示回滚。

修改代码,添加资源变更通知和场景脏标记:

var node = currently_selected_MeshInstance3D
var materials = []
for i in range(node.get_surface_override_material_count()):
    var mat_or = node.get_surface_override_material(i)
    if mat_or and mat_or is ShaderMaterial and mat_or not in materials:
        materials.append(mat_or)
for material in materials:
    material.set_shader_parameter(param_name, param_value)
    # 通知编辑器材质资源已修改
    material.resource_changed()
    # 若在编辑器环境,标记当前编辑场景为脏,确保保存时包含修改
    if Engine.editor_hint:
        get_tree().edited_scene_root.mark_scene_as_dirty()

关键说明

  • resource_changed():触发材质的资源变更信号,让编辑器更新面板显示,并将材质标记为需保存状态。
  • mark_scene_as_dirty():如果材质是场景内的实例化资源(而非全局独立资源文件),标记场景为脏,用户保存场景时会同步保存材质参数修改。

若材质是全局资源(存放在资源管理器的独立文件中),修改后需手动保存该资源,或通过编辑器全局保存操作持久化变更。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:10:08