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

碰撞时播放爆炸粒子系统失效,报错无法修改ParticleSystem.emission返回值

解决Unity粒子系统Emission修改报错的问题

嘿,这个报错我之前也踩过坑,其实是Unity里值类型和引用类型的小陷阱!咱们一步步捋清楚:

错误原因

ParticleSystem.emission 返回的是**EmissionModule值类型(struct)**,不是引用类型。当你直接写 explosion.emission.enabled = false 时,实际是在修改这个值类型的临时副本,根本影响不到原粒子系统的设置,所以Unity会抛出这个错误来提醒你。

正确的修改方式

你需要先把这个模块的副本取出来,修改完属性后再赋值回去,就像这样:

修正Start方法的代码

public ParticleSystem explosion; // 注意这里要改成ParticleSystem,不是Particle哦!

void Start()
{
    // 先获取EmissionModule的副本
    var emissionModule = explosion.emission;
    // 修改副本的enabled属性
    emissionModule.enabled = false;
    // 把修改后的副本赋值回粒子系统
    explosion.emission = emissionModule;
}

额外的潜在问题提醒

你代码里还有个容易忽略的小问题:Destroy(this.gameObject) 之后再调用 explosion.Play(),如果explosion是当前物体的子物体,粒子系统会跟着一起被销毁,根本播不出来。可以改成这两种方式:

  • 方式一:先播放粒子,延迟销毁当前物体
private void OnCollisionEnter(Collision collision)
{
    if(collision.gameObject.name == "Cube")
    {
        // 先播放爆炸粒子
        explosion.Play();
        // 延迟1秒(可根据粒子播放时长调整)再销毁当前物体
        Destroy(this.gameObject, 1f);
        // 加载场景
        UnityEngine.SceneManagement.SceneManager.LoadScene("GameOver");
    }
}
  • 方式二:分离粒子系统和当前物体,避免被连带销毁
private void OnCollisionEnter(Collision collision)
{
    if(collision.gameObject.name == "Cube")
    {
        // 把粒子系统从当前物体下分离出来
        explosion.transform.parent = null;
        // 播放粒子
        explosion.Play();
        // 销毁当前物体
        Destroy(this.gameObject);
        // 加载场景
        UnityEngine.SceneManagement.SceneManager.LoadScene("GameOver");
    }
}

另外注意,变量声明 public Particle explosion; 要改成 public ParticleSystem explosion;——Particle是单个粒子的类,咱们要操控的是整个粒子系统~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:58:37