- Home /
BoxCollider2D is not working as expected
 // PlayerController Script
 
 using UnityEngine;
 using System.Collections;
 
 [RequireComponent(typeof(PlayerPhysics))]
 public class PlayerController : MonoBehaviour {
     
     // Player Handling
     public float gravity = 20;
     public float speed = 8;
     public float acceleration = 30;
     public float jumpHeight = 12;
     
     private float currentSpeed;
     private float targetSpeed;
     private Vector2 amountToMove;
     
     private PlayerPhysics playerPhysics;
     
 
     void Start () {
         playerPhysics = GetComponent<PlayerPhysics>();
     }
     
     void Update () {
         targetSpeed = Input.GetAxisRaw("Horizontal") * speed;
         currentSpeed = IncrementTowards(currentSpeed, targetSpeed,acceleration);
         
         if (playerPhysics.grounded) {
             amountToMove.y = 0;
             
             // Jump
             if (Input.GetButtonDown("Jump")) {
                 amountToMove.y = jumpHeight;    
             }
         }
         
         amountToMove.x = currentSpeed;
         amountToMove.y -= gravity * Time.deltaTime;
         playerPhysics.Move(amountToMove * Time.deltaTime);
     }
     
     // Increase n towards target by speed
     private float IncrementTowards(float n, float target, float a) {
         if (n == target) {
             return n;    
         }
         else {
             float dir = Mathf.Sign(target - n); // must n be increased or decreased to get closer to target
             n += a * Time.deltaTime * dir;
             return (dir == Mathf.Sign(target-n))? n: target; // if n has now passed target then return target, otherwise return n
         }
     }
 }
 
 // PlayerPhysics Script
 
 using UnityEngine;
 using System.Collections;
 
 
 [RequireComponent (typeof(BoxCollider2D))]
 public class PlayerPhysics : MonoBehaviour {
     
     public LayerMask collisionMask;
 
     private BoxCollider2D collider;
     private Vector3 s;
     private Vector3 c;
     
     private float skin = 0.05f;
     
     [HideInInspector]
     public bool grounded;
     
     Ray ray;
     RaycastHit hit;
     
     void Start() {
         collider = GetComponent<BoxCollider2D>();
         s = collider.size;
         c = collider.center;
     }
 
     public void Move(Vector2 moveAmount) {
         
         float deltaY = moveAmount.y;
         float deltaX = moveAmount.x;
         Vector2 p = transform.position;
         
         // Check collisions above and below
         grounded = false;
         
         for (int i = 0; i<3; i ++) {
             float dir = Mathf.Sign(deltaY);
             float x = (p.x + c.x - s.x/2) + s.x/2 * i; // Left, centre and then rightmost point of collider
             float y = p.y + c.y + s.y/2 * dir; // Bottom of collider
             
             ray = new Ray(new Vector2(x,y), new Vector2(0,dir));
             Debug.DrawRay(ray.origin,ray.direction);
             if (Physics.Raycast(ray,out hit,Mathf.Abs(deltaY),collisionMask)) {
                 // Get Distance between player and ground
                 float dst = Vector3.Distance (ray.origin, hit.point);
                 
                 // Stop player's downwards movement after coming within skin width of a collider
                 if (dst > skin) {
                     deltaY = dst * dir + skin;
                 }
                 else {
                     deltaY = 0;
                 }
                 
                 grounded = true;
                 
                 break;
                 
             }
         }
         
     
         
         Vector2 finalTransform = new Vector2(deltaX,deltaY);
         
         transform.Translate(finalTransform);
     }
     
 }
 
Please refer the attachment. If i select the ground having a Collider of 'BoxCollider' then the player detects the collision but if the Collider of 'ground' is 'BoxCollider2D' the player passes through it. why ??
I dont know why this is happening. although the scripts doesn't have anything to do with it but still I have attached it. may be there is a issue

Does your player object in any way dependent on z axis functions. If it's 3d oriented object having z axis specifics interacting with 2d functions and objects ... Then the above usually occurs.
Red
no sir, its a 2D game and and movements are limited to x and y axis.
i have click 2D button in inspector just to represent the raycast and collision.
And also you should use SqrDistance ins$$anonymous$$d of Vector3.Distance for performance (compare it as dst > skin * skin).
Answer by EvilTak · Dec 11, 2014 at 09:41 AM
You have used Physics.Raycast which only works for 3d. For 2d you will have to use Physics2D.Raycast. Also you should add a kinematic rigidbody to your player as moving by transform without rigidbody causes the physics engine to rebuild the whole scene. Preferably use kinematic rigidbody2d and rigidbody2d.MovePosition().
Your answer
 
 
              koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                