Я реализовал управления на Устройстве под Android используя объекты UI Canvas. Но беда в том, что персонаж двигается не плавно, а рывками, при этом на клавиатуре все работает нормально. В канвасе я использовал элементы image с компонентом Ivent Trriger, внутри него добавил компонент Pointer down. Я думаю это связано с тем, что на клавиатуре можно зажимать кнопки, а эти элементы не реагируют на зажимание. Собственно вопрос в том как сделать такое управление на тач скрине чтобы персонаж мог двигаться не рывками, а пока палец нажат на кнопке? 
 Прилагаю код контроллера персонажа. 
 Код
[HideInInspector] public bool facingRight = true; 
   [HideInInspector]public bool jump = false; 
   public float moveForce = 365f; 
   public float maxSpeed = 5f; 
   public float jumpForce = 1000f; 
   public Transform groundCheck; 
   float hInput = 0; 
   private bool grounded = false; 
   private Animator anim; 
   private Rigidbody2D rb2d; 
   // Use this for initialization 
   void Awake () { 
    anim = GetComponent<Animator> (); 
    rb2d = GetComponent<Rigidbody2D> (); 
   } 
     
   // Update is called once per frame 
   void Update () { 
    grounded = Physics2D.Linecast (transform.position, groundCheck.position, 1 << LayerMask.NameToLayer("Ground")); 
    if (Input.GetButton ("Jump") && grounded) { 
     jump = true; 
    } 
   } 
   public void Jump() 
   { 
    grounded = Physics2D.Linecast (transform.position, groundCheck.position, 1 << LayerMask.NameToLayer("Ground")); 
    if (Input.GetButton("Jump") && grounded) { 
     jump = true; 
    } 
   } 
   void FixedUpdate() 
   { 
    float h = Input.GetAxis ("Horizontal"); 
    Debug.Log (h.ToString ()); 
    anim.SetFloat ("Speed", Mathf.Abs (h)); 
    if (h * rb2d.velocity.x < maxSpeed) 
     rb2d.AddForce(Vector2.right * h * moveForce); 
      
    if (Mathf.Abs (rb2d.velocity.x) > maxSpeed) 
     rb2d.velocity = new Vector2 (Mathf.Sign (rb2d.velocity.x) * maxSpeed, rb2d.velocity.y); 
    if (h > 0 && !facingRight) 
     Flip (); 
    else if (h < 0 && facingRight) 
     Flip (); 
    if(jump) 
    { 
     anim.SetTrigger ("Jump"); 
     rb2d.AddForce (new Vector2(0f, jumpForce)); 
     jump = false; 
    } 
   } 
   public void Tjump() 
   { 
    Debug.Log ("push"); 
    if ( grounded) { 
     jump = true; 
    } 
    if(jump) 
    { 
     anim.SetTrigger ("Jump"); 
     rb2d.AddForce (new Vector2(0f, 100)); 
     jump = false; 
    } 
   } 
   public void StartMoving(float h) 
   { 
    Debug.Log ("push"+" " + h.ToString()); 
    anim.SetFloat ("Speed", Mathf.Abs (h)); 
    if (h * rb2d.velocity.x < maxSpeed) 
     rb2d.AddForce(Vector2.right * h * moveForce); 
      
    if (Mathf.Abs (rb2d.velocity.x) > maxSpeed) 
     rb2d.velocity = new Vector2 (Mathf.Sign (rb2d.velocity.x) * maxSpeed, rb2d.velocity.y); 
    if (h > 0 && !facingRight) 
     Flip (); 
    else if (h < 0 && facingRight) 
     Flip (); 
   } 
   void Flip() 
   { 
    facingRight = !facingRight; 
    Vector3 theScale = transform.localScale; 
    theScale.x *= -1; 
    transform.localScale = theScale; 
   }