理解“结构”在Unity粒子系统

本文关键字:Unity 粒子系统 结构 理解 | 更新日期: 2023-09-27 18:13:39

下面的代码可以正常工作,"Particle"是类" particlessystem "的一个实例。

"粒子。是一个只能获取的属性。EmissionModule "

"。是一个属性,类型是struct"particlessystem"。MinMaxCurve "

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

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

注意该结构体不是引用,所以不能直接更改,否则会导致CS1612

目前,我猜是结构体"particlessystem"。"EmissionModule"存储了一些可以链接或与原始"粒子"实例相关的引用?

理解“结构”在Unity粒子系统

我也注意到了这个行为,但是我在深入研究。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 (struct)中,然后你可以修改它的rate变量

这是如何工作的?

:

ParticleSystem particle = GetComponent<ParticleSystem>(); 

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

它看起来像这样:

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

:

ParticleSystem.EmissionModule em = particle.emission;
Unity将从当前粒子(particle)创建EmissionModule的新实例并返回它。这将包含已保存的ParticleSystem (tempparticlessystem)引用。记住,ParticleSystem是一个类,所以引用仍然存在。emission属性只有get访问器。无set访问器。因此,它是一个read only属性。

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);
    }
}

为了简化,我们可以称之为class (ParticleSystem)在struct (EmissionModule)内的结果。