私は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を無効にします。しかし、パーティクルが止まってすぐにチェックされ、まだ再生されているので、その部分は実行されません。このパーティクルシステムは、再生が停止するとすぐに無効にします。
GIFが役に立ちます! – Maakep
粒子システムの 'シミュレーション空間'を 'world'に変更しました – Bijan
@Bijanそれはうまくいきました。ありがとう。 – mahir