public override void Emit(BulletEmitParam emitParam, Transform emitter) { var bulletComponent = Instantiate(bullet).AddComponent <GameObjectBullet>(); var absEmitParam = emitParam.RelativeTo(emitter); bulletComponent.Init(absEmitParam.position, absEmitParam.velocity, absEmitParam.color, absEmitParam.size); if (enableLifetime) { bulletComponent.EnableLifeTime(bulletLifeTime); } PlayEmissionEffect(emitParam, emitter); }
public void OnEmit(BulletEmitParam relative, Transform emitter) { if (!enabled) { return; } Quaternion lookRotation; Vector3 absolutePosition; switch (position) { case EffectPosition.OnEmitter: absolutePosition = emitter.position; break; case EffectPosition.OnParticle: absolutePosition = emitter.position + relative.position; break; default: throw new ArgumentOutOfRangeException(); } switch (rotation) { case EffectRotation.TowardsParticlePosition: lookRotation = Quaternion.LookRotation(relative.position - emitter.position); break; case EffectRotation.TowardsParticleVelocity: lookRotation = Quaternion.LookRotation(relative.velocity); break; case EffectRotation.None: lookRotation = Quaternion.identity; break; default: throw new ArgumentOutOfRangeException(); } var ps = Object.Instantiate(effect, absolutePosition, lookRotation, emitter); var psm = ps.main; psm.stopAction = ParticleSystemStopAction.Destroy; ps.Play(); }
public override void Emit(BulletEmitParam relative, Transform emitter) { ParticleSystem.EmitParams ToEmitParams(in BulletEmitParam bulletEmitParam) { var result = new ParticleSystem.EmitParams(); result.position = bulletEmitParam.position; result.velocity = bulletEmitParam.velocity; if (psr.renderMode == ParticleSystemRenderMode.Mesh) { var startRotation3D = psm.startRotation3D ? new Vector3( psm.startRotationX.Evaluate(ps.time) * psm.startRotationXMultiplier, psm.startRotationY.Evaluate(ps.time) * psm.startRotationYMultiplier, psm.startRotationZ.Evaluate(ps.time) * psm.startRotationZMultiplier) : new Vector3(0, 0, psm.startRotation.Evaluate(ps.time) * psm.startRotationMultiplier); result.rotation3D = (Quaternion.LookRotation(result.velocity == Vector3.zero ? Vector3.forward : result.velocity) * Quaternion.Euler(startRotation3D)).eulerAngles; } if (!bulletEmitParam.DefaultColor) { result.startColor = bulletEmitParam.color; } if (!bulletEmitParam.DefaultSize) { result.startSize3D = bulletEmitParam.size; } return(result); } ps.Emit( psm.simulationSpace == ParticleSystemSimulationSpace.World ? ToEmitParams(relative.RelativeTo(emitter)) : ToEmitParams(relative), 1); PlayEmissionEffect(relative, emitter); }
/// <summary> /// Plays the emission effect. Call this when emitting a bullet. /// </summary> protected void PlayEmissionEffect(BulletEmitParam emitParam, Transform emitter) => emissionEffect.OnEmit(emitParam, emitter);
public abstract void Emit(BulletEmitParam emitParam, Transform emitter);
/// <summary> /// Emits a single bullet. /// </summary> /// <param name="emitParam">Parameters of the bullet</param> /// <param name="bullet">The bullet type to emit</param> /// <param name="emitter">Bullet will be emitted relative to it</param> public void Emit(BulletEmitParam emitParam, IBulletSystem bullet, Transform emitter) => GetBulletController(bullet).Emit(emitParam, emitter);
/// <summary> /// Emits a single bullet from this emitter. /// </summary> /// <param name="emitParam">Parameters of the bullet</param> /// <param name="bullet">The bullet type to emit</param> public virtual void Emit(BulletEmitParam emitParam, IBulletSystem bullet) => Emit(emitParam, bullet, transform);
/// <summary> /// Emit a bullet. /// </summary> /// <param name="emitParam">Parameter of the bullet.</param> public Emit(BulletEmitParam emitParam) => emitParams = new[] { emitParam };