gpt4 book ai didi

c# - 了解Unity ParticleSystem中的 "Struct"

转载 作者:行者123 更新时间:2023-11-30 20:18:56 25 4
gpt4 key购买 nike

下面的代码有效,“Particle”是类“ParticleSystem”的一个实例。

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

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

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

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

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

目前,我的猜测是结构“ParticleSystem.EmissionModule”存储了一些可以链接或关联到原始“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 然后将其存储在临时 EmissionModule (struct) 然后你可以修改它的 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访问器(accessor)。没有 set访问器(accessor)。因此,它是一个只读属性。

emission 属性看起来像这样:

public EmissionModule emission
{
get
{
return new EmissionModule(this);
}
}

最后,当您这样做时:

em.rate = ....

或更改发射率,保存的引用用于更改用 C++ 编写的 Unity native 端的粒子率。

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)。

关于c# - 了解Unity ParticleSystem中的 "Struct",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40130332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com