Luis Cruz
Luis Cruz

Reputation: 159

Avoid Pushing between rigidbody

I have a issue with my 2D game in unity (pokemon style), I'm using transform.position to move the gameobjects.

I have a player and enemies that follow him, all is ok. But when the enemies make a collision, they begin to push each other

I need that nobody to be pushed when the enemies and player get a collision.

----UPDATE----

I need the collision but without pushing between them, here is a video to illustrate the problem https://www.youtube.com/watch?v=VkgnV1NOxlw

Just for the record, i'm using A* pathfinding script (http://arongranberg.com/astar/) here my enemies move script.

void FixedUpdate () {
    if(path == null)
        return;

    if(currentWayPoint >= path.vectorPath.Count)
        return;

    Vector3 wayPoint = path.vectorPath [currentWayPoint];
    wayPoint.z = transform.position.z;

    transform.position = Vector3.MoveTowards (transform.position, wayPoint, Time.deltaTime * speed);

    float distance = Vector3.Distance (transform.position, wayPoint);

    if(distance == 0){
        currentWayPoint++;
    }

}

----UPDATE----

Finally I'll get the expected result,changing the rigidbody2D.isKinematic property to true when the target was close and stop it

Here is a video https://www.youtube.com/watch?v=0Zm0idUU75s

And the enemy movement code

void FixedUpdate () {

    if(path == null)
        return;

    if(currentWayPoint >= path.vectorPath.Count)
        return;

    float distanceTarget = Vector3.Distance (transform.position, target.position);

    if (distanceTarget <= 1.5f) {
        rigidbody2D.isKinematic = true;
        return;
    }else{
        rigidbody2D.isKinematic = false;
    }

    Vector3 wayPoint = path.vectorPath [currentWayPoint];
    wayPoint.z = transform.position.z;

    transform.position = Vector3.MoveTowards (transform.position, wayPoint, Time.deltaTime * speed);

    float distance = Vector3.Distance (transform.position, wayPoint);

    if(distance == 0){
        currentWayPoint++;
    }

}

Upvotes: 2

Views: 7693

Answers (1)

Dinal24
Dinal24

Reputation: 3192

You can do this in several ways,

You can use Physics2D.IgnoreCollision

Physics2D.IgnoreCollision(someGameObject.collider2D, collider2D);
  • Make sure that you do the IgnoreCollision call before the collision occurs, maybe when objects instantiate.

or alternatively you can use, Layer Collision Matrix

enter image description here

  • Unity Manual provides information on using this. This simply does the collision avoidance by assigning different GameObjects to different layers. Try: Edit->Project Settings->Physics

Or if you want it to just stop moving, You can easily do it like,

bool isCollided = false;

// when when OnCollisionEnter() is called stop moving. 
//maybe write your move script like 

void Move() { 
    if(!isCollided) { 
        // move logic 
    } 
}

Upvotes: 4

Related Questions