Взаимодействие Rigidbody.Velocity

Программирование на Юнити.

Взаимодействие Rigidbody.Velocity

Сообщение MemoryStick 23 май 2017, 14:00

Часто в 2д платформере нужна возможность горизонтально передвигать твердое тело без учета его ускорения и прочих сил.
Словно через трансформ, но все же в будущем воздействовать на него силы должны, не говоря уже о гравитации, она вообще всегда должна работать.

Во многих статьях это реализуют через прямое воздействие на Velocity.
Пример:
rb.velocity = new Vector2 (Input.GetAxis("Horizontal"), rb.velocity);

Но, что если при ударе снаряда мой персонаж должен отлетать по вектору (-10,10);
AddForce(new Vector2(-10,10), ForceMode2D.Impulse);

Если я ничего не нажимаю, то компонент Х вектора Velocity всегда сбрасывается в 0, что не позволит совершить такой маневр.
Прямое взаимодействие с велосити у меня постоянно приводит к головной боли если есть другие силы, которые воздействуют на игрока.

Я пытался это сделать через AddForce, но не могу полностью избавиться от "слайдинга" и ускорения.
Как решается подобная задача?
MemoryStick
UNец
 
Сообщения: 7
Зарегистрирован: 23 май 2017, 13:48

Re: Взаимодействие Rigidbody.Velocity

Сообщение samana 23 май 2017, 17:44

Вы так же можете двигать с помощью https://docs.unity3d.com/ScriptReferenc ... ition.html

MemoryStick писал(а): я ничего не нажимаю, то компонент Х вектора Velocity всегда сбрасывается в 0

А почему сбрасывается, само? Или вы условие такое прописали? Тогда уберите это условие.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Взаимодействие Rigidbody.Velocity

Сообщение MemoryStick 23 май 2017, 21:55

samana писал(а):Вы так же можете двигать с помощью https://docs.unity3d.com/ScriptReferenc ... ition.html

MemoryStick писал(а): я ничего не нажимаю, то компонент Х вектора Velocity всегда сбрасывается в 0

А почему сбрасывается, само? Или вы условие такое прописали? Тогда уберите это условие.


Здравствуй.

Ну как почему X сбрасывается.
Эта строка ее сбрасывает:
rb.velocity = new Vector2(Input.GetAxis("horizontal"), rb.velocity.y);

Если я не ввожу Horizontal он нуль. Он и сбрасывает. В этом вся и проблема.

в документации написано что пока я двигаю через movePosition гравитация на меня не действует, это не подойдет.
Неужели нет возможности перемещаться без ускорения и замедления, по крайней мере видимого, но не через воздействие на velocity?
Поиграв с настройками компонента rb мне удалось добиться "что-то рядом". Но игрок реагирует на движение лишь через несколько мгновений, а не сразу.
Последний раз редактировалось MemoryStick 23 май 2017, 22:10, всего редактировалось 1 раз.
MemoryStick
UNец
 
Сообщения: 7
Зарегистрирован: 23 май 2017, 13:48

Re: Взаимодействие Rigidbody.Velocity

Сообщение samana 23 май 2017, 22:09

Просто не устанавливайте скорость по икс в ноль, если клавишу ходьбы не нажата.

Синтаксис:
Используется csharp
float xspeed = Input.GetAxis("Horizontal");
Vector2 currentVel = _rb2D.velocity;
if (xspeed != 0) currentVel.x = xspeed;

_rb2D.velocity = currentVel;


Возможно лучше сделать не прямой установкой скорости, а плавной, то-есть добавлять к скорости +=. Или таки AddForce, но контролировать максимальную скорость (if velocity > 10 то velocity = 10), чтобы персонаж не двигался очень быстро.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Взаимодействие Rigidbody.Velocity

Сообщение MemoryStick 23 май 2017, 22:13

samana писал(а):Просто не устанавливайте скорость по икс в ноль, если клавишу ходьбы не нажата.

Синтаксис:
Используется csharp
float xspeed = Input.GetAxis("Horizontal");
Vector2 currentVel = _rb2D.velocity;
if (xspeed != 0) currentVel.x = xspeed;

_rb2D.velocity = currentVel;


Возможно лучше сделать не прямой установкой скорости, а плавной, то-есть добавлять к скорости +=. Или таки AddForce, но контролировать максимальную скорость (if velocity > 10 то velocity = 10), чтобы персонаж не двигался очень быстро.


Разумеется я пробовал не устанавливать в ноль, если не нажата. Но тогда возникает проблемная ситуация. Так как я возвращаю управление велосити обратно физ движку, а не инпуту, то он начинает останавливаться с замедлением, а не сразу, поэтому и попал в тупик, вроде простая задача.
Быстрый старт, моментальный стоп, но получать воздействие сил в процессе, шаром по лбу, как ?)
Вы понимаете, не имеет значения здесь скорость. У меня проблема при начале ходьбы и в конце, во время остановки. У меня замедление и ускорение присутствует так как обьект пытается вести себя физически правильно.
Моментально я могу остановиться только через прямое обнуление велости... а я не хочу с ним взаимодействовать, от этого одни проблемы.
MemoryStick
UNец
 
Сообщения: 7
Зарегистрирован: 23 май 2017, 13:48

Re: Взаимодействие Rigidbody.Velocity

Сообщение samana 23 май 2017, 22:20

Тогда не знаю.. может просто настройте побольше трение у физического материала (который нужно создать и подцепить на физ.тело), вдруг поможет тормозить быстрее.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Взаимодействие Rigidbody.Velocity

Сообщение MemoryStick 24 май 2017, 09:52

samana писал(а):Тогда не знаю.. может просто настройте побольше трение у физического материала (который нужно создать и подцепить на физ.тело), вдруг поможет тормозить быстрее.


Даже это пробовал, но материал не решит проблему если мы будем передвигаться в воздухе, во время прыжка. Все равно спасибо.

Если кто реализовывал данное, вроде самое обычное поведение, отпишитесь, пожалуйста.
В игре идет управление персонажем, моментальный старт и моментальная остановка.
В процессе ходьбы или idle в него попадает шар и на игрока воздействует физ сила отбрасывания. AddForce()

Проблема в том что я не могу остановить персонажа в тот же момент без обнуления velocity, но обнуляя велосити
AddForce не сработает, а не обнуляя велосити моментальной остановки не происходит.

--- Без прямого воздействия с велосити не обошелся, но нашел путь когда его можно безопасно записывать.
Я это делаю не отслеживая нажатия кнопки, а проигрывающуюся анимацию.
К примеру велосити может быть перезаписано только в Runstate. Теперь если нас ударят и сработает DamageState то мы не сможем ходить, так как уже не управляем велосити и нас отбросит как нужно.
MemoryStick
UNец
 
Сообщения: 7
Зарегистрирован: 23 май 2017, 13:48


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4