Unity は ParticleSystem.Simulate を使用して、パーティクルの再生をタイム スケーリングの影響を受けないようにし、ParticleSystem.Simulate の詳細を説明します。

目次

序文:

コード:

シミュレートの詳細な説明:

1. Unity API の説明:

パラメータ:

説明:

2. Unity APIの説明がよくわからなかったので、以下の実験を行った

(1). パラメータ t

効果:

結論は:

(2). パラメータ再起動: true

効果:

(3). パラメータ再起動: false

効果:

結論 2:

(4). Simulate を使用して、タイム スケーリングの影響を受けずに特殊効果の再生を実現する

効果:

結論3:

(5). パラメータ fixedTimeStep

効果:

結論 4:


序文:

    Unity プロジェクトでは、通常、時間スケーリングを動的に調整して、いくつかの表示効果を行います.たとえば、ボスがアリーナに入ると、時間スケーリングを 0 に調整して、影響を受けずにボスの表示時間を与えることがよくあります.その他の要因 ボス出現時 時間が止まるとボス周辺の特殊効果も一時停止し、ボスの表示アクションと表示特殊効果が一致しない問題が発生するので、解決策はありますか?このとき、ParticleSystem.Simulate を使用します。

コード:

 void Update() {
        particleSystems[0].Simulate(1, true, true);
    } 

注: 2 番目のパラメータは、このパーティクルの子も時間スケーリングの影響を受けないかどうかを制御します

シミュレートの詳細な説明:

1. Unity API の説明:

public void Simulate (float t, bool withChildren= true, bool restart= true, bool fixedTimeStep= true);

パラメータ:

t: ParticleSystem が早送りをシミュレートする期間 (秒単位)。restart が true の場合、ParticleSystem を時間 0 にリセットし、その値から早送りしますrestart が false の場合、ParticleSystem シミュレーションはその時点で指定された現在の状態から早送りされます


withChildren:すべての子パーティクル システムを同時に早送りします


再起動:再起動して最初から開始します


fixedTimeStep:時間オプションの「固定時間」の値に基づいて、一定の間隔でシステムを更新するだけです

説明:

一定時間パーティクルをシミュレートして、パーティクル システムを早送りしてから一時停止します。


2. Unity APIの説明がよくわからなかったので、以下の実験を行った

(1). パラメータ t

void Start() {          particleSystems = this.GetComponentsInChildren<ParticleSystem>();         粒子システム[0].Simulate(1); }


効果:

 右側のパーティクルは 1 秒間再生した後の状態を示していることがわかります。

結論は:

ParticleSystem.Simulate は、特定の時間再生中の現在のパーティクル エフェクトのエフェクトをシミュレートできます。

(2). パラメータ再起動: true

void Start() {         particleSystems = this.GetComponentsInChildren<ParticleSystem>();         Invoke("シミュレート", 0.5f);     }


    void Simulate() {         particleSystems[0].Simulate(1, false, true);     }

効果:

 右のパーティクルは0.5秒再生後、瞬時に1秒再生する状態を示していることがわかりました

(3). パラメータ再起動: false

void Start() {         particleSystems = this.GetComponentsInChildren<ParticleSystem>();         Invoke("シミュレート", 0.5f);     }


    void Simulate() {         particleSystems[0].Simulate(1, false, false);     }

効果:

右のパーティクルは0.5秒再生後、瞬時に1.5秒再生する状態を示していることがわかりました

結論 2:

restart が true の場合、ParticleSystem.Simulate は現在のパーティクル エフェクトの再生効果を時間 t までシミュレートします。false
              の場合、ParticleSystem.Simulate は現在のパーティクル エフェクトの再生効果を再生時間 + 時間 t までシミュレートします。

(4). Simulate を使用して、タイム スケーリングの影響を受けずに特殊効果の再生を実現する

時間スケーリングを 0 に調整します

 

void Start() {         particleSystems = this.GetComponentsInChildren<ParticleSystem>();     }


    // Update はフレームごとに 1 回呼び出されます
    void Update() {         particleSystems[0].Simulate(1, false, true);     }

効果:

この時点で、左側のパーティクルの再生が停止し、右側のパーティクルが絶えず変化していることがわかったので、
速度を調整しました

void Start() {         particleSystems = this.GetComponentsInChildren<ParticleSystem>();     }


    // Update はフレームごとに 1 回呼び出されます
    void Update() {         particleSystems[0].Simulate(Time.unscaledDeltaTime, false, true);     }

 右側の粒子がちらつき、その後消えることがわかります

再度調整して再起動を閉じます

void Start() {         particleSystems = this.GetComponentsInChildren<ParticleSystem>();     }


    // Update はフレームごとに 1 回呼び出されます
    void Update() {         particleSystems[0].Simulate(Time.unscaledDeltaTime, false, false);     }

右の粒子は時間停止の状態で正常に再生されることが判明

注: 再生開始時に一瞬パーティクルが多くなる問題が発生し、ちょうど入ったときの Time.unscaledDeltaTime の値に問題があることが判明しました。

写真に示すように:

それは後で通常に戻ります

 

結論3:

上記の方法により、時間が0にスケーリングされたときに特殊効果の再生効果をシミュレートできます

(5). パラメータ fixedTimeStep

時間スケーリングを 1 に調整し、fixedTime の値を増やします

 

void Start() {         particleSystems = this.GetComponentsInChildren<ParticleSystem>();     }


    // Update はフレームごとに 1 回呼び出されます
    void Update() {         particleSystems[0].Simulate(Time.deltaTime, false, false, true);     }

効果:

   右側のパーティクルは 0.3 秒ごとに変化します

結論 4:

fixedTimeStep が true の場合、パーティクルは fixedtimestep ごとに更新されます

おすすめ

転載: blog.csdn.net/SmillCool/article/details/127070139