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控制蒙版的形状应该是最恰当的选择。
为了方便操作,可以设置一个充满屏幕的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
Godot 4.0 遮罩一个2D物体,使其部分显示的更多相关文章
- 使用PathfindingProject Pro 4.0.10实现2D自动寻路
昨天由于策划的要求,要在项目的最后加个自动寻路的功能,跑去研究了下自动寻路的插件.不多说,上操作 首先在寻路的游戏物体上加上seeker.AI Lerp这两个脚本,注意要给target赋值. 之后给目 ...
- 如何用WebGPU流畅渲染百万级2D物体?
大家好~本文使用WebGPU和光线追踪算法,从0开始实现和逐步优化Demo,展示了从渲染500个2D物体都吃力到流畅渲染4百万个2D物体的优化过程和思路 目录 需求 成果 1.选择渲染的算法 2.实现 ...
- 如何用WebGPU流畅渲染千万级2D物体:基于光追管线
大家好~我们已经实现了百万级2D物体的流畅渲染,不过是基于计算管线实现的.本文在它的基础上,改为基于光追管线实现,主要进行了CPU和GPU端内存的优化,成功地将渲染的2D物体数量由4百万提高到了2千万 ...
- GODOT 3.0 开发进度汇报 #6
经过了又一个月的开发工作,在此作进度报告.本月的工作可以划分为:完成Web导出工具开发.GDNative.以及新的粒子系统. Web Export Godot 现在有了一款实验性的导出工具,导出目标为 ...
- 【跟我一起学Unity3D】做一个2D的90坦克大战之AI系统
对于AI,我的初始想法非常easy,首先他要能动,而且是在地图里面动. 懂得撞墙后转弯,然后懂得射击,其它的没有了,基于这个想法,我首先创建了一个MyTank类,用于管理玩家的坦克的活动,然后创建AI ...
- ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)
1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 154 Solved: 112[ ...
- 平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。
题目:平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小. 源码如下: #include <iostream> #include <string.h> #incl ...
- 为什么js中0.1+0.2不等于0.3,怎样处理使之相等?(转载)
为什么js中0.1+0.2不等于0.3,怎样处理使之相等? console.log(0.1+0.2===0.3)// true or false?? 在正常的数学逻辑思维中,0.1+0.2=0.3这个 ...
- 设置一个div网页滚动时,使其固定在头部,当页面滚动到距离头部300px时,隐藏该div,另一个div在底部,此时显示;当页面滚动到起始位置时,头部div出现,底部div隐藏
设置一个div网页滚动时,使其固定在头部,当页面滚动到距离头部300px时,隐藏该div,另一个div在底部,此时显示: 当页面滚动到起始位置时,头部div出现,底部div隐藏 前端代码: <! ...
- GODOT 3.0 开发快照版本 ALPHA1 释出
经过将近一年的开发后,master 分支(即未来的Godot 3.0)所有功能特性接近完成,可以在Godot社区里进行更广泛的测试了.因此我们释出了第一个Alpha快照版本,供老用户体验.报告Bug. ...
随机推荐
- 写书写到一半,强迫症发作跑去给HotChocolate修bug
前言 这是写作<C#与.NET6 开发从入门到实践>时的小故事,作为本书正式上市的宣传,在此分享给大家. 正文 .NET目前有两个比较成熟的GraphQL框架,其中一个是HotChocol ...
- 在 Rainbond 上使用 Curve 云原生存储
Curve 是网易主导自研的现代化存储系统, 目前支持文件存储(CurveFS)和块存储(CurveBS). CurveBS 的核心应用场景主要包括: 虚拟机/容器的性能型.混合型.容量型云盘或持久化 ...
- CPU内部的奥秘:代码是如何被执行的?
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:景明 我们以一段 C 代码为例,来看一下代码被编译成二进制 ...
- Rust中的into函数和from函数
1.Rust中的into函数和from函数是做什么用的? into函数是Rust语言中的一个转换函数,它属于Into trait.它可以将一个类型转换为另一个类型.实现了From trait的类型会自 ...
- Go For Web:Golang http 包详解(源码剖析)
前言: 本文作为解决如何通过 Golang 来编写 Web 应用这个问题的前瞻,对 Golang 中的 Web 基础部分进行一个简单的介绍.目前 Go 拥有成熟的 Http 处理包,所以我们去编写一个 ...
- DES算法图解、密码学
- DevOps、SRE、平台工程的区别
DevOps.SRE和平台工程的概念在不同时期出现,并由不同的个人和组织开发. DevOps作为一个概念是由Patrick Debois和Andrew Shafer在2009年的敏捷会议上提出的.他们 ...
- nginx概要
新机(CentOS7)配置nginx: 一. 更新yum源为阿里云镜像 ping mirrors.aliyun.com mv /etc/yum.repos.d/CentOS-Base.repo /et ...
- 我自己写了一个波场(Tron)本地网页版钱包
最近由于项目需要,需要给每个用户分配一个充币地址,考虑到钱包安全性和方便管理,于是自己动手写了一个本地网页版的钱包,附上源代码跟大家交流下. Github 源代码地址 钱包和项目是分离的,项目通过鉴权 ...
- SignalR服务端及客户端实现
服务器端: 引用nuget: 1.Microsoft.AspNet.SignalR.SelfHost 2.Microsoft.Owin.Cors internal class Program { st ...