Я реализовал управления на Устройстве под 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;
}