// 开始一次抖动 public void StartShake(ShakeType shakeType) { switch (shakeType) { case ShakeType.Dash: m_CurrentShakeParams = shakeParams_Dash; break; case ShakeType.Die: m_CurrentShakeParams = shakeParams_Die; break; default: throw new Exception("Error"); } rippleEffect.Emit(); timer = m_CurrentShakeParams.shakeTime; }
public static void GenerateImpulseAt(CameraShakeParams shakeParams, Vector3 position, Vector3 direction) { CinemachineImpulseDefinition impulseDefinition = new CinemachineImpulseDefinition(); impulseDefinition.m_ImpulseChannel = GameConfig.Instance.m_ImpulseChannel; impulseDefinition.m_RawSignal = GameConfig.Instance.m_ImpulseRawSignal; impulseDefinition.m_AmplitudeGain = shakeParams.m_AmplitudeGain; impulseDefinition.m_FrequencyGain = shakeParams.m_FrequencyGain; impulseDefinition.m_RepeatMode = CinemachineImpulseDefinition.RepeatMode.Stretch; impulseDefinition.m_Randomize = true; impulseDefinition.m_TimeEnvelope.m_AttackTime = shakeParams.m_AttackTime; impulseDefinition.m_TimeEnvelope.m_SustainTime = shakeParams.m_SustainTime; impulseDefinition.m_TimeEnvelope.m_DecayTime = shakeParams.m_DecayTime; impulseDefinition.m_ImpactRadius = 100f; impulseDefinition.m_DirectionMode = CinemachineImpulseManager.ImpulseEvent.DirectionMode.Fixed; impulseDefinition.m_DissipationMode = CinemachineImpulseManager.ImpulseEvent.DissipationMode.ExponentialDecay; impulseDefinition.m_DissipationDistance = 1000f; impulseDefinition.CreateEvent(position, direction); }
private void TriggerEffects(PlayerBaseAttackLogic attackLogic, uint damage, EAttackResult attackResult, EHitNotificationType hitNotificationType) { Profiler.BeginSample("PlayerHealthComponent.TriggerEffects"); PlayerAttack attack = attackLogic.GetAttack(); bool isDead = IsDead(); // No stun neither pushback when an attack is parried if (attackResult != EAttackResult.Parried) { if (attackLogic.CanStunOnDamage()) { m_StunInfoSC.StartStun(attackLogic, attackResult); } // If stun duration is not anim driven, we can set the duration and apply a pushback if (!m_StunInfoSC.IsStunDurationAnimDriven()) { if (attackLogic.CanStunOnDamage()) { float stunDuration = attackLogic.GetStunDuration(attackResult); if (stunDuration > 0f) { m_StunInfoSC.SetStunDuration(attackLogic, stunDuration); } } if (attackLogic.CanPushBack()) { float pushBackForce = attackLogic.GetPushBackForce(attackResult); if (pushBackForce > 0.0f && m_MovementComponent) { if (isDead) { pushBackForce *= AttackConfig.Instance.m_OnDeathPushbackMultiplier; } m_MovementComponent.PushBack(pushBackForce); } } } } PlayerSuperGaugeSubComponent superGaugeSC = m_AttackComponent.GetSuperGaugeSubComponent(); if (superGaugeSC != null) { superGaugeSC.IncreaseGaugeValue(AttackConfig.Instance.m_DefenderSuperGaugeBonus); } if (attackResult == EAttackResult.Hit) { m_StunInfoSC.IncreaseGaugeValue(attackLogic.GetStunGaugeHitAmount()); } TimeScaleParams timeScaleParams = null; if (isDead) { timeScaleParams = AttackConfig.Instance.m_OnDeathTimeScaleParams; } else if (attack.m_UseTimeScaleEffect) { timeScaleParams = attack.m_TimeScaleParams; } if (timeScaleParams != null) { ChronicleManager.AddChronicle(gameObject, EChronicleCategory.Health, "StartTimeScale - Amount: " + timeScaleParams.m_TimeScaleAmount + " Duration: " + timeScaleParams.m_TimeScaleDuration); m_TimeScaleManager.StartTimeScale(timeScaleParams); if (timeScaleParams.m_TimeScaleAmount == 0f) { TriggerHitStopShake(timeScaleParams.m_TimeScaleDuration); } } if (!attackLogic.GetLastHitPoint(out Vector3 hitPoint)) { hitPoint = attackLogic.GetOwner().transform.position; } if (attackResult != EAttackResult.Blocked) { if (attack.m_UseCameraShakeEffect || isDead) { Vector3 hitDirection = (transform.position - attackLogic.GetOwner().transform.position).normalized; CameraShakeParams camShakeParamsToUse = isDead ? AttackConfig.Instance.m_OnDeathCamShakeParams : attack.m_CameraShakeParams; CameraShakeManager.GenerateImpulseAt(camShakeParamsToUse, hitPoint, hitDirection); } } TriggerHitFX(attackLogic, hitPoint, attackResult, hitNotificationType); PlayHitSFX(attackLogic, attackResult, hitNotificationType); Profiler.EndSample(); }