- 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