了解 Unity ParticleSystem 中的 "Struct"
Understanding the "Struct" in Unity ParticleSystem
下面的代码有效,"Particle" 是 class "ParticleSystem" 的实例。
"Particle.emission" 是一个 只获取 属性 return 结构 "ParticleSystem.EmissionModule"
"em.rate"是一个属性,类型是struct"ParticleSystem.MinMaxCurve"
ParticleSystem.EmissionModule em = Particle.emission;
em.rate = new ParticleSystem.MinMaxCurve(5);
我的问题是,为什么上面的代码可以更改 "Particle" 实例中的速率?
注意结构不是引用,不能直接修改,否则会导致CS1612
目前,我的猜测是结构 "ParticleSystem.EmissionModule" 存储了一些可以 link 或与原始 "Particle" 实例相关的引用?
我也注意到了这种行为,但在使用 .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
then store it in a temporary EmissionModule
(struct) then you can modify it's rate
变量
这是如何工作的?
当你做的时候:
ParticleSystem particle = GetComponent<ParticleSystem>();
或create/instantiate新建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 将从当前粒子 (particle
) 和 return 创建新的 EmissionModule
实例。这将包含保存的 ParticleSystem
(tempParticleSystem) 引用。请记住 ParticleSystem
是一个 class,因此引用仍然存在。 emission
属性 只有 get
访问器。没有 set
访问器。正因为如此,它是一个 read only 属性.
emission
属性 看起来像这样:
public EmissionModule emission
{
get
{
return new EmissionModule(this);
}
}
最后,当你做的时候:
em.rate = ....
或者更改发射率,保存的引用用于更改用 C++ 编写的 Unity 本机端的粒子率。
public ParticleSystem.MinMaxCurve rate
{
get
{
ParticleSystem.MinMaxCurve curve = new ParticleSystem.MinMaxCurve();
getParticleRate(this.tempParticleSystem, ref curve);
return curve;
}
set
{
setParticleRate(this.tempParticleSystem, ref value);
}
}
为了简化这一点,我们可以将其称为 struct
(EmissionModule
)内的 class
(ParticleSystem
)的结果。
下面的代码有效,"Particle" 是 class "ParticleSystem" 的实例。
"Particle.emission" 是一个 只获取 属性 return 结构 "ParticleSystem.EmissionModule"
"em.rate"是一个属性,类型是struct"ParticleSystem.MinMaxCurve"
ParticleSystem.EmissionModule em = Particle.emission;
em.rate = new ParticleSystem.MinMaxCurve(5);
我的问题是,为什么上面的代码可以更改 "Particle" 实例中的速率?
注意结构不是引用,不能直接修改,否则会导致CS1612
目前,我的猜测是结构 "ParticleSystem.EmissionModule" 存储了一些可以 link 或与原始 "Particle" 实例相关的引用?
我也注意到了这种行为,但在使用 .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
then store it in a temporary EmissionModule
(struct) then you can modify it's rate
变量
这是如何工作的?
当你做的时候:
ParticleSystem particle = GetComponent<ParticleSystem>();
或create/instantiate新建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 将从当前粒子 (particle
) 和 return 创建新的 EmissionModule
实例。这将包含保存的 ParticleSystem
(tempParticleSystem) 引用。请记住 ParticleSystem
是一个 class,因此引用仍然存在。 emission
属性 只有 get
访问器。没有 set
访问器。正因为如此,它是一个 read only 属性.
emission
属性 看起来像这样:
public EmissionModule emission
{
get
{
return new EmissionModule(this);
}
}
最后,当你做的时候:
em.rate = ....
或者更改发射率,保存的引用用于更改用 C++ 编写的 Unity 本机端的粒子率。
public ParticleSystem.MinMaxCurve rate
{
get
{
ParticleSystem.MinMaxCurve curve = new ParticleSystem.MinMaxCurve();
getParticleRate(this.tempParticleSystem, ref curve);
return curve;
}
set
{
setParticleRate(this.tempParticleSystem, ref value);
}
}
为了简化这一点,我们可以将其称为 struct
(EmissionModule
)内的 class
(ParticleSystem
)的结果。