前言:
- 我是根据b站上的视频进行学习,并且总结写下笔记,然后做此分享。笔记非常详细以至于你可以通过查看文章进行快速学习并且制作出游戏出来。当然视频学习的链接我也放在下面了:
- 视频学习:www.bilibili.com/video/BV1Nd…
- 音频/美术资源包下载: pan.baidu.com/s/1mY05SbG3…
完成目标
成目标:
成功让草丛具备“踩踏检测”和“被压扁动画效果”。
一、实现玩家踩踏检测
-
调整第二个碰撞形状大小为 40×10
-
向上移动 5px,用来检测玩家脚部区域
-
设置碰撞层:
- 第4层 = 草丛层
- 遮罩勾选第2层 = 只检测玩家
-
给草丛添加两个信号:
body_entered(玩家进入)body_exited(玩家离开)
-
玩家节点设置:
- 碰撞层 = 第2层(玩家层)
- 遮罩勾选第1层(会被平台挡住)
效果:
草丛只会检测玩家,不会对敌人或其他物体产生反应。
二、实现踩踏动画效果
-
新建变量:
scaleTweenstartScaleendScale
-
通过修改 Sprite 的 Y 轴缩放,实现被踩扁效果
-
使用 Tween 做缩放动画
-
若动画已存在,先停止再重新播放
-
封装成函数,进入和离开时都调用
三、优化
- 信号函数中未使用
body参数 - 在参数前加
_解决黄色警告
最终效果:
- 玩家进入草丛 → 草丛被压扁
- 玩家离开草丛 → 草丛恢复原状
- 动画自然流畅
- 逻辑清晰、无警告
草丛从“装饰物”升级为“可交互环境元素”。
- 让前后草丛看起来有空间层次差异
-
实现过程:
-
我们来选中碰撞形状2的,它将用来检测玩家是否来踩踏。所以就是修改它的大小为x40y10,然后节点坐标往上移动5
-
-
碰撞层和碰撞遮罩的工作原理
-
用“门牌号”和“钥匙”来比喻
-
碰撞层(Collision Layer)
-
作用:给物体贴一个“门牌号”,告诉系统它属于哪个“组”。
-
例子:
- 玩家:门牌号 = 1
- 敌人:门牌号 = 2
- 子弹:门牌号 = 3
- 地面:门牌号 = 4
-
-
碰撞遮罩(Collision Mask)
-
作用:给物体一把“钥匙”,告诉系统它能和哪些“门牌号”的物体碰撞。
-
例子:
- 玩家的钥匙:能开“敌人”和“地面”的门(即遮罩 = 2 | 4)
- 敌人的钥匙:能开“玩家”和“地面”的门(即遮罩 = 1 | 4)
- 子弹的钥匙:只能开“敌人”的门(即遮罩 = 2)
-
-
-
然后我们展开草丛根节点的碰撞设置,点击编辑图层名称
-
-
第一层为静态层,这将是用于平台和其他不会移动的物体的图层,第二层是玩家层,第三层是敌人层,第四层是草丛层
-
-
然后我们来设置一下,上面的点亮4表明这个层是草丛层,下面的点亮2表明是可以与玩家进行碰撞。所以这个碰撞形状只会检测玩家层中的物体。当其他物体进入这个碰撞形状时,碰撞形状本身不会产生反应。当这个碰撞形状实际检测到物体时,我们通过一种方式去监测,这种监测就是信号,通过信号的功能进行实现。
-
-
我们切换右侧检测器的面板到节点面板,就可以看到我们的信号事件
-
-
然后我们选择使用body_entered信号事件,这个信号事件是每当有物体进入这个碰撞形状时,就会发出这个信号。点击之后我们就会弹出一个设置信号事件连接脚本的窗口,这里我们不需要变动点击链接即可。方法名是可以自己自定义的不过我们不变就是了
-
-
然后我们就可以在草丛场景的脚本里面看到这个函数了
-
-
然后我们还需要监听玩家离开草丛的信号事件,所以我们使用body_exited
-
-
每当玩家离开这个碰撞形状时,就会调用这个函数
-
-
然后我们回到玩家场景来设置一下它的碰撞层,第二层是玩家层,所以上面点亮2,我们希望玩家角色被平台挡住所以下面点亮1
-
-
然后我们在脚本代码中新建3个变量,scaleTween和startScale和endScale。我们是通过设置我们精灵节点的缩放属性,通过调整精灵节点y轴缩放大小来制造被踩踏效果
-
-
然后我们还要检测如果玩家再次进入草丛了,我们这个补间动画是否存在了然后如果存在我们需要进行取消然后进行重新播放一下
-
-
然后我们函数如果需要进行多次的话,不妨我们进行一下封装函数,这样子每次触发就直接调用就好了,并且在踩踏和离开的时候都进行调用这个函数
-
-
然后结束之后我们可以看到控制台🈶2个黄色警告,这个是因为我们信号事件没有使用body这个参数,我们可以在body前面加一个下划线去解决掉这个警告
-
-
-