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

Unity 2D项目:TouchingDirections脚本在新物理层下失效?

问题解决方案

一、先解决设置层过滤导致的崩溃问题

  • 确认Unity中已正确创建InvisibleWallForMobs层,检查拼写是否完全一致(区分大小写)
  • 修改TouchingDirections脚本中设置castFilter.layerMask的代码,增加层存在性判断,避免无效层索引引发崩溃:
    // 获取隐形墙层索引
    int mobWallLayerIndex = LayerMask.NameToLayer("InvisibleWallForMobs");
    if (mobWallLayerIndex != -1)
    {
        // 构建正确的层掩码
        castFilter.layerMask = 1 << mobWallLayerIndex;
        // 若需要同时检测默认地面层,可合并掩码:castFilter.layerMask = (1 << mobWallLayerIndex) | (1 << LayerMask.NameToLayer("Ground"));
    }
    else
    {
        Debug.LogError("未找到InvisibleWallForMobs层,请检查Layers面板配置");
    }
    

二、修复怪物触墙不转向的问题

1. 验证碰撞检测逻辑

  • 检查TouchingDirections中的射线/胶囊投射参数:确保投射范围(长度、胶囊大小)足够覆盖怪物与隐形墙的碰撞区域,避免检测遗漏
  • 确认投射逻辑中包含了隐形墙层:如果之前只检测地面层,需要将隐形墙层合并到检测掩码中(参考上面的代码注释)

2. 调整碰撞回调逻辑(若使用碰撞器而非触发)

如果怪物通过碰撞器触发转向,在脚本中添加或修改碰撞检测代码:

private void OnCollisionStay2D(Collision2D collision)
{
    int mobWallLayer = LayerMask.NameToLayer("InvisibleWallForMobs");
    if (collision.gameObject.layer == mobWallLayer)
    {
        // 执行怪物转向逻辑,比如翻转缩放或改变移动方向
        transform.localScale = new Vector3(-transform.localScale.x, transform.localScale.y, transform.localScale.z);
        // 假设你的移动方向变量是moveDirection,也同步翻转
        // moveDirection = -moveDirection;
    }
}

3. 配置碰撞矩阵确保仅怪物能碰撞隐形墙

  • 打开Unity的Edit > Project Settings > Physics 2D
  • 在Layer Collision Matrix中,仅勾选怪物所在层与InvisibleWallForMobs层的碰撞项,取消其他层(如玩家)与该层的碰撞勾选

三、隐形墙对象的设置检查

  • 确保隐形墙的碰撞器未勾选Is Trigger(若使用触发则需改用OnTriggerStay2D回调)
  • 碰撞器设置为合适的大小和位置,完全覆盖需要阻挡怪物的区域

内容的提问来源于stack exchange,提问作者Dmitriy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:47:22