ccl4/blueberryPeak/Assets/Scripts/Player/PlayerJump.cs

90 lines
2.6 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerJump : MonoBehaviour
{
[SerializeField] private InputActionReference jump;
[SerializeField] private float forceValue = 5f;
[SerializeField] private GameObject playerGround;
[SerializeField] private float groundRayOffset = 0.1f;
[SerializeField] private float groundRayDistanceThreshold = 0.001f;
//[SerializeField] private Animator animator;
private Rigidbody rb;
private CapsuleCollider collider;
private BoxCollider boxCollider;
private bool isJumping = false;
private bool isGrounded = true;
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody>();
collider = GetComponent<CapsuleCollider>();
boxCollider = playerGround.GetComponent<BoxCollider>();
jump.action.Enable();
jump.action.performed += OnJump;
StartCoroutine(GroundCheck());
}
void OnJump(InputAction.CallbackContext context)
{
if (!isGrounded || isJumping)
{
return;
}
StartCoroutine(JumpControlFlow());
}
// Update is called once per frame
void Update()
{
//animator.SetBool("Jumping", isJumping);
}
IEnumerator GroundCheck()
{
while (true)
{
float bottomOfCollider = collider.bounds.min.y;
Vector3 newPlayerGroundPosition = new Vector3(playerGround.transform.position.x, bottomOfCollider,
playerGround.transform.position.z);
playerGround.transform.position = newPlayerGroundPosition;
Vector3 rayCastOrigin = new Vector3(playerGround.transform.position.x, playerGround.transform.position.y + groundRayOffset,
playerGround.transform.position.z);
Vector3 playerGroundExtents = playerGround.transform.lossyScale;
bool isHitting = Physics.BoxCast(rayCastOrigin, playerGroundExtents / 2, -transform.up, out RaycastHit hit, playerGround.transform.rotation);
if (isHitting && hit.distance <= groundRayOffset + groundRayDistanceThreshold)
{
isGrounded = true;
isJumping = false;
}
else
{
isGrounded = false;
}
yield return null;
}
}
IEnumerator JumpControlFlow()
{
rb.AddForce(Vector3.up * forceValue, ForceMode.Impulse);
while (isGrounded)
{
yield return null;
}
isJumping = true;
boxCollider.enabled = true;
yield return null;
}
}