如何将着色器的唯一实例添加到场景中的多个节点?戈多 4

问题描述 投票:0回答:1

我的游戏中有多个“可交互”对象,它们都扩展了 InteractableBody 类,该类设置了一些内容,以便玩家可以与该对象进行交互。我正在尝试向精灵添加轮廓着色器,以便我可以勾勒出能够与之交互的对象。这是我现在执行此操作的代码,但是当前仅将轮廓应用到带有着色器的第一个对象,无论是什么对象。我有一个以前的版本,其中所有对象都有轮廓,并且当只有一个对象更新时所有对象都被更改。

这是我当前应用着色器的代码:

class_name InteractableBody
extends CharacterBody2D

@export var string_name : String
@export var icon : Texture2D
@export var interact_range : float
@export var interactable_sprite : Sprite2D
@export var outline_shader : Shader

var player_node : Player = null

func _ready():
    add_to_group("interactable")
    var material_instance = ShaderMaterial.new()
    var new_shader = outline_shader
    material_instance.shader = new_shader
    interactable_sprite.set_material(material_instance)
    hide_outline()

func setup_player(_player_node):
    if _player_node:
        player_node = _player_node

func _process(delta):
    if player_node:
        if player_node.global_position.distance_to(global_position) < interact_range:
            if player_node.interactable_objects.has(self) == false:
                show_outline()
                player_node.add_interactable(self)
        else:
            if player_node.interactable_objects.has(self) == true:
                hide_outline()
                player_node.remove_interactable(self)

func show_outline():
    var shader_mat : ShaderMaterial = interactable_sprite.material
    shader_mat.set_shader_parameter("color", Color(1.0, 1.0, 1.0, 1.0))

func hide_outline():
    var shader_mat : ShaderMaterial = interactable_sprite.material
    shader_mat.set_shader_parameter("color", Color(1.0, 1.0, 1.0, 0.0))

我尝试将轮廓着色器应用于组中的每个对象,然后能够一次打开/关闭每个节点上的着色器。实际上发生的事情只是带有着色器的第一个节点有一个轮廓,并且无论我与哪个节点交互,该轮廓都会更新。

shader godot gdscript godot4
1个回答
0
投票

以下是一些解决方案,可能会根据您的具体设置起作用:

  1. 不要设置着色器材质,而是在着色器内创建一个制服来设置轮廓的颜色。然后您可以更改着色器的制服。这可能是您正在寻找的解决方案,因为您正在尝试更改着色器本身而不是您将其应用到的节点。
  2. 创建第二个对象,其唯一功能是保持轮廓。然后,根据您的需要隐藏或显示它。
  3. 如果您坚持实际更改着色器,您可以在准备好的函数中复制您的着色器以使其独一无二。然后当您稍后更改它时,这不会影响着色器的其他副本。
© www.soinside.com 2019 - 2024. All rights reserved.