Rigidbody2D.velocity
Благодарим вас за то, что вы помогаете нам улучшить качество документации по Unity. Однако, мы не можем принять любой перевод. Мы проверяем каждый предложенный вами вариант перевода и принимаем его только если он соответствует оригиналу.
Ошибка внесения изменений
По определённым причинам предложенный вами перевод не может быть принят. Пожалуйста попробуйте снова через пару минут. И выражаем вам свою благодарность за то, что вы уделяете время, чтобы улучшить документацию по Unity.
Ваше имя Адрес вашей электронной почты Предложение * Разместить предложенное
public var velocity : Vector2;
public Vector2 velocity ;
Описание
Линейная скорость твердого тела.
Скорость точно определена как вектор с компонентами в направлении X и Y осей (в 2D физике нет направления Z). Значение обычно не устанавливается напрямую, для этого лучше использовать «forces». Скорость также может постепенно спадать от эффекта «торможения», если это разрешено.
Unity как сбросить все ускорения с Rigit Body
то по логике вещей, после выхода из паузы у объекта не будет ускорений
но по факту, юнити гдето под капотом, собирает все эти ускорения который были приложены через ApplyForce, и применяет их в первом FixedUpdate, в итоге чем больше были на паузе, тем больше накапливаются ускорения в нутри, и при выходе из паузы, объект просто выстреливает как из пушки
Пока что я склоняюсь к тому, что когда мы вызываем .velocity = Vector3.zero, он смотрит свои кешированные данные, а ApplyForce собирается где-то в отдельной переменной. И потом на FixedUpdate применяет эти данные к реальному физ объекту ( физ движку )
- mega_otetz (father)
- Участник
#1
17:34, 7 мар 2020
Я точно не знаю Как именно в Unity, но по логике надо узнать в одном кадре три компоненты приложенной силы и момента силы, а затем приложить их в апдейте физике с отрицательным знаком.
#2
17:57, 7 мар 2020
FDsagizi
> b.angularVelocity = Vector3.zero;
> b.velocity = Vector3.zero;
b.angularVelocity = (-1)*Vector3.zero;
b.velocity = (-1)*Vector3.zero;
ну короче точно такое же количество ускорения но в противоположную сторону тогда равнодействующая равна ноль
#3
18:54, 7 мар 2020
Rikk
> b.angularVelocity = (-1)*Vector3.zero;
> b.velocity = (-1)*Vector3.zero;
уточнил вопрос в главном посте ( это не про это )
- Der FlugSimulator
- Участник
#4
22:53, 7 мар 2020
FDsagizi
> как сбросить все ускорения с объекта ?
сбросить «ускорения» нельзя. Т.к. они не хранятся. Хранятся скорости.
Если тело ускоряется, значит кто-то прикладывает силу, что-то типа «Constant Force».
> но есть место где мы вызываем ApplyForce
Несмотря на паузу?
#5
11:47, 8 мар 2020
rcsim
> Несмотря на паузу?
Понятно что это можно обойти, но мы сталкивались с подобной проблемой и в самой игре — при спавне объектов.
rcsim
> сбросить «ускорения» нельзя. Т.к. они не хранятся. Хранятся скорости.
Ну да, речь идет про скорости которые есть в объекте
которые при b.velocity = Vector3.zero должны обнуляться
#6
14:42, 8 мар 2020
FDsagizi
> Ну да, речь идет про скорости которые есть в объекте
> которые при b.velocity = Vector3.zero должны обнуляться
Velocity ― скорость. Почему при корректировке скорости должны обнуляться ускорения?
- Der FlugSimulator
- Участник
#7
16:40, 8 мар 2020
FDsagizi
> rcsim
> > Несмотря на паузу?
> Понятно что это можно обойти, но мы сталкивались с подобной проблемой и в самой
> игре — при спавне объектов.
Не понял ничего. Задам уточняющий вопрос: при паузе, «вы»
> но есть место где мы вызываем ApplyForce
зачем это делаете? Я бы не стал.
p.s. С юнити мало знаком, кажется там Physx, но нижеследующее действует и для других физдвигов:
При паузе (как правило) перестают обновлять физдвиг, но продолжают обновлять рендер.
И даже если не вызывать physicsWorld.update(), но вызывать rigidBody.ApplyForce(),
то это приведет к аккумулированию этих сил (там просто суммируются вектора) в самом теле, без всяких (имхо) Unitiy.
#8
16:43, 8 мар 2020
alexzzzz
> Velocity ― скорость. Почему при корректировке скорости должны обнуляться
> ускорения?
потому что
ускорение = [скорость2-скорость1] / [t2-t1]
a=dV/dt
скажем промежуток одна секунда 60кадров за секунду и на промежутке меняется скорость
значит можно скорости так подобрать что ускорение будет ноль
скажем сейчас скорость1=5 метров в секунду а через секунду скорость2=10метров в секунду
тогда ускорение=(10-5) /(одна секунда)= 5 метров за секунду в квадрате
но если скорость1=5 и скорость2=5 то ускорение=ноль хотя движение при скорости=5
#9
20:40, 8 мар 2020
Проблема уже обсуждалась и решалась AddForce(-velocity)
#10
20:42, 8 мар 2020
просто выдели объект и справа настройки отключи is gravity
или гравитация=0 is gravity=0
заодно включи is trigger управления программой(скриптами) и в программах не пиши формулы ускорения а пиши только формулы скорости
запилим супер на юнити как виртекса дергает в ванне током
#11
22:30, 8 мар 2020
foxes
> Проблема уже обсуждалась и решалась AddForce(-velocity)
Интересный вариант, надо попробовать
- endeavour_pr
- Участник
#12
0:22, 9 мар 2020
foxes
> AddForce(-velocity)
просто -velocity
там разве не по формуле ?
#13
14:52, 10 мар 2020
FDsagizi
Во- первых:
In most cases you should not modify the velocity directly, as this can result in unrealistic behaviour — use AddForce instead Do not set the velocity of an object every physics step, this will lead to unrealistic physics simulation. A typical usage is where you would change the velocity is when jumping in a first person shooter, because you want an immediate change in velocity.
Во-вторых:
Единственный случай когда в Юнити силы задаются как переменная, это у wheelcollider. AddForce прикладывает силу один раз как только в коде вы это обозначили (F=ma). Velocity это просто скорость и все, она не обнуляет силы которые прикладываются к объекту (F=ma > F = m(v1-v2) > F=mv > v = m/F, т.е. вы движку говорите что v = 0, а движок знает что, допустим F = 100 и m = 1, снова вычисляет скорость объекта). Так что если вы приложили к физическому объекту силу, то на него начинают действовать силы инерции и при обнулении скорости, вы не обнуляете силы инерции, по этому он и продолжает движение.
Поэтому как тут верно написали, либо вы прикладываете силы к объекту которые уравновесят силы инерции (только конечно не в таком виде — AddForce(-velocity), а как правильно указал endeavour_pr вычисляем по формуле), либо с помощью isKinematic сбрасываете все прикладываемые силы к объекту.
Если у вас объект ускоряется, то это значит что у вас в коде засела логическая ошибка и вы постоянно прикладываете к объекту силу. Я думаю, что просто вы слабо понимаете физику, отсюда и проблема.
#14
15:49, 10 мар 2020
sledo
силы инерции это же каки-то переменные, те по сути вектора, получаеться в Юнити они закрыты от нас ?
Что такое velocity в юнити, я не нашел ответа в других источниках?
GmDvlpr, тогда нужно уточнить вопрос. Желательно именно в самом вопросе, а не в комментарии к ответу. Что вам непонятно в слове «скорость»? Это же просто количество единиц расстояния, преодолеваемые объектом за секунду.
GmDvlpr @GmDvlpr Автор вопроса
dollar, для чего велосити? если можно юзать transform.translate и задать свою скорость
GmDvlpr, для разного. Например, можно поменять скорость объекта на противоположную. Хотя это будет выглядеть странно, но если очень хочется, то пожалуйста.
Но не понятно, какую проблему вы решаете. Лучше исходить от задачи и искать, что вам нужно для решения, а не брать фичу из юнити и смотреть, куда ее можно приткнуть.
GmDvlpr @GmDvlpr Автор вопроса
dollar, ясн, понял, что это бесполезно, можно просто юзать transform.translate
GmDvlpr @GmDvlpr Автор вопроса
dollar, кароч, я понял,, велосити это когда нам нужна физика, которая будет действовать на движения игрока, а транслейт — когда не нужона физика
xmoonlight @xmoonlight
https://sitecoder.blogspot.com
«Сопротивление воздуха» игрового мира для конкретного объекта.
Например, в момент прыжка (3D-шутер от 1-го лица: нпр, Quake) — мы её поднимаем для игрока до момента, когда вертикальное ускорение станет равно нулю — когда игрок окажется в верхней точке (и затем, он будет падать вниз под силой гравитации).
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ответы на вопрос 0
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Unity
Как исправить ошибку после установки стандартного рекордера видео в юнити?
- 1 подписчик
- 5 минут назад
- 3 просмотра
Rigidbody.velocity
Благодарим вас за то, что вы помогаете нам улучшить качество документации по Unity. Однако, мы не можем принять любой перевод. Мы проверяем каждый предложенный вами вариант перевода и принимаем его только если он соответствует оригиналу.
Ошибка внесения изменений
По определённым причинам предложенный вами перевод не может быть принят. Пожалуйста попробуйте снова через пару минут. И выражаем вам свою благодарность за то, что вы уделяете время, чтобы улучшить документацию по Unity.
Ваше имя Адрес вашей электронной почты Предложение * Разместить предложенное
public var velocity : Vector3;
public Vector3 velocity ;
Описание
Вектор скорости твердого тела.
В большинстве случаев вам не нужно изменять скорость напрямую, т.к. это может быть причиной нереалистичного поведения. Не устанавливайте скорость объекта каждый физический шаг, это приведет к нереалистичной имитации физики. Типичный пример, где вы можете изменить скорость это прыжок в шутере от первого лица, потому что вам нужно немедленно изменить скорость.
var rb: Rigidbody;
function Start() < rb = GetComponent.(); >
function FixedUpdate () < if (Input.GetButtonDown("Jump")) < rb.velocity = Vector3(0,10,0); > >
using UnityEngine; using System.Collections;
public class ExampleClass : MonoBehaviour < public Rigidbody rb; void Start() < rb = GetComponent(); > void FixedUpdate() < if (Input.GetButtonDown("Jump")) rb.velocity = new Vector3(0, 10, 0); > >