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

2D跳跃玩家基于射线检测的Blob阴影效果实现问询

实现2D玩家跳跃时的Blob阴影(Raycast方案)

当然可以用Raycast实现这个需求!你的思路完全正确,只是之前的代码用了3D物理API,这在2D项目里肯定没法正常工作~我来帮你修正并详细说明实现步骤:

原代码的核心问题

你用了Physics.Raycast和RaycastHit,这些都是Unity 3D物理系统的接口,而你的项目是2D类型,应该使用Physics2D下的2D射线检测API,对应的命中信息是RaycastHit2D。另外圆形Blob阴影不需要旋转,LookAt在这里也没必要。

修正后的完整代码

public GameObject shadow; 
public GameObject player; 
// 可选:设置射线的最大检测距离,防止检测到过远的地面
public float raycastMaxDistance = 2f;

private void Start()
{
    // 初始状态先隐藏阴影
    shadow.SetActive(false);
}

private void Update() 
{
    // 从玩家位置向下发射2D射线
    RaycastHit2D hit = Physics2D.Raycast(player.transform.position, Vector2.down, raycastMaxDistance);

    // 判断是否命中了带有2DCollider的物体
    if (hit.collider != null)
    {
        // 启用阴影,并设置位置到射线命中点
        shadow.SetActive(true);
        shadow.transform.position = hit.point;
    }
    else
    {
        // 没命中就隐藏阴影
        shadow.SetActive(false);
    }
}

关键细节说明

  • 射线起始位置:如果玩家的Collider比较大,可以把射线起始点稍微向下偏移一点(比如player.transform.position + Vector3.down * 0.1f),避免射线从玩家体内出发导致检测异常。
  • 射线距离:设置raycastMaxDistance可以限制检测范围,比如玩家跳跃的最大高度是1.5f,就把距离设为2f,这样不会检测到场景底部很远的地面。
  • Collider设置:确保你的地面/平台对象添加了Collider2D(比如BoxCollider2D),并且没有勾选Is Trigger(因为射线检测默认不检测Trigger,除非你用Physics2D.Raycast的重载参数指定检测Trigger)。
  • 阴影的层级:可以把阴影放在单独的Sorting Layer,确保它显示在玩家下方但在地面上方,避免被遮挡。

额外优化(可选)

如果想让阴影有“贴合地面”的缩放效果(比如离地面越远阴影越小,越近越大),可以根据射线的命中距离调整阴影的缩放:

// 在hit.collider != null的分支里添加
float distance = Vector2.Distance(player.transform.position, hit.point);
// 调整缩放系数,0.8和0.2可以根据需求修改
float scale = Mathf.Lerp(0.8f, 1f, 1 - distance / raycastMaxDistance);
shadow.transform.localScale = new Vector3(scale, scale, 1f);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:39:42