了解 Unity ParticleSystem 中的 "Struct"

Understanding the "Struct" in Unity ParticleSystem

下面的代码有效,"Particle" 是 class "ParticleSystem" 的实例。

"Particle.emission" 是一个 只获取 属性 return 结构 "ParticleSystem.EmissionModule"

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

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

我的问题是,为什么上面的代码可以更改 "Particle" 实例中的速率?

注意结构不是引用,不能直接修改,否则会导致CS1612

目前,我的猜测是结构 "ParticleSystem.EmissionModule" 存储了一些可以 link 或与原始 "Particle" 实例相关的引用?

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

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

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

注意事项:

ParticleSystemclass.

EmissionModulestruct.

要在 Unity 5 及更高版本中更改粒子的发射率,您必须获取 ParticleSystem.emission then store it in a temporary EmissionModule(struct) then you can modify it's rate 变量

这是如何工作的?

当你做的时候:

ParticleSystem particle = GetComponent<ParticleSystem>(); 

或create/instantiate新建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) 和 return 创建新的 EmissionModule 实例。这将包含保存的 ParticleSystem (tempParticleSystem) 引用。请记住 ParticleSystem 是一个 class,因此引用仍然存在。 emission 属性 只有 get 访问器。没有 set 访问器。正因为如此,它是一个 read only 属性.

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)的结果。