理解“结构”在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"存储了一些可以链接或与原始"粒子"实例相关的引用?
我也注意到了这个行为,但是我在深入研究。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
(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
)内的结果。