理解Unity ParticleSystem中的“结构”

时间:2016-10-19 11:35:54

标签: c# unity3d struct particle-system

下面的代码正在运行,“Particle”是“ParticleSystem”类的一个实例。

“Particle.emission”是 get-only属性返回struct“ParticleSystem.EmissionModule”

“em.rate”是一个属性,类型是struct“ParticleSystem.MinMaxCurve”

ParticleSystem.EmissionModule em = Particle.emission; 
em.rate = new ParticleSystem.MinMaxCurve(5);

我的问题是,为什么上面的代码可以改变“粒子”实例中的速率?

注意struct不是引用,因此不能直接更改,否则会导致CS1612

目前,我猜测结构“ParticleSystem.EmissionModule”存储了一些可以链接或与原始“粒子”实例相关的引用?

1 个答案:

答案 0 :(得分:6)

我也注意到了这种行为,但在深入研究.NET Reflector后我发现了发生了什么。

使用最新Unity版本的代码的完整示例:

ParticleSystem particle = GetComponent<ParticleSystem>();
ParticleSystem.EmissionModule em = particle.emission;
em.rate = new ParticleSystem.MinMaxCurve(5);

要记住的事情:

ParticleSystemclass

EmissionModulestruct

要更改Unity 5及更高版本中粒子的发射速率,您必须获取ParticleSystem.emission,然后将其存储在临时EmissionModule(结构)中,然后您可以修改它&#39; s rate变量

这是如何运作的?

当你做 时:

ParticleSystem particle = GetComponent<ParticleSystem>(); 

或创建/实例化新的ParticleSystem或通过编辑器附加一个,Unity将创建新的EmissionModule实例。 EmissionModule有一个internal构造函数,以ParticleSystem为参数。 Unity将立即将当前ParticleSystem实例传递给此EmissionModule构造函数,该实例存储在EmissionModule结构中的临时变量中供以后使用。

它看起来像这样:

private ParticleSystem tempParticleSystem;
internal EmissionModule(ParticleSystem particleInstance)
{
    this.tempParticleSystem = particleInstance;
}

当你做 时:

ParticleSystem.EmissionModule em = particle.emission;

Unity将从当前粒子(EmissionModule)创建particle的新实例并返回它。这将包含已保存的ParticleSystem(tempParticleSystem)引用。请记住,ParticleSystem是一个类,所以引用仍然存在。 emission属性只有get访问者。没有set访问者。因此,它只是一个读取属性。

emission属性看起来像这样:

public EmissionModule emission
{
    get
    {
        return new EmissionModule(this);
    }
}

最后,当你做 时:

em.rate = ....

或更改发射率,保存的引用用于更改Unity的本机端的粒子速率,该速率是用C ++编写的。

public ParticleSystem.MinMaxCurve rate
{
    get
    {
        ParticleSystem.MinMaxCurve curve = new ParticleSystem.MinMaxCurve();
        getParticleRate(this.tempParticleSystem, ref curve);
        return curve;
    }
    set
    {
        setParticleRate(this.tempParticleSystem, ref value);
    }
}

为了简化这一点,我们可以在classParticleSystem)内将structEmissionModule)称为结果。