- Home /
Collision detection and prevention between a rigid body and box collider
Hello.
This scenario that I am creating is presented in 2d although it utilizes all 3 dimensions.
I have a character that the player can move around that has a rigid body attached to it. There is also an object, a tree in this instance, that has a box collider attached to it. I have the scripting set up so that when the rigid body hits the box collider in any of the four main directions, the character will no longer be able to move in that direction, simulating having an obstacle in the way while still being able to move in any other direction.
The problem I am having however, is that my script is only working correctly if only one direction is involved. If the character is moving diagonally, the rigid body passes right through the box collider, even though I can still detect that there is, in fact, a collision.
Here's the script:
public float movementSpeed = 5.0f;
int collisionDetectedVertical = 0; //1 = up; -1 = down
int collisionDetectedHorizontal = 0; //1 = right; -1 = left
// Update is called once per frame
void Update () {
if(collisionDetectedVertical != 0 || collisionDetectedHorizontal != 0) {
if(collisionDetectedVertical == 1) { //is trying to move up
if(Input.GetAxis("Vertical") != -1) { //cannot move if not pressing down
transform.Translate(new Vector3(Input.GetAxis ("Horizontal") * movementSpeed * Time.deltaTime, 0, 0));
}
else {
transform.Translate(new Vector3(Input.GetAxis ("Horizontal") * movementSpeed * Time.deltaTime, Input.GetAxis ("Vertical") * movementSpeed * Time.deltaTime, Input.GetAxis("Vertical") / 100));
}
}
else if(collisionDetectedVertical == -1) { // is trying to move down
if(Input.GetAxis("Vertical") != 1) { // cannot move if not pressing up
transform.Translate(new Vector3(Input.GetAxis ("Horizontal") * movementSpeed * Time.deltaTime, 0, 0));
}
else {
transform.Translate(new Vector3(Input.GetAxis ("Horizontal") * movementSpeed * Time.deltaTime, Input.GetAxis ("Vertical") * movementSpeed * Time.deltaTime, Input.GetAxis("Vertical") / 100));
}
}
if(collisionDetectedHorizontal == 1) { // is trying to move right
if(Input.GetAxis("Horizontal") != -1) { // cannot move if not pressing left
transform.Translate(new Vector3(0, Input.GetAxis ("Vertical") * movementSpeed * Time.deltaTime, Input.GetAxis("Vertical") / 100));
}
else {
transform.Translate(new Vector3(Input.GetAxis ("Horizontal") * movementSpeed * Time.deltaTime, Input.GetAxis ("Vertical") * movementSpeed * Time.deltaTime, Input.GetAxis("Vertical") / 100));
}
}
else if(collisionDetectedHorizontal == -1) { // is trying to move left
if(Input.GetAxis("Horizontal") != 1) { // cannot move if not pressing right
transform.Translate(new Vector3(0, Input.GetAxis ("Vertical") * movementSpeed * Time.deltaTime, Input.GetAxis("Vertical") / 100));
}
else {
transform.Translate(new Vector3(Input.GetAxis ("Horizontal") * movementSpeed * Time.deltaTime, Input.GetAxis ("Vertical") * movementSpeed * Time.deltaTime, Input.GetAxis("Vertical") / 100));
}
}
}
else {
transform.Translate(new Vector3 (Input.GetAxis ("Horizontal") * movementSpeed * Time.deltaTime, Input.GetAxis ("Vertical") * movementSpeed * Time.deltaTime, Input.GetAxis("Vertical") / 100));
//print (transform.position.z);
}
}
void OnTriggerEnter (Collider collider) {
if (Input.GetAxis ("Vertical") == 1) {
collisionDetectedVertical = 1;
print ("There is collision up");
}
else if (Input.GetAxis ("Vertical") == -1) {
collisionDetectedVertical = -1;
print ("There is collision down");
}
if (Input.GetAxis ("Horizontal") == 1) {
collisionDetectedHorizontal = 1;
print ("There is collision right");
}
else if (Input.GetAxis ("Horizontal") == -1) {
collisionDetectedHorizontal = -1;
print ("There is collision left");
}
}
void OnTriggerExit (Collider colliderExit) {
collisionDetectedVertical = 0;
collisionDetectedHorizontal = 0;
}
I am detecting the collision by using the variables collisionDetectedVertical and collisionDetectedHorizontal, knowing that there is a collision when either of these values do not equal 0 and it is set up so that the rigid body cannot move into the collider even while holding down the up/down/left/right key.
However, if my rigid body enters diagonally, say by holding both the left and down keys at the same time, how will I prevent it from moving into the collider and only move around the edges?