【发布时间】:2017-02-02 14:42:00
【问题描述】:
我正在尝试实现火焰喷射器。我已经为火焰设置了粒子系统。它是池化对象。它不是火焰喷射器的孩子。当我按下 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() 中它检查粒子是否正在播放。如果它没有播放,它将禁用游戏对象。但是该部分没有执行,因为它在粒子停止后不久被检查并且它仍然会播放。我希望这个粒子系统在它停止播放后立即被禁用
【问题讨论】:
-
GIF 会很有帮助!
-
将粒子系统的
simulation space改为world -
@Bijan 那行得通。谢谢。
-
@Bijan 听起来可以将其扩展为答案(不要忘记链接到文档以确保完整性)。
-
@Serlite 好的,谢谢
标签: unity3d