[英]Unity particleSystem main access cannot modify struct member when accessed struct is not classified as a variable
[英]Understanding the “Struct” in Unity ParticleSystem
下面的代碼正在工作,“ Particle”是類“ ParticleSystem”的一個實例。
“ Particle.emission”是一個只讀屬性返回結構“ ParticleSystem.EmissionModule”
“ em.rate”是一個屬性,類型為結構“ ParticleSystem.MinMaxCurve”
ParticleSystem.EmissionModule em = Particle.emission;
em.rate = new ParticleSystem.MinMaxCurve(5);
我的問題是,為什么上面的代碼可以更改“粒子”實例中的速率?
注意,該結構不是引用,因此無法直接更改,否則將導致CS1612
當前,我的猜測是結構“ ParticleSystem.EmissionModule”是否存儲了一些可以鏈接或與原始“ 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
然后將其存儲在臨時的EmissionModule
(結構)中,然后可以修改其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將根據當前粒子( particle
)創建EmissionModule
新實例,並將其返回。 它將包含已保存的ParticleSystem
(tempParticleSystem)引用。 請記住, ParticleSystem
是一個類,因此引用仍然存在。 emission
屬性僅具有get
訪問器。 沒有set
訪問器。 因此,它是一個只讀屬性。
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
)的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.