- Home /
Question by
SuperInsaneGames · Jan 14 at 06:39 PM ·
playergrounded
Raycast groundcheck not working when standing on Edges?
I am using Raycast to do a ground check, It does work however there's one issue!
Whenever the character is standing at the edge of the ground, it sometimes set grounded to false meaning we can't jump.. Any solution?
Here's the full code:
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Security.Cryptography;
using System.Threading;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
[SerializeField] public LayerMask GroundMask;
public CharacterController controller;
public Transform cam;
private bool groundedPlayer;
public float distToGround = 1f;
public float speed = 6;
public float gravity = -9.81f;
public float jumpHeight = 3;
Vector3 velocity;
float turnSmoothVelocity;
public float turnSmoothTime = 0.1f;
float _slopeAngle;
// Update is called once per frame
void FixedUpdate()
{
GroundCheck();
if (Input.GetButtonDown("Jump")){
if (isGrounded){
velocity.y = Mathf.Sqrt(jumpHeight * -2 * gravity);
}
}
//gravity
velocity.y += gravity * Time.deltaTime;
controller.Move(velocity * Time.deltaTime);
//walk
float horizontal = Input.GetAxisRaw("Horizontal");
float vertical = Input.GetAxisRaw("Vertical");
Vector3 direction = new Vector3(horizontal, 0f, vertical).normalized;
if(direction.magnitude >= 0.1f)
{
float targetAngle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg + cam.eulerAngles.y;
float angle = Mathf.SmoothDampAngle(transform.eulerAngles.y, targetAngle, ref turnSmoothVelocity, turnSmoothTime);
transform.rotation = Quaternion.Euler(0f, angle, 0f);
Vector3 moveDir = Quaternion.Euler(0f, targetAngle, 0f) * Vector3.forward;
controller.Move(moveDir.normalized * speed * Time.deltaTime);
}
}
public bool isGrounded = false;
void GroundCheck () {
RaycastHit hit;
if (Physics.Raycast(transform.position, Vector3.down, out hit, distToGround + 1.1f, GroundMask)) {
_slopeAngle = (Vector3.Angle(hit.normal, transform.forward) - 90);
isGrounded = true;
} else {
isGrounded = false;
}
}
}
screenshot-88.png
(95.9 kB)
Comment
Answer by NPnpNPnpNP · Jan 14 at 08:13 PM
I also had this problem, and I solved it by using multiple raycasts. For example you can have one at the center, one at the back, one at the front, and two others at left and right to be sure that there is always at least one that touches the ground.
Your answer
Follow this Question
Related Questions
grouding down 0 Answers
Ground Check In Unity3D 2019.4? 1 Answer
Player Can Only Attack When Not Grounded 1 Answer
Adjust Y-axis 1 Answer