Так как в названии написано, что я немного застрял и ничего не понял о недавней ошибке, с которой я столкнулся, играя с единицей
Так что, в основном, если вы прыгаете на платформу на той же высоте, что и персонаж игрока, иногда игрок прыжок становится очень низким и скачет, как камень на воде на платформе, вместо того, чтобы выполнить правильную длину прыжка.
Здесь весь код , я новичок в единстве и создании игр, поэтому любая помощь будет быть 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
}
}