2015-09-15 4 views
0

Скажите, что у меня есть точка в Vector3, и мой FPSController (я использую стандартный, который поставляется с Unity 5) перемещает величину в 10 от этого Vector3. Я хочу не допускать движения в любом направлении, помимо величины 10. В идеале я бы предвидел, в каком направлении игрок нажал, чтобы перейти, протестировать этот вектор, и если он будет меньше 10, то это позволит двигаться дальше. Таким образом, если вы в 10 лет и нажмите «назад», вы не сможете двигаться, но если вы нажмете «вперед», тогда проблем не будет.Проверьте, превышает ли требуемое движение игрока значение?

Я знаю, что я немного абстратен здесь. Насколько я понимаю, скрипт FPSController.cs использует компонент CharacterController. Я уже некоторое время изучал код FPSController и замечаю, что он выполняет всевозможные вычисления в локальной позиции, но величина должна быть между двумя мировыми координатами.

Я знаю, как рассчитать величину уже, все, что мне нужно знать, - это проверить ожидаемое направление. У меня такое ощущение, что это проще, чем я думаю?

+0

Я не понимаю, что вы подразумеваете под «Я хочу не допускать движения в любом направлении, помимо величины 10.» Вы говорите, что хотите ограничить игрока в пределах 10 единиц с определенной точки? Или вы хотите ограничить их скорость? – 31eee384

+0

Я хочу сдержать их на 10 единиц с определенной точки. Вы привязаны к веревке, и как только она растянулась до своей длины, вы больше не можете идти – mythstified

ответ

0

Вы слишком задумываетесь об этом! Вместо того, чтобы думать, как вы можете ограничить скорость, подумайте о сдерживающей позиции. Проверьте Vector3 Vector3.ClampMagnitude(Vector3, float), который возвращает вектор, масштабированный до максимальной длины. «Преобразуя» позицию игрока в цель, зажимая до максимальной длины, а затем преобразуя обратно в мировые координаты, вы можете ограничить позицию игрока.

// target: the Vector3 you can't get too far from. 
// distance: the float max distance from the target. 
transform.position = Vector3.ClampMagnitude(transform.position - target, distance) + target; 
+0

Отличная идея! Но как я могу предотвратить перемещение контроллера символов? В очень простой игре сверху вниз, если пользователь нажимает вправо, он сначала проверяет, есть ли там стена, а если нет, это позволит двигаться. Итак, последний фрагмент этой головоломки - как я могу сказать, что контроллер fps не выходит за пределы максимальной длины? Я попытался ввести предложение if в скрипт fpscontroller.cs в областях обновления, но это привело к сканированию fps, очевидно, потому что он выполнял расчет расстояний в каждом кадре. Я хочу только сделать эту проверку, если обнаружен новый вход – mythstified

+0

@mythstified Удивительно, что это замедлит вашу игру вообще - это небольшое количество вычислений. Все, что вам нужно, - это запустить каждое обновление в самом конце, чтобы зажать игрока в ограничительной сфере. Вы должны изменить свой вопрос, чтобы добавить код как «то, что я пробовал». Редактирование: кстати, как общий совет, когда вы хотите, чтобы ваша игра не отставала, вы хотите рассмотреть * most *, которая может произойти в данном фрейме, поэтому оптимизируя, не делая ничего, пока игрок не движется, не отличная оптимизация, потому что игрок обычно движется. – 31eee384

+0

Это..одно..работано ... Я дам вам зеленый чек! Я все еще чувствую себя странно, это похоже на то, что сначала разрешает движение, а затем перемещает персонажа обратно .. но .. он работает – mythstified