2017-09-24 21 views
0

私は少し問題があります。私のゲームでは、マップ全体を拡大または縮小できるようにする必要があります。これは、パーティクルシステムも同様です。いくつかは地元であり、いくつかは世界の空間です。同じシステムを10倍に拡大すると、元のサイズと同じに見えるが大きさは10倍になるようにする方法はありますか?これは、速度、重力、減衰などもスケールすることを意味します。Unity Shuriken:パーティクルシステムを完全にスケールする

+0

カメラを動かすことはできませんか? – user3797758

+0

いいえ、これはゲームの唯一のものではありません – QFSW

+0

マップを別のシーンに移動してゲームと地図を同時にレンダリングすることは可能でしょうか?しばらくして行ったシーンの変更により、これが可能になるかもしれません。 – user3797758

答えて

0

スクリプトを作成して、ParticleSystemゲームオブジェクトに配置します。

class ParticleSystemScaler : Monobehaviour 
{ 
    ParticleSystem _ps; 
    public float sizeModifier = 1.0f; 

    void Awake() 
    { 
     _ps = GetComponent<ParticleSystem>(); 
     //For each property you want to scale, just multiply it by the size modifier. 
     _ps.startSize *= sizeModifier; 
    } 
} 

あなたは、いくつかの方法でこれを改善することができた。..

  1. ストア何らかのGameManager型クラスでsizeModifier、それはいくつかに
  2. キャッシュ起き上の元の値を必要なときにそれを取得浮動小数点数を入力してくださいoriginalStartSize *= sizeModifier
  3. awakeでサイズ変更を行う代わりに呼び出すことができる関数ResizeParticles(float modifier)をいくつか作成してください。

これらの改善はいつでもResizeParticles()を呼び出し、Bejascの答えに続いて(目を覚ましにそれがコンポーネントからコピーされていたであろう自分自身を)元のサイズに適用される「修飾子」

0

を持つことができますもう少し包括的かつ自動化されたバージョンを作りましたが、まだ追加していないパラメータがあります。

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class ParticleSystemScaler : MonoBehaviour 
{ 
    private ParticleSystem ThisSystem; 
    private ParticleSystem.MainModule ThisMain; 
    private ParticleSystem.NoiseModule ThisNoise; 
    private ParticleSystem.LimitVelocityOverLifetimeModule ThisLimitVelocity; 

    private float CurrentScale; 

    private float InitialGravity; 
    private float InitialNoiseStrength; 
    private float InitialNoiseFrequency; 
    private float InitialMaxVelocity; 

    private void Start() 
    { 
     Initialise(); 
     ResizeSystem(transform.lossyScale.x); 
    } 

    private void Initialise() 
    { 
     ThisSystem = GetComponent<ParticleSystem>(); 

     if (ThisSystem) 
     { 
      ThisMain = ThisSystem.main; 
      ThisNoise = ThisSystem.noise; 
      ThisLimitVelocity = ThisSystem.limitVelocityOverLifetime; 

      InitialGravity = ThisMain.gravityModifierMultiplier; 
      InitialNoiseStrength = ThisNoise.strengthMultiplier; 
      InitialNoiseFrequency = ThisNoise.frequency; 
      InitialMaxVelocity = ThisLimitVelocity.limitMultiplier; 
     } 
    } 

    private void ResizeSystem(float NewScale) 
    { 
     CurrentScale = NewScale; 

     if (ThisSystem) 
     { 
      ThisMain.gravityModifierMultiplier = InitialGravity * NewScale; 
      if (ThisMain.simulationSpace == ParticleSystemSimulationSpace.World) 
      { 
       ThisNoise.strengthMultiplier = InitialNoiseStrength * NewScale; 
       ThisNoise.frequency = InitialNoiseFrequency/NewScale; 
       ThisLimitVelocity.limitMultiplier = InitialMaxVelocity * NewScale; 
      } 
     } 
    } 

    private void Update() 
    { 
     if (transform.lossyScale.x != CurrentScale) { ResizeSystem(transform.lossyScale.x); } 
    } 
} 
関連する問題