- Home /
 
 
               Question by 
               Wilsh · Nov 20, 2014 at 08:35 PM · 
                c#playercontrollerboxcollider  
              
 
              Help with player controller
Hello, I have been following a tutorial on creating a player controller using Rays and box colliders. I'm unsure why it won't work as my player object keeps falling through the ground. Here is the code and the ground + player has box colliders and the layer mask is attached to the ground only.
 [RequireComponent(typeof(BoxCollider))]
 public class PlayerPhysics : MonoBehaviour {
     public LayerMask collisionMask;
     private BoxCollider collider;
     private Vector3 s;
     private Vector3 c;
 
     private float skin = .005f;
 
     [HideInInspector]
     public bool grounded;
         Ray ray;
 
     RaycastHit hit;
 
     void Start() {
 
                 collider = GetComponent<BoxCollider> ();
                 s = collider.size;
                 c = collider.center;
 
         }
     public void Move(Vector2 moveAmount) {
 
         float deltaY = moveAmount.y;
         float deltaX = moveAmount.x;
             Vector2 p = transform.position;
 
         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;
             float y = p.y + c.y + s.y/2 * dir;
 
             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));
             {
                 float dst = Vector3.Distance(ray.origin, hit.point);
 
                 if(dst > skin){
                     deltaY = dst * dir + skin;
                 }
                 else {
                     deltaY = 0;
                 }
                 grounded = true;
                 break;
             }
 
         }
 
         Vector2 finalTransform = new Vector2 (deltaX, deltaY);
         transform.Translate (moveAmount);
 }
 }
 using System.Collections;
 [RequireComponent(typeof(PlayerPhysics))]
 public class PlayerController : MonoBehaviour {
     public float gravity = 20;
     public float speed = 8;
     public float acceleration = 12;
     public float jumpHeight = 12;
 
     private float currentSpeed;
     private float targetSpeed;
     private Vector2 amountToMove;
 
     public PlayerPhysics playerPhysics;
     // Use this for initialization
     void Start () {
         playerPhysics = GetComponent<PlayerPhysics>();
     }
     
     // Update is called once per frame
     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);
     }
 
     private float IncrementTowards(float n, float target, float speed){
                 if (n == target) {
                         return n;
                 } else {
                         float dir = Mathf.Sign (target - n);
                         n += speed * Time.deltaTime * dir;
                         return (dir == Mathf.Sign (target - n)) ? n : target;
                 }
         }
 }
 
 
              
               Comment
              
 
               
              Your answer