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

Unity中使用OnParticleCollision获取粒子碰撞力时无法访问属性的问题

解决无法访问Particle Collision Events属性的问题

不是缺少库,问题出在你没有正确初始化并获取ParticleCollisionEvent数组,直接访问属性自然会失败。以下是正确的实现流程:

1. 声明并初始化碰撞事件数组

在脚本中先定义一个ParticleCollisionEvent类型的数组,用来存储碰撞产生的事件数据:

private ParticleCollisionEvent[] collisionEvents;

void Start()
{
    // 获取当前物体上的ParticleSystem组件
    ParticleSystem particleSystem = GetComponent<ParticleSystem>();
    // 根据粒子系统的最大粒子数初始化数组,避免存储溢出
    collisionEvents = new ParticleCollisionEvent[particleSystem.main.maxParticles];
}

2. 在OnParticleCollision中获取并访问事件属性

在OnParticleCollision方法里,调用ParticleSystem.GetCollisionEvents填充数组,之后就能遍历访问目标属性:

void OnParticleCollision(GameObject other)
{
    ParticleSystem particleSystem = GetComponent<ParticleSystem>();
    // 获取碰撞事件数量,同时将事件数据填充到数组中
    int eventCount = particleSystem.GetCollisionEvents(other, collisionEvents);

    for (int i = 0; i < eventCount; i++)
    {
        // 正常访问所需属性
        Vector3 particleVelocity = collisionEvents[i].velocity;
        Vector3 collisionNormal = collisionEvents[i].normal;
        Vector3 intersectionPoint = collisionEvents[i].intersection;
        Component hitCollider = collisionEvents[i].colliderComponent;

        // 示例:计算碰撞力(公式:力 = 质量 * 速度变化 / 时间)
        float particleMass = particleSystem.main.startMass.constant;
        float collisionForce = particleMass * particleVelocity.magnitude / Time.fixedDeltaTime;
    }
}

额外注意事项

  • 确保粒子系统的碰撞模块已启用,并且勾选了Send Collision Messages选项,否则OnParticleCollision方法不会被触发。
  • 如果后续调整了粒子系统的最大粒子数,需要重新初始化数组,或者在每次调用时动态检查数组长度(若事件数量超过数组长度,就重新创建数组)。
  • colliderComponent返回的是碰撞到的组件(如Collider、Rigidbody),可根据需求用as关键字转换为对应类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:18:19