Ограничение области движения ускорителя в Unity

void Update(){
    float accel = Input.acceleration.x;
    transform.Translate(accel, 0, 0);
}

Выше мой текущий код для управления ускорителем в моей игре. Я хочу иметь возможность наклонять телефон влево и вправо, и персонаж будет двигаться влево и вправо. Код работает нормально, но персонаж перемещается за пределы экрана. Я попробовал Mathf.Clamp на значении ускорения, а также попытался зафиксировать transform.position, но ничего не сработало и, похоже, просто изменило скорость управления акселерометром.

Мне нужен способ динамически ограничивать перемещение персонажей на экране любого размера.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
241
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если я правильно понял вопрос, вы хотите, чтобы объект был зажат в видимой области. Для этого вы можете использовать Viewport.

Vector3 pos = this.transform.position;
Vector3 viewportPos = Camera.main.WorldToViewportPoint(pos);
if (viewportPos.x < 0f) Camera.main.ViewportToWorldPoint(new Vector3(0f, pos.y, pos.z));
else if (viewportPos.x > 1f) Camera.main.ViewportToWorldPoint(new Vector3(1f, pos.y, pos.z));

Я полагаю, вы поместили этот скрипт в функцию обновления? Потому что я попробовал это, и это не сработало. Для справки, я делаю трехмерную летную игру, поэтому нет никаких естественных краев или стен, которые могли бы удерживать его. Также да, в соответствии с вашим предположением. Я хочу убедиться, что персонаж может перемещаться влево и вправо с помощью элементов управления наклоном, но его следует останавливать, когда он уходит слишком далеко.

user6318284 04.10.2018 07:23

Да, этот код переходит в функцию обновления. Если вы не знакомы с пространством области просмотра - это как координата пространства экрана, но со значениями единиц измерения. Таким образом, он изменяется от 0 до 1 по обеим осям (x и y). Это позволяет легко зажимать объекты в видимой области.

Iggy 04.10.2018 13:12

Другим решением может быть добавление 2D-коллайдеров вокруг видимой области и привязка их к камере. Однако это будет работать, только если основной объект также использует физику.

Iggy 04.10.2018 13:14

Хм, я пробовал использовать идею WorldToViewPortPoint, но персонаж просто прошел сквозь них. Полностью проигнорировал зажим. Я также попытался создать несколько парящих коллайдеров вокруг персонажа, который двигался вместе с ним, и установить его ускорение на 0, как предложил кто-то другой, но это тоже не сработало. Я также попытался сделать так, чтобы у переводчика была жесткая блокировка, когда он ударялся о невидимые стены, но я не уверен, как вы его «разблокируете», когда он отойдет от стены.

user6318284 06.10.2018 10:05

Возможно, вы могли бы установить коллайдеры в качестве триггеров рядом с дорожкой и установить переменную ускорения в 0, если объект касается триггера

Другие вопросы по теме