首页 > 解决方案 > 如何让敌人不会从平台上掉下来?

问题描述

目前,我制造的敌人能够“巡逻”一个区域并在撞到墙壁时改变方向。我想把它们放在浮动平台上而不会掉下来,我该怎么做?

这是让他们在撞墙时改变方向的代码:

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

标签: godot

解决方案


根据 OP 的需求,这是我将如何使用RayCast2D.

首先,RayCast2Dwill 是 the 的子节点,KinematicBody2D我们需要将其放置在一边并指向下方。还要确保RayCast2D已启用。如此处所示:

Godot 窗口截图

对于我正在使用的代码:

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.


这是运行碰撞形状可见的游戏(调试选项):

游戏录制

如您所见,它在墙上和孔上都会改变方向。


推荐阅读