private void Update() { m_Animator.gameObject.SetActive(m_FPController.State != MotionState.Climbing); m_Crouch = Mathf.MoveTowards(m_Crouch, m_FPController.State == MotionState.Crouched || m_FPController.IsCrouched ? 1 : 0, Time.deltaTime * 5); m_Running = Mathf.MoveTowards(m_Running, m_FPController.State == MotionState.Running ? 1 : 0, Time.deltaTime * 5); m_Yaw = Mathf.MoveTowards(m_Yaw, Mathf.Abs(m_FPController.CurrentYawTarget) > 0.75f && m_FPController.State == MotionState.Idle ? Mathf.Clamp(m_FPController.CurrentYawTarget, -1, 1) : 0, Time.deltaTime * (Math.Abs(m_FPController.CurrentYawTarget) > Mathf.Epsilon ? 1.5f : 3)); if (m_FPController.State == MotionState.Flying && !m_IsFlying) { m_Animator.speed = 1f; m_Animator.CrossFadeInFixedTime(Flying, 0.1f); m_IsFlying = true; } if (m_FPController.State != MotionState.Idle && m_FPController.State != MotionState.Flying) { if (m_IsFlying) { if (m_FPController.State != MotionState.Climbing) { m_Animator.CrossFadeInFixedTime(Landing, 0.1f); } m_IsFlying = false; } m_Animator.speed = Mathf.Max(m_FPController.CurrentTargetForce / (m_FPController.State == MotionState.Running ? 10 : 4), 0.7f); m_HorizontalVelocity = Mathf.MoveTowards(m_HorizontalVelocity, m_FPController.GetInput().x, Time.deltaTime * 5); m_VerticalVelocity = Mathf.MoveTowards(m_VerticalVelocity, m_FPController.GetInput().y, Time.deltaTime * 5); } else { m_Animator.speed = 1f; m_HorizontalVelocity = Mathf.MoveTowards(m_HorizontalVelocity, 0, Time.deltaTime * 5); m_VerticalVelocity = Mathf.MoveTowards(m_VerticalVelocity, 0, Time.deltaTime * 5); } if (m_FPController.State != MotionState.Climbing) { m_Animator.SetFloat(Turn, m_Yaw); m_Animator.SetFloat(Running, m_Running); m_Animator.SetFloat(Crouch, m_Crouch); m_Animator.SetFloat(Horizontal, m_HorizontalVelocity); m_Animator.SetFloat(Vertical, m_VerticalVelocity); } }
/// <summary> /// Simulates the swinging effect animation on the weapon relative to the character movement. /// </summary> /// <param name="weaponSwing">The target Transform reference.</param> /// <param name="FPController">The CharacterController reference.</param> internal void Swing(Transform weaponSwing, FirstPersonCharacterController FPController) { if (Mathf.Abs(Time.timeScale) < float.Epsilon) { return; } if (m_Swing) { // Calculates the swing angle by the mouse movement float yRot = Mathf.Clamp(Input.GetAxis("Mouse X") * -m_SwingAngle.x * GameplayManager.Instance.OverallMouseSensitivity, -m_SwingAngle.y, m_SwingAngle.y); float xRot = Mathf.Clamp(Input.GetAxis("Mouse Y") * -m_SwingAngle.x * GameplayManager.Instance.OverallMouseSensitivity, -m_SwingAngle.y, m_SwingAngle.y); // Calculates the tilt angle by sideways movement float zRot = FPController.Velocity.sqrMagnitude > 1 && !FPController.IsSliding ? Mathf.Clamp(FPController.GetInput().x * -m_TiltAngle.x, -m_TiltAngle.y, m_TiltAngle.y) : 0; float zRotBoost = Mathf.Clamp(m_AnimateAllAxes ? Input.GetAxis("Mouse X") * GameplayManager.Instance.OverallMouseSensitivity * -m_TiltBoost.x : 0, -m_TiltBoost.y, m_TiltBoost.y); // Simulates the tremor effect (shaking effect) if (FPController.TremorTrauma) { yRot += UnityEngine.Random.Range(-1.0f, 1.0f) * m_TremorAmount; xRot += UnityEngine.Random.Range(-1.0f, 1.0f) * m_TremorAmount; } if (m_SwingTarget == SwingTarget.Fist) { m_TargetRot = Quaternion.Euler(xRot, yRot, zRot + zRotBoost); m_TargetPos = new Vector3(-yRot / 100 + (zRot + zRotBoost) / 500, xRot / 100, 0); if (FPController.IsAiming) { m_TargetPos /= 2; } } else { m_TargetRot = Quaternion.Euler(-xRot, yRot, zRot + zRotBoost); m_TargetPos = new Vector3((zRot + zRotBoost) / 500, 0, 0); } } else { m_TargetRot = Quaternion.identity; m_TargetPos = Vector3.zero; } weaponSwing.localPosition = Vector3.Lerp(weaponSwing.localPosition, m_TargetPos * m_ScaleFactor, Time.deltaTime * m_Speed * 10); weaponSwing.localRotation = Quaternion.Slerp(weaponSwing.localRotation, m_TargetRot, Time.deltaTime * m_Speed * 10); }