Godot中如何设置单个MeshInstance的颜色且不影响其他同场景实例
问题原因
你遇到的所有实例颜色同步修改的问题,核心是Godot中预加载的资源默认是共享引用的:你代码中直接修改预加载得到的char_material属性,本质是修改了res://Materials/Character_material.tres这个原始材质资源,所有使用该预加载资源的角色实例自然会同步变色。
最优实现方案
只要在赋值材质前,对预加载的原始材质执行复制操作,生成每个角色实例独有的材质副本即可,修改后的代码如下:
tool extends KinematicBody const char_material = preload("res://Materials/Character_material.tres") export var body_color: Color setget change_color func change_color(new_color: Color): # 复制原始材质得到实例专属材质,避免修改共享资源 var new_material = char_material.duplicate() new_material.albedo_color = new_color $BodyMesh.material_override = new_material body_color = new_color
优化版(适配频繁改色场景)
如果后续需要频繁修改单个角色的颜色,可以缓存实例专属的材质副本,避免每次修改都重复复制材质带来的额外开销:
tool extends KinematicBody const char_material = preload("res://Materials/Character_material.tres") export var body_color: Color setget change_color # 缓存当前实例的专属材质 var _instance_material: Material = null func change_color(new_color: Color): if not _instance_material: _instance_material = char_material.duplicate() $BodyMesh.material_override = _instance_material _instance_material.albedo_color = new_color body_color = new_color
内容的提问来源于stack exchange,提问作者Dacromir
相关产品推荐
相关产品推荐

