2016-10-19 7 views
2

以下のコードは動作していますが、 "Particle"は "ParticleSystem"クラスのインスタンスです。Unity ParticleSystemの "Struct"を理解する

"Particle.emissionは" 取得専用のプロパティをリターン構造体 "ParticleSystem.EmissionModule" である

"em.rateは" プロパティで、型が構造体 "ParticleSystem.MinMaxCurve" である

ParticleSystem.EmissionModule em = Particle.emission; 
em.rate = new ParticleSystem.MinMaxCurve(5); 

私の問題は、上記のコードが「パーティクル」インスタンスのレートを変更できる理由は何ですか?現在、私の推測では、元にリンクまたは関連することができ、いくつかの参照が格納される構造体「ParticleSystem.EmissionModule」であることを直接変更することはできません、またはそれはCS1612

の原因となりますので、構造体は、参照ではない

注意"パーティクル"インスタンス?

+0

完全な例がなければ、それは非常に難しいです - あなたは* EmissionModuleは構造体ですか?そして、あなたが 'Particle.emission.rate'を使うと、新しいレートが見えますか? –

+0

はい、私は確信しています、なぜ私は彼らのタイプを提供し、この問題を説明することができるのですか。 – Developer

+0

「レート」の変更が実際に「パーティクル」の排出レートを変更することを、どのように確認しましたか?変更前と変更後の 'Particle.emission.rate'の値を記録するとどうなりますか? –

答えて

4

.NET Reflectorで深く掘り下げた後で、この現象も気付きました。

最新Unityのバージョンを使用して、コードの完全な例:

ParticleSystem particle = GetComponent<ParticleSystem>(); 
ParticleSystem.EmissionModule em = particle.emission; 
em.rate = new ParticleSystem.MinMaxCurve(5); 

物事は心に留めて:

ParticleSystemclassです。

EmissionModuleは、structです。ユニティ5にし、上記の粒子の放出率を変更するには

、あなたはParticleSystem.emissionが、その後、あなたはそれがこの仕事をしてどのようにrate変数

です変更することができ、一時EmissionModule(構造体)に保管して取得する必要がありますか?あなたが行うと

ParticleSystem particle = GetComponent<ParticleSystem>(); 

をまたは作成/ ParticleSystem新しいインスタンスまたはエディタを使用して1を添付し、Unityは新しいEmissionModuleインスタンスを作成します。 EmissionModuleは、ParticleSystemをパラメータとするinternalコンストラクタを持ちます。 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)の結果を呼び出すことができます。

+0

ありがとう、これは私が前に推測した "EmissionModule"構造体の粒子クラスの参照を保存する構造体です! – Developer

+0

それは私が思った最初のものでした。投稿する前に確認したいと思って、それを確認するためにリフレクターを使用した後に本当であることが判明しました。 – Programmer

関連する問題