Exemple #1
0
        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);
        }