You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取敌人信息?新手RayCast首次碰撞无法获取数据求助

问题解决:RayCast首次碰撞失效与代码扩展性优化

一、修复RayCast首次碰撞无法获取信息的问题

首次碰撞失效通常是这几个原因导致的:

  • RayCast节点未启用(检查节点的enabled属性是否勾选)
  • 未排除玩家自身(将RayCast的exclude_owner设为true,避免检测到玩家自己)
  • 射线检测与逻辑执行的顺序不合理

调整后的move函数代码:

func move(dir):
    # 设置射线目标方向
    ray.cast_to = inputs[dir] * grid_size
    # 强制触发射线检测更新
    ray.force_raycast_update()
    
    # 先处理碰撞检测,再执行移动逻辑
    if ray.is_colliding():
        var collider = ray.get_collider()
        # 增加空判断避免报错,同时验证敌人分组
        if collider != null and "Enemy" in collider.get_groups():
            var enemy_stats = collider.get_combat_stats()
            print("碰撞到敌人")
            print("敌人AC: ", enemy_stats.AC)
    else:
        # 无碰撞时才执行移动
        position += inputs[dir] * grid_size

二、优化代码扩展性(避免新增属性时重复修改逻辑)

现在直接读取敌人的AC变量,后续新增HP、攻击力等属性时,代码会变得臃肿且难以维护。可以在敌人节点中封装一个统一的战斗信息获取方法:

敌人节点代码修改:

# 定义敌人战斗属性
var AC = 15
var HP = 50
var attack_damage = 8

# 统一返回战斗信息的方法
func get_combat_stats():
    return {
        "AC": AC,
        "HP": HP,
        "attack_damage": attack_damage
        # 后续新增属性直接在此处添加即可
    }

这样玩家端只需调用get_combat_stats()就能获取所有需要的战斗数据,不用每次新增属性都修改玩家的碰撞逻辑,代码的可维护性大幅提升。

额外提示:如果是2D网格类游戏,也可以考虑用Area2D的body_entered信号来检测碰撞,这种方式更适合处理持续接触的场景,不过调整后的RayCast逻辑也能正常工作。

内容的提问来源于stack exchange,提问作者Marcelo João

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:05:26