嗨,我偶然發現了一些奇怪的東西,我想停止粒子系統的發射,如下所示:
laser.GetComponent<ParticleSystem>().emission.enabled = false;
但我收到錯誤CS1612(無法修改回傳值,因為它不是變數)
但
var emissionModule = laser.GetComponent<ParticleSystem>().emission;
emissionModule.enabled = false;
有效,現在我搜索了這個問題,但每個人都說你不能這樣做,因為回傳值是按值而不是按參考回傳的,但這不可能是真的,因為上面的代碼確實將發射模塊更改為false游戲中,它沒有更改我的代碼中的本地副本,它實際上在參考上更改了它,所以我的問題是為什么首先創建一個變數會做任何不同的事情,然后只是在同一行上更改它?它可以在 JS/Python 中作業
如果我不得不做類似的事情
var emissionModule = laser.GetComponent<ParticleSystem>().emission;
emissionModule.enabled = false;
laser.GetComponent<ParticleSystem>().emission = emissionModule
我會更好地理解這個問題,但我不需要像這里那樣做,我不需要再次分配它,正如我在第二個示例中展示的那樣,它作業正常,所以它沒有意義, emitModule 似乎是一個參考而不是一個值副本
TL;DR 版本:
這是代碼的完整示例:
void changeLasers(bool isActive) {
foreach (GameObject laser in lasers) {
var emissionModule = laser.GetComponent<ParticleSystem>().emission;
emissionModule.enabled = isActive;
}
}
這很奇怪,它可以作業,但我不需要再次分配它,所以為什么我不能在 1 行中做呢?c# 強迫我在這里使用另一個變數似乎很奇怪。這給出了CS1612錯誤:
void changeLasers(bool isActive) {
foreach (GameObject laser in lasers) {
laser.GetComponent<ParticleSystem>().emission.enabled = isActive;
}
}
uj5u.com熱心網友回復:
emitModule 似乎是一個參考而不是一個值副本
好吧,它不是;)
EmissionModule是一個結構,因此該ParticleSystem.emission屬性按值回傳一個副本!
由于 Unity 實際上主要是一個 C 引擎,而 C# 只是它上面的一層,因此大多陣列件屬性實際上只是將 getter 和 setter 包裝到實際實作它們的底層 C 部分中。(見源代碼)
=> Unity 中的大多數屬性的行為與此完全相同,您總是需要使用 getter,存盤它們,修改它們并重新分配它們。
在這種情況下,很可能內部結構仍然持有對系統的參考,這允許enabled屬性直接影響底層系統。
仍然因為 c# 是這樣的,所以您不能直接修改回傳的結構的值。
uj5u.com熱心網友回復:
derHugo 在這里回答了 c# 問題(我們確實通過值獲得了一個結構),
我想談談為什么我們不需要重新分配結構:
它不會正常作業,這是 Unity 引擎在幕后完成的黑魔法(基本上應用您的結構更改,而無需重新分配結構)。
有關此主題的更多資訊:
https
://forum.unity.com/threads/is-particlesystem-emissionmodule-a-struct-and-how-should-we-use-it.821988/
更詳細一點:
https: //blog.unity.com/technology/particle-system-modules-faq
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/523512.html
標籤:C#unity3d
