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

Unity 2D中如何获取两个物体的碰撞点位置

解决Unity碰撞点生成粒子特效的问题

要获取两个物体的碰撞点,直接用Collision2D参数里的接触点数组就行,下面是具体修改方案和解释:

步骤1:准备粒子特效资源

先在Unity编辑器里创建或导入你需要的粒子特效,把它做成预制体(Prefab),方便在代码里实例化。

步骤2:修改碰撞脚本

在敌人的碰撞脚本里添加粒子相关的逻辑,修改后的代码如下:

// 先声明粒子特效预制体的变量,在Inspector里赋值
public ParticleSystem hitEffectPrefab;

private void OnCollisionEnter2D(Collision2D collision)
{
    if(collision.relativeVelocity.magnitude > 7)
    {
        damage = damageConstant * collision.relativeVelocity.magnitude;
        health -= damage;
        CreatePopup(gameObject.transform.position, damage);

        // 获取碰撞点并生成粒子特效
        if (hitEffectPrefab != null && collision.contacts.Length > 0)
        {
            // 取第一个接触点作为粒子生成位置
            Vector2 hitPoint = collision.contacts[0].point;
            // 实例化粒子,2D项目里可把Z轴设为0(根据需求调整)
            ParticleSystem effect = Instantiate(hitEffectPrefab, new Vector3(hitPoint.x, hitPoint.y, 0f), Quaternion.identity);
            // 播放完粒子后自动销毁对象
            Destroy(effect.gameObject, effect.main.duration);
        }
    }
    if(health <= 0)
    {
        Destroy(gameObject);
    }
}

关键逻辑解释

  • collision.contacts:这是Collision2D自带的接触点数组,每个元素是ContactPoint2D类型,里面的point属性就是碰撞发生的世界坐标位置。
  • 取contacts[0]的原因:2D碰撞可能产生多个接触点(比如球体砸到敌人的多个部位),通常取第一个就足够满足需求;如果需要处理多接触点,可遍历数组逐个生成粒子。
  • 自动销毁粒子:用effect.main.duration获取粒子的播放时长,播放完成后自动销毁,避免场景堆积无用对象。

额外提示

  • 如果粒子特效不需要实例化(比如已在场景中存在),可直接调用Play()方法,同时把粒子位置设置为碰撞点。
  • 注意粒子的层级设置,确保它能显示在敌人和球体上方,避免被遮挡。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:50:27