首页 > 解决方案 > 当我试图让粒子系统慢慢消失时,Unity 崩溃(C 代码)

问题描述

我做了一些事情,由于某种原因,在执行这段代码后,统一就崩溃了。我想做的是慢慢地让粒子系统消失。这是代码:

public float TimeToDestroy;
private ParticleSystem ParticleSystem;
private float MaxParticle;
private float OriginalTimeToDestroy;
private float OriginalMaxParticle;
private void Start()
{
    ParticleSystem = GetComponent<ParticleSystem>();
    OriginalTimeToDestroy = TimeToDestroy;
    MaxParticle = ParticleSystem.maxParticles;
    OriginalMaxParticle = MaxParticle;
    Destroy(gameObject, TimeToDestroy);
    while (TimeToDestroy >= 0)
    {
        MaxParticle = Mathf.Lerp(OriginalMaxParticle, 0, OriginalTimeToDestroy);
        ParticleSystem.maxParticles = Mathf.RoundToInt(MaxParticle);
    }
    Destroy(gameObject);
}
private void Update()
{
    TimeToDestroy -= Time.deltaTime;
}

标签: c#unity3d

解决方案


Malphegal 说了这么多,你有一个无限循环。您永远不会将控制权交给 Unity,以便Update可以运行(并TimeToDestroy减少),因此它会冻结。要么按照 Malphegal 的建议使用 Update 方法,要么制作Start协程。

协程方式

public float TimeToDestroy;
private ParticleSystem ParticleSystem;
private float MaxParticle;
private float OriginalTimeToDestroy;
private float OriginalMaxParticle;

private IEnumerator Start()
{
    ParticleSystem = GetComponent<ParticleSystem>();
    OriginalTimeToDestroy = TimeToDestroy;
    MaxParticle = ParticleSystem.maxParticles;
    OriginalMaxParticle = MaxParticle;
    while (TimeToDestroy >= 0)
    {
        MaxParticle = Mathf.Lerp(OriginalMaxParticle, 0, OriginalTimeToDestroy);
        ParticleSystem.maxParticles = Mathf.RoundToInt(MaxParticle);
        yield return null;
        TimeToDestroy -= Time.deltaTime;
    }
    Destroy(gameObject);
}

Update方法

public float TimeToDestroy;
private ParticleSystem ParticleSystem;
private float MaxParticle;
private float OriginalTimeToDestroy;
private float OriginalMaxParticle;

private void Start()
{
    ParticleSystem = GetComponent<ParticleSystem>();
    OriginalTimeToDestroy = TimeToDestroy;
    MaxParticle = ParticleSystem.maxParticles;
    OriginalMaxParticle = MaxParticle;
}

private void Update()
{
    if(TimeToDestroy >= 0)
    {
        TimeToDestroy -= Time.deltaTime;
        MaxParticle = Mathf.Lerp(OriginalMaxParticle, 0, OriginalTimeToDestroy);
        ParticleSystem.maxParticles = Mathf.RoundToInt(MaxParticle);
    }
    else
        Destroy(gameObject);
}

推荐阅读