forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Движение 2D-объектов (http://forum.boolean.name/showthread.php?t=20884)

JeanWinters 07.01.2021 13:56

Движение 2D-объектов
 
Как вообще двигают объекты в коде Unity? Очень много способов, которые непонятные, просто так нельзя прибавить к координате значения, нужно через какие-то translate , какие-то вектора и т.д. Куча запутанных примеров, вроде должно быть это просто, а на самом деле через кучу строк кода почему-то.

pax 09.01.2021 01:14

Ответ: Движение 2D-объектов
 
Все зависит от того, что за объект нужно двигать. Если это 2d спрайт или 3d объект, то все просто
PHP код:

transform.localPosition += new Vector3(x,y,z); 

Если это UI, то тут да, заморочки, т.к. интерфейс обычно масштабируется в размер экрана, некоторые объекты UI привязываются к краям экрана или другим объектам UI, отсюда и сложности.

PS: с векторной математикой придется подружиться, а если объекты захочется вращать по кратчайшим направлениям, то еще и с кватернионами придется немного познакомиться. Векторная математика сильно упрощает вычисления позиций, покоординатно что-то менять имхо не модно)

ABTOMAT 09.01.2021 01:27

Ответ: Движение 2D-объектов
 
Цитата:

Сообщение от JeanWinters (Сообщение 318255)
просто так нельзя прибавить к координате значения

Ну как это нельзя.
Есть компонент Transform.
За положение у него отвечает свойство position (глобальная позиция) и localPosition (позиция относительно парента).

В Блице за это отвечал флаг global у EntityX/Y/Z, а тут просто раздельные.

Это и есть те значения, к которым надо прибавлять то, что ты хочешь.
Прибавляют не отдельно X Y Z, а вектор (все три вместе), вот и вся разница.



Ну например

PHP код:

myGameObject.transform.position += Vector3.right*0.5f// Сдвинуть объект вправо на 0.5 в глобальных координатах
myGameObject.transform.localPosition += Vector3.forward*0.1f// Сдвинуть объект вперёд на 0.1 относительно его парента
myGameObject.transform.localPosition += new Vector3(25,-40,70); // Сдвинуть объект на 25 по X, -40 по Y и 70 по Z относительно его парента 


Randomize 09.01.2021 14:10

Ответ: Движение 2D-объектов
 
Я сначала написал пост, потом подумал, что тред из 11 года и удалил. Показалось что его апнул бот, которого оперативно снёс один из админов. Чёртова единичка на конце.

JeanWinters 09.01.2021 16:06

Ответ: Движение 2D-объектов
 
Почитал в "интернетах" , там пишут, что не рекомендуется передвигать игровые объекты присвоением значений "transform.position" , это называется "телепортация" и так делают только новички и так движком не задумано. А правильно нужно передвигать через "transform.Translate" (хотя и это некоторые не рекомендуют) или самое верное - через методы компонента "rigidBody" .

К тому же рекомендуется почему-то использовать FixedUpdate(), хотя не совсем понял чем он отличается от Update().

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

Nerd 09.01.2021 19:06

Ответ: Движение 2D-объектов
 
Цитата:

К тому же рекомендуется почему-то использовать FixedUpdate(), хотя не совсем понял чем он отличается от Update().
FixedUpdate() - тикает ровно 50 раз в секунду (по дефолту).
Update() - на каждый кадр. Здесь сдвиги и повороты надо умножать на delta time (время с последнего кадра), а в Fixed не надо.

(не пользуюсь Unity, могу ошибаться)

JeanWinters 09.01.2021 19:22

Ответ: Движение 2D-объектов
 
Ну и зачем тогда использовать Update() и delta time, если есть FixedUpdate() ? Или этот метод позже добавили в какой-то новой версии движка?

ABTOMAT 09.01.2021 20:27

Ответ: Движение 2D-объектов
 
Цитата:

Сообщение от JeanWinters (Сообщение 318269)
Почитал в "интернетах" , там пишут, что не рекомендуется передвигать игровые объекты присвоением значений "transform.position" , это называется "телепортация" и так делают только новички и так движком не задумано. А правильно нужно передвигать через "transform.Translate" (хотя и это некоторые не рекомендуют)

А в чём разница не поясняют? И то и другое в итоге приводит к смене позиции.

Цитата:

Сообщение от JeanWinters (Сообщение 318269)
или самое верное - через методы компонента "rigidBody" .

Ну так-то да, но это если ты используешь RigidBody. А его не всегда надо использовать.
Цитата:

Сообщение от JeanWinters (Сообщение 318269)
К тому же рекомендуется почему-то использовать FixedUpdate()

А есть ссылка почитать эти советы? Что-то мне подсказывает, что автор подобных советов и сам не особо хорошо разбирается в том, что советует.

Цитата:

Сообщение от JeanWinters (Сообщение 318272)
Ну и зачем тогда использовать Update() и delta time, если есть FixedUpdate() ? Или этот метод позже добавили в какой-то новой версии движка?

Потому что FPS-то не фиксированный, это значит, что обновление движение объекта будет не совпадать с реальным FPS (если FPS выше, то будут "затыки", если ниже, то апдейтить чаще FPS излишне).
Fixed Update может быть полезен при работе с физикой, потому что там обновление происходит в отдельном потоке и с фиксированными интервалами (потому что по многим причинам физика плохо дружит с нефиксированным дельта таймом), а в обычных ситуациях использовать Fixed Update не стоит (если только нет конкретных причин почему это в Update делать нельзя).

JeanWinters 09.01.2021 21:35

Ответ: Движение 2D-объектов
 
Искал про движение в Unity, вот ссылка в поисковике:



https://ru.stackoverflow.com/questio...%D0%B6%D 0%B0


Есть другие обсуждения, но пока что на этом остановился, поэтому его привожу.

ABTOMAT 10.01.2021 06:05

Ответ: Движение 2D-объектов
 
Цитата:

Сообщение от JeanWinters (Сообщение 318274)
Искал про движение в Unity, вот ссылка в поисковике:



https://ru.stackoverflow.com/questio...%D0%B6%D 0%B0


Есть другие обсуждения, но пока что на этом остановился, поэтому его привожу.

Почитал, крайне однобокий взгляд на вещи и разделение мира на "правильно" и "неправильно". К сожалению, пост написан убедительно, ему будут верить. Нирикаминдую следовать этим советам.

pax 13.01.2021 00:09

Ответ: Движение 2D-объектов
 
Извиняйте что я такой тормоз. Но написать напишу.

Что transform.position/localPosition, что transform.Translate (этим не пользуюсь вообще) изменяют позицию объекта (телепортируют его). Различие в том, что Translate смещает объект на указанное значение, что эквивалентно оператору += при применении совместно с transform.position/localPosition. Есть вероятность, что Translate работает чуть быстрее, т.к. там не надо получать вектор текущей позиции (что по идее делает оператор +=). Стоит об этом заботиться, если с производительностью проблемы и в игре много объектов двигаются, в остальных случаях имхо пофиг.

Что касается RigidBody - если объект физический, то да, двигать надо через свойства компонента RigidBody, а не Transform. И двигать надо в FixedUpdate, т.к. только там физика правильно обрабатывается. При низком FPS применяя силы в Update/LateUpdate можно получить не те результаты, которые предполагаются. И да, если двигаете физические объекты, то есть спец методы у RigidBody: MovePosition и MoveRotation, которые не телепортируют объекты, а двигают/вращают их в течении кадров, в которых физика не обрабатывается (при высоком FPS, об этом ниже). Кстати двигают обычно только кинематические физические объекты (IsKinematic), в остальных случаях к ним прикладывают силы.

На счет отдельного потока не совсем верно, FixedUpdate вызывается столько раз, сколько нужно даже в пределах одного кадра в основном потоке. Если FPS высокий, то FixedUpdate срабатывает не каждый кадр, если низкий (ниже 50 FPS, что установлено в настройках по умолчанию 0,02 секунды), то FixedUpdate может сработать несколько раз за один кадр. В крайних случаях физика может замедляться, т.к. в настройках по умолчанию задано 0,333 секунды - максимальное время на обработку физики за раз. Сама физика считается в отдельных потоках да, но FixedUpdate и Update и LateUpdate и корутины и т.д. всегда вызываются в основном потоке.


Часовой пояс GMT +4, время: 12:47.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot