WIP by Flogger-K 2. Аркада в Unity.

Список разделов Геймдев в Blender Unity 3D

Модератор: exooman

Сообщение #21 Flogger-K » 20.07.2019, 14:55

Затык у меня с json. Туплю с десериализацией.
Сам json выглядит так:

Спойлер
Код: Выделить всё
{
"speed":2.0,
"nameUnit":"Experiment",
"weapon":1,
"xyzCoord":[1.5 , 3.0, 5.2]
}

Лежит он в папке Ассетов, рядом со сценой и прочим - других папок там нет, проект экспериментальный, очень маленький, как раз для отработки таких вот частных вопросов.

Сам скрипт СиШарп:

Спойлер
Код: Выделить всё
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;

public class UnitINI : MonoBehaviour
   {
   
    public float speed = 0.0f;
    public string nameUnit;
    public int weapon = 1;
    public float[] xyzCoord = {0.0f , 0.0f, 0.0f};
   
   public string objectsJson = "Assets/experimentJson.json";
   
    void Start()
        {
        StreamReader strRead = new StreamReader(objectsJson);
        string json = strRead.ReadToEnd();
        UnitINI player = (UnitINI)JsonUtility.FromJson(json, typeof(UnitINI));
        Debug.Log(player.speed);
        }

   // Update is called once per frame
   void Update () {
      
   }
}

Итогом стало выдача консолью следующей ошибки:

Спойлер
ArgumentException: Cannot deserialize JSON to new instances of type 'UnitINI.'
UnityEngine.JsonUtility.FromJson (System.String json, System.Type type) (at C:/buildslave/unity/build/Modules/JSONSerialize/Public/JsonUtility.bindings.cs:48)
UnitINI.Start () (at Assets/UnitINI.cs:20)

Перерыл много сайтов, смотря примеры, но только в текстах. Сунулся на Котодомик.рф, там был архив с примером сериализации-десериализации, но, во-первых, он устарел (был рассчитан на сторонние библиотеки для работы с json), а во-вторых, и это главное - уже удален.
Что я делаю не так?
Опять ралогинило...
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 495

  • 1

Сообщение #22 exooman » 20.07.2019, 16:34

Почитай про scriptable object. Я использую его для хранения настроек танков - удобная вещь.

https://habr.com/ru/post/421523/

Так же данные можно хранить в html. Для статичных данных, типа текста и перевода, в плане удобства неплохо использовать статические классы.
exooman M В сети
Аватара
Сообщения: 1803


  • 1

Сообщение #23 Flogger-K » 22.07.2019, 18:47

mageaster, exooman, спасибо за подсказки.
Урок по Scriptable Object с Хабра я воспроизвел, так сказать пошагово, но там еще надо почитать код, чтобы понять, что и зачем делается. Правда, кое-какие выводы насчет самодельных ассетов в меню я уже сделал - да это удобная штука. Также воспроизвел эффект работы монитора прицела - видеотекстура в юнити таки гораздо удобнее БГЕ. Плюс, dron подсказал насчет моих потуг с jsohn - оказывается, ни Monobehaviour, ни ScrriptableObject напрямую не поддерживают работу с json, надо дополнительно делать в этом же скрипте класс-"посредник". Потом, когда окончательно разберусь, попробую накатать статью в блог (давно его не обновлял).
Ну а пока - картинка с работой механизации МиГ-23М - отчетливо видно отклонение руля направления на киле, поднятый интерцепотор на правом крыле, если присмотреться, можно увидеть выпущенные тормоза и отклоненные стабилизаторы. Собственно, вся механика, кроме флаперонов, закончена, с ними надо разбираться отдельно - возникли вопросы чисто справочного характера - куда вертеть - это надо в РЛЭ и техсправочники лезть...
Вложения
МиГ-23_механизация.jpg
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 495

  • 4

Сообщение #24 Flogger-K » 11.09.2019, 19:07

Наклепал деревьев - для листвы использовал текстуры веток с листьями с textures.com, сделал почти полностью аэродром, без зданий - там довольно сложное кружево из рулежных дорожек и площадок. За основу брал найденные в Сети чертежи и схемы аэродромов. Укрытия для техники я делал еще до последней операции, осталось их затекстурить под бетон. И да, видимо, придется делать отдельно куски ландшафта, а потом их подгружать. Либо все же, как советовал exooman, приводить к масшатабам карты сами юниты, их скорости, и прочее. Пока еще не решил, 1/10 вроде как камера уже не видит, хотя может, я с камерой чего-то не так сделал. В общих чертах scriptable object я понял, c json вроде тоже более-менее понятно, хотя там и есть ограничения.
Ниже снимок аэродрома сверху. Имеет 2 ВПП длиной около 2.5 км, магистральную рулежную дорожку (широкая серая полоса,к которой примыкают рулежные дорожки к укрытиям). Укрытия для самолетов образуют вместе с рулежными дорожками что-то вроде веток дерева. Площадки для самолетных укрытий имеют обваловку (черные закорючки). Склад вооружения и склад ГСМ вынесены далеко в стороны от аэродрома, вдоль МРД имеются длинные площадки для стоянок самолетов (можно разместить эскадрилью), имеется площадка для контрольно-диспетчесркого пункта, примыкающая к главной ВПП и больше бетонные площадки для ангаров и зданий, которых там пока еще нет. Текстура кое-где будет заменена, это так сказать, пробные мазки. Предполагается использование аэродрома как проекте БГЕ, так и в Юнити.
Хех, не разлогинило ни разу...
Вложения
airbase.png
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 495

  • 1

Сообщение #25 Flogger-K » 27.12.2019, 11:45

Сейчас идет работа над освоением некоторых тонкостей скриптования в СиШарп, в частности с добавлением префабов исключительно через скрипт. Клепаю деревья - пока у меня примерно такая схема - отдельная сцена, где находятся "исходники" деревьев, и из каждого дерева я делаю по три префаба, отличающиеся количеством веток и листьев, и немного- своим внешним видом. Не бывает же в природе одинаковых деревьев одного вида.
В связи с чем вопрос к exooman. Насколько много у одногог дерева может быть веток и листьев? Я, конечно, понимаю, что в разных проектах по-разному, но хотя б примерно... Тем более, что в проекте Tankomania деревьев хватает и любопытно узнать за счет чего можно сэкономить ресурсы (про отсечение деталей и перевод деревьев в "плоские" изображения в настройках террайна я в курсе), но если деревьев много и стоят они густо в поле зрения камеры?
И на своих деревьях я использую не отдельные листья (текстуру, то есть одиночного листа) - а целые ветки с кучей листьев. На мой взгляд, это позволит сделать листву погуще, без сильных затрат, как если бы использовались одиночные листья.
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 495

  • 1

Сообщение #26 exooman » 27.12.2019, 13:25

В юнити есть tree-creator. Чтобы получить максимальный буст производительности, нужно использовать именно его.
https://docs.unity3d.com/ru/current/Manual/tree-Structure.html

Я пробовал делать деревья по разному - и свои модельки, и массивы из множества лоуполи. Но самое производительное в итоге вышло обычное дерево сделанное стандартными средствами юнити.
Если ты уже в теме и создаешь деревья в tree-creator, то на счет оптимизации скажу так - если нужен результат - делай лоды. В этом случае на первый план ты можешь выводить хоть HD-деревья, вот только смысл в этом?))

У меня же всё хитрее - камера специально фиксирована в одном положении, что позволяет примерно прикинуть количество объектов в кадре и не использовать лоды вообще. Поэтому я определился с допустимым полигонажем для деревьев и расставляю их в необходимом количестве. По началу, все мои деревья вообще были сплошным обманом и состояли из лоуполи ствола(30-40 полигонов) и 15-20 билбоардов с кроной.
Выглядело всё нормально и увидеть "обман" мог лишь человек разбирающийся в графике.
Спойлер
Изображение

И именно такие деревья я бы советовал делать тебе - это самый лучший и производительный вариант, дающий максимальное соотношение "цена/качество". Ствол с парой веток. Полигонаж - 5 ребер в сечении, не более. 20-40 билбордов на крону - более чем достаточно.

Проблема же этого способа в том, что при изменении освещения, деревья перезапекают тени на кроне не совсем корректно (затенения на кронах либо слишком контрастны, либо пересвечены). И в масштабах моей игры, где объектов в кадре не так уж и много, это мне показалось недопустимым и я сделал деревья уже в фулл 3д, без билбордов. Но если не учитывать отсутствие артефактов, то разницу между нынешним и предыдущим способом еще поищи. Вот тут среди трех скринов один - с билбордами. Вот и делай выводы.
Спойлер
Изображение
Изображение
Изображение

Flogger-K писал(а):И на своих деревьях я использую не отдельные листья (текстуру, то есть одиночного листа) - а целые ветки с кучей листьев.

Так оно и делается. В случае с билбордами там и веток нет, одна хитрая мешанина из листьев. Делается она просто - берешь фотку с веткой и копипастишь её, чтобы образовался эдакий круг, без явного верха и низа.
Спойлер
Изображение
exooman M В сети
Аватара
Сообщения: 1803


  • 1

Сообщение #27 Flogger-K » 27.12.2019, 13:42

exooman, понял, спасибо. Хорошо, что спросил... Мои деревья временами вроде как и красивы, вот только веточек там многовато. Обычно делал ствол одну штуку, толстые ветки - от 10 до 30 штук и сразу на них текстуры мелких веток с листьями от 10 до 30. Жирно получается. Придется покопаться в текстурах и подобрать что-то другое.
Кстати, о ЛОДах - ради интереса - настройки с LOD в tree creator имеются, но, вот объяснения, как ими пользоваться не нашел в документации. Надо еще пошарить, вроде как Интернет всегда ответ дает, если поискать...
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 495

  • 1

Сообщение #28 exooman » 27.12.2019, 13:57

Flogger-K писал(а):Обычно делал ствол одну штуку, толстые ветки - от 10 до 30 штук и сразу на них текстуры мелких веток с листьями от 10 до 30. Жирно получается.

да, очень жирно. Особенно учитывая, что все эти деревья игрок и не увидит. Ты конечно можешь сделать пяток-другой детализированных деревьев для скриншотов или ВПП, но всё остальное должно быть максимально простым. Я бы даже сказал, на грани между "отвратительно" и "более-менее". Ибо уж поверь, ресурсы в игре есть на что потратить и лучше начинать экономить с самого начала. Ниже скрины из тундры, чтобы было понимание на сколько нужно экономить ;)

Спойлер
Изображение
Изображение

Flogger-K писал(а):Кстати, о ЛОДах - ради интереса - настройки с LOD в tree creator имеются, но, вот объяснения, как ими пользоваться не нашел в документации. Надо еще пошарить, вроде как Интернет всегда ответ дает, если поискать...

Да поищи. Лоды вроде компонентом назначаются. В новых версиях может поменялось что-то.
exooman M В сети
Аватара
Сообщения: 1803


Сообщение #29 Flogger-K » 31.12.2019, 13:46

Вопросы к exooman и вообще к тем, кто в теме разбирается.
1. В Tree Creator имеется две величины - для значка дерева - LOD Quality. Для ствола дерева - LOD Multiples. Как я понял - в первом случае - это качество ЛОДов для одиночного дерева. Во втором случае - для множества деревьев. По умолчанию LOD Quality - 0.8? Multiple - 1. Следует ли их выкрутить до, скажем 0.2-0.3?
2. Сколько полигонов максимум (именно максимум, минимумом можно и совсем уж грубо сделать) нужно на юнит - самолет, танк, корабль, персонаж? В разумных пределах, конечно, где-то попадалась цифра 15 тысяч на технику вроде БМП и примерно столько же - на персонажа. Просто сейчас начал кое-какие модели делать, чтоб потом не переделывать сильно...
3. Я так понял, ЛОДы юнитов надо делать вручную из "хай-поли"? и Потом уже через скрипты их добавлять-менять-убирать?
4. При создании деревьев в Tree Creator автоматически проявляются папки с текстурами нормалмап, transluence, shadow. Что с ними делать - для нормал мап ячейка для текстуры в материале дерева имеется. А остальное?
5. В настойках материалов дерева имеются графы Enable Instancing GPU и еще Double slided Global Illumination. Сэкономит или наобогрт, скушает ресурсы их включение?
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 495

Сообщение #30 Милослав » 31.12.2019, 14:29

exooman писал(а):Просто берешь бленд-файл и кладешь в папку ассетс. Прямо в проводнике виндовс, а не в самой юнити.
Объекты вытаскивает, но вот с текстурами беда
Армия должна быть профессиональной/контрактной (Право частной собственности - Статья 35 Конституции РФ)
Пока ты смотришь в бездну, бездна смотрит в тебя (Ницше)
https://www.artstation.com/miloslav
Милослав M В сети
Аватара
Откуда: Краснодарский край
Сообщения: 1420

Сообщение #31 exooman » 01.01.2020, 18:56

Flogger-K писал(а):1. В Tree Creator имеется две величины - для значка дерева - LOD Quality. Для ствола дерева - LOD Multiples. Как я понял - в первом случае - это качество ЛОДов для одиночного дерева. Во втором случае - для множества деревьев. По умолчанию LOD Quality - 0.8? Multiple - 1. Следует ли их выкрутить до, скажем 0.2-0.3?

не пробовал. Если не выйдет, используй LOD group.
https://docs.unity3d.com/ru/current/Manual/class-LODGroup.html
Еще хороший вариант - вообще не заморачиваться. Деревья и так в билборды превращаются на расстоянии - для инди игры этого уже через голову хватит.

Flogger-K писал(а):2. Сколько полигонов максимум (именно максимум, минимумом можно и совсем уж грубо сделать) нужно на юнит - самолет, танк, корабль, персонаж? В разумных пределах, конечно, где-то попадалась цифра 15 тысяч на технику вроде БМП и примерно столько же - на персонажа. Просто сейчас начал кое-какие модели делать, чтоб потом не переделывать сильно...

У меня 8-12к в танках - это вполне жирный полигонаж. А в идеале - чем меньше, тем лучше. На больших расстояниях можно вообще квадратным всё делать в 8-10 полигонов. Ориентируйся так - в кадре должно быть 1.5-3 млн вершин. Если уложился, то всё норм и на железе уровня gtx560 будут стабильные 60 FPS.

Flogger-K писал(а):3. Я так понял, ЛОДы юнитов надо делать вручную из "хай-поли"? и Потом уже через скрипты их добавлять-менять-убирать?

Изучи компонент LOD group, там никаких скриптов не надо. Объекты же делай как удобно - либо хайполи режь, либо отдельно делай модельки. Тут всё зависит от того, что тебе важнее - качество или потраченное время.

Flogger-K писал(а):4. При создании деревьев в Tree Creator автоматически проявляются папки с текстурами нормалмап, transluence, shadow. Что с ними делать - для нормал мап ячейка для текстуры в материале дерева имеется. А остальное?

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

Flogger-K писал(а):5. В настойках материалов дерева имеются графы Enable Instancing GPU и еще Double slided Global Illumination. Сэкономит или наобогрт, скушает ресурсы их включение?

это уже к гуглу)
exooman M В сети
Аватара
Сообщения: 1803


Сообщение #32 Flogger-K » 06.01.2020, 17:41

Видимо, настройки из пятого вопроса придется включить. Вроде как Юнити при отсутствии на машинах возможностей для просчет а с GPU автоматически переходит на другой, более простой вариант.
Пока что отрабатываю разные вещи скриптом. С этого я начинал в БГЕ, целую вечность тому назад, но все делал бриками, а тут все же какое-тог понятие о программировании имею. Ниже скрипт с пояснениями.
Спойлер
Код: Выделить всё
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ScriptFind : MonoBehaviour {
   
    private Transform caps1;
    private Transform caps2;
    private List<GameObject> listCaps = new List<GameObject>();
    public GameObject Plane;
    public GameObject newPlane;
    public GameObject EmitMis;
    private int A = 0;
   
    private string tagName;
    private int zalp = 0;
   
    private int X = 0;
    private int Y = 0;
   
   // Use this for initialization
   void Start () {
               // Это эксперимент с поисками потомка по конкретному имени
      if (this.transform.Find("Capsule1") != null)
          {
          caps1 = this.transform.Find("Capsule1");
          //Debug.Log(caps1.name);
          }
      if (this.transform.Find("Capsule2") != null)
          {
          caps2 = this.transform.Find("Capsule2");
          //Debug.Log(caps2.name);
          }
        //А это уже генерация оружия и его "пристегивание" к родительскому объекту
   foreach(Transform child in this.GetComponentsInChildren<Transform>()){
            {
            newPlane = Instantiate(Plane);
            newPlane.name = "Plane";
            // После обзывания появившегося объекта новым именем делаю для него тэг, там пришлось               конвертировать число в строку, это тоже очень пригодится
            A += 1;
            tagName = "Weapon" + (A).ToString();
            newPlane.tag = tagName;
           
            newPlane.transform.SetParent(this.transform);
           
           // Эксперимент с добавлением объекта в список, пока неудачный - распечатка ничего не дает
            listCaps.Add(newPlane);
           
           // Расстановка генерируемых объектов и их проворот, пригодится, прошло удачно
            X += 5;
            Y += 5;
            newPlane.transform.position = new Vector3(X, 0, Y);
            newPlane.transform.Rotate(0.0f, 0.0f , -90.0f);
            //Debug.Log(child);
            }
          }
      
        //Instantiate(Plane);   
       
    //Debug.Log(listCaps);
    }
   
   // Update is called once per frame
   void Update () {
      // Закомменченный блок - я пытался найти новый объект-погтомок по имени. Нашелся...
            //if( this.transform.Find("Plane") != null && Input.GetKeyDown( KeyCode.Q ) )
        //  {
          //Debug.Log("Est");
          //}
      if( A > 4 )
          A = 0;   
      // Это выбор оружия - задается значение строковой переменной и сравнивается с тегом   
      if( Input.GetKeyDown( KeyCode.Tab ) )
          {
         A += 1;
         tagName = "Weapon" + (A).ToString();
         }
       // Залповая или одиночная стрельба   
       if( Input.GetKeyDown( KeyCode.W ) )
          {
         if ( zalp == 1 )
             zalp = 0;
         if ( zalp == 0 )
             zalp = 1;
         }
         
      if( Input.GetKeyDown( KeyCode.Q ) )
          {
          foreach(Transform child in this.GetComponentsInChildren<Transform>())
              {
             if( child.name == "Plane" )
                    { 
               if ( zalp == 1 )
                   {
                   child.gameObject.AddComponent<Rigidbody>();
                   //child.GetComponent<EmitterMissile>();
                        child.SetParent(null);
                        newPlane = Instantiate(EmitMis);
                        newPlane.name = "Fire";
                        newPlane.transform.SetParent(child.transform);
                        newPlane.transform.localPosition = new Vector3(0, 0, 0);
                        }
                    if ( zalp == 0 && child.tag == tagName )
                   {
                   child.gameObject.AddComponent<Rigidbody>();
                   //child.GetComponent<EmitterMissile>();
                        child.SetParent(null);
                        newPlane = Instantiate(EmitMis);
                        newPlane.name = "Fire";
                        newPlane.transform.SetParent(child.transform);
                        newPlane.transform.localPosition = new Vector3(0, 0, 0);
                        }
                    //Destroy(child.gameObject);
                    //Debug.Log("Est");
                }
                }
            }
   }
}
// При залпе ищется объект только по имени. При одиночном пуске - проверяется еще и тег. Он разный у всех ракет с одинаковым именем
В общем, по большому счету, примерно половина работы с системой управления огнем готова. Если, конечно, я ничего не напутал в своих экзерзисах. Плюс скрипты механизации ЛА, отчасти, скрипт движения...

При пуске к выбранной ракете подключается компонент Rigidbody и добавляется с проипаренчиванием пустышка с системой частиц, изображающей ракетный факел. Пока отсоединенные ракеты просто медленно падают вниз, но добавить к ним скрипт движения и включить его "дистанционно" я уже умею - делал с механикой в другом экспериментальном проекте. Звуком и самонаведением пока не занимался, с частицами по большей части понятно, в том числе и с анимированной текстурой.
Ниже скрин - "залповый пуск" двух Р-27Р. Текстур нет, как и текстур на частицах, присутствующие примитивы - были нужны для экспериментов с поисками по именам.
Вложения
vlcsnap-2020-01-06-18h15m23s276.png
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 495

Сообщение #33 exooman » 06.01.2020, 22:51

Flogger-K писал(а):foreach(Transform child in this.GetComponentsInChildren<Transform>())

Вот такого в апдейте быть не должно. Функции GetComponents и FindObject очень тяжелые и вызывать их каждый кадр - это пустая трата ресурсов. Тем более внутри цикла. Инициализируй всё объекты при Старте, а дальше уже обращайся к ним. Если часто создаешь новые одинаковые объекты - используй пул, чтобы пореже дергать функции Instantiate и Destroy. Как делать пул - полно статей на хабре, там только ленивый свой вариант пула не написал))

Flogger-K писал(а):При пуске к выбранной ракете подключается компонент Rigidbody и добавляется с проипаренчиванием пустышка с системой частиц, изображающей ракетный факел.

Правильно (а вернее - производительнее) будет делать всю ракету сразу со всем функционалом, сохранив её в префаб. Если же ты при создании ракеты будешь через скрипты добавлять к одному объекту кучу других, параллельно устанавливая им родственные связи, то в итоге залп из десятка таких ракет просто отожрет все твои фпс.
Если желаешь использовать подобные конструкторы, то сделай менеджер, который ОДИН РАЗ при старте уровня переберет и соберет все объекты, создав экземпляры к которым ты уже будешь обращаться. Последнее - желательно делать через пул. Особенно если собираешься выпускать десятки ракет за раз.
exooman M В сети
Аватара
Сообщения: 1803


Сообщение #34 Flogger-K » 07.01.2020, 17:43

exooman, а замена меша модели при старте не пойдет? Схема такая - призагоузке и "развешивании" объектов типа ракет, бомб и баков используется один стандартный примитив, тот же кубик. К нему уже прицеплена система частиц, имеется Rigidbody. Остается только подменить меш куба мешем модели ракеты, бомбы или бака и все. В БГЕ такое делалось только так. А то делать к каждой ракете свою систему частиц и прочее - дело долгое, хоть и несложное. Да и к тому же, замена меша модели здорово пеомогла бы при "стартовой" сборке модели ЛА. Скажем, меняется только меш фюзеляжа, а все остальное - не трогается. А уже у "собранного" юнита происходит смена материала с нужной текстурой(окраской).
На Хабре я нашел файл с манипуляцией меша в реальном времени, но, хотя эт и может пригодиться, все же не совсем то. Нужна именно замена меша на другой.
Или, как вариант - создается префаб того же ЛА, который объединяет в себе все семейство (фюзеляж, фонари, которые отличаются по форме) с уже заранее присоединенными и расставленными подвесками и перед стартом игры лишние объекты-потомки просто убираются с модели. А сам префаб входит в пул, скажем jet - реактивные самолеты.
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 495

Сообщение #35 exooman » 08.01.2020, 01:18

Flogger-K писал(а):а замена меша модели при старте не пойдет?

Ну я про это вроде тоже говорил. Но важно чтобы именно при старте, а не в апдейте. А вот где и что использовать - это уже нужно смотреть по ситуации. Те же ракеты: если их много разных, но они отличаются лишь мешем, то естественно выгоднее сделать ОДИН префаб с ракетой, а меш подменять при старте. Если же ракеты у тебя все разные и у каждой свои звуки, эффекты и настройки - проще каждой делать свой отдельный префаб.
exooman M В сети
Аватара
Сообщения: 1803


Сообщение #36 Flogger-K » 08.01.2020, 13:47

Следующая пара вопросов))).
Отыскал, как менять меш. В скрипт вставил в стартовую функцию строчки

Код: Выделить всё
Mesh mesh = newPlane.GetComponent<MeshFilter>().sharedMesh;
Mesh mesh2 = Instantiate(mesh);
caps1.GetComponent<MeshFilter>().sharedMesh = mesh2;
           
caps1.GetComponent<Renderer>().enabled = true;

Ошибок консоль не выдает, одна из капсул-потомков "исчезает" - стало быть прошла замена меша. Но новый меш не проявился. Это как раз меш ракеты, которые добавляются в сцену и расставляются, парентясь к объекту, на котором висити скрипт. Строчка с включением МешРендерер была добавлена в ходе экспериментов, но не помогло. Что еще нужно сделать для прорисовки нового меша объекта на сцене?
И второй вопрос.
Вот объявляю я public GameObject newObj; , в инспекторе появляется поле, куда я вручную тащу префаб (можно и private с объявлением сериализации перед ним, не важно, речь не о типе переменной). Каким образом туда можно добавить префаб через скрипт из папки (его нет на сцене!) ? Задать путь к этому префабу?
Я рассчитываю в пустое поле через скрипт вписывать название нужного префаба во время игры (ее старта), а не добавлять его туда вручную перед игрой.
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 495

Сообщение #37 exooman » 08.01.2020, 15:01

Flogger-K писал(а):Я рассчитываю в пустое поле через скрипт вписывать название нужного префаба во время игры (ее старта), а не добавлять его туда вручную перед игрой.

хозяин - барин, конечно. Но я особого преимущества у указания ключевых имен над ручным добавлением не вижу. Объясняю:
Чтобы заменять меш по имени, ты должен будешь указать это имя объекту, а затем обозначить это имя в скрипте. Например "Закрылок_От_Ф_4". Новому масалету пишешь "Закрылок_От_МИГ_21". Все переменные ты должен держать в голове, а учитывая то, сколько у тебя может быть деталек в масалете, ты вымотаешься уже на третьем.
Ведь ты и в блендере сидишь переименовываешь детальки и в юнити объявляешь. Так еще должен строго следить за иерархией. И не приведи Ктулху, ты чутка где-то забудешь нормализировать масштаб или с центром масс ошибешься.

Это к тому, что вся затея "искать детальки автоматом" выйдет куда трудозатратнее. Особенно если ты на месяц-другой забросишь проект и забудешь что там куда пихать.


Лично я бы при необходимости менять меши, объявил публичный компонент "MeshFilter" и массив мешей, из которого первый будет выбирать себе этот самый меш. Дальше можно работать по принципу ID. То есть пишешь себе шпаргалку - какой номер в массиве за какой самолет или модель ракеты отвечает. Например "0" - это миг19, а "1" - миг21, а "2" - фантом. И исходя из этой шпаргалки ты уже вручную назначаешь перетаскиваешь меши в слоты, согласно установленному порядку.

По трудозатратам это не сложнее твоего варианта с именами и авто-поиском, но! тут нет той путаницы, тут нет глюков и множества обращений к тяжелым функциям типа getComponent. Всё максимально гибко и ты сможешь быстро и интуитивно выдергивать меши.

Сделал для каждой детальки массивы, один раз перетащил и больше не возвращаешься. Надо добавить новый масалет? Расширил массивы и добавил новые детали - всё. Никаких имен, поисков, глюков. Только прямые обращения. Типа MeshFilter.mesh = mesh_massive[1], вот и всё.
exooman M В сети
Аватара
Сообщения: 1803


Сообщение #38 Flogger-K » 08.01.2020, 16:03

Для пробы объявил в скрипте public Mesh meshObj и выбрал там меш Р-27Р. В скрипте поставил строчку:
caps1.GetComponent<MeshFilter>().sharedMesh = meshObj;
Капсула исчезла - смена меша произошла. Но ракета на месте капсулы не возникла. Что еще надо сделать для отрисовки нового меша? Как-то рекалькулировать его?
И да, наверное, с массивами будет проще. Это же будет относиться и к материалам (то бишь окраске). Меня сбивает с толку, что многих типов объявляемых перемнных я просто не знаю. Вот, оказывается есть материалы, меши, гейм-объекты, но ведь и еще имеются, до которых не дошел.
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 495

Сообщение #39 exooman » 08.01.2020, 17:44

Flogger-K писал(а):caps1.GetComponent<MeshFilter>().sharedMesh = meshObj;

sharedMesh для чтения вроде. Правильно GetComponent<MeshFilter>().mesh

Flogger-K писал(а):Меня сбивает с толку, что многих типов объявляемых перемнных я просто не знаю

да, в коде у тебя будет просто адище из разных переменных типа "Закрылок_От_самолета_номер_Один". Проще собирать всё массивы/классы.

Я бы посоветовал сделать так:

1. Собери самолет из пустышек. Все пустышки должны быть нормализированы(иметь нулевое вращение). Каждая пустышка - это в будущем некая подвижная или отсоединяемая деталь (элерон, оперение, подвесы и т.д.)

2. Каждую пустышку располагай с расчетом, что это именно её ты будешь вращать-перемещать В ИГРЕ. То есть это именно она является тем самым закрылком.

3. И только теперь во внутрь пустышек помещай объекты с мешем. Теперь, при смене меша и несоответствии координат, пивота или еще какой-нить мути, ты можешь просто переместить объект с мешем внутри пустышки не сбив никаких настроек поворотов и перемещения. Меш - это меш, а пустышка - весь функционал.
Ведь все масалеты разные и тебе в любом случае придется двигать эти детальки, подгонять их и т.д. И тут обязательно иметь подобные константы в виде пустышек.

Теперь о смене объектов скриптами:

Делать это стоит там, где не нужна точная настройка и подгонка. Смысла городить автоматы для самолетов, где каждая деталь на своем уникальном месте - нету вообще. Тут всё проще делать вручную, способом описанном выше. Почему? Потому что ошибок с координатами и поворотами будет тьма.

А вот автоматизировать имеет смысл всякую однообразную мелочь, типа материалов к объектам, их текстуры и тыды. Тут нет пивотов/поворотов и автоматизация уместнее некуда. Ну да всё это ты поймешь, написав автомат для мешей и попробовав прогнать через него самолет-другой - количество неправильно повернутых и расположенных деталей быстро отрезвит и заставит перейти к ручной настройке, так что не трать своё время.
Любая ракета, любой самолет в игре - уникальные объекты. Если у них есть что-то общее, типа партиклов, то вот их и подгружай отдельно из общего источника. Всё остальное разбрасывай по префабам, оттуда же и бери.


Просто как пример несостоятельности всей идеи - у тебя есть миг-23 и миг-21. У одного обычное крыло, у другого - с изменяемой стреловидностью. То есть это уже больше деталей, модулей, узлов для вращения. И как ты всё это будешь унифицировать? Говорю же - ад адский.
exooman M В сети
Аватара
Сообщения: 1803


Сообщение #40 Flogger-K » 08.01.2020, 18:48

Нет, я не собирался делать некий "автомат" для создания все видов самолетов. Я собирался делать "семейства". Скажем, МиГ-21 - условно говоря, эти машины можно разбить на три поколения. Внешне поколения ПФ/ПФМ/ПФС отличаются от МФ/М/СМ/М/С/бис только фюзеляжем. Поэтому делается исходный фюзеляж, скажем от "биса" и к нему прицеплены уже расставленные детали механизации, все они уже имеют свои углы поворота, свои локальные координаты итд. При старте игры выбирается меш фюзеляжа - если надо, он меняется. И да, подсказка насчет массивов объектов очень даже подходит для их "окрашивания" - просто пробег циклом по ним и самолет получает камуфляж.
Самое сложное - это подвеска.Можно заранее прицепить модели пилонов-исходников, при необходимости они опять-таки получают другой меш (пусковые устройства ракет отличаются от бомбодержателей, но расположены те на одних и тех же координатах). Остается только сгенерить непосредственно сами бомбы или ракеты (ПТБ или блоки НАР). Вот их-то по всему придется либо делать через добавление префабов, либо опять сделать замену мешей какого-нибудь абстрактного куба.
У меня пока никак не выходит поменять меш. Проблема в том, что после исправления строчки с GetComponent юнити упорно не желает менять меш "стороннегог" ассета. А вот меши объектов, созданных в самом юнити он прекрасно меняет. Все эксперименты с цилиндром приводят к тому, что я могу поменять его меш на сферу, куб, капсулу, но не меш ракеты. И пока не могу разобраться, в чем дело.
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 495

Пред.След.

Вернуться в Unity 3D

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 1 гость