Я реализовал горизонтальное смахивание, чтобы повернуть игрока на 90 градусов, но вращение камеры ломает мой свайп logi c. Как я мог решить эту проблему? - PullRequest
0 голосов
/ 09 июля 2020

Я новичок в Unity и делаю гусеницу по подземельям сверху вниз с движением по рельсам, как шахматная доска с нестандартным дизайном плитки. Смахивание по горизонтали вращает игрока на фиксированные 90 градусов по часовой стрелке или против часовой стрелки в зависимости от того, было ли смахивание вправо или влево, а смахивание вверх перемещает вперед к плитке перед игроком, подземелье представляет собой график, а плитки - узлы *. 1001 *

Проблема в том, что важно, чтобы камера вращалась вместе с игроком, поэтому я поместил камеру как дочернюю по отношению к объекту игрока, и она вращалась, как я и предсказывал, но затем я понял, что ось для сенсорного ввода изменилась. как если бы я повернул свой смартфон на 90 градусов, ось привязана к камере.

Я использую Camera.main.ScreenToWorldPoint для получения первой и последней точки смахивания.

Я использую изменение x и y от точек касания и отпускания относительно экрана, если Input.GetTouch(0).phase равно TouchPhase.Ended:

deltaX = releaseX - touchX;
deltaY = releaseY - touchY;

touchX и touchY происходят от touchPosition переменной который содержит первую позицию касания относительно экрана, releaseX и touchY исходят из переменной, которая содержит текущую позицию касания GetTouch(0), поскольку она изменяется при каждом u pdate.

Смахивание вверх Если deltaY больше 1, это означает, что смахивание было выполнено хорошо, но поскольку мне не нужны очень диагональные смахивания, deltaX должно быть между -1 и 1 допуском, если нет, свайп игнорируется.

Смахивание вправо Если deltaX больше 1, это означает, что свайп вправо был хороший, так как мне не нужны очень диагональные смахивания, deltaY необходимо быть в пределах от -1 до 1, в противном случае смахивание игнорируется.

Смахивание влево Если deltaX меньше -1, это означает, что смахивание влево было хорошее, так как я не хочу очень диагональные смахивания, deltaY должно быть между -1 и 1 допуском, в противном случае смахивание игнорируется.

Лог c работает, пока камера не вращается, предположим, я смахиваю вправо, так как камера вращался, его ось также вращалась, как если бы я крутил свой телефон руками, ось вращается против часовой стрелки, смахивание вправо дает эффект смахивания вниз.

Я избавился от использования ScreenToWorld и смотрел консоль, чтобы узнать значения po ints, но код по-прежнему не работает, потому что все значения x и y должны быть одинаковыми для одного и того же места на экране, мировые значения изменятся, если камера перемещается, поэтому перемещение камеры приведет к беспорядку с swipe logi c, потому что это что-то, относящееся к экрану смартфона, а не к миру.

Представьте себе точку p (0,0), я думаю, мне нужно, чтобы она всегда была в центре экран, потому что я буду использовать его в качестве справочного материала для расчета типа смахивания и его правильности. Я научился это делать с помощью ScreenToWorld и камеры. Возможно, если бы у меня была привязка в центре экрана, я мог бы использовать с ней ScreenToWorld вместо использования камеры. Я думаю, что разработчикам тривиально иметь дело с сенсорным экраном и камерой, поэтому должен быть традиционный способ сделать это.

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 13 июля 2020

Вы хотите получить положение касания относительно камеры. Используйте ScreenToViewportPoint вместо ScreenToWorldPoint. Вероятно, вам потребуется использовать меньший порог, потому что он выражается в терминах покрытия области просмотра, а не в мировых единицах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...