千里之行,始于足下
零、 笔记
在开发类星露谷风格游戏时,为了让各类物品(比如果实、资源等)都能被玩家收集,开发中运用了 组件化思想 —— 这种思想的核心是将 “可被收集” 这一重复出现的功能,从具体物品中剥离出来,做成一个独立、通用的模块。基于此思路,本文创建了 【可收集组件】 。它内部封装了完整的 “收集逻辑”,将它作为子节点添加到物品场景中后,可使物品立刻拥有 被玩家收集 的能力。

一、创建物品
第一步,创建新场景,以 Sprite2D 作为场景根节点(用于展示物品图片);

第二步,选中 Sprite2D 节点,在检查器下的 Texture 加载 Egg_item.png 文件;
文件路径: res://资产/Sprout Lands - Sprites - Basic pack/Objects

第三步,在文件系统 res://场景/ 路径下创建 物品 文件夹;

第四步,更改 Sprite2D 节点名为 蛋 ,并保存该场景在新创建的 res://场景/物品 路径下 ;

完成物品创建!
二、创建可收集组件
第一步,在文件系统 res://场景/ 路径下创建 组件 文件夹;

第二步,创建新场景,并以 Area2D 为根节点;

第三步,为 Area2D 附加脚本 可收集组件.gd ,并保存在 res://场景/组件 路径下

第四步,理清 可收集组件.gd 检测玩家进入后收集物品的逻辑;
逻辑如下:
第五步,选中 可收集组件 节点,找到检查器下的节点 信号 ,右键点击 连接;

然后我们发现 可收集组件.gd 连接后变成了这样:

注意左边的绿色箭头,代表连接成功;
- 这个函数的意思是:如果检测到物理体 Phisics Body,就会执行这个函数里面的操作
- 我们的玩家是正是用 Charecterbody2D 节点做的,这个节点就属于物理体 Phisics Body
- 利用这一点可以实现检测到玩家进入后,将物品收集的目的!
编写代码如下:
extends Area2D
#一旦东西进入则使得物品消失
func _on_body_entered(body: Node2D) -> void:
#获取父节点(物品)并删除
#使得物品消失看起来像是收集了
get_parent().queue_free()
三、物品 + 可收集组件
可收集的物品 = 物品 + 可收集组件;
第一步,将 可收集组件 作为 物品 的子节点;

第二步,根据警告,我们添加 CollisionShape2D 作为可收集组件的 收集范围;

并在检查器中选择收集范围的 形状 ,这里我们用圆形;

可自行调节圆形的大小。
第三步,将 蛋 添加到 测试_基本地形 场景中;

第四步,运行当前场景前,我们打开调试,勾选 显示碰撞区域;

第五步,观察碰撞是否有效;

碰撞有效,完成!
四、免费开源资产包
某开源网站精灵图资源包链接: 点击此处
-
进入链接后点击下图按钮

-
然后点击【No thanks,just take me to the downloads】(不了谢谢,只想下载)

-
最后点击下图按钮完成下载(注意导入前需解压缩)

1088

被折叠的 条评论
为什么被折叠?



