void UpdateBeam(Beam beam) { var prev = beam.position; beam.Update(Time.deltaTime, target.position); var cur = beam.position; float l = (cur - prev).magnitude; float c = l * beamParameters.countPerMeter; int ci = (int)c; float frac = c - (float)ci; if (UnityEngine.Random.value < frac) { ci++; } EmitBeamParticles(beam, ci, prev, cur); // ヒット判定 var diff = beam.position - target.position; if (diff.magnitude < 3f) { targetVelocity += beam.velocity * beamParameters.impact; beam.time = -float.MaxValue; // ビーム消滅 Spark(beam.position, beam.velocity, diff.normalized, sparkParameters.sharpness, sparkParameters.particleCount); } }
public override void Update(GameTime gameTime) { base.Update(gameTime); Beam.Update(gameTime); if (Target != null) { float angleToTarget = Trigonometry.GetAngleOfLineBetweenObjectAndTarget(this, Target.WorldPosition); if (Math.Abs(angleToTarget - WorldRotation) <= 0.1f) { Fire(); } else { firing = false; firingSoundEffectInstance.Pause(); } } else { firing = false; firingSoundEffectInstance.Pause(); } if (firing) { Beam.Opacity = (float)Math.Min(Beam.Opacity + 0.02f, 1); } else { Beam.Opacity = (float)Math.Max(Beam.Opacity - 0.05f, 0); } TargetingLine.Visible = Opacity == 0 ? true : false; }