C# 了解",;结构";统一分词系统
下面的代码正在运行,“Particle”是类“ParticleSystem”的实例 “Particle.emission”是一个仅获取属性返回结构“ParticleSystem.EmissionModule” “em.rate”是一个属性,类型为结构“ParticleSystem.MinMaxCurve” 我的问题是,为什么上面的代码可以更改“粒子”实例中的速率 注意,结构不是引用,因此不能直接更改,否则会导致C# 了解",;结构";统一分词系统,c#,unity3d,struct,particle-system,C#,Unity3d,Struct,Particle System,下面的代码正在运行,“Particle”是类“ParticleSystem”的实例 “Particle.emission”是一个仅获取属性返回结构“ParticleSystem.EmissionModule” “em.rate”是一个属性,类型为结构“ParticleSystem.MinMaxCurve” 我的问题是,为什么上面的代码可以更改“粒子”实例中的速率 注意,结构不是引用,因此不能直接更改,否则会导致 目前,我的猜测是结构“ParticleSystem.EmissionModule”存
目前,我的猜测是结构“ParticleSystem.EmissionModule”存储了一些可以链接或关联原始“Particle”实例的引用?我也注意到了这种行为,但在使用.NET Reflector深入挖掘之后,我发现了发生了什么 最新Unity版本的完整代码示例:
ParticleSystem particle = GetComponent<ParticleSystem>();
ParticleSystem.EmissionModule em = particle.emission;
em.rate = new ParticleSystem.MinMaxCurve(5);
或者创建/实例化新的ParticleSystem
或通过编辑器附加一个,Unity将创建新的EmissionModule
实例EmissionModule
有一个内部
构造函数,该构造函数将ParticleSystem
作为参数。Unity将立即将当前的ParticleSystem
实例传递给此EmissionModule
构造函数,该实例存储在EmissionModule
结构中的临时变量中,以供以后使用
它看起来像这样:
private ParticleSystem tempParticleSystem;
internal EmissionModule(ParticleSystem particleInstance)
{
this.tempParticleSystem = particleInstance;
}
public EmissionModule emission
{
get
{
return new EmissionModule(this);
}
}
当您这样做时:
ParticleSystem particle = GetComponent<ParticleSystem>();
ParticleSystem.EmissionModule em = particle.emission;
em.rate = ....
Unity将从当前粒子(particle
)创建新的EmissionModule
实例并返回它。将包含已保存的ParticleSystem
(tempParticleSystem)引用。请记住,ParticleSystem
是一个类,因此引用仍然存在。该属性只有get
访问器。无set
accessor。因此,它是一个只读属性
该属性的外观如下所示:
private ParticleSystem tempParticleSystem;
internal EmissionModule(ParticleSystem particleInstance)
{
this.tempParticleSystem = particleInstance;
}
public EmissionModule emission
{
get
{
return new EmissionModule(this);
}
}
最后,当您执行时:
ParticleSystem particle = GetComponent<ParticleSystem>();
ParticleSystem.EmissionModule em = particle.emission;
em.rate = ....
或改变发射速率,保存的参考被用来改变在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);
}
}
为了简化这一点,我们可以将其称为
结构中的类(ParticleSystem
)(EmissionModule
)的结果。如果没有完整的示例,很难判断-您确定EmissionModule
是一个结构吗?如果你使用Particle.emission.rate
你会看到新的速率吗?是的,我确定,因此我可以提供它们的类型并描述这个问题。你是如何确定更改rate
实际上会更改Particle
的发射速率的?如果在更改前后记录Particle.emission.rate
的值,会发生什么情况?更改后,原来是10,之后是5您是否能够通过在更改前后记录Particle.emission.rate
看到这一点?有可能EmissionModule
引用了它来自的Particle
,但这看起来肯定很奇怪……谢谢,这也是我之前猜测的,struct“EmissionModule”存储Particle类的引用!是的,这也是我想到的第一件事。想在发布前验证,在使用反射器检查后,结果证明是真的。