- Home /
Question by
smasters654 · Sep 20, 2019 at 06:43 AM ·
rigidbodycontrolleraddforcedamping
Rigidbody Controller and controlling in air movements
Hello,
I am hoping someone can point me in the right direction here. I have a sphere rigidbody character controller and I have everything working except the in-Air movement. The problem I am having is my sphere upon jumping will jump really far in the direction of travel. I want to some how slow or dampen in air movement kind of like 3d Super Mario games. I want to have more control in the air but I don't want the player to be able to jump too far in one direction. It would be easy if I could control drag on separate axis. I don't want to affect the Y velocity. Any Ideas? Thanks!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//Requirements
[RequireComponent(typeof(Rigidbody))]
public class PlayerController : MonoBehaviour
{
//variables
public int PlayerId = 0;
public float groundSpinSpeed = 2.0f;
public float moveGroundSpeed = 7.0f;
public float moveAirSpeed = 1.0f;
public float jumpHeight = 7.0f;
private Rewired.Player player;
private Rigidbody rb;
private bool isGrounded = false;
private float playerRadius = 0.43f;
private float playerDrag;
//Awake
void Awake()
{
//get the player id for controls
player = Rewired.ReInput.players.GetPlayer(PlayerId);
}
//Start Init
void Start()
{
rb = gameObject.GetComponent<Rigidbody>();
playerRadius = GetComponent<SphereCollider>().radius;
playerDrag = rb.drag;
}
//Update
void Update()
{
PlayerJump();
}
//Fixed Update
void FixedUpdate()
{
PlayerMove();
CheckGrounded();
}
void PlayerMove()
{
float horizontalMovement = player.GetAxis("Horizontal");
float verticalMovement = player.GetAxis("Vertical");
if (!(player.GetAxis("Horizontal") == 0 && player.GetAxis("Vertical") == 0) && isGrounded)
{
rb.AddTorque(verticalMovement * groundSpinSpeed * Time.deltaTime, 0f, -horizontalMovement * groundSpinSpeed * Time.deltaTime, ForceMode.Impulse);
rb.AddForce(horizontalMovement * moveGroundSpeed * Time.deltaTime, 0f, verticalMovement * moveGroundSpeed * Time.deltaTime, ForceMode.Impulse);
}
else if (!(player.GetAxis("Horizontal") == 0 && player.GetAxis("Vertical") == 0) && !isGrounded)
{
rb.AddTorque(verticalMovement * groundSpinSpeed * Time.deltaTime, 0f, -horizontalMovement * groundSpinSpeed * Time.deltaTime, ForceMode.Impulse);
rb.AddForce(horizontalMovement * moveAirSpeed * Time.deltaTime, 0f, verticalMovement * moveAirSpeed * Time.deltaTime, ForceMode.Impulse);
}
}
void PlayerJump()
{
if (player.GetButtonDown("Jump") && isGrounded == true)
{
rb.AddForce(rb.velocity.x, jumpHeight, rb.velocity.z, ForceMode.Impulse);
}
}
void CheckGrounded()
{
isGrounded = Physics.CheckSphere(transform.position, playerRadius + 0.3f, 1 << 0);
if (!isGrounded)
{
rb.drag = 0;
}
else
{
rb.drag = playerDrag;
}
}
}
Comment