news 2026/9/18 12:11:46

Godot 粒子碰撞层指南:用分层与掩码把子弹互碰关掉,只留你需要的碰撞

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Godot 粒子碰撞层指南:用分层与掩码把子弹互碰关掉,只留你需要的碰撞

Godot 粒子碰撞层指南:用分层与掩码把子弹互碰关掉,只留你需要的碰撞

【免费下载链接】godot-demo-projectsDemonstration and Template Projects项目地址: https://gitcode.com/GitHub_Trending/go/godot-demo-projects

做粒子效果时最常踩的物理坑不是速度、不是数量,而是粒子之间会不会互相碰。子弹互相弹开、火花彼此穿身,画面一下就乱了。Godot 的粒子碰撞层配置专门管这件事:用碰撞层(Collision Layer)和碰撞掩码(Collision Mask)两样东西,就能精确决定哪几类物理对象会碰、哪几类绝不碰。官方示例仓库 godot-demo-projects 里的 2d/bullet_shower 就是个现成范本:500 发子弹照样能碰到玩家、被边界挡住,子弹之间却从不互相碰撞。下面按这个 bullet_shower 子弹雨示例走一遍——先弄清碰撞层和掩码各管什么,再给每类粒子分层,然后用一行代码关掉同类粒子的互碰,最后看不同配置下画面到底差在哪。

为什么 500 发子弹默认会互相打架

先说这个 demo 的实际场景:屏幕右侧源源不断涌进左侧的圆形刚体子弹,每帧 500 发;玩家是个跟着鼠标走的圆,被碰到就换成哭脸。

问题出在"默认"两个字上。Godot 的 2D 物理引擎每一帧都要判定"谁碰了谁",而且是按对象两两组合来判的。500 颗子弹如果彼此都开着碰撞,等于每帧都有上百万对组合要过一遍检测,帧率肉眼可见地往下掉。比掉帧更直观的代价是画面:子弹会互相顶住、弹开、堆叠,原本笔直下落的雨瞬间变成乱窜的弹片。

所以动手配置之前,先回答一个具体问题:我到底需要哪几类碰撞?这个 demo 的答案很干脆——子弹要能碰到玩家,子弹出了左边界要能绕回右边,子弹和子弹之间谁也不用管。想清楚这三条,后面的层和掩码基本就是照单填数。

👀 碰撞层和碰撞掩码,一个说"我是谁",一个说"我查谁"

在 Godot 里,每个 2D 物理对象都挂着两条 32 位的开关,就是 Godot 碰撞层和碰撞掩码:

  • 碰撞层(Layer):第 n 位打开,表示"我属于第 n 类"。
  • 碰撞掩码(Mask):第 n 位打开,表示"我要主动检测第 n 类的对象"。

引擎判定时做的是交叉查询:A 的层命中 B 的掩码,或者 B 的层命中 A 的掩码,任意一条成立,就算这对对象发生了碰撞。注意这个不对称性,它正是 Godot 碰撞掩码配置好用的地方。

拿玩家和子弹举例:玩家设成层 1、掩码 1,它只管第 1 类;子弹设成层 2、掩码 1,它挂在第 2 类,却只去查第 1 类。子弹飞进玩家范围,触发玩家身上的body_shape_entered信号,玩家换哭脸;而两颗子弹同属第 2 类,谁的掩码里都没有 2 这一位,它们之间永远不会产生判定。

🗂️ 给每类粒子分一个碰撞层:先数对象,再填位号

动手之前,把场景里的物理对象数一遍,每类固定一个位号,之后不再挪动:

  1. 位号 1:玩家
  2. 位号 2:子弹
  3. 位号 3:边界墙(或地形)
  4. 位号 4、5:留给日后要加的道具、敌人

规划好再去填数。检查器里把玩家的 Collision Layer 勾上 1、Collision Mask 勾上 1;子弹的 Collision Layer 勾上 2、Collision Mask 只勾 1。用界面上的勾选框一个个点,比在脑子里记二进制数省心,也方便随时回头核对:某个位号到底是谁、谁在查它,一眼能看清。

🎬 一行代码,把 Godot 2D 粒子的同类互碰关掉

bullets.gd 没走检查器那条路——它不用场景节点,而是在脚本里通过PhysicsServer2D批量建出 500 个刚体,每建出一颗就顺手配好掩码:

# 每颗子弹建好刚体后,掩码置 0:不再检测任何层,子弹互不碰撞 PhysicsServer2D.body_set_collision_mask(bullet.body, 0)

掩码为 0 的意思是:这颗子弹主动去查任何一类对象都不在乎,它和同属位号 2 的其他子弹从此互不相关。而子弹打到玩家依然成立,因为那次判定由玩家那边的掩码发起——碰撞检测是双向查询,关掉一头,另一头照样工作。另外,掩码 0 并不会把刚体从物理世界里摘走:它照旧被脚本每帧移动、照旧能被别的对象检测到,只是自己不再发起任何查询。

关掉和没关掉,差别直接写在截图里。互碰打开时,子弹互相顶住、轨迹乱偏,密集区挤成一坨:

掩码置 0 之后,雨丝均匀地横穿屏幕,只有玩家被碰到时才会换表情:

省下的是每帧成片的碰撞判定,换来的是帧率和画面整洁度——粒子类视觉效果最忌讳的就是彼此打架。

🧪 换个场景:多类粒子各自独立跑的思路

同一套分层思路在 2d/particles 里同样成立。那个示例里火焰、烟雾、星点各是一个GPUParticles2D节点配自己的ParticleProcessMaterial,视觉和运动参数互不串扰,所以三类效果能同时跑在同一屏里不打架:

如果哪天你想给它们接上真实物理——比如烟雾只落回地面、火花只打中敌人——办法还是上面那套:给地面、火花、敌人各占一个位号,掩码里只勾自己要碰的那几格。层管身份,掩码管意向,配完跑一遍场景,用画面而不是脑补来验证。

  • 把 2d/bullet_shower 里的子弹数从 500 调到 2000,对比一下掩码为 0 和为 1 时的帧率差,直观感受"少查一对"省下的量。
  • 给自己正在做的项目画一张两列表:先写"谁需要碰谁",再回头填位号和掩码,比边写边勾不容易漏勾或撞位号。
  • 翻一翻 2d/particles 里的.tres材质文件,看看每类粒子是怎么在ParticleProcessMaterial里各自独立配参数的,思路和碰撞分层如出一辙。

【免费下载链接】godot-demo-projectsDemonstration and Template Projects项目地址: https://gitcode.com/GitHub_Trending/go/godot-demo-projects

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 12:11:01

【ComfyUI】Flux + 双LoRA 动漫图片3D转换

今天展示的案例是一个 卡通图片 2D 转绘 3D 的 ComfyUI 工作流,它能够将二维的动漫或卡通风格图像转化为细致的三维感视觉效果。通过加载基础模型、组合 Lora 插件以及应用 ControlNet 预处理器,整个工作流在保持原始角色特征的同时,增强了立体感和空间表现力。 结合最终生成…

作者头像 李华
网站建设 2026/9/18 12:10:19

YOLOv5到v11选型决策指南:2026工业落地实战手册

1. 这不是版本迭代史,而是一份面向真实落地场景的YOLO选型决策手册YOLO 演进 v5→v11 与 2026 选型指南——这个标题里藏着三个极易被忽略但决定项目成败的关键信号:v5到v11不是线性升级,而是技术范式迁移;2026不是年份噱头&#…

作者头像 李华
网站建设 2026/9/18 12:10:09

iPhone双屏适配实战:不止是布局模型,更是交互与生命周期重构

前阵子接了个项目,要把一款iPhone应用适配成Duo双屏协作模式——手机作为主控端,外接显示器/平板作为扩展端,两个屏幕同时跑同一套业务。第一反应自然是"把布局改成自适应的不就行了",可真正动手之后才意识到&#xff0…

作者头像 李华
网站建设 2026/9/18 12:10:02

Kimi K2.7 Code 上了 LiveCodeBench:TaoToken 同一把 Key 再调一次

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 12:09:29

从 WebUI 到 DeepSeek 桌面端:本地大模型迁移与调参实战

前两个月我把用了快两年的 WebUI 从浏览器书签栏里彻底删掉了,日常和 DeepSeek 打交道这件事,全部挪到了桌面端。不是 WebUI 不好用,恰恰相反,它把模型能力、插件生态和一堆可视化面板都塞进了浏览器里,几乎零门槛。但…

作者头像 李华
网站建设 2026/9/18 12:07:28

【Typora】2025年激活Typora

2025年激活Typora一、激活方法二、下载地址三、激活Typora一、激活方法 前置声明,此激活仅支持1.9.5及以下版本激活,激活后不可更新,更新则失效。 二、下载地址 通过百度网盘分享的文件:Typora激活 链接:https://pan.baidu.com/s/…

作者头像 李华