Hi, folks! So, I have the problem with making materials as unique.

Image

I need effects, such as painting of ships in red color, will applies only where particles will spawns. But… As you can see those effects can applies also into other ships.

I’ve already set these materials as “Local to Scene” into inspector tab.

And have create script for making those materials as unique:

func _make_ship_materials_unique() -> void:
	for i in ship.get_children():
		if i is MeshInstance3D:
			for n in range(i.get_surface_override_material_count()):
				i.mesh.surface_set_material(n, i.mesh.surface_get_material(n).duplicate(true))

But it given me few results 😕

If it can help, here’s the script of applying of ships painting:

func damaged_spec_effect() -> void:
	for i in ship.get_children():
		if i is MeshInstance3D:
			for n in range(i.get_surface_override_material_count()):
				_create_fade_in_then_out_effect(i.mesh.surface_get_material(n), Color.RED)
func _create_fade_in_then_out_effect(material: Material, final_color: Color) -> void:
	if material is StandardMaterial3D:
		material.albedo_color = Color.WHITE
		var tween = get_tree().create_tween()
		tween.tween_property(material, "albedo_color", final_color, EFFECTS_DURATION / 2)
		tween.tween_property(material, "albedo_color", Color.WHITE, EFFECTS_DURATION / 2)

So, what do I need to do for solving my problem? 🤔

  • aquacat@pawb.socialB
    link
    fedilink
    arrow-up
    1
    ·
    edit-2
    2 days ago

    this, also the code is just $[the node with mesh].mesh.duplicate() and the same thing for the material. put it at a func start() and you’re set.

          • xolatgames@programming.devOPB
            link
            fedilink
            arrow-up
            1
            ·
            1 day ago

            Thanks a lots, folks! 😄 Everything works fine now 👍🏼

            Image

            What I have to do:

            1. Made don’t only materials, but also meshes as unique:
            var new_model = model.front.duplicate(true)
            var new_ship: Node3D = new_model.instantiate()
            new_ship.position = front_model_pos
            _model_parent.add_child(new_ship)
            _make_ship_materials_unique(new_ship)
            
            1. Change mesh.surface_set_material to mesh.set_surface_override_material:
            func _make_ship_materials_unique(new_ship: Node3D) -> void:
            	for i in new_ship.get_children(true):
            		if i is MeshInstance3D:
            			for n in range(i.get_surface_override_material_count()):
            				i.set_surface_override_material(n, i.mesh.surface_get_material(n).duplicate(true))
            
            func damaged_spec_effect() -> void:
            	for i in ship.get_children(true):
            		if i is MeshInstance3D:
            			for n in range(i.get_surface_override_material_count()):
            				_create_fade_in_then_out_effect(i.get_surface_override_material(n), Color.RED)
            

            And everything started works as well. Thanks again 🤝🏼