【问题标题】:Why setting ParticleSystem.main properties works like this?为什么设置 ParticleSystem.main 属性是这样的?
【发布时间】:2023-01-08 04:29:02
【问题描述】:
在 Unity 手册中,我们被告知要像这样设置属性
ParticleSystem ps = GetComponent<ParticleSystem>();
var main = ps.main;
main.startDelay = 5.0f;
我不明白为什么它会起作用,因为 main 和 startDelay 是值类型。
这是否意味着 main 有复杂的 setter 链接到 ParticleSystem 对象?这种方法的好处是什么?
现在我不能做ps.main.startDelay = 5.0f;,但本质上拆分“错误”不会给我任何错误。
我重新创建了原始环境,以检查我是否正确理解了 C# 值类型。
如果您在类中有一个结构,则不能像这样更改结构属性。它没有任何影响!
【问题讨论】:
标签:
c#
unity3d
value-type
particle-system
【解决方案1】:
这是否意味着 main 有复杂的 setter 链接到 ParticleSystem 对象?
-> 是的!
MainModule 知道粒子系统,事情实际上发生在引擎的底层原生 c++ 层中。
这种方法的好处是什么?
由于模块本身实际上并没有做任何事情,只是作为到本机代码的链接,所以它是类还是结构并不重要,除了引用类型与值类型在内存中的处理方式。
他们只是想将某些功能集中到模块中以使其更易于使用......它也可以直接包含在 ParticleSystem 的 API 中,但这样会非常混乱并且难以理解什么属于一起。
这基本上都归结为底层原生粒子的工作方式(我们没有任何信息,因为引擎的原生部分不公开)。
那
ps.main.startDelay = 5.0f;,
在 c# 级别上是不允许的,这是我们必须处理的缺点 - 但显然采用这种方式的优势大于那种方式,并且对于几乎所有 Unity API 属性来说基本上是相同的 - 所以它再次保持一致。