Перейти к содержимому

Velocity unity что это

  • автор:

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); > >

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
Ваш ответ на вопрос

Войдите, чтобы написать ответ

c#

  • C#
  • +1 ещё

Как проверять столкновение префаба и UI панели в Unity?

  • 1 подписчик
  • час назад
  • 7 просмотров

Передвижение персонажем

Большинство игр, как правило, имеют в себе функции передвижения, которые присутствуют у игровых персонажей, ботов, или других игровых объектов. В данной статье мы рассмотрим несколько способов реализации передвижения персонажем.

Способ 1. Смена координат

Для начала нужно понять, что такое передвижение объекта? – Это плавное изменение координат X и Y (если говорить о 2D играх.) у нашего объекта. Следовательно, для передвижения любого объекта необходимо циклически менять его координаты, тем самым, создавая эффект передвижения. Координаты любого игрового объекта находятся в классе(компоненте) Transform. Изменим позицию объекта по оси X на единицу вправо, через метод FixedUpdate():

void FixedUpdate()

В представленном выше коде, сначала мы получаем текущую позицию объекта по оси X с помощью transform.position.x. После чего передвигаем наш объект на одну единицу вправо с помощью оператора +1.

На самом деле, данный код можно упростить используя метод Translate(), который сразу меняет позицию объекта на определённое значение.

void FixedUpdate()

Представленный код меняет позицию объекта на 1 в правую сторону по оси Х, и на 3 единицы вниз по оси Y.

Передвигать игровой объект мы научились. Но что делать, если нам передвигать объект необходимо только в тот момент, когда была нажата определённая кнопка. Для этого воспользуемся Input.GetAxisRaw(«Horizontal») и Input.GetAxisRaw(«Vertical»).

Input.GetAxisRaw(«Horizontal») отвечает за горизонтальное передвижение. Оно получает значение -1, если игрок двигается НАЗАД(нажал стрелочку влево). При движении ВПЕРЁД(нажата стрелочка вправо), мы получаем значение 1.

Input.GetAxisRaw(«Vertical») отвечает за вертикальное передвижение. Оно поучает значение -1, если игрок двигается НАЗАД(нажал стрелочку вниз). При движении ВПЕРЁД(нажата стрелочка вверх), мы получаем значение 1.

Так же стрелочки «влево», «вправо», «вверх» и «вниз», соответствуют нажатым клавишам A, D, W и S. Но их так же можно изменить в настройках Unity. Данные настройки находятся в меню EditProject SettingsInput Manager.

Давайте немного переделаем наш код:

void FixedUpdate()

Последнее, на чём хотелось бы заострить внимание, это на скорости передвижения объекта. Чтобы указать скорость, с которой мы будем передвигать нашего персонажа, нам необходимо объявить переменную, например runSpeed, и умножить её на наши параметры метода GetAxisRaw. Итоговый код передвижения будет выглядеть следующим образом:

using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMovement : MonoBehaviour < public float runSpeed = 0.3f; void FixedUpdate() < transform.Translate(Input.GetAxisRaw("Horizontal") * runSpeed, Input.GetAxisRaw("Vertical") * runSpeed, 0); >> 

Способ 2. Толкание

Очень часто при реализации передвижения, разработчики хотят, чтобы передвигаемый персонаж не проходил сквозь стены и другие твёрдые объекты. Поэтому для реализации такого передвижения используют компонент Rigidbody2D, и его метод velocity(). Смысл данного передвижения в том, что мы не перемещаем наш объект по координатам(как в предыдущем способе), а мы как бы толкаем его. И если наш объект встретит препятствие на своём пути, он будет замедлен, либо полностью остановлен. Данный способ передвижения самый распространённый.

Поскольку мы будем работать с компонентом Rigidbody2D, то объявим для неё поле rigidbody, а так же объявим скорость передвижения объекта в поле runSpeed:

private Rigidbody2D rigidbody; public float runSpeed = 5.0f; 

Теперь нам необходимо получить ссылку на экземпляр класса(компонента) Rigidbody2D, ведь именно через этот компонент мы и будем перемещать нашего персонажа.

void Awake () < rigidbody = GetComponent(); > 

Теперь мы можем с помощью rigidbody, обратиться к методу velocity – который как говорилось выше, будет толкать наш объект в определённую сторону. Чтобы эти значения изменить как нам необходимо, воспользуемся new Vector2(1, 0). Например, нам необходимо переместить объект вправо по оси Х, на единицу:

void FixedUpdate()

Давайте разберём несколько важных моментов. В компоненте Rigidbody2D , свойство velocity может иметь всего 2 параметра, X и Y. Чем выше X и Y, чем сильнее наш объект будет толкаться по соответствующим координатам. Например, если мы хотим направить персонажа двигаться вправо(по вектору X), то нам нужно первым параметром передать значение больше нуля, например, velocity(6, 0). Если нужно двигаться влево, то velocity(-6,0). Аналогичная ситуация и с осью Y.

Используя Input.GetAxisRaw(«Horizontal»), Input.GetAxisRaw(«Vertical») и runSpeed из предыдущего урока, изменим наш код:

void FixedUpdate()

Итоговый код передвижения будет выглядеть следующим образом:

using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMovement : MonoBehaviour < private Rigidbody2D rigidbody; public float runSpeed = 5.0f; void Start() < rigidbody = GetComponent(); > private void FixedUpdate() < rigidbody.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * runSpeed, Input.GetAxisRaw("Vertical") * runSpeed); >>

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *