#c# #unity3d
Вопрос:
Мой приведенный ниже код работает для обнаружения ударов и добавления силы к моему игровому объекту. Однако моя цель состоит в том, чтобы позволить пользователю проводить пальцем только вверх(может быть вверх влево, вверх вправо, но никогда вниз). Я имею в виду, что только если пользователь проведет пальцем вверх, будет вызван метод AddForce. Когда пользователь проводит пальцем вниз, ничего не произойдет. Возможно ли это сделать, если да, то как?
public class SwipeScript : MonoBehaviour
{
Vector2 startPos, endPos, direction;
float touchTimeStart, touchTimeFinish, timeInterval;
[Range(0.05f, 1f)]
public float throwForse = 0.5f;
void Update()
{
if (Input.touchCount > 0 amp;amp; Input.GetTouch (0).phase == TouchPhase.Began)
{
touchTimeStart = Time.time;
startPos = Input.GetTouch(0).position;
}
if (Input.touchCount > 0 amp;amp; Input.GetTouch(0).phase == TouchPhase.Ended)
{
touchTimeFinish = Time.time;
timeInterval = touchTimeFinish - touchTimeStart;
endPos = Input.GetTouch(0).position;
direction = startPos - endPos;
GetComponent<Rigidbody2D>().AddForce(-direction / timeInterval * throwForse);
}
}
}
Комментарии:
1. @Palo пожалуйста, не отвечайте в комментариях. Просто просто добавьте ответ на вопрос, ваш ответ совершенно прекрасен.
2. @ЮринУдельман готово
Ответ №1:
Почему бы вам просто не зафиксировать направление, чтобы оно было неотрицательным? Например, перед последней строкой добавьте что-то вроде:
Это было бы для вверх и вправо:
direction = Vector2.Max(direction, Vector2.Zero);
и это было бы для всех наверху:
direction = new Vector2(direction.x, Math.Max(direction.y, 0));
и я предлагаю вам использовать
direction = endPos - startPos;
вместо другого способа, как в вашем исходном коде, так как таким образом он правильно представляет этот вектор движения. Затем AddForce
также удалите отрицательный знак direction
напротив. Таким образом:
void Update()
{
if (Input.touchCount > 0 amp;amp; Input.GetTouch (0).phase == TouchPhase.Began)
{
touchTimeStart = Time.time;
startPos = Input.GetTouch(0).position;
}
if (Input.touchCount > 0 amp;amp; Input.GetTouch(0).phase == TouchPhase.Ended)
{
touchTimeFinish = Time.time;
timeInterval = touchTimeFinish - touchTimeStart;
endPos = Input.GetTouch(0).position;
Vector2 direction = endPos - startPos;
direction = new Vector2(direction.x, Math.Max(direction.y, 0));
GetComponent<Rigidbody2D>().AddForce(direction / timeInterval * throwForse);
}
}
Комментарии:
1. Я попробовал ваш код, сначала Vector2.Zero должен быть Vector2.zero, потому что я получаю ошибку, когда пишу в верхнем регистре. Во-вторых, ваш код ограничил направления прокрутки, но не так, как я хотел. С помощью вашего кода я могу провести пальцем вверх и вправо, как область L-образной формы. Я не могу провести пальцем вверх влево или влево по экрану.
2. Так что, я думаю, это позволяет нам только проводить пальцем вверх и вправо (что является положительным направлением). Но я также хочу иметь возможность провести пальцем влево
3. О да, похоже, в этом и заключается разница между UnityEngine. Основной модуль. Вектор2 против системы. Цифры. Вектор2. У первого есть «ноль», у другого — «Ноль». Во — первых, чтобы понять вас, значит, вы хотите разрешить любое направление вверх, но не вниз? И хотите ли вы полностью отфильтровать (т. Е. Игнорировать) все нисходящие предположения, как если бы они не возникали, или вы хотите сохранить их горизонтальную часть (слева и справа), но в одной и той же координате Y?
4. Я хочу игнорировать жесты вниз.
5. @asdasdasd Я обновил ответ за игнорирование вниз. У меня нет компилятора C#, но я уверен, что вы справитесь, если в коде есть что-то еще, чего можно коснуться. Хорошего дня.