![]() |
Быстрый поворот/перемещение множества объектов
Здраствуйте! Язык C#. В Unity новичок, до этого использовал Blitz3D.
Есть массив клонированных объектов, пусть будет 5000 кубов: Код:
cube = new GameObject[5000]; Код:
float tdt=Time.deltaTime; А если обновлять то ~18 FPS. Уж очень большая разница. Неужели расчет занимает так много времени? Может нужно как-то по другому их перемещать/вращать? |
Ответ: C# Быстрый поворот/перемещение множества объектов
надо получить transform каждого кубика отдельно и самого объекта отдельно в начале работы скрипта (например в Start) а потом работать с ними. Получение transform через свойство скрипта - медленно
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Вот так?
Код:
GameObject[] cube; Может при перемещении кубика, автоматический рассчитываются коллизии или еще чего, поэтому так тормозит?! Может как-то еще можно? Вот тут http://unity3d.com/support/documenta...imization.html Пишут про Vector3 массивы, говорят очень быстрые,как их использовать вместе с GameObject? Будет ли прирост? |
Ответ: C# Быстрый поворот/перемещение множества объектов
Вот так:
Код:
GameObject[] cube; |
Ответ: C# Быстрый поворот/перемещение множества объектов
А если кубики с коллайдерами, то конечно надо поставить их в режим IsTrigger хотя бы. А если с RigidBody, то в режим IsKinematic.
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Нет не Pro а бесплатная.
Все дела в двух строчках: Код:
cubet[i].Translate(tra); Полный исходник: Код:
using UnityEngine; |
Ответ: C# Быстрый поворот/перемещение множества объектов
Вот тебе две строчки, каждую можешь попробовать после создания префаба:
PHP код:
![]() Результаты со второй строчкой: ![]() Если несколько по иному рассчитывать поворот, то немного можно прибавить кадров: PHP код:
![]() |
Ответ: C# Быстрый поворот/перемещение множества объектов
Вот еще способ добиться лучшего результата:
PHP код:
![]() |
Ответ: C# Быстрый поворот/перемещение множества объектов
Код:
DestroyImmediate(myPrefab.GetComponent<BoxCollider>()); Код:
myPrefab.GetComponent<BoxCollider>().isTrigger = true; Наверно для моей системы 50FPS это предел. |
Ответ: C# Быстрый поворот/перемещение множества объектов
Когда в блитце такое делал, какой результат был?
Я так подозреваю, что без правильного кода, который время обращения к памяти сводил бы к минимуму, ты вряд ли существенного прироста производительности добьешься. |
Ответ: C# Быстрый поворот/перемещение множества объектов
Цитата:
Цитата:
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Цитата:
Код:
void Update() Отмечу в каждом Update меняются координаты всех 6000 кубов в первом for, но трансформируются (transform.position/rotation) только 2000. За три кадра 6000. Тему можно еще развить если обновлять только объекты находящиеся близко к камере или находящиеся в поле зрения камеры. Предполагаю, что первое должно быть проще, а по скорости скорее всего будет небольшая разница. |
Ответ: C# Быстрый поворот/перемещение множества объектов
Ну Вам виднее. Только у вас будет неравномерное перемещение, т.к. 2 обновления по 2000 а одно 1000. Следовательно deltaTime для следующей первой группы в 2000 будет меньше в 2 раза.
PHP код:
PHP код:
PHP код:
PHP код:
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Цитата:
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Цитата:
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Цитата:
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Цитата:
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Цитата:
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Цитата:
Говорю же это только сейчас в одну сторону. Далее добавлю массив cuber[] где буду хранить направление каждого куба. В радианах скорее всего. Так что deg2rad может вовсе не пригодится. На а дальше как-то так. Код:
for(int i = 0; i<cube.Length; i++){ |
Ответ: C# Быстрый поворот/перемещение множества объектов
Я на самом деле о Sin и Cos вообще не подумал бы, а работал бы так:
PHP код:
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Кстати зачем такое количество кубиков?
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Цитата:
Через cubet[i].position есть небольшой прирост, но он не значителен. Что касается Sin/Cos таким путем можно перемещать и 50000 объектов. А в реале обновлять только то, что попадает в камеру и работать должно шустро. В тему кубиков, MINE CRAFT тут ни причем =) Просто куб наименее прожорливая фигура 12 треугольников 8 вершин. Ну это пока кубики, потом может танки или космические корабли или еще чего =) |
Ответ: C# Быстрый поворот/перемещение множества объектов
Не подскажите как сделать чтобы объект был ярким без источников света.
Чтобы у него была полная яркость на C#? |
Ответ: C# Быстрый поворот/перемещение множества объектов
для fullbright нужно использовать шейдер. например такой: http://www.unifycommunity.com/wiki/i...hp?title=Unlit
по "оптимизации" кубов я не понял постановки задачи. без коллайдеров (а следовательно физики) скорость возросла. только вот в игре объекты без коллайдеров практически невозможны, так как (ВНЕЗАПНО!) отсутствует возможность отслеживать их контакты и "пикать лучами из мышки". распределенные во времени вычисления удобнее всего организовать через coroutines (сопрограммы): http://unity3d.com/support/documenta..._26_Yield.html |
Ответ: C# Быстрый поворот/перемещение множества объектов
То PAX
Может я что-то не понял. Этот пример реализация вывода части из большого множества объектов на экран. cubex,cubey это массивы float. Как показала практика быстрее рассчитать перемещение с помощью SinCos а потом в порядке очереди обновлять координаты кубов, что позволяет увеличить FPS. То ffinder Цитата:
Можно как в Blitz3d например. EntityFX cube,1 Если нет, то как этот шейдер прикрутить к кубикам? Физика мне точно не нужна а вот насчет pick пока не знаю, может тоже не понадобится. |
Ответ: C# Быстрый поворот/перемещение множества объектов
Цитата:
копируешь в него текст шейдера переносишь файл в папку Assets своего проекта создаешь новый материал, выбираешь ему созданный шейдер выбираешь материал для меша |
Ответ: C# Быстрый поворот/перемещение множества объектов
|
Ответ: C# Быстрый поворот/перемещение множества объектов
ну может у него куб без нормалей и текс. координат.
имхо объекты без коллайдеров имеют право на жизнь тоже. |
Ответ: C# Быстрый поворот/перемещение множества объектов
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Вложений: 1
Извините за примитивный вопрос.
Вот создал я Terrain вручную, а как определить высоту Terrain в точке x,z например? В Blitz я использовал TerrainHeight#(terrain,grid_x,grid_z). А тут как? И еще как можно определить нормали к поверхности terrain в определенной точке. Чтобы кубы разворачивать к поверхности. По поводу self-ilumination есть ambientLight http://unity3d.com/support/documenta...ientLight.html Пока как-то так |
Ответ: C# Быстрый поворот/перемещение множества объектов
Ответы по работе с террейном тут:
http://unity3d.com/support/documenta...rrainData.html По поводу нормалей... рейкаст в сторону террейна(т.е. вниз) - один из вариантов. |
Ответ: C# Быстрый поворот/перемещение множества объектов
Цитата:
1. Берём 3 точки на поверхности террайна (и не говорите мне, что в юнити так нельзя) - сам куб + 2 любые рядом. 2. Из них делаем два вектора с началом в кубе. 3. Векторно перемножаем. 4. Нормаль готова, получите и распишитесь. Обычно не пишу в юнити-тредах, ибо посчитают, что троллю, но тут уж промолчать было преступно. |
Ответ: C# Быстрый поворот/перемещение множества объектов
Цитата:
А вот с нормалью тупик. Делаю так: Код:
Vector3 n=terrainData.GetInterpolatedNormal(x/1024,y/1024); Кубики не ворочаются так как числа варьируются не от 0-360, а от ~0..1. Как преобразовать? |
Ответ: C# Быстрый поворот/перемещение множества объектов
Спасибо за комплимент, всегда рад о себе хорошее услышать.
По первой ссылке которую я привел, есть все что связано с террейном (и heghtMap тоже). Извини меня конечно, но написал "один из вариантов". Когда я болею, я не могу вспоминать все сразу, да я знаю как нормаль к треугольнику посчитать. Зато видишь, новые люди в разделе общаться начали ;) |
Ответ: C# Быстрый поворот/перемещение множества объектов
Цитата:
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Цитата:
Поправляйся PAX. Код:
cube[t].transform.position = new Vector3(cubex[t],terrainData.GetInterpolatedHeight(cubex[t]/1024,cubey[t]/1024),cubey[t]); |
Ответ: C# Быстрый поворот/перемещение множества объектов
Опять же - трансформы лучше получать отдельно. Свойство transform ищет на объекте компонент Transform прежде чем его использовать - это дополнительная нагрузка. В прочем как и другие свйосва объекта типа collider, audio, camera и т.д.
Цитата:
|
Ответ: C# Быстрый поворот/перемещение множества объектов
АВТ, несоглашусь.
втроенные методы предпочтительнее, хотя бы из-за уровня удаления от ядра.©импер етот рейкаст может ядром юниты быть реализован эффективнее чем три получения высоты. хотя надо тестить в любом случае... |
Ответ: C# Быстрый поворот/перемещение множества объектов
Цитата:
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Кто подскажет?
Вот я создаю в GameObject примитив куб, вот так: Цитата:
Я ее загрузил модель уже в Heractiy и Project, но как загрузить ее в сам GameObject я понять не могу.:dontknow: |
Ответ: C# Быстрый поворот/перемещение множества объектов
Не надо ее бросать в Hierarchy. У скрипта есть поле GameObject myPrefab; на него в инспекторе юнити бросаешь свою модель, а в скрипте убираешь строчку myPrefab=GameObject.CreatePrimitive(PrimitiveType. Cube);
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Цитата:
NullReferenceException: Object reference not set to an instance of an object NScript.Update () (at Assets/NScript.cs:65) Мне же надо в Start() еще эту модель от копировать. А программно никак нельзя? |
Ответ: C# Быстрый поворот/перемещение множества объектов
Покажи код.
UPD: Догадки: 1) поле GameObject myPrefab не public (public GameObject myPrefab) и ты на него ничего не бросил соответственно. 2) где-то переменной myPrefab что-то присваиваешь. |
Ответ: C# Быстрый поворот/перемещение множества объектов
Жалуется на cube[i].transform.position типа "исходный объект не найден".
Код:
GameObject[] cube; |
Ответ: C# Быстрый поворот/перемещение множества объектов
myPrefab где объявлена? и в инспекторе на нее кинул модель?
Если приведенный код неизменный в программе, то должно работать. |
Ответ: C# Быстрый поворот/перемещение множества объектов
Цитата:
Раньше Heracty заполнялось Cube(Clone) А сейчас вообще ничего не клонируется. perfab в Nscript классе, естественно отдельно от start() И Update(). В Script References NScript добавил свою модель. Может модели просто нельзя клонировать в отличие от кубов? |
Покажи скрин инспектора твоего скрипта
Цитата:
Script References - отвечает за заполнение свойств скрипта при его навешивании на объект, но не после. |
Ответ: C# Быстрый поворот/перемещение множества объектов
Заработало конечно. Но мне нужно не скрипт вешать на объект, а из скрипта управлять объектами. Поэтому я и прошу как это сделать из кода.
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Как ты хочешь из скрипта управлять объектами? Опиши все нужные возможности.
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Вот у меня есть массив GameObject для моделей.
Допустим загрузил я в Project несколько моделей например там ship,tank,jeep далее вешаю свой NScript на Camera.Main и из него в масив GameObject клонирую либо ship либо tank, захотел поменял ship на tank и т.д. вообщем чтобы можно было менять клоны в массиве, если понадобится. |
Ответ: C# Быстрый поворот/перемещение множества объектов
PHP код:
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Спасибо! Идея понята. Буду экспериментировать.
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Небольшой доп.вопрос:
Как сделать камеру как в режиме просмотра сцены? Влево-вправо двигается camera.Translate(Vector3.right *Input.GetAxis("Horizontal")*speed); А при движении вперед назад, начинает опускатся/подниматся. А мне нужно, чтобы она была все время на одной и той же высоте Может ее как-то сравнять с линией горизонта потом передвинуть вперед и вернуть угол наклона обратно? Код:
//Перемещение |
Ответ: C# Быстрый поворот/перемещение множества объектов
PHP код:
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Вложений: 1
Цитата:
Камера по красной оси (влево/вправо) двигается нормально А (вперед/назад) она двигается по синей оси. А мне нужно что-бы вперед/назад она двигалась по фиолетовой оси, то есть параллельно террайну, на зависимо от угла наклона синей и зеленой стрелки. В режиме просмотра сцены она именно так и двигается. |
Ответ: C# Быстрый поворот/перемещение множества объектов
Тогда вот так:
PHP код:
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Цитата:
В общем я сделал так, работает. Определяю угол наклона между камерой и горизонтом. Поднимаю камеру в верх на этот угол чтобы она сравнялась с горизонтом. Двигаю камеру вперед. Опускаю камеру на тот же угол. Криво но работает. Код:
//Перемещение |
Ответ: C# Быстрый поворот/перемещение множества объектов
Может это все из-за Translate. Никогда ей не пользовался
Попробуй так: PHP код:
PHP код:
|
Ответ: C# Быстрый поворот/перемещение множества объектов
Вложений: 1
PHP код:
30000 обновляемых объектов, из которых на экране отображается только 3000, в зоне камеры на расстоянии 200 метров. |
Ответ: C# Быстрый поворот/перемещение множества объектов
Есть ли какой-нибудь простой способ получить FPS (кадровую частоту)? Или это нужно делать вручную?
|
Ответ: C# Быстрый поворот/перемещение множества объектов
в окне Game View включить статистику ;)
еще вот так: http://www.unifycommunity.com/wiki/i...ramesPerSecond |
Ответ: C# Быстрый поворот/перемещение множества объектов
Пардон! Не до конца объяснил.
Просто хочу сделать exe билд и по тестировать его на других машинах, без установки Unity естественно. Посмотреть сколько будет фпс, а как посмотришь если его на экран не вывести. Про окно статистики я в курсе оно у меня в каждом скриншоте. Что-то в скрипте не то. |
Ответ: C# Быстрый поворот/перемещение множества объектов
|
Часовой пояс GMT +4, время: 06:19. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot