繁体   English   中英

了解Unity粒子系统中的“结构”

[英]Understanding the “Struct” in Unity ParticleSystem

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

“ Particle.emission”是一个只读属性返回结构“ ParticleSystem.EmissionModule”

“ em.rate”是一个属性,类型为结构“ ParticleSystem.MinMaxCurve”

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

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

注意,该结构不是引用,因此无法直接更改,否则将导致CS1612

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

我也注意到了这种行为,但是在深入了解.NET Reflector之后,我发现了正在发生的情况。

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

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

注意事项:

ParticleSystem是一class

EmissionModule是一个struct

要在Unity 5及更高版本中更改粒子的发射速率,必须获取ParticleSystem.emission然后将其存储在临时的EmissionModule (结构)中,然后可以修改其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将根据当前粒子( particle )创建EmissionModule新实例,并将其返回。 它将包含已保存的ParticleSystem (tempParticleSystem)引用。 请记住, ParticleSystem是一个类,因此引用仍然存在。 emission属性仅具有get访问器。 没有set访问器。 因此,它是一个只读属性。

emission属性看起来像这样:

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

最后,当您执行以下操作时

em.rate = ....

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

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

为了简化此过程,我们可以将其称为structEmissionModule )中的classParticleSystem )的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM