godot - 如何让敌人不会从平台上掉下来?
问题描述
目前,我制造的敌人能够“巡逻”一个区域并在撞到墙壁时改变方向。我想把它们放在浮动平台上而不会掉下来,我该怎么做?
这是让他们在撞墙时改变方向的代码:
func _physics_process(delta):
_velocity.y += gravity * delta
if is_on_wall():
_velocity.x *= -1.0
_velocity.y = move_and_slide(_velocity, FLOOR_NORMAL).y
解决方案
根据 OP 的需求,这是我将如何使用RayCast2D
.
首先,RayCast2D
will 是 the 的子节点,KinematicBody2D
我们需要将其放置在一边并指向下方。还要确保RayCast2D
已启用。如此处所示:
对于我正在使用的代码:
extends KinematicBody2D
export var gravity:float = 100
var _velocity:Vector2 = Vector2.RIGHT * 100
const FLOOR_NORMAL:Vector2 = Vector2.UP
func _physics_process(delta:float) -> void:
_velocity.y += gravity * delta
_velocity.y = move_and_slide(_velocity, FLOOR_NORMAL).y
if is_on_wall() or (is_on_floor() and !$RayCast2D.is_colliding()):
_velocity.x *= -1.0
$RayCast2D.position.x *= -1.0
为了检查这个洞,我们要验证它RayCast2D
没有碰撞。如果它正在碰撞,则意味着前面有地板。检查is_on_floor
是为了避免它在空中改变方向。
此外,我正在检查单个语句中的两个条件。一是为了避免重复,二是因为如果有两个可以改变方向的检查,而且它们都改变了方向……结果就是没有改变方向!下一帧它将尝试再次改变方向,无限期。任何类似的情况都会导致KinematicBody2D
原地方向的改变。它似乎一动不动。
最后,我之所以move_and_slide
在所有检查之前进行检查是因为,is_on_wall
并且is_on_floor
在您调用move_and_slide
.
这是运行碰撞形状可见的游戏(调试选项):
如您所见,它在墙上和孔上都会改变方向。
推荐阅读
- python - 在python中从整个熊猫数据框中选择和删除单词列表
- google-cloud-platform - Google play 到 BigQuery 转移作业中的错误
- java - AWS SDK 2.0+ jar 下载
- r - RStudio 将行索引附加到图形上的点
- android - 安卓模拟器
- linux - 如何将命令的输出作为对 bash shell 中变量的引用
- flutter - “错误:在 Flutter 中执行数字求和时,不能将类型为‘double’的值分配给‘int’类型的变量”
- python - Python:使用rolling + apply和一个需要2列作为pandas参数的函数
- react-native - React Native 网络信息
- selenium - 如何通过用于 Zalenium 消息的 selenium-side-runner 将 cookie 添加到在网格中运行的 Selenium IDE 测试