void playSfx(AudioClip clip, YoumuSlashBeatMap.TargetBeat.Direction direction, bool varyPitch) { sfxSource.panStereo = voicePan * (direction == YoumuSlashBeatMap.TargetBeat.Direction.Right ? 1f : -1f); sfxSource.pitch = (varyPitch ? MathHelper.randomRangeFromVector(voicePitchRange) : 1f) * timeScale; sfxSource.PlayOneShot(clip); }
void attemptSlash(YoumuSlashBeatMap.TargetBeat.Direction direction) { var hitTarget = timingData.BeatMap.getFirstHittableTarget(timingData.CurrentBeat, hitTimeFudge.x / timingData.BeatDuration, hitTimeFudge.y / timingData.BeatDuration, direction); if (hitTarget != null) { attacking = true; direction = hitTarget.HitDirection; hitTarget.launchInstance.slash(MathHelper.randomRangeFromVector(sliceAngleRange)); nextIdleBeat = (int)hitTarget.HitBeat + 1; bool facingRight = direction == YoumuSlashBeatMap.TargetBeat.Direction.Right; setRigFacingRight(facingRight); setIdleFlipped(false); rigAnimator.SetTrigger("Attack"); rigAnimator.ResetTrigger("Idle"); float facingDirection = (facingRight ? -1f : 1f); spriteTrail.resetTrail(spriteTrailStartOffset * facingDirection, facingDirection); } }
public void playScheduled(YoumuSlashSoundEffect soundEffect, YoumuSlashBeatMap.TargetBeat.Direction direction, float time) { foreach (var sound in soundEffect.Sounds) { var newSource = Instantiate(audioSourcePrefab, transform); newSource.pitch = MathHelper.randomRangeFromVector(sound.PitchRange) * timeScale; newSource.panStereo = getStereoPan(sound.PanAmount, direction); if (sound.PanSpeed != 0f) { newSource.GetComponent <YoumuSlashMovingAudioSource>().setSpeed(sound.PanSpeed * (direction == YoumuSlashBeatMap.TargetBeat.Direction.Left ? -1f : 1f)); } newSource.clip = sound.Clip; if (time <= 0f) { newSource.Play(); } else { AudioHelper.playScheduled(newSource, time); } } }
public void play(YoumuSlashSoundEffect soundEffect, YoumuSlashBeatMap.TargetBeat.Direction direction) => playScheduled(soundEffect, direction, 0f);
float getStereoPan(float panAmount, YoumuSlashBeatMap.TargetBeat.Direction direction) => panAmount * (direction == YoumuSlashBeatMap.TargetBeat.Direction.Left ? -1f : 1f);
void attemptSlash(YoumuSlashBeatMap.TargetBeat.Direction direction) { var hitTarget = getFirstHittableTarget(direction); bool isHit = hitTarget != null; if (holdAttack && !isHit && attacking) //No slash if holdAttack is true and this slash attack is a miss and we're still attacking { return; } if (slashCooldownTimer > 0f && //No slash if cooldown timer isn't reached and attack is a miss (!isHit || !attackWasSuccess)) //Or if last attack was a miss { return; } else if (isHit) //For force direction (auto-slash) { direction = hitTarget.HitDirection; } //From here below slash is confirmed attackWasSuccess = isHit; slashCooldownTimer = slashCooldown; noteMissReactionQueued = false; lastAttackTime = Time.time; if (!(onAttack == null)) { onAttack(hitTarget); } //Do animation stuff rigAnimator.SetBool("IsAttacking", true); bool reAttacking = attacking == true && direction == lastSliceDirection; rigAnimator.SetBool("ReAttack", reAttacking); lastSliceDirection = direction; bool attackingUp = (!attackedUp && attacking); if (hitTarget != null && hitTarget.ForceUp) { attackingUp = true; } rigAnimator.SetBool("AttackUp", attackingUp); attackedUp = attackingUp; rigAnimator.SetBool("AttackMissed", !isHit); disableNoteMissReaction(); attacking = true; if (!isHit) { triggerMiss(); } bool facingRight = direction == YoumuSlashBeatMap.TargetBeat.Direction.Right; setRigFacingRight(facingRight); setIdleFlipped(false); rigAnimator.SetTrigger("Attack"); rigAnimator.ResetTrigger("Idle"); rigAnimator.SetBool("Tense", false); untenseBeat = -1; rigAnimator.SetBool("LookBack", false); rigAnimator.SetTrigger("ResetLook"); float facingDirection = (isRigFacingRight() ? -1f : 1f); spriteTrail.resetTrail(spriteTrailStartOffset * facingDirection); rigAnimator.SetBool("Scream", false); holdAttack = false; if (isHit) { //Hit successful hitTarget.launchInstance.slash(MathHelper.randomRangeFromVector(sliceAngleRange), slashAnimationEffectTime); nextIdleBeat = (int)hitTarget.HitBeat + 1; if (upsetResetHits > 0) { upsetResetHits--; if (upsetResetHits == 0) { rigAnimator.SetBool("Upset", false); } } switch (hitTarget.HitEffect) { case (YoumuSlashBeatMap.TargetBeat.Effect.Scream): rigAnimator.SetBool("Scream", true); nextIdleBeat++; MicrogameController.instance.playSFX(screamClip); holdAttack = true; break; default: MicrogameController.instance.playSFX(hitVoiceClip, pitchMult: Random.Range(.95f, 1.05f)); break; } } else { //Missed MicrogameController.instance.playSFX(hitVoiceClip, pitchMult: Random.Range(.95f, 1.05f)); } spriteTrail.EnableSpawn = isHit ? (!reAttacking) : false; }
YoumuSlashBeatMap.TargetBeat getFirstHittableTarget(YoumuSlashBeatMap.TargetBeat.Direction direction) { return(timingData.BeatMap.getFirstHittableTarget(timingData.CurrentBeat, hitTimeFudge.x / timingData.BeatDuration, hitTimeFudge.y / timingData.BeatDuration, direction)); }
void attemptSlash(YoumuSlashBeatMap.TargetBeat.Direction direction) { var hitTarget = getFirstHittableTarget(direction, true); bool isHit = hitTarget != null; if (Time.frameCount == lastSlashFrame) //Return if slashed already this frame { return; } if (holdAttack && !isHit && attacking) //No slash if holdAttack is true and this slash attack is a miss and we're still attacking { return; } if (slashCooldownTimer > 0f && //No slash if cooldown timer isn't reached and attack is a miss (!isHit || !attackWasSuccess)) //Or if last attack was a miss { return; } else if (isHit) //For force direction (auto-slash) { direction = hitTarget.HitDirection; } //From here below slash attempt is confirmed lastSlashFrame = Time.frameCount; attackWasSuccess = isHit; slashCooldownTimer = slashCooldown; noteMissReactionQueued = false; lastAttackTime = Time.time; if (!(onAttack == null)) { onAttack(hitTarget); } if (!attackWasSuccess && emptySwingsDepleteHealth) { noteMissReactionQueued = true; } //Do animation stuff rigAnimator.SetBool("IsAttacking", true); bool reAttacking = attacking == true && direction == lastSliceDirection; rigAnimator.SetBool("ReAttack", reAttacking); lastSliceDirection = direction; bool attackingUp = (!attackedUp && attacking); if (hitTarget != null && hitTarget.TypeData.ForceUp) { attackingUp = true; } rigAnimator.SetBool("AttackUp", attackingUp); attackedUp = attackingUp; rigAnimator.SetBool("AttackMissed", !isHit); disableNoteMissReaction(); attacking = true; if (!isHit) { triggerMiss(emptySwingsDepleteHealth); } bool facingRight = direction == YoumuSlashBeatMap.TargetBeat.Direction.Right; setRigFacingRight(facingRight); setIdleFlipped(false); rigAnimator.SetTrigger("Attack"); rigAnimator.ResetTrigger("Idle"); rigAnimator.SetBool("Tense", false); untenseBeat = -1; rigAnimator.SetBool("LookBack", false); rigAnimator.SetTrigger("ResetLook"); float facingDirection = (isRigFacingRight() ? -1f : 1f); rigAnimator.SetBool("Scream", false); holdAttack = false; if (isHit) { //Hit successful var offset = AutoSlash ? 0f : timingData.PreciseBeat - hitTarget.HitBeat; hitTarget.launchInstance.slash(MathHelper.randomRangeFromVector(sliceAngleRange), slashAnimationEffectTime, offset); nextIdleBeat = (int)hitTarget.HitBeat + 1; if (upsetResetHits > 0) { upsetResetHits--; if (upsetResetHits == 0) { rigAnimator.SetBool("Upset", false); } } switch (hitTarget.TypeData.HitEffect) { case (YoumuSlashTargetType.Effect.Scream): rigAnimator.SetBool("Scream", true); nextIdleBeat++; playSfx(screamClip, direction, false); holdAttack = true; break; default: playSfx(getRandomHitClip(), direction, true); break; } if (!reAttacking) { spriteTrail.resetTrail(spriteTrailStartOffset * facingDirection, offset); } checkForGameplayEnd(hitTarget); } else { //Missed playSfx(getRandomHitClip(), direction, true); spriteTrail.resetTrail(spriteTrailStartOffset * facingDirection, 0f); } spriteTrail.EnableSpawn = isHit;// ? (!reAttacking) : false; }