Unity 5: AddForce Increases power when already being pushed towards a collider. How to make stop?
Okay, so I'm kinda new to Unity and all, so yeah.
Anyway, I'm trying to make a basic player for something like a 3d platformer.
The rigidbody player uses the Horizontal and Vertical keys to move, and moves the mouse to rotate. I'm using some basic RigidBody.AddForce for the movement, and RigidBody.AddTorque for rotation. So that's all fine, right? But my problem right now is with jumping. For jumping, I also use AddForce to actually jump, and a OnCollisionStay and OnCollisionExit thingy to detect whether I'm grounded, and it's fine at first, but something weird happens when I try to jump while walking into another rigidbody object. I jump up way higher than usual. I suspect this is because there's something wrong with the way I'm detecting whether I'm grounded, but I dunno. I think there might be a better way to do it, with Raycasts or whatever, but, again, I'm kinda new to coding and stuff, and I don't really understand how to do it.
Anyway, here's my PlayerControl script (Oh yeah, and also, I'm doing this in C#):
using UnityEngine;
using System.Collections;
public class PlayerControl : MonoBehaviour {
public float movementSpeed;
public float rotationSpeed;
public float jumpSpeed;
private Rigidbody rb;
public bool IsGrounded;
void OnCollisionStay (Collision collisionInfo)
{
IsGrounded = true;
}
void OnCollisionExit (Collision collisionInfo)
{
IsGrounded = false;
}
void Start ()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate ()
{
float moveRotation = Input.GetAxisRaw ("Mouse X");
float moveHorMovement = Input.GetAxisRaw ("Horizontal");
float moveVertMovement = Input.GetAxisRaw ("Vertical");
float moveJump = Input.GetAxisRaw ("Jump");
Movement(moveRotation, moveHorMovement, moveVertMovement, moveJump);
}
void Movement(float moveRotation, float moveHorMovement, float moveVertMovement, float moveJump){
Vector3 rotation = new Vector3 (0.0f,moveRotation,0.0f);
Vector3 movement = new Vector3 (moveHorMovement, 0.0f, moveVertMovement);
Vector3 jump = new Vector3 (0.0f,moveJump,0.0f);
rb.AddTorque (rotation * rotationSpeed * Time.deltaTime,ForceMode.Acceleration);
rb.AddRelativeForce (movement * movementSpeed,ForceMode.Acceleration);
if (IsGrounded) {
rb.AddRelativeForce (jump * jumpSpeed, ForceMode.Force);
}
}
}
So, yeah. If you know how to make this stop happening, please help!
Thanks.
Answer by Astraphobia95 · Dec 08, 2016 at 04:33 PM
As you said, you're testing if you're grounded based on if you're touching another collider. If you jump against something, you're still being counted as grounded, and so your if statement will equate to true in the update function, and will keep adding force until you stop touching that object.
Try using tags to check for the floor rather than any collider.