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

