簡體   English   中英

了解Unity粒子系統中的“結構”

[英]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);
    }
}

為了簡化此過程,我們可以將其稱為structEmissionModule )中的classParticleSystem )的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM