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

Unity 3D抓钩系统中如何实现角色与Ledge边缘正确对齐?

解决方案:角色与边缘对齐实现

要解决角色后退与旋转对齐的问题,核心是通过边缘的表面法线计算正确的移动和旋转方向,以下是修改后的AlignWithLedge方法实现:

void AlignWithLedge(Vector3 ledgePosition)
{
    // 基础垂直位置调整:让角色从抓钩点下移,避免漂浮
    Vector3 offsetPos = transform.position;
    offsetPos.y -= 2f;

    // 检测边缘表面法线(用于计算后退和旋转方向)
    RaycastHit hit;
    // 排除玩家自身层,避免射线检测到角色碰撞体
    int layerMask = ~LayerMask.GetMask("Player");
    
    // 从抓钩点向下发射射线,获取边缘的碰撞信息
    if (Physics.Raycast(ledgePosition, Vector3.down, out hit, 5f, layerMask))
    {
        // 将法线投影到水平平面,忽略垂直方向的影响
        Vector3 horizontalLedgeNormal = Vector3.ProjectOnPlane(hit.normal, Vector3.up).normalized;
        
        // 1. 实现从边缘后退:向法线的反方向移动(向平台内侧)
        float retreatDistance = 0.6f; // 可根据角色模型大小调整
        offsetPos -= horizontalLedgeNormal * retreatDistance;

        // 2. 旋转角色朝向边缘外侧(符合阿卡姆系列悬挂姿态)
        // 如果需要角色朝向边缘内侧,将horizontalLedgeNormal改为 -horizontalLedgeNormal
        Quaternion targetRotation = Quaternion.LookRotation(horizontalLedgeNormal, Vector3.up);
        transform.rotation = targetRotation;
    }
    else
    {
        // 射线检测失败时的 fallback 逻辑(可选)
        // 默认向后退并旋转到默认方向
        offsetPos -= transform.right * 0.6f;
        transform.rotation = Quaternion.LookRotation(Vector3.forward, Vector3.up);
    }

    // 应用最终位置
    transform.position = offsetPos;
    hanging = true;
}

关键逻辑说明:

  • 获取边缘法线:通过射线从抓钩点向下检测边缘碰撞体,获取表面法线,再投影到水平平面,得到边缘的水平方向法线(边缘外侧的方向)。
  • 后退移动:让角色向法线的反方向移动一段距离,确保角色不会卡在边缘模型中,同时符合“轻微后退”的需求。
  • 旋转对齐:使用Quaternion.LookRotation让角色的正面朝向边缘外侧(和阿卡姆系列的悬挂姿态一致),如果需要角色朝向边缘内侧,只需将horizontalLedgeNormal取反即可。

优化提示:

如果你的抓钩检测系统(findGrapplePoint.WinnerGrapple)已经包含了边缘的法线信息,直接使用该法线替代射线检测会更准确,比如:

// 替换射线检测部分,直接用抓钩点的法线
Vector3 ledgeNormal = findGrapplePoint.WinnerGrapple.Normal;
Vector3 horizontalLedgeNormal = Vector3.ProjectOnPlane(ledgeNormal, Vector3.up).normalized;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 19:14:49