Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity > Общие вопросы

Общие вопросы вопросы не попадающие ни в один из доступных разделов

Ответ
 
Опции темы
Старый 07.01.2021, 13:56   #1
JeanWinters
Знающий
 
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений
(для 51 пользователей)
Движение 2D-объектов

Как вообще двигают объекты в коде Unity? Очень много способов, которые непонятные, просто так нельзя прибавить к координате значения, нужно через какие-то translate , какие-то вектора и т.д. Куча запутанных примеров, вроде должно быть это просто, а на самом деле через кучу строк кода почему-то.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ARA (08.01.2021)
Старый 09.01.2021, 01:14   #2
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Движение 2D-объектов

Все зависит от того, что за объект нужно двигать. Если это 2d спрайт или 3d объект, то все просто
transform.localPosition += new Vector3(x,y,z); 
Если это UI, то тут да, заморочки, т.к. интерфейс обычно масштабируется в размер экрана, некоторые объекты UI привязываются к краям экрана или другим объектам UI, отсюда и сложности.

PS: с векторной математикой придется подружиться, а если объекты захочется вращать по кратчайшим направлениям, то еще и с кватернионами придется немного познакомиться. Векторная математика сильно упрощает вычисления позиций, покоординатно что-то менять имхо не модно)
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
ABTOMAT (09.01.2021), St_AnGer (09.01.2021)
Старый 09.01.2021, 01:27   #3
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
St_AnGer (09.01.2021)
Старый 09.01.2021, 14:10   #4
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,354
Написано 2,470 полезных сообщений
(для 6,850 пользователей)
Ответ: Движение 2D-объектов

Я сначала написал пост, потом подумал, что тред из 11 года и удалил. Показалось что его апнул бот, которого оперативно снёс один из админов. Чёртова единичка на конце.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Andvrok (09.01.2021)
Старый 09.01.2021, 16:06   #5
JeanWinters
Знающий
 
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений
(для 51 пользователей)
Ответ: Движение 2D-объектов

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

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

Я не утверждаю, так как только разбираюсь в этих вопросах и хотелось бы понять правильную реализацию движения, а то их вроде бы много вариантов.
(Offline)
 
Ответить с цитированием
Старый 09.01.2021, 19:06   #6
Nerd
Чудо-кот
 
Аватар для Nerd
 
Регистрация: 22.02.2011
Сообщений: 901
Написано 480 полезных сообщений
(для 1,471 пользователей)
Ответ: Движение 2D-объектов

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

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

(Offline)
 
Ответить с цитированием
Старый 09.01.2021, 19:22   #7
JeanWinters
Знающий
 
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений
(для 51 пользователей)
Ответ: Движение 2D-объектов

Ну и зачем тогда использовать Update() и delta time, если есть FixedUpdate() ? Или этот метод позже добавили в какой-то новой версии движка?
(Offline)
 
Ответить с цитированием
Старый 09.01.2021, 20:27   #8
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 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 за это полезное сообщение:
ant0N (13.01.2021), pax (14.01.2021)
Старый 09.01.2021, 21:35   #9
JeanWinters
Знающий
 
Регистрация: 22.12.2007
Сообщений: 223
Написано 22 полезных сообщений
(для 51 пользователей)
Ответ: Движение 2D-объектов

Искал про движение в Unity, вот ссылка в поисковике:



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


Есть другие обсуждения, но пока что на этом остановился, поэтому его привожу.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ABTOMAT (10.01.2021)
Старый 10.01.2021, 06:05   #10
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: Движение 2D-объектов

Сообщение от JeanWinters Посмотреть сообщение
Искал про движение в Unity, вот ссылка в поисковике:



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


Есть другие обсуждения, но пока что на этом остановился, поэтому его привожу.
Почитал, крайне однобокий взгляд на вещи и разделение мира на "правильно" и "неправильно". К сожалению, пост написан убедительно, ему будут верить. Нирикаминдую следовать этим советам.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Старый 13.01.2021, 00:09   #11
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 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 и корутины и т.д. всегда вызываются в основном потоке.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
ABTOMAT (13.01.2021), Andvrok (13.01.2021), ant0N (13.01.2021), Randomize (13.01.2021), St_AnGer (13.01.2021)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com