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

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

Модератор: exooman

Сообщение #1 Flogger-K » 02.03.2019, 16:43

В связи с переходом на Юнити открываю новую тему в этом разделе, посвященному именно этому игровому движку. Задачи в общем-то те же, с поправкой на особенности нового инструмента.
Итак, как водится у новичков, начинаю с вопросов.
В своем последнем посте в сатрой теме, я получил ответ от exooman-a по поводу скрипта на С# и по поводу деревьев. С деревьями стало понятно только после того, как я навел курсор на кнопки добавления веток и листьев и по появившейся надписи понял, что это такое (мелковаты они все-таки). Общий принцип создания дерева понятен, дело лишь в привыкании к интерфейсу.
Скрипт генерации самолета на сцене был выправлен, и модель благополучно появилась. Далее я попробовал назначить материал добавленному ассету. Как и следовало ожидать, модель осталась белой. Подозреваю, что материал надо назначать конкретным объектам, а не добавленному ассету - родителю с потомками. Материал был мною создан в юнити, на него была нзначена текстура, название материала было прописано в скрипте, и материал был добавлен как переменная во вьюпорте (Inspector).. Ошибок в скрипте нет, консоль не ругается.

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

public class AirGen : MonoBehaviour {

    public GameObject MiG23;
    public GameObject _Aircraft;
    public Material MiG23MFLibya;
   
    void Start()
        {
        _Aircraft = Instantiate(MiG23);
        MiG23.GetComponent<Renderer>().material = MiG23MFLibya;
        }
   
   
}

1. Что сделаног не так? Добавленный юнит состоит из фюзеляжа-родителя с деталями-потомками.
2. Формат fbx позволяет сохранять анимацию, созданную в Блендер. Но юнити имеет другую систему координат - не получится ли, что при конвертации в самом Блендере в fbx потом в юнити анимация будет искажена?
3. каким образом можно обращаться к потомкам родителя для манипуляций с ними (типа own.parent или childrenRecursive в БГЕ)?
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 467

  • 1

Сообщение #2 mageaster » 02.03.2019, 17:42

Flogger-K писал(а):3. каким образом можно обращаться к потомкам родителя для манипуляций с ними (типа own.parent или childrenRecursive в БГЕ)?
Вроде как, примерно так же, как к компонентам. ЕМНИП там есть оператор GetComponentInChild.
Меньше слов, больше дела!
AMD Phenom II X6 1055T, 4 GiB RAM, Nvidia GeForce GTX 550 Ti, Kubuntu 18.04
Мой WIP
mageaster M
теоретик
Аватара
Откуда: оттуда
Сообщения: 2435

  • 1

Сообщение #3 exooman » 02.03.2019, 18:27

Flogger-K писал(а):1. Что сделаног не так?

ну во-первых, не Renderer, а MeshRenderer
во-вторых, не стоит городить огороды из GetComponent и непосредственных обращений к модельке. Создавай префабы.
То есть, добавь модельку на сцену, настрой её, задай ей материалы, скрипты и всё что тебе нужно. А затем из Hierarchy перетащи объект в папку проекта к ассетам. В итоге у тебя будет префаб с уже настроенным объектом, который ты и будешь добавлять через Instantiate().
Сама же импортированная моделька - это как бы исходник, который один раз импортируешь в проект куда-нибудь в отдельную папку и забываешь про неё до тех пор, пока не нужно поправить развертку или полигоны. Все же её настройки лучше производить в теле префаба, саму исходную модель никак не трогая и не меняя.

Flogger-K писал(а):2. Формат fbx позволяет сохранять анимацию, созданную в Блендер. Но юнити имеет другую систему координат - не получится ли, что при конвертации в самом Блендере в fbx потом в юнити анимация будет искажена?

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

3. каким образом можно обращаться к потомкам родителя для манипуляций с ними (типа own.parent или childrenRecursive в БГЕ)?

https://docs.unity3d.com/ru/530/ScriptReference/Transform.GetChild.html
exooman M
Аватара
Сообщения: 1565


Сообщение #4 Flogger-K » 04.03.2019, 18:07

С блендфайлом вышел облом. Импортировал ассет бленд-файл. Отобразился в меню "Проект", при попытке перетащить его в "Иерархию" или непосредственно на сцену - ничего не вышло - запрещающий значок. Для пробы сохранил бленд в 3ds, импортировал, все получилось. Если не считать явного нарушения родительских связей. Про fbx не говорю -там изначально импорт нормальный. Вопрос - нужно ли что-то дополнительно поставить в настройках юнити для импорта и использования бленда напрямую или в новой версии убрали возможность импорта блендов?
Вопрос два - опять по потомкам. Как я понял по ссылке выше - возвращается потомок по индексу в списке. В "Иерархии" выдается список потомков для данногго объекта - соотвествует ли он этим индексам? То есть, если первая строчка под родителем с именем потомка имеет название типа "СтабилизаторПравый", то использование this.gameObject.transform.GetChild(0) укажет именно на этот объект? Просто насколько я понял, читая доки (в которых пока еще не очень ориентируюсь), есть метод Find, но он ищет по всему списку в данном случае.
Из достижений - ну разве что понял, как плавно увеличивать или уменьшать величину переменной. Пригодится как раз в этом случае - без анимации плавно отклоняется на нужный угол какая-либо деталь-потомок (которую надо еще найти в списке и ни с чем не перепутать).
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 467

Сообщение #5 exooman » 04.03.2019, 19:36

Flogger-K писал(а):С блендфайлом вышел облом. Импортировал ассет бленд-файл. Отобразился в меню "Проект", при попытке перетащить его в "Иерархию" или непосредственно на сцену - ничего не вышло - запрещающий значок.

Просто берешь бленд-файл и кладешь в папку ассетс. Прямо в проводнике виндовс, а не в самой юнити.

Flogger-K писал(а):В "Иерархии" выдается список потомков для данногго объекта - соотвествует ли он этим индексам?
Сложно сказать. Проще возвращать print(Transform.GetChild(0)) и посмотреть что там за объект с данным индексом. А вообще, если ты хочешь обратиться к конкретному объекту, то объяви и назначь его в скрипте как public Transform или GameObject. Так куда проще и понятнее, нежели искать потомков у родителя. Ты вообще для каких целей используешь это всё? К чему обращаешься? Если это части масалета, которые ты хочешь пошевелить, то проще сделать так:


public Transform Stabilizator_Left;
public Transform Stabilizator_Right;
public Transform Wing_Left;
public Transform Wing_Right;




А затем назначь объекты в редакторе и спокойно обращайся к ним напрямую, не городя огороды из поиска в массиве и тем более функций Find().

Если у тебя много объектов и ты хочешь их сгруппировать, дабы они не засоряли окно инспектора, то напиши свой класс:

[System.Serializable] // нужно, чтобы класс отображался в инспекторе
public class Masalet_Object_Grupp
{
public Transform Stabilizator_Left;
public Transform Stabilizator_Right;
public Transform Wing_Left;
public Transform Wing_Right;
}


далее создай экземпляр класса как обычную переменную:

public Masalet_Object_Grupp masalet_Objects;

и ты получишь красивую вкладку со своими объектами, которую в любой момент можешь закрыть.

Обращаться к объектам думаю поймешь как. Например masalet_Objects.Stabilizator_Left;
exooman M
Аватара
Сообщения: 1565


Сообщение #6 Flogger-K » 07.03.2019, 09:03

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

  • 1

Сообщение #7 exooman » 08.03.2019, 04:20

Flogger-K писал(а):Вопрос такой - возможно ли добавление материала, созданного непосредственно в юнити, одним движением сразу на все объекты модели? В Блендере это было очень удобно, выделяешь группу объектов, далее Make Links -> Material и все. а в юнити пока не могу понять, можно ли такое проделать или остается ручками для каждой детали материал перетаскивать.

Выделяешь объекты (удобнее всего через удержание шифта или ctrl в окне иерархии) и перетаскиваешь материал в соответствующую вкладку компонента MeshRender.
exooman M
Аватара
Сообщения: 1565


  • 2

Сообщение #8 Flogger-K » 10.03.2019, 10:34

Видимо, я еще не совсем безнадежен. Частично написан и работает скрипт механизации для МиГ-23, пока самое важное - полный цикл перекладки крыла выполняется успешно. Можно попробовать "пошевелить" остальными деталями...
Скрипт под спойлером, пока без комментариев, может, кому и будут интересны мои потуги в си шарпе.
Спойлер
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MiG23 : MonoBehaviour {

public Transform Wing_Right;
public Transform Wing_Left;
public Transform Rudder_;
public Transform Flaps_Right;
public Transform Flaps_Left;
public Transform Interceptor_Right;
public Transform Interceptor_Left;
public Transform Slats_Right;
public Transform Slats_Left;
public Transform Elevator_Right;
public Transform Elevator_Left;
public Transform AirBrake_Up_Left;
public Transform AirBrake_Up_Right;
public Transform AirBrake_Down_Left;
public Transform AirBrake_Down_Right;

public float Rotat_Wing = 0.0008333f;
public int PlusMinus_Wing = 0;
public int Reper_Wing = 0;

public float Rotat_Rudder = 0.05f;
public int PlusMinus_Rudder = 0;
public int Reper_Rudder = 0;

public float Rotat_Flaps = 0.05f;
public int PlusMinus_Flaps = 0;
public int Reper_Flaps = 0;

public float Rotat_Slats = 0.05f;
public int PlusMinus_Slats = 0;
public int Reper_Slats = 0;

public float Rotat_Interceptor = 3.0f;
public int PlusMinus_Interceptor = 0;
public int Reper_Interceptor = 0;

public float Rotat_Pitch_Elevator = 3.0f;
public int PlusMinus_Pitch_Elevator = 0;
public int Reper_Pitch_Elevator = 0;

public float Rotat_Roll_Elevator = 3.0f;
public int PlusMinus_Roll_Elevator = 0;
public int Reper_Roll_Elevator = 0;

public float Rotat_AirBrakeUp = 3.0f;
public float Rotat_AirBrakeDown = 3.0f;
public int PlusMinus_AirBrake = 0;
public int Reper_AirBrake = 0;

void Start () {}

void Update () {

if( Input.GetKeyDown( KeyCode.Tab )
&& PlusMinus_Wing == 0
&& Reper_Wing > 599
)
{
Reper_Wing -= 1;
PlusMinus_Wing = -1;
}

if( Input.GetKeyDown( KeyCode.Q )
&& PlusMinus_Wing == 0
&& Reper_Wing < 1150
)
{
Reper_Wing += 1;
PlusMinus_Wing = 1;
}

if ( Reper_Wing == 0 || Reper_Wing == 600 || Reper_Wing == 1150 )
PlusMinus_Wing = 0;


if ( PlusMinus_Wing == 1 )
Reper_Wing += 1;
if ( PlusMinus_Wing == -1 )
Reper_Wing -= 1;

if ( PlusMinus_Wing != 0 )
{
Debug.Log( Reper_Wing );
Wing_Left.transform.Rotate(0, 0, -Time.deltaTime * PlusMinus_Wing * Rotat_Wing);
Wing_Right.transform.Rotate(0, 0, Time.deltaTime * PlusMinus_Wing * Rotat_Wing);
}


}
}


Перекладка крыла в этой "инкаранции" МиГ-23 выполняется в соответствии с "Инструкцией летчику МиГ-23УБ" и "Практической аэродинамикой МиГ-23МЛ/УБ". А именно - до 45 градусов за 10 секунд, до 72 (с 45) за 9 секунд.
И первая картинка. Стреловидность 45 градусов (текстуры научился натягивать в один прием, спасибо за подсказку exooman-a)
Вложения
МиГ-23_45град.jpg
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 467

Сообщение #9 mageaster » 10.03.2019, 11:55

Что-то у тебя все переменные public. Ты собираешься обращаться к ним из других скриптов?

Добавлено спустя 2 минуты 6 секунд:
Если тебе нужно что-то назначить в инспекторе, но к нему не будет доступа из других скриптов, используй Serialize Field.
Меньше слов, больше дела!
AMD Phenom II X6 1055T, 4 GiB RAM, Nvidia GeForce GTX 550 Ti, Kubuntu 18.04
Мой WIP
mageaster M
теоретик
Аватара
Откуда: оттуда
Сообщения: 2435

Сообщение #10 exooman » 10.03.2019, 14:00

mageaster писал(а):используй Serialize Field

а смысл? Всё равно всю эту простыню Flogger-K будет впоследствии разбивать на классы, структуры или массивы, а к тому времени уже хоть понимание будет, кому какой доступ задавать и зачем.
exooman M
Аватара
Сообщения: 1565



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

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

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