Godot 4.0 遮罩一个2D物体,使其部分显示
本文针对Godot 4.0。
我也查到了Godot 3.5如何实现遮罩,见这个链接 https://ask.godotengine.org/3031/how-do-i-mask-a-sprite
由于查到的大部分教程均针对3.5版本,特此提供4.0版本的教程。
CanvasItem的遮罩功能
Godot4.0的遮罩不是一个单独的节点,这个功能被包含在了一个常见的基类CanvasItem内。
若要遮罩一个物体,可以这样做:
- 建立精灵(或是其他继承自CanvasItem的节点),贴图为希望作为 "蒙版" 的图。接下来简称这个物体为蒙版。
- 把你希望被遮罩的物体称作本体,建立它或是拿出来它,把它作为 "蒙版" 的子物体,可以先摆一个你认为方便查看的位置,等一下就要开启遮罩了。
- 这一步是重点。在检查器中设置 "蒙版" 的属性。设置
CanvasItem->Visibility栏目->ClipChildren
为ClipOnly
。
这样就成功实现了遮罩的效果,即,本体显示时,透明度会根据蒙版的透明度进行调整。
因为遮罩功能被内置在CanvasItem内,所以不论是继承自Node2D的Sprite2D,还是继承自Control的Label,都可以将自己设置为"蒙版"或是"本体"。
效果如下
我想到的一点窍门
很多时候,我们希望遮罩的运作模式类似于一些游戏中的"拿手电筒照射黑暗区域",场景是固定的,光照区域是运动的。
而为了使用蒙版,不得不把场景设置成光照区域的子物体,这样不就是场景随着光照运动了吗?
我想到了几个解决方案分享一下:
1. 强制跟随
使用RemoteTransform2D节点,将目标设置为"本体",使节点跟随RemoteTransform2D节点而不是"蒙版"节点。
或为本体节点绑定脚本,在_Process()
中不断重设自己的GlobalPosition
。
注:Godot中有多个会不断轮询的函数,如果你的蒙版位移不是在_Process()
中处理的,比如是在_Input()
函数中处理,那么本体也应该在_Input()
中重设位置,若是被物理组件控制,本体应该在_PhysicsProcess()
中重设位置。不这样做容易产生明显的画面晃动。
我推测使用上述方法可能会增加无谓的DrawCall,说不定还会引起轻微的画面晃动。
2. 使用shader
经验证,按我目前了解的知识,shader似乎无法只对蒙版起作用,渲染结果会影响整个物体的最终效果而不是遮罩本身。
若有能只影响蒙版的shader写法,或是别的方案,若能在评论区指出,不胜感激。
如果会简单的shader编程,那么使用shader控制蒙版的形状应该是最恰当的选择。
为了方便操作,可以设置一个充满屏幕的ColorRect作为父节点,设置ClipChildren
使其变成蒙版,而后在工具栏中选择"锁定",避免操作子物体时误操作蒙版
然后用shader控制蒙版的透明度以构成希望的形状。简单的圆、矩形是比较容易实现的。
可参考GodotShaders网站中的示例,特别是这一系列:
https://godotshaders.com/snippet/useful-code-snippets/
参考
https://godotforums.org/d/33826-where-is-the-mask-mode-for-light2ds-in-godot-4
作者:qiiimiu
出处:https://www.cnblogs.com/qiiimiu/p/17468482.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!