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. ...
随机推荐
- vue2双向绑定原理及源码解析
首先我们要知道VUE实现双向绑定的步骤是什么: 实现一个监听器 Observer 对数据对象进行遍历,包括子属性对象的属性,利用 Object.defineProperty() 对属性都加上 sett ...
- pypiwin32里面常用包
PACKAGE CONTENTS _win32sysloader _winxptheme mmapfile odbc perfmon servicemanager timer win2kras win ...
- Redis集群介绍及测试思路
作者:京东零售 李磊 Redis集群介绍 Redis集群一般有四种方式,分别为:主从复制.哨兵模式.Cluster以及各大厂的集群方案.在3.0版本之前只支持单实例模式,3.0之后支持了集群方式.在3 ...
- SpringCloud源码学习笔记3——Nacos服务注册源码分析
系列文章目录和关于我 一丶基本概念&Nacos架构 1.为什么需要注册中心 实现服务治理.服务动态扩容,以及调用时能有负载均衡的效果. 如果我们将服务提供方的ip地址配置在服务消费方的配置文件 ...
- SpringBoot项目中使用缓存Cache的正确姿势!!!
前言 缓存可以通过将经常访问的数据存储在内存中,减少底层数据源如数据库的压力,从而有效提高系统的性能和稳定性.我想大家的项目中或多或少都有使用过,我们项目也不例外,但是最近在review公司的代码的时 ...
- IIC总线协议—读写EEPROM
IIC总线协议-读写EEPROM 1.I2C简介 I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要USA ...
- Rust中的into函数和from函数
1.Rust中的into函数和from函数是做什么用的? into函数是Rust语言中的一个转换函数,它属于Into trait.它可以将一个类型转换为另一个类型.实现了From trait的类型会自 ...
- keycloak~时间不正确的问题
首先我们应该知道,写到数据库里的时间,主要和你的mysql时区system_time_zone有关,而把mysql里的数据取出来,以json形式响应到浏览器上,这个时间会经过反序列化的过程,这时时间和 ...
- 【SpringCloud】(一)分布式理论
分布式架构理论 方法远程调用 各个模块运行于不同的tomcat,模块之间通过网络进行调用. 远程调用的技术演进 1 WebService 解决应用程序之间的跨平台访问问题,基于SOAP/WSDL协议, ...
- TEMP_FAILURE_RETRY宏的用法
#define TEMP_FAILURE_RETRY(expression) \ (__extension__\ ({ long int __result;\ do ...