left/right movement of player becomes slow when position of player in y axis increases or decreases i.e when player goes above or below ground level (everything works fine when player is at y=0)
private const float LANE_DISTANCE = 3.0f;
private bool isRunning = false;
//Movement
private CharacterController controller;
private float jumpForce = 4.0f;
private float gravity = 10.0f;
private float verticalVelocity;
public float speed = 10.0f;
private int desiredLane = 1; //0(left),1(middle),2(right)
private void Start()
{
controller = GetComponent<CharacterController> ();
}
private void Update()
{
if(!isRunning)
return;
if(MobileInput.Instance.SwipeLeft)
MoveLane(false);
if(MobileInput.Instance.SwipeRight)
MoveLane(true);
// calculate where we should be in the future
Vector3 targetPosition = transform.position.z * Vector3.forward;
if (desiredLane == 0)
targetPosition += Vector3.left * LANE_DISTANCE;
else if (desiredLane == 2)
targetPosition += Vector3.right * LANE_DISTANCE;
//lets calculate our move delta
Vector3 moveVector = Vector3.zero;
moveVector.x = (targetPosition - transform.position).normalized.x * speed;
// calculate y
if(IsGrounded()) // if grounded
{
verticalVelocity = -0.1f;
if(MobileInput.Instance.SwipeUp)
{
//jump
verticalVelocity = jumpForce;
}
else if (MobileInput.Instance.SwipeDown) {
//slide
StartSliding();
Invoke ("StopSliding", 1.0f);
}
}
else
{
verticalVelocity -= (gravity * Time.deltaTime);
//fast falling mechanism
if(MobileInput.Instance.SwipeDown)
{
verticalVelocity= -jumpForce;
}
}
moveVector.y = verticalVelocity;
moveVector.z = speed;
//move the player
controller.Move(moveVector * Time.deltaTime);
}
private void MoveLane (bool goingRight)
{
desiredLane += (goingRight) ? 1 : -1;
desiredLane = Mathf.Clamp (desiredLane, 0, 2);
}
private bool IsGrounded()
{
Ray groundRay = new Ray(new Vector3(controller.bounds.center.x,(controller.bounds.center.y - controller.bounds.extents.y) + 0.2f,controller.bounds.center.z),Vector3.down);
Debug.DrawRay (groundRay.origin, groundRay.direction, Color.cyan, 1.0f);
return Physics.Raycast(groundRay,0.2f + 0.1f);
}
public void StartRunning()
{
isRunning = true;
}
private void Crash()
{
isRunning = false;
}
}