2017-02-02 17 views
0

私はFlame Throwerを実装しようとしています。私は炎のためにパーティクルシステムをセットアップしました。プールされたオブジェクトです。炎の投射機の子供ではありません。 Fireボタンを押すとパーティクルシステムが起動し、ボタンが上がると停止します。しかし、プレーヤーが動いているときにパーティクルシステムが動かないという問題が発生しました。これはパーティクルシステムの再生を停止するとすぐに無効にする必要があります。

particles.transform.position = transform.GetChild(0).position; 

以下の行を追加することで解決した。しかし、私は(これは、2D横スクロールゲームです)プレーヤーを回転させたとき粒子が瞬時にそれを回転させるという別の問題を発見しました。プレイヤーが方向を変えると、現在のパーティクルが停止し、新しいパーティクルがアクティブになり、再生されます。しかし、問題は、Fireボタンを押しながら方向を変えるたびに新しいオブジェクトが作成されることです。

私のフレームスローダのコードはUnityEngineを使用して です。

public class FlameThrower : Gun 
{ 
    private ParticleSystem particles; 

    private int direction = 0; 
    private bool isFiring = false; 

    public override void Update() 
    { 
     if(shoot) 
     { 
      InitShoot(); 
     } 
     else 
     { 
      StopFire(); 
     } 
    } 

    public override void InitShoot() 
    { 
     if(!isFiring) 
     { 
      SelectDirection(); 
      Fire(); 
     } 

     //Check direction has changed 
     if(direction != playerManager.direction) 
     { 
      StopFire(); 
     } 

     if(particles != null) 
     { 
      particles.transform.position = transform.GetChild(0).position; 
     } 
    } 

    public override void Fire() 
    { 
     isFiring = true; 
     direction = playerManager.direction; 

     InstantiateParticles(weapon.bulletName, transform.GetChild(0).position, rotation); 
    } 

    public override void SelectDirection() 
    { 
     if (playerManager.direction == 1) 
     { 
      rotation = Quaternion.Euler(transform.rotation.x, transform.rotation.y, -90); 
     } 
     else if (playerManager.direction == -1) 
     { 
      rotation = Quaternion.Euler(transform.rotation.x, transform.rotation.y, 90); 
     } 
    } 

    public override void InstantiateParticles(string name, Vector3 position, Quaternion rotation) 
    { 
     GameObject bullet = ObjectPooler.instance.GetObject(name); 

     while (bullet == null) 
     { 
      ObjectPooler.instance.CreateObject(name); 
      bullet = ObjectPooler.instance.GetObject(name); 
     } 

     if (bullet != null) 
     { 
      particles = bullet.GetComponent<ParticleSystem>(); 
      //Set Position and rotation 
      bullet.transform.position = position; 
      bullet.transform.rotation = rotation; 
      bullet.SetActive(true); 
      particles.Play(); 
     } 
    } 

    private void StopFire() 
    { 
     if (particles != null) 
     { 
      isFiring = false; 
      particles.Stop(); 
      if(!particles.isPlaying) 
      { 
       particles.gameObject.SetActive(false); 
       particles = null; 
      } 
     } 
    } 
} 

問題は、StopFire()関数でパーティクルが再生されているかどうかをチェックすることです。それが再生されていない場合は、GameObjectを無効にします。しかし、パーティクルが止まってすぐにチェックされ、まだ再生されているので、その部分は実行されません。このパーティクルシステムは、再生が停止するとすぐに無効にします。

+0

GIFが役に立ちます! – Maakep

+1

粒子システムの 'シミュレーション空間'を 'world'に変更しました – Bijan

+0

@Bijanそれはうまくいきました。ありがとう。 – mahir

答えて

4

パーティクルシステムがローカルスペースでレンダリングされているようです。

Simulation SpaceWorldに変更してください。他の問題については

enter image description here

、あなたはゲームオブジェクトを無効にするならば、すでに放出される粒子が消えます。そして、もしそれらを遅延(Invokeなどを使用して)で非アクティブ化すると、その遅延内で新しいパーティクルが放出されます。

これを処理する最善の方法は、ゲームオブジェクトを非アクティブにするのではなく、発光を止めることです。これはインスペクタまたはコードで行うことができます。 myParticles.emission.enabled

enter image description here

+0

私は団体文書(私の国で禁止されています)にアクセスすることはできません。誰かが必要な文書を編集して追加していただければ幸いです。 – Bijan

+0

説明スクリーンショットがインラインで含まれています。 – Serlite

0
using UnityEngine; 

public class ParticleSystemControllerWindow : MonoBehaviour 
{ 
ParticleSystem system 
{ 
    get 
    { 
     if (_CachedSystem == null) 
      _CachedSystem = GetComponent<ParticleSystem>(); 
     return _CachedSystem; 
    } 
} 
private ParticleSystem _CachedSystem; 

public Rect windowRect = new Rect(0, 0, 300, 120); 

public bool includeChildren = true; 

void OnGUI() 
{ 
    windowRect = GUI.Window("ParticleController".GetHashCode(), windowRect, DrawWindowContents, system.name); 
} 

void DrawWindowContents(int windowId) 
{ 
    if (system) 
    { 
     GUILayout.BeginHorizontal(); 
     GUILayout.Toggle(system.isPlaying, "Playing"); 
     GUILayout.Toggle(system.isEmitting, "Emitting"); 
     GUILayout.Toggle(system.isPaused, "Paused"); 
     GUILayout.EndHorizontal(); 

     GUILayout.BeginHorizontal(); 
     if (GUILayout.Button("Play")) 
      system.Play(includeChildren); 
     if (GUILayout.Button("Pause")) 
      system.Pause(includeChildren); 
     if (GUILayout.Button("Stop Emitting")) 
      system.Stop(includeChildren, ParticleSystemStopBehavior.StopEmitting); 
     if (GUILayout.Button("Stop & Clear")) 
      system.Stop(includeChildren, ParticleSystemStopBehavior.StopEmittingAndClear); 
     GUILayout.EndHorizontal(); 

     includeChildren = GUILayout.Toggle(includeChildren, "Include Children"); 

     GUILayout.BeginHorizontal(); 
     GUILayout.Label("Time(" + system.time + ")"); 
     GUILayout.Label("Particle Count(" + system.particleCount + ")"); 
     GUILayout.EndHorizontal(); 
    } 
    else 
     GUILayout.Label("No particle system found"); 

    GUI.DragWindow(); 
} 
} 

これは、遊んで一時停止し、完全に粒子を放出するから、あなたのパーティクルシステムを停止することであなたを助けるかもしれません。 私は助けてくれることを願っています。

関連する問題