Uhh… so I was making a third person controller and everything was going fine, i added sliding jumping and moving but then i changed the gravity scale using Physics.gravity = -gravityScale * Vector3.up;
pretty much since then the gravity isnt working. No matter what value i set the gravity scale to be it only applies a gravity of -0.14 which is really weird. I cant seem to find any similar cases. But what I have noticed is that once the player character comes close enough to the ground so that the ground check raycast can hit the floor, gravity returns to normal.
Here is my code
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Windows;
public class PlayerMovement : MonoBehaviour
{
[Space(20)]
[Header("MOVEMENT")]
[Space(20)]
[SerializeField] private float moveSpeed = 10f;
[SerializeField] private float speedMultiplier = 5f;
[SerializeField] private float airMultiplier = 0.4f;
[SerializeField] private float drag = 10f;
[SerializeField] private float airDrag = 10f;
[Space(20)]
[Header("INPUTS AND RIGIDBODIES")]
[Space(20)]
[SerializeField] private Rigidbody rb;
[SerializeField] private InputActionReference movement, jump, dash;
[Space(20)]
[Header("JUMPING")]
[Space(20)]
[SerializeField] private float jumpForce;
[SerializeField] private LayerMask whatIsGround;
[SerializeField] private bool isGrounded;
[Space(20)]
[Header("DASH")]
[Space(20)]
[SerializeField] private float dashDura = 1f;
[SerializeField] private float timeSinceDash = 0f;
[SerializeField] private bool isDashing = false;
[SerializeField] private float dashForce;
[SerializeField] private float dashAirMultiplier;
[Space(20)]
[Header("OTHER")]
[Space(20)]
[SerializeField] private float gravityScale = 15;
private void OnEnable()
{
jump.action.performed += Jump;
dash.action.performed += Dash;
}
private void OnDisable()
{
jump.action.performed -= Jump;
dash.action.performed -= Dash;
}
private void Start()
{
rb = GetComponent<Rigidbody>();
rb.freezeRotation = true;
rb.drag = drag;
}
private void FixedUpdate()
{
if (isDashing)
{
KeepDashing();
timeSinceDash += Time.deltaTime;
if(timeSinceDash >= dashDura)
{
isDashing = false;
timeSinceDash = 0;
}
}
DragControl();
GroundCheck();
Move();
}
private void GroundCheck()
{
if(Physics.Raycast(transform.position, Vector3.down, (transform.localScale.y / 2) + 0.6f, whatIsGround))
{
isGrounded = true;
}
else
{
isGrounded = false;
}
}
private void Jump(InputAction.CallbackContext context)
{
if (isGrounded)
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
isGrounded = false;
}
}
private void DragControl()
{
if (isGrounded)
{
rb.drag = drag;
}
else if(!isGrounded)
{
rb.drag = airDrag;
}
}
private void Move()
{
Vector2 input = movement.action.ReadValue<Vector2>();
Vector3 moveDir = transform.forward * input.y + transform.right * input.x;
if (isGrounded)
{
rb.AddForce(moveSpeed * speedMultiplier * moveDir.normalized, ForceMode.Acceleration);
}
else
{
rb.velocity = moveDir.normalized* moveSpeed;
rb.AddForce(airMultiplier* moveSpeed * speedMultiplier * moveDir.normalized, ForceMode.Acceleration);
}
}
private void Dash(InputAction.CallbackContext context)
{
if (!isDashing)
{
if (isGrounded)
rb.AddForce(transform.forward * dashForce, ForceMode.Impulse);
else
rb.AddForce(transform.forward * dashForce * dashAirMultiplier, ForceMode.Impulse);
isDashing = true;
}
}
private void KeepDashing()
{
if (isGrounded)
rb.AddForce(transform.forward * (dashForce / dashDura), ForceMode.Impulse);
else
rb.AddForce(transform.forward * (dashForce / dashDura) * dashAirMultiplier, ForceMode.Impulse);
}
}