Прежде всего все ваши случаи точно равны:
if (Mathf.Abs(lp.x - fp.x) > Mathf.Abs(lp.y - fp.y))
{ //If the horizontal movement is greater than the vertical movement...
if ((lp.x > fp.x)) //If the movement was to the right)
{ //Right swipe
Vector2 moveInput = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
moveVelocity = moveInput.normalized * speed;
}
else
{ //Left swipe
Vector2 moveInput = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
moveVelocity = moveInput.normalized * speed;
}
}
else
{ //the vertical movement is greater than the horizontal movement
if (lp.y > fp.y) //If the movement was up
{ //Up swipe
Vector2 moveInput = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
moveVelocity = moveInput.normalized * speed;
}
else
{ //Down swipe
Vector2 moveInput = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
moveVelocity = moveInput.normalized * speed;
}
}
Все они используют одинаковые две строки
Vector2 moveInput = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
moveVelocity = moveInput.normalized * speed;
Я предполагаю, что Input.GetAxisRaw("Horizontal")
и Input.GetAxisRaw("Vertical")
просто всегда 0
, и поэтому никакого движения не происходит вообще. Насколько я знаю, это работает только для ввода с клавиатуры и мыши, а не для касаний.
Не лучше ли вы в соответствии с вашим направлением движения, а, например,
if (Mathf.Abs(lp.x - fp.x) > Mathf.Abs(lp.y - fp.y))
{
//If the horizontal movement is greater than the vertical movement...
if (lp.x > fp.x) //If the movement was to the right)
{ //Right swipe
moveVelocity = Vector2.right;
}
else
{ //Left swipe
moveVelocity = Vector2.left;
}
}
else
{ //the vertical movement is greater than the horizontal movement
if (lp.y > fp.y) //If the movement was up
{ //Up swipe
moveVelocity = Vector2.up;
}
else
{ //Down swipe
moveVelocity = Vector2.down;
}
}
А затем
void FixedUpdate()
{
rb.MovePosition(rb.position + moveVelocity * speed * Time.deltaTime);
}
Обратите внимание, что вместо Time.fixedDeltaTime
Для чтения времени дельты рекомендуется использовать Time.deltaTime
вместо этого, поскольку он автоматически возвращает правильную дельту время, если вы находитесь внутри функции FixedUpdate
или Update
.
В качестве альтернативы вы также можете напрямую назначить rb.velocity
if (Mathf.Abs(lp.x - fp.x) > Mathf.Abs(lp.y - fp.y))
{
//If the horizontal movement is greater than the vertical movement...
if (lp.x > fp.x) //If the movement was to the right)
{ //Right swipe
rb.velocity = Vector2.right * speed;
}
else
{ //Left swipe
rb.velocity = Vector2.left * speed;;
}
}
else
{ //the vertical movement is greater than the horizontal movement
if (lp.y > fp.y) //If the movement was up
{ //Up swipe
rb.velocity = Vector2.up * speed;;
}
else
{ //Down swipe
rb.velocity = Vector2.down * speed;;
}
}
без FixedUpdate
. Поскольку вы здесь только изменяете velocity
Rigidbody и не перемещаете его напрямую, это можно сделать в Update
.
Общие примечания:
Вы должны используйте switch-case
вместо
switch(touch.phase)
{
case TouchPhase.Began:
fp = touch.position;
// No need to assign lp here actually
// lp = touch.position;
break;
case TouchPhase.Ended:
// lp could actually be a local variable - no need to make it a field
var lp = touch.position;
...
break;
}
Поскольку вы не используете значение lp
, назначенное в TouchPhase.Moved
, вы можете вообще пропустить этот блок.
Вы можете сделайте ваши if-else
проверки на направление перемещения немного более читабельными / лучше поддерживающими, введя одну дополнительную переменную:
var lp = touch.position;
var difference = lp - fp;
if (difference.x > dragDistance || difference.y > dragDistance)
{
if (Mathf.Abs(difference.x) > Mathf.Abs(difference.y))
{
if (difference.x > 0)
{
// Right swipe
}
else
{
// Left swipe
}
}
else
{
if (difference.y > 0)
{
// Up swipe
}
else
{
// Down swipe
}
}
}