- Home /
2D Platformer Jump while Running Android
Hi Im new to the unity community but not Unity and programming. I am making a 2D Platformer in Unity 4.3 (new 2D Tools) and everything seemed to be going just fine until I added Jumping... My character Jumps fine but my problem is that he wont jump while Running left or right. My character does this fine on a windows computer but when I compile a .APK and run it on my android tablet with touch controls (GuiTextures) he simply will not Jump while running left or Right.
Here are my scripts...
PlayerLogic.cs using UnityEngine; using System.Collections;
public class PlayerLogic : MonoBehaviour {
public Transform GroundStart, GroundEnd;
public bool grounded = false;
public float jumpForce = 300f;
public float MoveSpeed = 3f;
public int JumpCount = 0;
//Movement booleans
public static bool MoveRight = false;
public static bool MoveLeft = false;
public static bool Jump = false;
// Use this for initialization
void Update()
{
//Run these to functions
Raycasting();
Movement();
}
void Raycasting()
{
//Draw a line from the start position, to the end position.
Debug.DrawLine(this.transform.position, GroundEnd.position, Color.green);
//If Raycast detects the Ground layer from the end point of the line, then IsGrounded becomes true
grounded = Physics2D.Linecast(this.transform.position, GroundEnd.position, 1 << LayerMask.NameToLayer("Ground"));
}
void Movement()
{
//Touch Controls
if(MoveRight == true)
{
transform.Translate(Vector2.right * MoveSpeed * Time.deltaTime);
transform.eulerAngles = new Vector2(0, 0);
}
if(MoveLeft == true)
{
transform.Translate(Vector2.right * MoveSpeed * Time.deltaTime);
transform.eulerAngles = new Vector2(0, 180);
}
if(Jump == true && grounded == true)
{
rigidbody2D.AddForce(Vector2.up * jumpForce);
Jump = false;
}
//Key Controls
/*if(Input.GetKey (KeyCode.D))
{
transform.Translate(Vector2.right * MoveSpeed * Time.deltaTime);
transform.eulerAngles = new Vector2(0, 0);
}
if(Input.GetKey (KeyCode.A))
{
transform.Translate(Vector2.right * MoveSpeed * Time.deltaTime);
transform.eulerAngles = new Vector2(0, 180);
}
if(Input.GetKeyDown (KeyCode.Space) && grounded)
{
rigidbody2D.AddForce(Vector2.up * jumpForce);
}*/
}
}
PlayerLeft.cs
using UnityEngine;
using System.Collections;
public class PlayerLeft : MonoBehaviour {
// Update is called once per frame
void Update ()
{
//Is there a touch?
if(Input.touches.Length <= 0)
{
//If no touches...
}
else //If screen touched..
{
//Loop through these
for(int i = 0; i < Input.touchCount; i++)
{
//executes this code for current touch
if(this.guiTexture.HitTest(Input.GetTouch(i).position))
{
//If current touch hits the guitexture...
if(Input.GetTouch(i).phase == TouchPhase.Began)
{
PlayerLogic.MoveLeft = true;
}
if(Input.GetTouch(i).phase == TouchPhase.Ended)
{
PlayerLogic.MoveLeft = false;
}
}
}
}
}
}
PlayerRight.cs
using UnityEngine;
using System.Collections;
public class PlayerRight : MonoBehaviour {
// Update is called once per frame
void Update ()
{
//Is there a touch?
if(Input.touches.Length <= 0)
{
//If no touches...
}
else //If screen touched..
{
//Loop through these
for(int i = 0; i < Input.touchCount; i++)
{
//executes this code for current touch
if(this.guiTexture.HitTest(Input.GetTouch(i).position))
{
//If current touch hits the guitexture...
if(Input.GetTouch(i).phase == TouchPhase.Began)
{
PlayerLogic.MoveRight = true;
}
if(Input.GetTouch(i).phase == TouchPhase.Ended)
{
PlayerLogic.MoveRight = false;
}
}
}
}
}
}
PlayerJump.cs
using UnityEngine;
using System.Collections;
public class PlayerJump : MonoBehaviour {
// Update is called once per frame
void Update ()
{
//Is there a touch?
if(Input.touches.Length <= 0)
{
//If no touches...
}
else //If screen touched..
{
//Loop through these
for(int i = 0; i < Input.touchCount; i++)
{
//executes this code for current touch
if(this.guiTexture.HitTest(Input.GetTouch(i).position))
{
//If current touch hits the guitexture...
if(guiTexture.HitTest(Input.touches[0].position))
{
PlayerLogic.Jump = true;
}
}
}
}
}
}
I hope you can understand my question.
Thanks in advance.
@Phles Thankyou so much it worked I dont know why I didnt realize that when I was checking the code. Probably staying up too late..
Answer by Phles · Dec 30, 2013 at 09:13 AM
Hey there,
In your PlayerJump.cs you are doing 2 HitTest's the first one is checking touches[i] the second nested HitTest is checking touches[0], the second nested HitTest could be causing the problem.
You are looping through touches checking if any touch is touching the guiTexture using GetTouch(i), then with the second nested HitTest you are checking if touches[0] is ALSO touching the guiTexture... this doesn't make sense or I need more sleep.
Try removing the second nested HitTest and see if that helps.