下面的代码正在运行,“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”存储了一些可以链接或与原始“粒子”实例相关的引用?
答案 0 :(得分:6)
我也注意到了这种行为,但在深入研究.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
(结构)中,然后您可以修改它&#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);
}
}
为了简化这一点,我们可以在class
(ParticleSystem
)内将struct
(EmissionModule
)称为结果。