C# 了解",;结构";统一分词系统

C# 了解",;结构";统一分词系统,c#,unity3d,struct,particle-system,C#,Unity3d,Struct,Particle System,下面的代码正在运行,“Particle”是类“ParticleSystem”的实例 “Particle.emission”是一个仅获取属性返回结构“ParticleSystem.EmissionModule” “em.rate”是一个属性,类型为结构“ParticleSystem.MinMaxCurve” 我的问题是,为什么上面的代码可以更改“粒子”实例中的速率 注意,结构不是引用,因此不能直接更改,否则会导致 目前,我的猜测是结构“ParticleSystem.EmissionModule”存

下面的代码正在运行,“Particle”是类“ParticleSystem”的实例

“Particle.emission”是一个仅获取属性返回结构“ParticleSystem.EmissionModule”

“em.rate”是一个属性,类型为结构“ParticleSystem.MinMaxCurve”

我的问题是,为什么上面的代码可以更改“粒子”实例中的速率

注意,结构不是引用,因此不能直接更改,否则会导致


目前,我的猜测是结构“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类的引用!是的,这也是我想到的第一件事。想在发布前验证,在使用反射器检查后,结果证明是真的。