Ошибка прыжка в Unity при использовании контроллера твердого тела - PullRequest
0 голосов
/ 13 января 2020

Так как в названии написано, что я немного застрял и ничего не понял о недавней ошибке, с которой я столкнулся, играя с единицей

Так что, в основном, если вы прыгаете на платформу на той же высоте, что и персонаж игрока, иногда игрок прыжок становится очень низким и скачет, как камень на воде на платформе, вместо того, чтобы выполнить правильную длину прыжка.

Здесь весь код , я новичок в единстве и создании игр, поэтому любая помощь будет быть appricated:)

Здесь также ссылка на видео YouTube, показывающий ошибку в действии https://youtu.be/nrVQjpknl5U

using System;
using UnityEngine;

namespace Player.Movement.Scripts
{
    [RequireComponent(typeof(Rigidbody))]
    public class PlayerMovement : MonoBehaviour
    {
        #region Public Fields

        [Header(header: "Walk / Run Setting")] public float walkSpeed;
        public float runSpeed;

        [Header(header: "Jump Setting")] public float playerJumpForce;
        public ForceMode appliedForceMode;

        [Header(header: "Jump State")] public bool playerIsJumping;

        [Header(header: "Current Player Speed")] public float currentSpeed;

        [Header(header: "Sensitivity")] public float sensitivity = 100f;

        #endregion

        #region Private Fields

        private float _xAxis;
        private float _zAxis;
        private Rigidbody _rb;
        private RaycastHit _hit; //Raycast to check for jump
        private Vector3 _groundLocation;
        private bool _isShíftPressedDown;

        private CapsuleCollider _cc;

        #endregion

        #region MonoDevelop Routines

        private void Start()
        {
            _rb = GetComponent<Rigidbody>();
            _cc = GetComponent<CapsuleCollider>();
            Cursor.lockState = CursorLockMode.Locked;

        }

        private void Update()
        {
            #region Controller Input   

            _xAxis = Input.GetAxis("Horizontal");
            _zAxis = Input.GetAxis("Vertical");

            #endregion

            #region Adjust Player Speed

            currentSpeed = _isShíftPressedDown ? runSpeed : walkSpeed;

            #endregion

            #region Player jump Status

            playerIsJumping = Input.GetButton("Jump");

            #endregion

            #region Disble Multi Jump



            Vector3 pos1 = transform.position + (transform.right * _cc.radius);
            Vector3 pos12 = transform.position + (transform.right * -_cc.radius);
            Vector3 pos2 = transform.position + (transform.forward * _cc.radius);
            Vector3 pos22 = transform.position + (transform.forward * -_cc.radius);

            // Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.down) * 10f, Color.yellow);
            // Debug.DrawRay(pos1, transform.TransformDirection(Vector3.down) * 10f, Color.blue);
            // Debug.DrawRay(pos12, transform.TransformDirection(Vector3.down) * 10f, Color.blue);
            // Debug.DrawRay(pos2, transform.TransformDirection(Vector3.down) * 10f, Color.red);
            // Debug.DrawRay(pos22, transform.TransformDirection(Vector3.down) * 10f, Color.red);

            bool playerIsJumping0 = true;
            bool playerIsJumping1 = true;
            bool playerIsJumping2 = true;
            bool playerIsJumping3 = true;
            bool playerIsJumping4 = true;


            #region Middle RayCast

            if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.down), out _hit,
                    Mathf.Infinity))
            {
                if (String.Compare(_hit.collider.tag, "ground", StringComparison.Ordinal) == 0)
                {
                    _groundLocation = _hit.point;
                }

                var distanceFromPlayerToGround = Vector3.Distance(transform.position, _groundLocation);

                if (distanceFromPlayerToGround > 1f)
                    playerIsJumping0 = false;
                if (distanceFromPlayerToGround < 1f)
                    playerIsJumping0 = false;
                // Debug.Log("Distance: " + distanceFromPlayerToGround);
            }

            #endregion

            #region RayCast 1

            if (Physics.Raycast(pos1, transform.TransformDirection(Vector3.down), out _hit, Mathf.Infinity))
            {
                if (String.Compare(_hit.collider.tag, "ground", StringComparison.Ordinal) == 0)
                {
                    _groundLocation = _hit.point;
                }

                var distanceFromPlayerToGround = Vector3.Distance(transform.position, _groundLocation);

                if (distanceFromPlayerToGround > 1.118035f)
                    playerIsJumping1 = false;
                if (distanceFromPlayerToGround < 1.08f)
                    playerIsJumping1 = false;

            }
            #endregion

            #region RayCast 2

            if (Physics.Raycast(pos12, transform.TransformDirection(Vector3.down), out _hit, Mathf.Infinity))
            {
                if (String.Compare(_hit.collider.tag, "ground", StringComparison.Ordinal) == 0)
                {
                    _groundLocation = _hit.point;
                }

                var distanceFromPlayerToGround = Vector3.Distance(transform.position, _groundLocation);

                if (distanceFromPlayerToGround > 1.118035f)
                    playerIsJumping2 = false;
                if (distanceFromPlayerToGround < 1.08f)
                    playerIsJumping2 = false;
            }
            #endregion

            #region RayCast 3

            if (Physics.Raycast(pos2, transform.TransformDirection(Vector3.down), out _hit, Mathf.Infinity))
            {
                if (String.Compare(_hit.collider.tag, "ground", StringComparison.Ordinal) == 0)
                {
                    _groundLocation = _hit.point;
                }

                var distanceFromPlayerToGround = Vector3.Distance(transform.position, _groundLocation);

                if (distanceFromPlayerToGround > 1.118035f)
                    playerIsJumping3 = false;
                if (distanceFromPlayerToGround < 1.08f)
                    playerIsJumping3 = false;
            }
            #endregion

            #region RayCast 4

            if (Physics.Raycast(pos22, transform.TransformDirection(Vector3.down), out _hit, Mathf.Infinity))
            {
                if (String.Compare(_hit.collider.tag, "ground", StringComparison.Ordinal) == 0)
                {
                    _groundLocation = _hit.point;
                }

                var distanceFromPlayerToGround = Vector3.Distance(transform.position, _groundLocation);

                if (distanceFromPlayerToGround > 1.118035f)
                    playerIsJumping4 = false;
                if (distanceFromPlayerToGround < 1.08f)
                    playerIsJumping4 = false;
            }

            #endregion


            if (playerIsJumping0 == false && playerIsJumping1 == false && playerIsJumping2 == false && playerIsJumping3 == false && playerIsJumping4 == false)
            {
                playerIsJumping = false;
            }

            #endregion

        }


        private void FixedUpdate()
        {
            #region Move Player

            _rb.MovePosition(transform.position + Time.deltaTime * currentSpeed *
                transform.TransformDirection(_xAxis, 0f, _zAxis));

            #endregion

            #region Player Jump Applied

            if (playerIsJumping)
            {
                PlayerJump(playerJumpForce, appliedForceMode);
            }

            #endregion
        }

        private void OnGUI()
        {
            _isShíftPressedDown = Event.current.shift;
        }
        #endregion

        #region Helper Routines

        private void PlayerJump(float jumpForce, ForceMode forceMode)
        {
            _rb.AddForce(jumpForce * _rb.mass * Time.deltaTime * Vector3.up, forceMode);
        }

        #endregion
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...