我的游戏中有多个“可交互”对象,它们都扩展了 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))
我尝试将轮廓着色器应用于组中的每个对象,然后能够一次打开/关闭每个节点上的着色器。实际上发生的事情只是带有着色器的第一个节点有一个轮廓,并且无论我与哪个节点交互,该轮廓都会更新。
以下是一些解决方案,可能会根据您的具体设置起作用: