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

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

Модератор: exooman

Сообщение #41 exooman » 08.01.2020, 21:35

У меня пока никак не выходит поменять меш.

быстро набросал - всё работает.
Спойлер
Изображение
Изображение
exooman
Сообщения: 1863


Сообщение #42 Flogger-K » 09.01.2020, 07:37

exooman, скрипт по твоему образцу не сработал. Сначала. А потом я на всякий случай сменил формат импортируемой модели. Импортировал obj, а не fbx. В итоге сработал и твой скрипт и мой...
Надо еще формат 3ds проверить и еще раз попробовать бленд-файл импортировать напрямую/
Вот так, значит. Во всем виноват оказался fbx. Блин. Хорошо, что я не успел наимпортировать моделей, как чувствовал, что надо сначала поэкспериментировать. Спасибо за помощь. Теперь надо развить твою идею с массивами мешей и объектов.
И я так понял, что при объявлении переменных можно в качестве типа брать любой, который можно обнаружить в инспекторе, а именно, MeshFilter, Material, MeshRenderer и прочее, а не только Transform Или GameObject.
P.S. Можно, оказывается, не заморачиваться с конвертацией. Бленды тоже прошли. Видимо, я затупил, когда только начал пользоваться юнити и толком не знал, что такое префаб. И как добавлять ассет на сцену и в иерархию. Что ж, даже в незапертую дверь все же можно войти, если понять, что она открывается не внутрь, а наружу...
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 500

  • 1

Сообщение #43 exooman » 09.01.2020, 13:32

Flogger-K писал(а):что такое префаб

Это сохраненный набор настроек для твоих объектов. Если ты в префабе используешь меш, а затем изменишь этот меш в исходном бленд-файле, то он поменяется и в префабе, так как префаб это именно про настройки, расположение объектов, но не более. Короче, префаб хранит только иерархию и всё что находится в окне компонентов.

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

Flogger-K писал(а):Вот так, значит. Во всем виноват оказался fbx. Блин.

Вроде раньше уже говорил, что экспортировать ничего не нужно, просто чистишь бленд-файл от всего лишнего (убираешь все текстуры и материалы) и перетаскиваешь его в папку с ассетами. Всё. Оно там само всё экспортируется, причем с анимациями.
exooman
Сообщения: 1863


Сообщение #44 Flogger-K » 11.01.2020, 15:06

Следующее затруднение:
Имеем переменную-массив объектов самолета, требующих смены материала.
public Transform[] childObj = new Transform[18];
В поля перемнных внесены объекты - составные части машины.
Далее попытался применить цикл обхода всех деталей с присвоением им нового материала
foreach( Transform child in childObj )
{
child.gameObject.GetComponent<Renderer>().material = materialUnit[0];
}

Для переменной материалов применен массив вида
public Material[] materialUnit = new Material[4];
Материалы внесены в поля массива.
Что не так делаю с командой смены материала? Кстати, исходный материал там DefaultMaterial, то есть изначально модель на сцене представляет собой болванку без текстур.
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 500

  • 1

Сообщение #45 exooman » 11.01.2020, 17:21

Flogger-K писал(а):child.gameObject.GetComponent<Renderer>().material = materialUnit[0];

Если мне не изменяет память, нужно обращаться через GetComponent<MeshRenderer>().
exooman
Сообщения: 1863


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

В общем, все получилось. Схема примерно такая - в иерархию добавляем "стартовую модель". На ней висит скрипт "мутации и окраски". В инспекторе настраиваются все поля переменных. Сама модель содержит 5 "мутирующих" мешей - фюзеляж, фонарь кабины, стекла фонаря и козырька кабины, плюс створки шасси, выполненные в сложенном положении как единый меш. Шасси отсутствуют и будут выполнены отдельным префабом, ибо не вижу смысла их таскать во время игры, где они нужны либо при старте с земли (что далеко не всегда ьудет), либо для статических объектов, типа самолетов на стоянке (но здесь тоже лучше отдельный префаб с как можно меньшим числом объектов.
Скрипт выглядит так:
Спойлер
Код: Выделить всё
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class StartAircraft : MonoBehaviour {
   
    public Material[] materialUnit = new Material[4];
    public Mesh[] meshFus = new Mesh[6];
    public Mesh[] meshCnp = new Mesh[2];
    public Mesh[] meshStworki = new Mesh[2];
    public Mesh[] meshGlass = new Mesh[2];
    public Mesh[] meshCnpGlass = new Mesh[2];
    public Transform[] childObj = new Transform[18];
   
    public MeshFilter meshFusFilter;
    public MeshFilter meshGlassFilter;
    public MeshFilter meshCnpGlassFilter;
    public MeshFilter meshStworkiFilter;
    public MeshFilter meshCnpFilter;
   
    public int typeAircraft = 0;
   
   // Use this for initialization
   void Start () {
      
   }
   
   //ВСЕ МАНИПУЛЯЦИИ будут производиться ОДИН раз - при старте игры. Максимум - еще раз - при получении повреждений
   // Update is called once per frame
   void Update () {
      if( Input.GetKeyDown( KeyCode.Z ) )
          {
         typeAircraft+= 1;
         }
      if( typeAircraft == 5 )
          {
         typeAircraft = 0;
         }
      
      // MiG-23BN   
      if( typeAircraft == 0 )
          {
         meshFusFilter.mesh = meshFus[0];
         meshGlassFilter.mesh = meshGlass[1];
         meshCnpGlassFilter.mesh = meshCnpGlass[1];
         meshCnpFilter.mesh = meshCnp[1];
         meshStworkiFilter.mesh = meshGlass[1];
         foreach( Transform child in childObj )
             {
            child.gameObject.GetComponent<MeshRenderer>().material = materialUnit[0];
             }
               
         }
         
      // MiG-23MF   
      if( typeAircraft == 1 )
          {
         meshFusFilter.mesh = meshFus[1];
         meshGlassFilter.mesh = meshGlass[0];
         meshCnpGlassFilter.mesh = meshCnpGlass[0];
         meshCnpFilter.mesh = meshCnp[0];
         meshStworkiFilter.mesh = meshGlass[0];
         foreach( Transform child in childObj )
             {
            child.gameObject.GetComponent<MeshRenderer>().material = materialUnit[1];
             }
         }
         
      // MiG-23ML   
      if( typeAircraft == 2 )
          {
         meshFusFilter.mesh = meshFus[2];
         meshGlassFilter.mesh = meshGlass[0];
         meshCnpGlassFilter.mesh = meshCnpGlass[0];
         meshCnpFilter.mesh = meshCnp[0];
         meshStworkiFilter.mesh = meshGlass[0];
         foreach( Transform child in childObj )
             {
            child.gameObject.GetComponent<MeshRenderer>().material = materialUnit[2];
             }
         }
         
      // MiG-27K   
      if( typeAircraft == 3 )
          {
         meshFusFilter.mesh = meshFus[5];
         meshGlassFilter.mesh = meshGlass[1];
         meshCnpGlassFilter.mesh = meshCnpGlass[1];
         meshCnpFilter.mesh = meshCnp[1];
         meshStworkiFilter.mesh = meshGlass[1];
         foreach( Transform child in childObj )
             {
            child.gameObject.GetComponent<MeshRenderer>().material = materialUnit[3];
             }
         }
      
      
      
   }
}


Все это планируется упростить, попробую применить для одинаковых типов переменных многомерные массивы, ну и под private упрячу все, что можно. Далее - в состав префаба, наверное, войдут и пилоны подвески - тоже некая стартовая модель, меш которой будет мутировать. А вот оружие - видимо, придется все же при старте его генерить и развешивать по местам, потому как многие типы пилонов и пусковых устройств предусматривают установку нескольких единиц оружия разом. Это не ЗРК, у которого число "посадочных мест" строго ограничено. Впрочем, пока надо научиться писать скрипты, читающие текстовые файлы и исполняющие то, что там расписано...
Ниже скрин, иллюстрирующий работу скрипта. Четыре варианта - польский МиГ-23МФ, советские МиГ-23МЛ и МиГ-27К, ливийский МиГ-23БН. В общем, "брюки превращаются, брюки превращаются... простите, маленькая техническая неудаяа" (с по памяти).
Вложения
ScreenMutateAircraft.jpg
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 500

Сообщение #47 exooman » 11.01.2020, 19:02

Flogger-K писал(а):void Update () {
      if( Input.GetKeyDown( KeyCode.Z ) )
          {
         typeAircraft+= 1;
         }
      if( typeAircraft == 5 )
          {
         typeAircraft = 0;
         }
      
      // MiG-23BN   
      if( typeAircraft == 0 )
          {
         meshFusFilter.mesh = meshFus[0];
         meshGlassFilter.mesh = meshGlass[1];
         meshCnpGlassFilter.mesh = meshCnpGlass[1];
         meshCnpFilter.mesh = meshCnp[1];
         meshStworkiFilter.mesh = meshGlass[1];
         foreach( Transform child in childObj )
             {
            child.gameObject.GetComponent<MeshRenderer>().material = materialUnit[0];
             }
               
         }

Зачем. Это. Делать. В Апдейте? :)

Говорю же - всё в старте перебирай. В апдейте ты вызываешь эти функции КАЖДЫЙ КАДР. Каждый кадр вызываешь то, что сменить нужно всего один раз.

Если хочешь сделать смену по нажатии кнопки - делай отдельный метод и вызывай его ТОЛЬКО по нажатию кнопки. Зачем в апдейт-то пихать? Еще и с циклом... Еще и GetComponent...

Код: Выделить всё
void MyMethod(int masalyot_number)
{
  typeAircraft  = masalyot_number;
  if( typeAircraft == 0)
          {
         meshFusFilter.mesh = meshFus[0];
         meshGlassFilter.mesh = meshGlass[1];
         meshCnpGlassFilter.mesh = meshCnpGlass[1];
         meshCnpFilter.mesh = meshCnp[1];
         meshStworkiFilter.mesh = meshGlass[1];
         foreach( Transform child in childObj )
             {
            child.gameObject.GetComponent<MeshRenderer>().material = materialUnit[0];
             }
               
         }
}

void Update () {
      if( Input.GetKeyDown( KeyCode.Z ) )
           MyMethod(1);

exooman
Сообщения: 1863


Сообщение #48 Flogger-K » 12.01.2020, 07:34

exooman, кмментарий перед Update в скрипте
Код: Выделить всё
//ВСЕ МАНИПУЛЯЦИИ будут производиться ОДИН раз - при старте игры. Максимум - еще раз - при получении повреждений
   // Update is called once per frame
   void Update ()
Так что в апдейте все это временно. Проверю, как работают многомерные массивы и как до н7их лучше добираться при генерации оружия и мутировании самолета при старте, а потом все это переместится в void Start. А при повреждениях будет отдельный скрипт срабатывать, для следов осколков и "обгорания". Но это немного позже. Надо попробовать что-то сделать с бортовыми номерами. Можно опять же сделать с мутацией меша и материалов, но есть ли еще какие-то способы? Куда копать? Декали?
P.S. Как обнаружилось, многомерные массивы в инспекторе не отображаются. поэтому объявление типа public Mesh[ , ] meshMutate = new Mesh[4,2]; ничего не дало. Как добиться появления многомерных массивов в инспекторе?
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 500

  • 1

Сообщение #49 exooman » 12.01.2020, 12:45

Flogger-K писал(а):кмментарий перед Update в скрипте

ну в комментарии было написано одно, в коде - другое, вот и обратил внимание))

Flogger-K писал(а):Можно опять же сделать с мутацией меша и материалов, но есть ли еще какие-то способы? Куда копать? Декали?
Да, декали. Там вроде был готовый шейдер.

Flogger-K писал(а):P.S. Как обнаружилось, многомерные массивы в инспекторе не отображаются. поэтому объявление типа public Mesh[ , ] meshMutate = new Mesh[4,2]; ничего не дало. Как добиться появления многомерных массивов в инспекторе?

Пишешь свой класс со вложенным массивом, не забыв обозначить его [System.Serializable]
Например:

Код: Выделить всё
[System.Serializable]
public class My_Class
{
    public GameObject[] obj;
}


А далее делай массив из этих классов. Тогда все вложения будут работать в инспекторе.
exooman
Сообщения: 1863


  • 2

Сообщение #50 Flogger-K » 06.04.2020, 17:44

После большого перерыва опять что-то вроде отчета. Так уж получилось, что за это время я задумал подтянуть свои знания в области моделирования и кое-чего еще. Почитал по инструментам Блендера 2.79, почитал уроки Striver (не все) по нодам и созданию материалов в cycles, поэкспериментировал сам, не скажу, чтоб я стал знатоком нодов, но хотя бы не смотрю на них, как баран на новые ворота. Установил и "пощупал" Армори 3Д, UPBGE - как для 2.79, так и для 2.82, почитал учебники и форумы по юнити, учебники по программированию и так далее. Много чего, в общем.
Сделал в первом приближении физику самолета (моделировал я тоже интенсивно, пытаясь найти новые способы создания сетки 3Д обьектов с новыми изученными мною инструментами Блендера), пока физика жестко завязана на использование Transform.forward и rigidbody.velocity. Как говорилось в аннотации к Юнити, это, конечно, лучше, чем телепортация каждый кадр через position, но наиболее физически правдоподобным движением будет использование AddForce. Но там надо ограничивать скорость, иначе разгонишься даже не до гиперзвука, а до световой скорости. Это еще полбеды. Если измерить линейную скорость еще как-то понятно, то вот с угловыми скоростями пока никак. Так что пока физика здорово напоминает ту, к которой я привык в БГЕ, хотя там еще надо подрегулировать.
Пока все это дело идет скорее в рамках прототипирования и нащупывания пути. Примерно можно сказать так - делать пустыню (типа Ближний Восток или Северная Африка), по которой изредка разбросаны горы, и имеются оазисы с водой. Это позволит сделать ландшафт из повторяющихся блоков, не делать на них много растительности, а также строений и прочих "фоновых объектов".
Закинул в проект базу с ВПП, стоянками и дорожками, а также аэродромными строениями, сильно пока не напрягался. Кстати, почему-то проект не все созданные мною деревья видит, то ли я чего-тог упускаю, то ли ограничения там есть. Картинка пока выглядит примерно так (управление уже работает, хотя и не полностью - тормоза и прочее пока не задействованы, как и переключение камер):
Вложения
vlcsnap-2020-04-06-18h18m52s717.png
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 500

Пред.

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