Подскажите, как реализовать touch на Uniyty 3D?
Делаю игру на Unity 3D. Мне нужно, чтобы куб двигался по оси Z вверх, или вниз(до "бортов"), при таче в определенную область экрана, соответственно в верхнюю, либо нижнюю. Я пробовал это сделать, но при таче, функция вызывается несколько раз, я в откладке это видно, соответствено куб двигается на несколько позиций. Подскажите, как это исправить, чтобы при таче куб двигался только на одну позицию?
З.Ы. Я делаю игру по типу endless runner, поэтому куб двигается с постоянной скоростью по оси X.
Также, могли бы подсказать, как придать плавности движению куба при по оси Z?
Спасибо.
private void Update()
{
CubePosUp_Z = transform.position.z - 0.7f;
CubePosDown_Z = transform.position.z + 0.7f;
if (Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
if (touch.position.y > Screen.height / 2)
{
tempUp = 1;
tempDown = 0;
}
else
{
tempUp = 0;
tempDown = 1;
}
if (tempUp == 1 && tempDown == 0)
{
UpTran();
}
else if (tempUp == 0 && tempDown == 1)
{
DownTran();
}
}
}
void UpTran()
{
Debug.Log("Up");
if (CubePosUp_Z <= -1.4)
{
transform.Translate(0, 0, 0, Space.World);
}
else if (CubePosUp_Z > -1.4)
{
transform.Translate(0, 0, -0.14f, Space.World);
}
}
void DownTran()
{
if (CubePosDown_Z >= 1.4)
{
transform.Translate(0, 0, 0, Space.World);
}
else if (CubePosDown_Z < 1.4)
{
transform.Translate(0, 0, 0.14f, Space.World);
}
}
Ответы (1 шт):
- Почему при таче функция вызывается несколько раз?
Потому что Input.GetTouch, - возвращает все активные тачи.
Что бы отслеживать только новые можно, например, добавить такой код
if (touch.phase != TouchPhase.Began)
{
return;
}
После добавления это кода вы получите телепортацию объекта по нажатию на экран
- Как придать плавности движению куба при по оси Z? Есть много способов это сделать. Подробнее можно прочитать здесь: Правильная-реализация-передвижения-персонажа Например, мы можем все таки реагировать, не только на начала тача, но каждый раз при активном таче немножко сдвигать наш куб:
transform.Translate(new Vector3(0, 0, Time.deltaTime * speed));
- Нет никакого смысла делать
transform.Translate(0, 0, 0, Space.World); Space.Worldуказывать можно, но это и так вариант по умолчанию- Ваши
tempUpиtempDownудобнее заменить на одну переменную типаboolВ итоге получиться что-то вроде:
using UnityEngine;
public class Controller : MonoBehaviour
{
private float CubePosUp_Z;
private float CubePosDown_Z;
private bool isUp; //Нужна?
[SerializeField]
private float speed = 1;
private void Update()
{
var position = transform.position;
CubePosUp_Z = position.z - 0.7f; //рекомендация: вынести все магические числа в поля класса
CubePosDown_Z = position.z + 0.7f;
if (Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
if (touch.position.y > Screen.height / 2f)
{
isUp = true;
UpTran();
}
else
{
isUp = false;
DownTran();
}
}
}
private void UpTran()
{
Debug.Log("Up");
if (CubePosUp_Z > -1.4)
{
transform.Translate(new Vector3(0,0,-Time.deltaTime * speed));
}
}
private void DownTran()
{
Debug.Log("Down");
if (CubePosDown_Z < 1.4) //рекомендация: вынести все магические числа в поля класса
{
transform.Translate(new Vector3(0,0,Time.deltaTime * speed));
}
}
}

