|
Общие вопросы вопросы не попадающие ни в один из доступных разделов |
07.01.2021, 13:56
|
#1
|
Знающий
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений (для 51 пользователей)
|
Движение 2D-объектов
Как вообще двигают объекты в коде Unity? Очень много способов, которые непонятные, просто так нельзя прибавить к координате значения, нужно через какие-то translate , какие-то вектора и т.д. Куча запутанных примеров, вроде должно быть это просто, а на самом деле через кучу строк кода почему-то.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
09.01.2021, 01:14
|
#2
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Движение 2D-объектов
Все зависит от того, что за объект нужно двигать. Если это 2d спрайт или 3d объект, то все просто
transform.localPosition += new Vector3(x,y,z);
Если это UI, то тут да, заморочки, т.к. интерфейс обычно масштабируется в размер экрана, некоторые объекты UI привязываются к краям экрана или другим объектам UI, отсюда и сложности.
PS: с векторной математикой придется подружиться, а если объекты захочется вращать по кратчайшим направлениям, то еще и с кватернионами придется немного познакомиться. Векторная математика сильно упрощает вычисления позиций, покоординатно что-то менять имхо не модно)
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
|
|
09.01.2021, 01:27
|
#3
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Движение 2D-объектов
Сообщение от JeanWinters
просто так нельзя прибавить к координате значения
|
Ну как это нельзя.
Есть компонент Transform.
За положение у него отвечает свойство position (глобальная позиция) и localPosition (позиция относительно парента).
В Блице за это отвечал флаг global у EntityX/Y/Z, а тут просто раздельные.
Это и есть те значения, к которым надо прибавлять то, что ты хочешь.
Прибавляют не отдельно X Y Z, а вектор (все три вместе), вот и вся разница.
Ну например
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 относительно его парента
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
09.01.2021, 14:10
|
#4
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,361
Написано 2,473 полезных сообщений (для 6,856 пользователей)
|
Ответ: Движение 2D-объектов
Я сначала написал пост, потом подумал, что тред из 11 года и удалил. Показалось что его апнул бот, которого оперативно снёс один из админов. Чёртова единичка на конце.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 4090 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
09.01.2021, 16:06
|
#5
|
Знающий
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений (для 51 пользователей)
|
Ответ: Движение 2D-объектов
Почитал в "интернетах" , там пишут, что не рекомендуется передвигать игровые объекты присвоением значений "transform.position" , это называется "телепортация" и так делают только новички и так движком не задумано. А правильно нужно передвигать через "transform.Translate" (хотя и это некоторые не рекомендуют) или самое верное - через методы компонента "rigidBody" .
К тому же рекомендуется почему-то использовать FixedUpdate(), хотя не совсем понял чем он отличается от Update().
Я не утверждаю, так как только разбираюсь в этих вопросах и хотелось бы понять правильную реализацию движения, а то их вроде бы много вариантов.
|
(Offline)
|
|
09.01.2021, 19:06
|
#6
|
Чудо-кот
Регистрация: 22.02.2011
Сообщений: 901
Написано 480 полезных сообщений (для 1,471 пользователей)
|
Ответ: Движение 2D-объектов
К тому же рекомендуется почему-то использовать FixedUpdate(), хотя не совсем понял чем он отличается от Update().
|
FixedUpdate() - тикает ровно 50 раз в секунду (по дефолту).
Update() - на каждый кадр. Здесь сдвиги и повороты надо умножать на delta time (время с последнего кадра), а в Fixed не надо.
(не пользуюсь Unity, могу ошибаться)
|
(Offline)
|
|
09.01.2021, 19:22
|
#7
|
Знающий
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений (для 51 пользователей)
|
Ответ: Движение 2D-объектов
Ну и зачем тогда использовать Update() и delta time, если есть FixedUpdate() ? Или этот метод позже добавили в какой-то новой версии движка?
|
(Offline)
|
|
09.01.2021, 20:27
|
#8
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Движение 2D-объектов
Сообщение от JeanWinters
Почитал в "интернетах" , там пишут, что не рекомендуется передвигать игровые объекты присвоением значений "transform.position" , это называется "телепортация" и так делают только новички и так движком не задумано. А правильно нужно передвигать через "transform.Translate" (хотя и это некоторые не рекомендуют)
|
А в чём разница не поясняют? И то и другое в итоге приводит к смене позиции.
Сообщение от JeanWinters
или самое верное - через методы компонента "rigidBody" .
|
Ну так-то да, но это если ты используешь RigidBody. А его не всегда надо использовать.
Сообщение от JeanWinters
К тому же рекомендуется почему-то использовать FixedUpdate()
|
А есть ссылка почитать эти советы? Что-то мне подсказывает, что автор подобных советов и сам не особо хорошо разбирается в том, что советует.
Сообщение от JeanWinters
Ну и зачем тогда использовать Update() и delta time, если есть FixedUpdate() ? Или этот метод позже добавили в какой-то новой версии движка?
|
Потому что FPS-то не фиксированный, это значит, что обновление движение объекта будет не совпадать с реальным FPS (если FPS выше, то будут "затыки", если ниже, то апдейтить чаще FPS излишне).
Fixed Update может быть полезен при работе с физикой, потому что там обновление происходит в отдельном потоке и с фиксированными интервалами (потому что по многим причинам физика плохо дружит с нефиксированным дельта таймом), а в обычных ситуациях использовать Fixed Update не стоит (если только нет конкретных причин почему это в Update делать нельзя).
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо ABTOMAT за это полезное сообщение:
|
|
09.01.2021, 21:35
|
#9
|
Знающий
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений (для 51 пользователей)
|
Ответ: Движение 2D-объектов
Искал про движение в Unity, вот ссылка в поисковике:
https://ru.stackoverflow.com/questio...%D0%B6%D 0%B0
Есть другие обсуждения, но пока что на этом остановился, поэтому его привожу.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.01.2021, 06:05
|
#10
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Движение 2D-объектов
Сообщение от JeanWinters
|
Почитал, крайне однобокий взгляд на вещи и разделение мира на "правильно" и "неправильно". К сожалению, пост написан убедительно, ему будут верить. Нирикаминдую следовать этим советам.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
13.01.2021, 00:09
|
#11
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Движение 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 и корутины и т.д. всегда вызываются в основном потоке.
|
(Offline)
|
|
Эти 5 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:33.
|