所以我希望在我的玩家周围创造一个气泡的效果,当他进入隐藏区域(由磁贴图隐藏)时,气泡被激活,它本质上具有x射线效果。所以我可以看到背景,地面和区域内的所有物品,但我看不到积木本身。
所以很大程度上是这样的

到这个

随着我的深入,我发现了更多的东西
我甚至不知道该从哪里开始搜索这个。所以任何方向都会非常感谢
发布于 2021-11-10 16:00:25
首先,我想做点什么:让东西出现在播放器附近很容易,你可以使用一个灯光和一个着色器。用这种方法让东西在玩家附近消失是不可能的。
这是我们的计划:我们将创建一个纹理,它将作为遮罩来显示和不显示什么。然后我们将使用纹理蒙版和着色器来制作有选择地消失的材质。为了创建这个纹理,我们将使用一个Viewport,因此我们可以从中获得一个ViewportTexture。
Viewport设置如下所示:
Viewport
├ ColorRect
└ Sprite使用以下属性设置Viewport:
更新模式大小:指定窗口大小(默认值为1024 x 600)更新模式Hdr: disable
对于Sprite,您需要灰度纹理,可能具有透明度。它将是你想要在玩家周围展示的形状。
对于ColorRect,您需要将背景颜色设置为黑色或白色。任何与Sprite上的颜色相反的颜色。
接下来,您将向Viewport附加一个脚本。它必须处理两个问题:
Sprite以匹配球员的位置。它看起来像这样:扩展视口导出var target_path:NodePath func _process(_delta:float) _delta:float ->:var := get_node_or_null(target_path) as Node2D if target == null: return $Sprite.position =var
您要将target_path设置为引用玩家头像。
在这段代码中,target.get_viewport().get_canvas_transform().origin将告诉我们目标节点(玩家头像)在屏幕上的位置。我们正在放置与之匹配的Sprite。
func _ready():# warning-ignore:return_value_discarded get_tree().get_root().connect("size_changed",self,"_on_size_changed") func _on_size_changed():size = get_tree().get_root().size
在此代码中,我们连接到根Viewport (与窗口关联的那个)的"size_changed",并更改此Viewport的大小以匹配。
下一件事是着色器。转到TileMap或要使其消失的任何内容,然后添加着色器材质。这是它的代码:
shader_type canvas_item;
uniform sampler2D mask;
void fragment()
{
COLOR.rgb = texture(TEXTURE, UV).rgb;
COLOR.a = texture(mask, SCREEN_UV).r;
}如您所见,第一行将设置红色、绿色和蓝色通道,以匹配节点已有的纹理。但alpha通道将设置为遮罩纹理的其中一个通道(在本例中为红色通道)。
注意:上面的代码将使黑色部分完全不可见,白色部分完全可见。如果您想反转,请将COLOR.a = texture(mask, SCREEN_UV).r;更改为COLOR.a = 1.0 - texture(mask, SCREEN_UV).r;。
当然,我们需要设置遮罩纹理。设置代码后,着色器材质下应该有一个名为"Mask“的着色器参数,将其设置为新的ViewportTexture,并将Viewport设置为我们之前设置的值。
我们就完事了。
我用publicdomainvectors.org的这个纹理测试了一下:

加上来自Kenney的some tiles。当然,它们都在公有领域下。
它看起来是这样的:

尝试使用不同的纹理以获得不同的结果。此外,还可以将着色器添加到Sprite以获得额外的效果。例如,通过使用如下代码向Sprite提供着色器材质,可以添加一些涟漪:
shader_type canvas_item;
void fragment()
{
float width = SCREEN_PIXEL_SIZE.x * 16.0;
COLOR = texture(TEXTURE, vec2(UV.x + sin(UV.y * 32.0 + TIME * 2.0) * width, UV.y));
}所以你会得到这样的结果:

当上面的动画断断续续时,会有一个瞬间。那是因为我没有把循环切得很好。这不是游戏中的问题。此外,动画的每秒帧数也比游戏少得多。
https://stackoverflow.com/questions/69911347
复制相似问题