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

如何让Unity 2D游戏对象垂直于碰撞体调整朝向

2D玩家攀爬与定向跳跃实现方案

核心思路

通过Raycast检测障碍物接触时,获取碰撞体的法线方向(即与碰撞体表面垂直的向外方向),将该方向作为跳跃的基准方向,实现沿障碍物反方向的跳跃逻辑。

具体实现步骤

  • 接触检测与法线获取:用Raycast检测玩家与墙壁/斜坡的接触,命中时提取RaycastHit2D.normal值,这就是碰撞体表面的垂直向外方向。
  • 对齐跳跃方向:可将玩家的transform.up设置为该法线(或单独维护一个跳跃方向变量,避免影响视觉旋转)。
  • 定向跳跃执行:跳跃时沿该法线方向施加力,或沿此方向发射跳跃路径检测Raycast。

代码示例(Unity C#)

using UnityEngine;

public class PlayerClimbJump : MonoBehaviour
{
    [Header("检测设置")]
    public float contactCheckDistance = 0.6f;
    public LayerMask obstacleLayer;

    [Header("跳跃设置")]
    public float jumpForce = 5f;
    public float jumpCheckDistance = 1f;

    private Rigidbody2D rb;

    void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        // 发射接触检测Raycast(可根据玩家朝向调整发射方向)
        RaycastHit2D hit = Physics2D.Raycast(transform.position, -transform.up, contactCheckDistance, obstacleLayer);

        if (hit)
        {
            // 对齐玩家up方向至碰撞体法线
            transform.up = hit.normal;

            // 示例:按空格触发跳跃
            if (Input.GetKeyDown(KeyCode.Space))
            {
                // 检测跳跃路径是否有阻碍
                RaycastHit2D jumpHit = Physics2D.Raycast(transform.position, transform.up, jumpCheckDistance, obstacleLayer);
                if (!jumpHit)
                {
                    // 沿法线方向施加跳跃力
                    rb.AddForce(transform.up * jumpForce, ForceMode2D.Impulse);
                }
            }
        }
        else
        {
            // 未接触障碍物时恢复默认向上方向
            transform.up = Vector3.up;
        }
    }

    // Scene视图绘制辅助线,方便调试Raycast路径
    void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawLine(transform.position, transform.position + (-transform.up * contactCheckDistance));
        Gizmos.color = Color.blue;
        Gizmos.DrawLine(transform.position, transform.position + (transform.up * jumpCheckDistance));
    }
}

注意事项

  • 务必设置正确的obstacleLayer,仅检测墙壁/斜坡所在层,避免误触发。
  • 调整contactCheckDistance参数,确保Raycast能精准检测到玩家与障碍物的接触(略大于玩家碰撞体半径即可)。
  • 若不想改变玩家的视觉旋转,可替换transform.up为自定义的Vector2 jumpDirection变量,仅在跳跃逻辑中使用该方向。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:33:10