forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   C# Быстрый поворот/перемещение множества объектов (http://forum.boolean.name/showthread.php?t=14047)

Evgen 12.01.2011 22:14

Быстрый поворот/перемещение множества объектов
 
Здраствуйте! Язык C#. В Unity новичок, до этого использовал Blitz3D.
Есть массив клонированных объектов, пусть будет 5000 кубов:

Код:

cube = new GameObject[5000];
Обновляю его в Update()

Код:

float tdt=Time.deltaTime;
for(int i=0;i<cube.Length;i++){
        cube[i].transform.Translate(transform.forward * tdt*5);
        cube[i].transform.Rotate(Vector3.up*tdt*Random.Range(-50, 50));
}

Если не обновлять положение кубов счетчик показывает 100 FPS,
А если обновлять то ~18 FPS. Уж очень большая разница.
Неужели расчет занимает так много времени?
Может нужно как-то по другому их перемещать/вращать?

pax 12.01.2011 23:27

Ответ: C# Быстрый поворот/перемещение множества объектов
 
надо получить transform каждого кубика отдельно и самого объекта отдельно в начале работы скрипта (например в Start) а потом работать с ними. Получение transform через свойство скрипта - медленно

Evgen 13.01.2011 00:22

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Вот так?

Код:

GameObject[] cube;
Transform[] cubet;
       
void Start()
{
  cube = new GameObject[5000];
  ...
  cubet = new Transform[5000];
  for(int i=0;i<cube.Length;i++){
      ... 
      cubet[i]=cube[i].transform;
  }       
}


void Update()
{
    float tdt=Time.deltaTime;
    for(int i=0;i<cube.Length;i++){
        cubet[i].Translate(transform.forward * tdt*5);
        cubet[i].Rotate(Vector3.up*tdt*Random.Range(-50, 50));
    }
}

Сделал, но прирост всего 3-5 FPS, это ничтожно мало :(
Может при перемещении кубика, автоматический рассчитываются коллизии или еще чего, поэтому так тормозит?!
Может как-то еще можно?

Вот тут
http://unity3d.com/support/documenta...imization.html
Пишут про Vector3 массивы, говорят очень быстрые,как их использовать вместе с GameObject? Будет ли прирост?

pax 13.01.2011 00:48

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Вот так:
Код:

GameObject[] cube;
Transform[] cubet;
Transform thisTransform;       
void Start()
{
  cube = new GameObject[5000];
  ...
  cubet = new Transform[5000];
  thisTransform = transform;
  for(int i=0;i<cube.Length;i++){
      ... 
      cubet[i]=cube[i].transform;
  }       
}


void Update()
{
    Vector3 translation= thisTransform.forward * tdt*5;
    float tdt=Time.deltaTime;
    for(int i=0;i<cube.Length;i++){
        cubet[i].Translate(translation);
        cubet[i].Rotate(Vector3.up*tdt*Random.Range(-50, 50));
    }
}

Если у тебя Pro версия Unity, то посмотри в профайлер, какая операция больше времени жрет. Update или отрисовка.

pax 13.01.2011 01:04

Ответ: C# Быстрый поворот/перемещение множества объектов
 
А если кубики с коллайдерами, то конечно надо поставить их в режим IsTrigger хотя бы. А если с RigidBody, то в режим IsKinematic.

Evgen 13.01.2011 01:18

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Нет не Pro а бесплатная.
Все дела в двух строчках:

Код:

cubet[i].Translate(tra);
cubet[i].Rotate(0,tdt*Random.Range(-50, 50),0);

Стоит их закомментировать, как FPS возрастает до 200. А пять вызовов опускают производительность до 100 FPS

Полный исходник:

Код:

using UnityEngine;
using System.Collections;

public class NScript : MonoBehaviour {

        public string HelloWorldString;
        GameObject[] cube;
        Transform[] cubet;
        Transform thisTransform;
        public GameObject myPrefab;
        int calls;
    void Start()
    {
                HelloWorldString="Текст из Unity3D!";
                thisTransform = transform;
               
                cube = new GameObject[5000];
                myPrefab=GameObject.CreatePrimitive(PrimitiveType.Cube);
                myPrefab.transform.localScale = new Vector3(10,10,10);
                cubet = new Transform[5000];
        for(int i=0;i<cube.Length;i++){
                        cube[i] = (GameObject)Instantiate(myPrefab);
                        cube[i].transform.position = new Vector3(Random.Range(0, 1024),Random.Range(400, 600),Random.Range(0, 11024));
                        cubet[i]=cube[i].transform;
                }       

    }


    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Escape))Application.Quit();
                calls++;
                float tdt=Time.deltaTime;
                Vector3 tra= thisTransform.forward * tdt*5;               
                for(int i=0;i<cube.Length;i++){
                        cubet[i].Translate(tra);
                        cubet[i].Rotate(0,tdt*Random.Range(-50, 50),0);
                }
    }
       

       
}


pax 13.01.2011 01:38

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Вот тебе две строчки, каждую можешь попробовать после создания префаба:
PHP код:

myPrefab.GetComponent<BoxCollider>().isTrigger true;
DestroyImmediate(myPrefab.GetComponent<BoxCollider>()); 

Результаты с первой:


Результаты со второй строчкой:


Если несколько по иному рассчитывать поворот, то немного можно прибавить кадров:
PHP код:

void Update()
    {
        if (
Input.GetKeyDown(KeyCode.Escape)) Application.Quit();
        
calls++;
        
float tdt Time.deltaTime;
        
Vector3 tra thisTransform.forward tdt 5;
        
Vector3 up Vector3.up;
        for (
int i 0cube.Lengthi++)
        {
            
cubet[i].Translate(tra);
            
cubet[i].rotation *= Quaternion.AngleAxis(tdt Random.Range(-5050), up);
            
//cubet[i].Rotate(0, tdt * Random.Range(-50, 50), 0);
        
}
    } 


pax 13.01.2011 03:44

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Вот еще способ добиться лучшего результата:
PHP код:

private float lastDelta 0;
    private 
bool secondFrame false;

    
void Update()
    {
        
secondFrame = !secondFrame;
        
float newDelta Time.deltaTime;
        if (
Input.GetKeyDown(KeyCode.Escape)) Application.Quit();

        
calls++;
        
float tdt lastDelta newDelta;

        
Vector3 tra thisTransform.forward tdt 5;
        
Vector3 up Vector3.up;
        if (
secondFrame)
        {
            for (
int i 0cube.Length/2i++)
            {
                
cubet[i].Translate(tra);
                
cubet[i].rotation *= Quaternion.AngleAxis(tdt*Random.Range(-5050), up);
             }
        }
        else
        {
            for (
int i cube.Length 2cube.Lengthi++)
            {
                
cubet[i].Translate(tra);
                
cubet[i].rotation *= Quaternion.AngleAxis(tdt Random.Range(-5050), up);
            }
        }
        
lastDelta newDelta;
    } 


Evgen 13.01.2011 10:41

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Код:

DestroyImmediate(myPrefab.GetComponent<BoxCollider>());
Увеличило FPS до 50ти

Код:

myPrefab.GetComponent<BoxCollider>().isTrigger = true;
Хоть true хоть false не влияет.

Наверно для моей системы 50FPS это предел.

.Squid 13.01.2011 11:57

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Когда в блитце такое делал, какой результат был?
Я так подозреваю, что без правильного кода, который время обращения к памяти сводил бы к минимуму, ты вряд ли существенного прироста производительности добьешься.

pax 13.01.2011 13:54

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от Evgen (Сообщение 175467)
Наверно для моей системы 50FPS это предел.

Последний вариант не устраивает? У меня показывал 150+ кадров. А результат практически не отличим.

Цитата:

Сообщение от .Squid (Сообщение 175469)
Я так подозреваю, что без правильного кода, который время обращения к памяти сводил бы к минимуму, ты вряд ли существенного прироста производительности добьешься.

Тут есть вариант считать матрицы вручную и вручную выводить кубики на экран. Можно я думаю еще ускорить этот процесс, но это только в Pro версии Unity.

Evgen 13.01.2011 14:35

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от pax (Сообщение 175476)
Последний вариант не устраивает? У меня показывал 150+ кадров. А результат практически не отличим.

Тут есть вариант считать матрицы вручную и вручную выводить кубики на экран. Можно я думаю еще ускорить этот процесс, но это только в Pro версии Unity.

Я понял суть вашего последнего варианта. Спасибо :) ! только я сделал немного по другому "более гибко". Ну и конечно ничего на свете лучше Sin,Cos нету =)

Код:

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape)) Application.Quit();
        calls++;

                rot=rot+2.5f;//Random.Range(-5, 5);
                float speed=Time.deltaTime*25;
                float deg2rad=rot*0.0174532925f;
                for(int i = 0; i<cube.Length; i++){
                        cubex[i]+=Mathf.Sin(deg2rad)*speed;       
                        cubey[i]+=Mathf.Cos(deg2rad)*speed;       
                }       
               
                int updates=2000;
                int block=(updates*calls)%cube.Length;
                int end=block+updates;
                if(end>cube.Length)end=cube.Length;
                for(int i = block; i<end; i++){
                        cube[i].transform.position = new Vector3(cubex[i],500,cubey[i]);
                        cube[i].transform.rotation = Quaternion.AngleAxis(rot,Vector3.up);
                }                 
    }

Если взять 6000 кубов и за один Update трансформировать 2000 скорость 90FPS.
Отмечу в каждом Update меняются координаты всех 6000 кубов в первом for, но трансформируются (transform.position/rotation) только 2000. За три кадра 6000.

Тему можно еще развить если обновлять только объекты находящиеся близко к камере или находящиеся в поле зрения камеры. Предполагаю, что первое должно быть проще, а по скорости скорее всего будет небольшая разница.

pax 13.01.2011 14:40

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Ну Вам виднее. Только у вас будет неравномерное перемещение, т.к. 2 обновления по 2000 а одно 1000. Следовательно deltaTime для следующей первой группы в 2000 будет меньше в 2 раза.

PHP код:

float deg2rad=rot*0.0174532925f

это можно так:
PHP код:

float deg2rad=rot*Mathf.Deg2Rad

а еще можно
PHP код:

int end=block+updates;
if(
end>cube.Length)end=cube.Length

заменить на
PHP код:

int endMathf.Clamp(block+updates,0,cube.Length); 


Evgen 13.01.2011 14:53

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от .Squid (Сообщение 175469)
Когда в блитце такое делал, какой результат был?
Я так подозреваю, что без правильного кода, который время обращения к памяти сводил бы к минимуму, ты вряд ли существенного прироста производительности добьешься.

Точно не помню но на Blitz около 5000 кубов где-то 40-50FPS и выдавало. Ну Unity то по мощнее будет чем Blitz.

Evgen 13.01.2011 15:01

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от pax (Сообщение 175481)
можно так:
PHP код:

float deg2rad=rot*Mathf.Deg2Rad

PHP код:

int endMathf.Clamp(block+updates,0,cube.Length); 


Да можно. Только у меня уже привычка (оставшаяся от Java) обращаться к классам типа Mathf.бла-бла-бла только в случае крайней необходимости. Скорость выражения типа Mathf. практический не уменьшают, но когда дело касается 5-10тыс. объектов могут отнять десяток FPS. Если я не прав поправьте.

pax 13.01.2011 15:07

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от Evgen (Сообщение 175483)
Да можно. Только у меня уже привычка (оставшаяся от Java) обращаться к классам типа Mathf.бла-бла-бла только в случае крайней необходимости. Скорость выражения типа Mathf. практический не уменьшают, но когда дело касается 5-10тыс. объектов могут отнять десяток FPS. Если я не прав поправьте.

Не прав, эти операции у тебя выполняются один раз за апдейт ;).

Evgen 13.01.2011 15:11

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от pax (Сообщение 175485)
Не прав, эти операции у тебя выполняются один раз за апдейт ;).

Ладно, Ладно. В этом варианте конечно один раз, но это только пока все кубики едут в одну сторону :)

pax 13.01.2011 15:13

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от Evgen (Сообщение 175480)
Код:

                for(int i = 0; i<cube.Length; i++){
                        cubex[i]+=Mathf.Sin(deg2rad)*speed;       
                        cubey[i]+=Mathf.Cos(deg2rad)*speed;       
                }


Тогда зачем вызываешь одинаковые операции Sin и Cos в цикле в данном случае? ;)

Evgen 13.01.2011 15:20

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от pax (Сообщение 175489)
Тогда зачем вызываешь одинаковые операции Sin и Cos в цикле в данном случае? ;)

В смысле одинаковые? Sin прирост по x относительно угла rot, Cos прирост по y.
Говорю же это только сейчас в одну сторону. Далее добавлю массив cuber[] где буду хранить направление каждого куба. В радианах скорее всего. Так что deg2rad может вовсе не пригодится.
На а дальше как-то так.

Код:

                for(int i = 0; i<cube.Length; i++){
                        cubex[i]+=Mathf.Sin(cuber[i])*speed;       
                        cubey[i]+=Mathf.Cos(cuber[i])*speed;       
                }


pax 13.01.2011 15:26

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Я на самом деле о Sin и Cos вообще не подумал бы, а работал бы так:
PHP код:

cubet[i].position += cubet[i].forward*speed


pax 13.01.2011 15:46

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Кстати зачем такое количество кубиков?

Evgen 13.01.2011 15:48

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от pax (Сообщение 175492)
Я на самом деле о Sin и Cos вообще не подумал бы, а работал бы так:
PHP код:

cubet[i].position += cubet[i].forward*speed


Да мы с этого начинали.
Через cubet[i].position есть небольшой прирост, но он не значителен.
Что касается Sin/Cos таким путем можно перемещать и 50000 объектов. А в реале обновлять только то, что попадает в камеру и работать должно шустро.

В тему кубиков, MINE CRAFT тут ни причем =) Просто куб наименее прожорливая фигура 12 треугольников 8 вершин.
Ну это пока кубики, потом может танки или космические корабли или еще чего =)

Evgen 13.01.2011 16:23

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Не подскажите как сделать чтобы объект был ярким без источников света.
Чтобы у него была полная яркость на C#?

ffinder 13.01.2011 16:26

Ответ: C# Быстрый поворот/перемещение множества объектов
 
для fullbright нужно использовать шейдер. например такой: http://www.unifycommunity.com/wiki/i...hp?title=Unlit

по "оптимизации" кубов я не понял постановки задачи.
без коллайдеров (а следовательно физики) скорость возросла.
только вот в игре объекты без коллайдеров практически невозможны, так как (ВНЕЗАПНО!) отсутствует возможность отслеживать их контакты и "пикать лучами из мышки".

распределенные во времени вычисления удобнее всего организовать через coroutines (сопрограммы): http://unity3d.com/support/documenta..._26_Yield.html

Evgen 13.01.2011 16:58

Ответ: C# Быстрый поворот/перемещение множества объектов
 
То PAX
Может я что-то не понял. Этот пример реализация вывода части из большого множества объектов на экран. cubex,cubey это массивы float.
Как показала практика быстрее рассчитать перемещение с помощью SinCos а потом в порядке очереди обновлять координаты кубов, что позволяет увеличить FPS.

То ffinder

Цитата:

Сообщение от ffinder (Сообщение 175504)
для fullbright нужно использовать шейдер. например такой: http://www.unifycommunity.com/wiki/i...hp?title=Unlit

по "оптимизации" кубов я не понял постановки задачи.
без коллайдеров (а следовательно физики) скорость возросла.
только вот в игре объекты без коллайдеров практически невозможны, так как (ВНЕЗАПНО!) отсутствует возможность отслеживать их контакты и "пикать лучами из мышки".

распределенные во времени вычисления удобнее всего организовать через coroutines (сопрограммы): http://unity3d.com/support/documenta..._26_Yield.html

А без шейдеров никак?
Можно как в Blitz3d например. EntityFX cube,1
Если нет, то как этот шейдер прикрутить к кубикам?

Физика мне точно не нужна а вот насчет pick пока не знаю, может тоже не понадобится.

ffinder 13.01.2011 17:12

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от Evgen (Сообщение 175507)
Если нет, то как этот шейдер прикрутить к кубикам?

создаешь файл с расширением .shader
копируешь в него текст шейдера
переносишь файл в папку Assets своего проекта
создаешь новый материал, выбираешь ему созданный шейдер
выбираешь материал для меша

.Squid 13.01.2011 17:55

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от Evgen (Сообщение 175500)
Просто куб наименее прожорливая фигура 12 треугольников 8 вершин.

В каждом уважающем себя кубе 24 вершины.

HolyDel 13.01.2011 18:50

Ответ: C# Быстрый поворот/перемещение множества объектов
 
ну может у него куб без нормалей и текс. координат.

имхо объекты без коллайдеров имеют право на жизнь тоже.


чот меня внезавпно заинтересовало юнити. пойду качну..

Evgen 13.01.2011 21:26

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от HolyDel (Сообщение 175518)

чот меня внезавпно заинтересовало юнити. пойду качну..

Неделю назад я тоже так подумал :)
Если бы знал, что появилась бесплатная версия, может и раньше бы качнул.

Evgen 13.01.2011 22:07

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Вложений: 1
Извините за примитивный вопрос.
Вот создал я Terrain вручную, а как определить высоту Terrain в точке x,z например?
В Blitz я использовал TerrainHeight#(terrain,grid_x,grid_z). А тут как?
И еще как можно определить нормали к поверхности terrain в определенной точке. Чтобы кубы разворачивать к поверхности.

По поводу self-ilumination есть ambientLight
http://unity3d.com/support/documenta...ientLight.html

Пока как-то так

pax 13.01.2011 22:38

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Ответы по работе с террейном тут:
http://unity3d.com/support/documenta...rrainData.html
По поводу нормалей... рейкаст в сторону террейна(т.е. вниз) - один из вариантов.

ABTOMAT 14.01.2011 00:07

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от pax (Сообщение 175552)
Ответы по работе с террейном тут:
http://unity3d.com/support/documenta...rrainData.html
По поводу нормалей... рейкаст в сторону террейна(т.е. вниз) - один из вариантов.

Ну вы, юнитоиды, совсем *****нулись - рейкасты приплетать? Ладно - новички, но ты, pax?

1. Берём 3 точки на поверхности террайна (и не говорите мне, что в юнити так нельзя) - сам куб + 2 любые рядом.
2. Из них делаем два вектора с началом в кубе.
3. Векторно перемножаем.
4. Нормаль готова, получите и распишитесь.

Обычно не пишу в юнити-тредах, ибо посчитают, что троллю, но тут уж промолчать было преступно.

Evgen 14.01.2011 00:13

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от ABTOMAT (Сообщение 175561)
1. Берём 3 точки на поверхности террайна (и не говорите мне, что в юнити так нельзя) - сам куб + 2 любые рядом.
2. Из них делаем два вектора с началом в кубе.
3. Векторно перемножаем.
4. Нормаль готова, получите и распишитесь.

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

Код:

Vector3 n=terrainData.GetInterpolatedNormal(x/1024,y/1024);
cube.transform.rotation = Quaternion.Euler(n);

GetInterpolatedNormal возвращает Vector3 я так понял в Радианах, но может быть и нет. А Quaternion.Euler должен быть вроде бы в градусах.
Кубики не ворочаются так как числа варьируются не от 0-360, а от ~0..1.
Как преобразовать?

pax 14.01.2011 00:16

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Спасибо за комплимент, всегда рад о себе хорошее услышать.
По первой ссылке которую я привел, есть все что связано с террейном (и heghtMap тоже). Извини меня конечно, но написал "один из вариантов". Когда я болею, я не могу вспоминать все сразу, да я знаю как нормаль к треугольнику посчитать. Зато видишь, новые люди в разделе общаться начали ;)

pax 14.01.2011 00:20

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от Evgen (Сообщение 175562)
GetInterpolatedNormal возвращает Vector3 я так понял в Радианах, но может быть и нет. А Quaternion.Euler должен быть вроде бы в градусах.
Кубики не ворочаются так как числа варьируются не от 0-360, а от ~0..1.
Как преобразовать?

Это не в радианах. Это нормаль к террейну, вектор ему перпендикулярный. Попробуй ее присвоить transform.up = GetInterpolatedNormal();

Evgen 14.01.2011 01:17

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от pax (Сообщение 175564)
Это не в радианах. Это нормаль к террейну, вектор ему перпендикулярный. Попробуй ее присвоить transform.up = GetInterpolatedNormal();

Заработало! :) :super:
Поправляйся PAX.

Код:

cube[t].transform.position = new Vector3(cubex[t],terrainData.GetInterpolatedHeight(cubex[t]/1024,cubey[t]/1024),cubey[t]);                       
cube[t].transform.up=terrainData.GetInterpolatedNormal(cubex[t]/1024,cubey[t]/1024);


pax 14.01.2011 01:39

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Опять же - трансформы лучше получать отдельно. Свойство transform ищет на объекте компонент Transform прежде чем его использовать - это дополнительная нагрузка. В прочем как и другие свйосва объекта типа collider, audio, camera и т.д.
Цитата:

Сообщение от Evgen (Сообщение 175567)
Поправляйся PAX.

спасибо

HolyDel 14.01.2011 19:18

Ответ: C# Быстрый поворот/перемещение множества объектов
 
АВТ, несоглашусь.

втроенные методы предпочтительнее, хотя бы из-за уровня удаления от ядра.©импер

етот рейкаст может ядром юниты быть реализован эффективнее чем три получения высоты. хотя надо тестить в любом случае...

ABTOMAT 14.01.2011 20:19

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от HolyDel (Сообщение 175597)
АВТ, несоглашусь.

втроенные методы предпочтительнее, хотя бы из-за уровня удаления от ядра.©импер

етот рейкаст может ядром юниты быть реализован эффективнее чем три получения высоты. хотя надо тестить в любом случае...

Рейкаст быстрее перемножения интенсивности текселя и скейла террейна? Ни за что не поверю.

Evgen 14.01.2011 21:10

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Кто подскажет?

Вот я создаю в GameObject примитив куб, вот так:
Цитата:

public GameObject myPrefab;
myPrefab=GameObject.CreatePrimitive(PrimitiveType. Cube);
А теперь я хочу в место куба использовать 3DS модель.
Я ее загрузил модель уже в Heractiy и Project, но как загрузить ее в сам GameObject я понять не могу.:dontknow:

pax 14.01.2011 21:17

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Не надо ее бросать в Hierarchy. У скрипта есть поле GameObject myPrefab; на него в инспекторе юнити бросаешь свою модель, а в скрипте убираешь строчку myPrefab=GameObject.CreatePrimitive(PrimitiveType. Cube);

Evgen 14.01.2011 21:31

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от pax (Сообщение 175627)
Не надо ее бросать в Hierarchy. У скрипта есть поле GameObject myPrefab; на него в инспекторе юнити бросаешь свою модель, а в скрипте убираешь строчку myPrefab=GameObject.CreatePrimitive(PrimitiveType. Cube);

Пробовал ошибка:
NullReferenceException: Object reference not set to an instance of an object
NScript.Update () (at Assets/NScript.cs:65)


Мне же надо в Start() еще эту модель от копировать. А программно никак нельзя?

pax 14.01.2011 21:40

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Покажи код.

UPD: Догадки: 1) поле GameObject myPrefab не public (public GameObject myPrefab) и ты на него ничего не бросил соответственно. 2) где-то переменной myPrefab что-то присваиваешь.

Evgen 14.01.2011 21:54

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Жалуется на cube[i].transform.position типа "исходный объект не найден".

Код:

GameObject[] cube;
public GameObject myPrefab;

void Start()
{
cube = new GameObject[2000];
//myPrefab=GameObject.CreatePrimitive(PrimitiveType.Cube);
//myPrefab.GetComponent<BoxCollider>().isTrigger = true;
//DestroyImmediate(myPrefab.GetComponent<BoxCollider>());
for(int i=0;i<cube.Length;i++){
        cube[i] = (GameObject)Instantiate(myPrefab);
}
}

void Update()
{
for(int i = 0; i<cube.Length; i++){
        cube[i].transform.position = new Vector3(10,10,10);
}
}


pax 14.01.2011 21:57

Ответ: C# Быстрый поворот/перемещение множества объектов
 
myPrefab где объявлена? и в инспекторе на нее кинул модель?
Если приведенный код неизменный в программе, то должно работать.

Evgen 14.01.2011 22:03

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от pax (Сообщение 175632)
Покажи код.

UPD: Догадки: 1) поле GameObject myPrefab не public (public GameObject myPrefab) и ты на него ничего не бросил соответственно. 2) где-то переменной myPrefab что-то присваиваешь.

Проверил perfab public.
Раньше Heracty заполнялось Cube(Clone)
А сейчас вообще ничего не клонируется.

perfab в Nscript классе, естественно отдельно от start() И Update().
В Script References NScript добавил свою модель.
Может модели просто нельзя клонировать в отличие от кубов?

pax 14.01.2011 22:07

Покажи скрин инспектора твоего скрипта

Цитата:

Сообщение от Evgen (Сообщение 175636)
В Script References NScript добавил свою модель.
Может модели просто нельзя клонировать в отличие от кубов?

Ясна проблема: добавь ссылку не в Script References, а на объект, где у тебя скрипт в сцене висит.

Script References - отвечает за заполнение свойств скрипта при его навешивании на объект, но не после.

Evgen 14.01.2011 22:32

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Заработало конечно. Но мне нужно не скрипт вешать на объект, а из скрипта управлять объектами. Поэтому я и прошу как это сделать из кода.

pax 14.01.2011 22:34

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Как ты хочешь из скрипта управлять объектами? Опиши все нужные возможности.

Evgen 14.01.2011 22:40

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Вот у меня есть массив GameObject для моделей.
Допустим загрузил я в Project несколько моделей например там ship,tank,jeep далее вешаю свой NScript на Camera.Main и из него в масив GameObject клонирую либо ship либо tank, захотел поменял ship на tank и т.д. вообщем чтобы можно было менять клоны в массиве, если понадобится.

pax 14.01.2011 22:53

Ответ: C# Быстрый поворот/перемещение множества объектов
 
PHP код:

GameObject[] cube;
    public 
GameObject tank;
    public 
GameObject jeep;
    
void Start()
    {
        
cube = new GameObject[2000];


        for (
int i 0cube.Length 2i++)
        {
            
cube[i] = (GameObject)Instantiate(tank);
        }
        for (
int i cube.Length 2cube.Lengthi++)
        {
            
cube[i] = (GameObject)Instantiate(jeep);
        }
    }

    
void Update()
    {
        if (
Input.GetKeyDown(KeyCode.Space))
        {
            for (
int i 0cube.Lengthi++)
            {
                
Destroy(cube[i]);
                
cube[i] = (GameObject)Instantiate(jeep);
            }
        }
        for (
int i 0cube.Lengthi++)
        {
            
cube[i].transform.position = new Vector3(101010);

        }
    } 


Evgen 14.01.2011 23:06

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Спасибо! Идея понята. Буду экспериментировать.

Evgen 15.01.2011 13:38

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Небольшой доп.вопрос:
Как сделать камеру как в режиме просмотра сцены?
Влево-вправо двигается
camera.Translate(Vector3.right *Input.GetAxis("Horizontal")*speed);
А при движении вперед назад, начинает опускатся/подниматся.
А мне нужно, чтобы она была все время на одной и той же высоте

Может ее как-то сравнять с линией горизонта потом передвинуть вперед и вернуть угол наклона обратно?

Код:

//Перемещение
camera.Translate(Vector3.right *Input.GetAxis("Horizontal")*speed);
//Вперед назад...
сamera.Translate(Vector3.forward *Input.GetAxis("Vertical")*speed);               
// Поворот камеры при зажатой правой клавише
if (Input.GetMouseButton(1)){
        camera.Rotate(0,Input.GetAxis("Mouse X")*turnSpeed, 0, Space.World);
        camera.Rotate(-Input.GetAxis("Mouse Y")*turnSpeed,0,0);
}


pax 15.01.2011 14:33

Ответ: C# Быстрый поворот/перемещение множества объектов
 
PHP код:

//Перемещение
camera.Translate(camera.transform.right *Input.GetAxis("Horizontal")*speed);
//Вперед назад...
сamera.Translate(camera.transform.forward *Input.GetAxis("Vertical")*speed); 


Evgen 15.01.2011 14:55

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Вложений: 1
Цитата:

Сообщение от pax (Сообщение 175698)
PHP код:

//Перемещение
camera.Translate(camera.transform.right *Input.GetAxis("Horizontal")*speed);
//Вперед назад...
сamera.Translate(camera.transform.forward *Input.GetAxis("Vertical")*speed); 


Не не то. она опять летит в землю а не вперед.

Камера по красной оси (влево/вправо) двигается нормально
А (вперед/назад) она двигается по синей оси.
А мне нужно что-бы вперед/назад она двигалась по фиолетовой оси, то есть параллельно террайну, на зависимо от угла наклона синей и зеленой стрелки.
В режиме просмотра сцены она именно так и двигается.

pax 15.01.2011 15:30

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Тогда вот так:
PHP код:

Vector3 camForward =  camera.transform.forward;
camForward.y=0;
сamera.Translate(camForward.normalized *Input.GetAxis("Vertical")*speed); 


Evgen 15.01.2011 15:31

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Цитата:

Сообщение от pax (Сообщение 175705)
Тогда вот так:
PHP код:

Vector3 camForward =  camera.transform.forward;
camForward.y=0;
сamera.Translate(camForward.normalized *Input.GetAxis("Vertical")*speed); 


Так тоже куда-то в сторону плывет.

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

Код:

//Перемещение
camera.Translate(Vector3.right *Input.GetAxis("Horizontal")*speed);               
//Вперед назад...
float angle=camera.transform.rotation.eulerAngles.x;
camera.Rotate(-angle,0,0);
camera.Translate(Vector3.forward*Input.GetAxis("Vertical")*speed);       
camera.Rotate(+angle,0,0);


pax 15.01.2011 15:39

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Может это все из-за Translate. Никогда ей не пользовался
Попробуй так:
PHP код:

Vector3 camForward =  camera.transform.forward;
camForward.y=0;
camera.transform.position += camForward.normalized *Input.GetAxis("Vertical")*speed

да
PHP код:

function Translate (translation Vector3relativeTo Space Space.Self) : void 

по умолчанию Translate в локальных координатах.

Evgen 15.01.2011 16:15

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Вложений: 1
PHP код:

Vector3 camForward =  camera.transform.forward;
camForward.y=0;
camera.transform.position += camForward.normalized *Input.GetAxis("Vertical")*speed

Во вот так работает, как надо.

30000 обновляемых объектов, из которых на экране отображается только 3000, в зоне камеры на расстоянии 200 метров.

Evgen 21.01.2011 00:04

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Есть ли какой-нибудь простой способ получить FPS (кадровую частоту)? Или это нужно делать вручную?

pax 21.01.2011 01:00

Ответ: C# Быстрый поворот/перемещение множества объектов
 
в окне Game View включить статистику ;)
еще вот так: http://www.unifycommunity.com/wiki/i...ramesPerSecond

Evgen 21.01.2011 01:03

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Пардон! Не до конца объяснил.
Просто хочу сделать exe билд и по тестировать его на других машинах, без установки Unity естественно. Посмотреть сколько будет фпс, а как посмотришь если его на экран не вывести.

Про окно статистики я в курсе оно у меня в каждом скриншоте.

Что-то в скрипте не то.

pax 21.01.2011 01:09

Ответ: C# Быстрый поворот/перемещение множества объектов
 
Такие вопросы лучше задавать в FAQ например, т.к. к теме топика они не относятся


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

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