public virtual void BumpMe(Vector3 _bumpDirectionFlat, BumpForce _force) { if (!isBumpable) { return; } ChangePawnState("Bumped", Bump_C(_bumpDirectionFlat, _force), CancelBump_C()); }
private IEnumerator Bump_C(Vector3 _bumpDirectionFlat, BumpForce _force) { animator.SetTrigger("BumpTrigger"); moveState = MoveState.Pushed; FeedbackManager.SendFeedback(eventOnBeingBumpedAway, this); float bumpDistance = 0; float bumpDuration = 0; switch (_force) { case BumpForce.Force1: if (isPlayer) { bumpDistance = pushDatas.BumpPlayerForce1Distance; bumpDuration = pushDatas.BumpPlayerForce1Duration; } else { bumpDistance = pushDatas.BumpForce1Distance; bumpDuration = pushDatas.BumpForce1Duration; } break; case BumpForce.Force2: if (isPlayer) { bumpDistance = pushDatas.BumpPlayerForce2Distance; bumpDuration = pushDatas.BumpPlayerForce2Duration; } else { bumpDistance = pushDatas.BumpForce2Distance; bumpDuration = pushDatas.BumpForce2Duration; } break; case BumpForce.Force3: if (isPlayer) { bumpDistance = pushDatas.BumpPlayerForce3Distance; bumpDuration = pushDatas.BumpPlayerForce3Duration; } else { bumpDistance = pushDatas.BumpForce3Distance; bumpDuration = pushDatas.BumpForce3Duration; } break; } bumpDistance = bumpDistance + Random.Range(pushDatas.bumpRandomRangeModifier.x, pushDatas.bumpRandomRangeModifier.y); bumpDuration = bumpDuration + Random.Range(pushDatas.bumpRandomDurationModifier.x, pushDatas.bumpRandomDurationModifier.y); float i_restDuration = pushDatas.bumpRestDuration; if (isPlayer) { i_restDuration = pushDatas.bumpPlayerRestDuration; } i_restDuration = i_restDuration + Random.Range(pushDatas.bumpRandomRestModifier.x, pushDatas.bumpRandomRestModifier.y); Vector3 i_bumpDirection = _bumpDirectionFlat; i_bumpDirection.y = 0; Vector3 i_bumpInitialPosition = transform.position; Vector3 i_bumpDestinationPosition = transform.position + i_bumpDirection * bumpDistance; transform.rotation = Quaternion.LookRotation(-i_bumpDirection); float i_gettingUpDuration = maxGettingUpDuration; EnemyBehaviour i_enemy = GetComponent <EnemyBehaviour>(); if (i_enemy != null) { i_enemy.ChangeState(EnemyState.Bumped); } float i_bumpTimeProgression = 0; bool i_playedEndOfFall = false; while (i_bumpTimeProgression < 1) { moveState = MoveState.Pushed; i_bumpTimeProgression += Time.deltaTime / bumpDuration; //move ! Vector3 i_newPosition = Vector3.Lerp(i_bumpInitialPosition, i_bumpDestinationPosition, pushDatas.bumpSpeedCurve.Evaluate(i_bumpTimeProgression)); //check of collision Collider i_hitCollider = CheckForCollision(); if (i_hitCollider != null) { if (isPlayer) { WallSplat(WallSplatForce.Heavy, transform.position - i_hitCollider.ClosestPoint(transform.position)); } else { WallSplat(WallSplatForce.Heavy, transform.position - i_hitCollider.ClosestPoint(transform.position)); } } rb.MovePosition(i_newPosition); //trigger end anim if (i_bumpTimeProgression >= whenToTriggerFallingAnim && i_playedEndOfFall == false) { animator.SetTrigger("FallingTrigger"); i_playedEndOfFall = true; } yield return(null); } // After the whole bump-fly-fall sequence if (damageAfterBump > 0) { if ((currentHealth - damageAfterBump) <= 0) { DeathOverrideWithBump(); } Damage(damageAfterBump); } //when arrived on ground while (i_restDuration > 0) { i_restDuration -= Time.deltaTime; if (i_restDuration <= 0) { animator.SetTrigger("StandingUpTrigger"); } yield return(null); } //time to get up while (i_gettingUpDuration > 0) { i_gettingUpDuration -= Time.deltaTime; if (i_gettingUpDuration <= 0 && GetComponent <EnemyBehaviour>() != null) { i_enemy.ChangeState(EnemyState.Following); } yield return(null); } moveState = MoveState.Idle; }