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
авиатор
Аватара
Сообщения: 476

  • 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
теоретик
Аватара
Откуда: оттуда
Сообщения: 2679

  • 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
Аватара
Сообщения: 1689


Сообщение #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
авиатор
Аватара
Сообщения: 476

Сообщение #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
Аватара
Сообщения: 1689


Сообщение #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
авиатор
Аватара
Сообщения: 476

  • 1

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

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

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


  • 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
авиатор
Аватара
Сообщения: 476

  • 1

Сообщение #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
теоретик
Аватара
Откуда: оттуда
Сообщения: 2679

  • 1

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

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

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


  • 1

Сообщение #11 Flogger-K » 05.04.2019, 16:36

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

public class Scr1 : MonoBehaviour {
   
    private GameObject Ob;
    private GameObject Ob1;
    private GameObject Ob2;
   
   // Use this for initialization
   void Start () {
      Ob = this.transform.Find("Cube2").gameObject;
      Ob1 = this.transform.Find("Cylinder").gameObject;
      Ob2 = this.transform.Find("Cube2/Capsule").gameObject;
      }
   
   // Update is called once per frame
   void Update () {
      Ob.transform.Rotate(0, 10, 0);
      Ob1.transform.Rotate(0, 0, 10);
      Ob2.transform.Rotate(0, 0, 10);
      
   }
}
Сие творение стало результатом проб и ошибок, в попытке избежать перетаскивания объектов из Иерархии в окошки переменных Инспектора. Как я предполагаю, названия деталей у юнитов будут одинаковыми, разница будет заключаться лишь в их переменных для вращения или передвижения. Пока схема получается такая - создается несколько классов, скажем так, "анимации"(на самом деле просто идет проворот или шаг детали до опреленного предела или ее "откат" до нулевого проперти), эти классы отвечают за визуальную работу группы объектов-потомков - элеронов, рулей направления, закрылков и так далее. Все они "висят" на одном едином объекте - двигателе-кубике, к которому при старте "цепляется" нужная модель. В эти скрипты передаются переменные от главного скрипта, типа EngineAir, и уже в этих скриптах идет "шевеление" деталями. Пока я еще не добрался до передачи данных между скриптами так сказать на практике, пока только теория.
В скрипте выше в старотовой функции объявляются тартовые переменные - сами детали, для этого я использовал поиск потомков по имени, причем для пробы там был и потомок потомка, прочитал в советах и на обсуждениях разных сайтов по поводу Юнити... Пока, как говорится, как умею.
С деревьями (созданием) разобрался лишь частично - создать само дерево в Tree Creator вроде как научился, но пока не могу сообразить, как включить на нем материалы и текстуры. Скачал видеоурок, буду смотреть, как там должно быть.
Ну и мысли по поводу скриптов. Аналогично тому, что я описал, попробую сделать скрипты сенсоров, тоже отдельно, но на одном объекте скрипты РЛС, теплопеленгаторов, лазерных дальномеров и так далее. Тут, правда, нужно освоить еще одну крайне необходимую вещь - чтение данных из файла json, откуда надо пери старте достать данные о скорости, высотности, угле обзора РЛС и так далее... Пока читаю то, что удается найти и, самое главное, осознать и понять.
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 476

Сообщение #12 Flogger-K » 09.04.2019, 15:19

Результат моих экспериментов методом не совсем научного тыка - имеем фюзеляж, к которому прицеплены крылья, рули направления и высоты. К крыльям прицеплены элероны и закрылки (потомки второго уровня, так сказать). Имеем три скрипта, все они висят на фюзеляже, как главном родителе всех остальных объектов. Целью эксперимента было научиться:
1. Менять переменную в одном скрипте из другого.
2. Брать значение из одного тскрипта другим.

Имеем три скрипта. Первый, грубо говоря "центральный", в котором прописаны клавиатурные команды. Control.
Спойлер
Код: Выделить всё
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Control : MonoBehaviour {
   
    //Объявляем переменную - скрипт тангажа, в котором будем менять переменную
    private Pitch pitch;
   
    //А эту переменную - направление крена будем отдавать скрипту крена (точнее, он ее отсюда и будет брать)
    public int ROLL = 0;
   
   // Use this for initialization
   void Start () {
      }
   
   // Указываем скрипт, в котором будем брать переменную, он висити на этом же объекте
   public void Awake()
     {
      pitch = GetComponent<Pitch>();
     }
   
   // А это блок клавиатурных команд, по изменению переменной внутри себя самого и
   // изменению переменной в другом скрипте
   void Update () {
        if ( Input.GetKeyDown(KeyCode.Tab) )
            pitch.PITCH = 1;
        if ( Input.GetKeyUp(KeyCode.Tab) )
            pitch.PITCH = 0;
       
        if ( Input.GetKeyDown(KeyCode.Q) )
            ROLL = 1;
        if ( Input.GetKeyUp(KeyCode.Q) )
            ROLL = 0;
   }
}


Второй скрипт - Roll, отвечает за крен. Он сам БЕРЕТ данные из Control.
Спойлер
Код: Выделить всё
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Roll : MonoBehaviour {
   
    //Обьявляем переменный - элероны левый и правый, а также скрипт, откуда берем перменную
    private Transform AlnL;
    private Transform AlnR;
    private Control roll;
   
   //Находим потомков у данного объекта, на ктором висит скрипт, по названиям и путям к ним
   void Start ()
       {
       AlnL = this.transform.Find("WingL/AlnL");
      AlnR = this.transform.Find("WingR/AlnR");
      }
   
   //Указываем скрипт, откуда берем перменную - этот скрипт висити на этом же объекте
   public void Awake()
     {   
      roll = GetComponent<Control>();
     }
     
   //А это уже просто вращение (тест) для элеронов
   void Update () {
      if ( roll.ROLL == 1 )
          {
         AlnL.transform.Rotate(0, 0, 10);
          AlnR.transform.Rotate(0, 0, 10);
         }
      
   }
}


Третий скрипт. Pitch - отвечает за тангаж. Скрипт Control сам МЕНЯЕТ в нем переменную.
Спойлер
Код: Выделить всё
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Pitch : MonoBehaviour {
   
    //Объявляем перменные - рули высоты
    private Transform ElvL;
    private Transform ElvR;
   
    //А вот эта переменная - направление тангажа, должна быть доступна скрипту Control
    public int PITCH = 0;
   
   // Находим потомков по названиям для этого объекта
   void Start () {
      ElvL = this.transform.Find("ElvL");
      ElvR = this.transform.Find("ElvR");
      
   }
   
   // Это просто тест вращения рулей высоты
   void Update () {
      if ( PITCH == 1 )
          {
            ElvL.transform.Rotate(0, 0, 10);
              ElvR.transform.Rotate(0, 0, 10);
         }
      
   }
}


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

  • 1

Сообщение #13 exooman » 09.04.2019, 17:55

Flogger-K писал(а):Сие творение стало результатом проб и ошибок, в попытке избежать перетаскивания объектов из Иерархии в окошки переменных Инспектора.

ну тут кому как удобно. С одной стороны да - перетаскивать не надо, с другой - нужно постоянно следить за наименованием объектов, их пивотом(центром масс или как его там). Лично я использую для поворотов и передвижения пустышки, а внутри них уже находятся объекты с мешами. Так искореняются проблемы с некорректными координатами, багами поворота и т.д., но зато перетаскивать и настраивать надо, так что так.

Flogger-K писал(а):Будет ли оно работать при добавлении в сцену префаба с этими скриптами после старта игры ОТДЕЛЬНО для КАЖДОГО юнита или же добавленные объекты будут копировать поведение первого или последнего добавленного "собрата"?

а чего ей не работать? Каждый добавленный на сцену префаб - это уже экземпляр класса и у него свои личные экземпляры скриптов. К тому же ты ищешь объекты "внутри" трансформа (this.transform.Find), то есть дочерние, и тут у каждого экземпляра они опять же свои. Если же будешь искать именно объект на сцене(напр. через FindGameObjectsWithTag) или же будешь обращаться к самому префабу (тот, что в папке с ассетами), а не к его созданному экземпляру (тот, что добавлен на сцену) то да - в случае FindGameObjectsWithTag ты получишь "первый" объект на сцене, а в случае непосредственного обращения к префабу - все экземпляры будут так же редактироваться, ведь они являются его дубликатами.

Поэтому если из внешних скриптов тебе надо обратиться и изменить конкретный объект, то либо явно указывай его, либо делай ссылку. Типа GameObject obj = Instantiate(some_prefab), где obj - и есть ссылка на объект, который можно крутить как угодно.

Твой private Transform ElvR - это тоже ссылка на объект, который ты потом конкретно указываешь через this.transform.Find("ElvR");

Тут просто нужно понять принцип - при изменении экземпляра, ни оригинал(префаб), ни другие экземпляры не меняются. При изменении префаба - меняются и его экземпляры на сцене.
exooman M
Аватара
Сообщения: 1689


Сообщение #14 Flogger-K » 09.04.2019, 18:49

Спасибо за ответ. Да, во многом Юнити напоминает БГЕ. Те же ссылки на объекты... Тут неожиданно возник вопрос по поводу добавления префаба на сцену (это уже было, чуть ли не в первых постах), ситуация такая - для того, чтобы добавить юнит на сцену, я рассчитываю использовать json, в котором указывается тип юнита, его "сторона" (союзник-противник), обвес(оружие), стартовые координаты и повороты. Все это вроде можно реализовать - по чтению json как раз читаю, но вот как добавить префаб без использования значения переменной в инспекторе? Смысл в том, что добавляется универсальный движок кубик, к которому цепляется нужная модель. Вот каким образом задать имя этой самой модели? Значение-то переменной в инспекторе только одно...
Вроде как можно клонировать с объектов в сцене (но они там уже должны быть и пока не совсем внятно про это объяснено).
Ну можно, в принципе, изобразить в скрипте добавления стартовых юнитов перечисление всех юнитов игры типа public GameObject F15Cб public GameObject MiG29A и так далее,после чего ручками из иерархии перетащить в инспектор, но хочется знать, можно ли префаб добавлять без использования инспектора.
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 476

Сообщение #15 exooman » 09.04.2019, 19:53

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

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

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

GameObject obj = Instantiate(some_prefab)
Samolet_Script samolet = obj.GetComponents<Samolet_Script>( );
samolet.fraction = "enemy";

ну или как-то так.

Но признаюсь, я не до конца понял что именно ты хочешь сделать.


можно ли префаб добавлять без использования инспектора.
дык добавил раз в какой-нить главный скрипт из которого будешь брать все объекты, да и делов-то. А так да, префабы можно искать напрямую, но это лишние костыли как по мне.
exooman M
Аватара
Сообщения: 1689


Сообщение #16 Flogger-K » 09.04.2019, 20:16

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

  • 1

Сообщение #17 Flogger-K » 11.06.2019, 18:51

На данный момент удалось через скриптинг создать анимацию работы подвижных частей самолетов. Пока для МиГ-23, но скрипты должны с успехом работать и на других машинах. Схема построения "паутины" из Си-шарп скриптов выглядит так:
Создается универсальный кубик-двигатель, на котором висят все необходимые скрипты - для механизации крыла, тормозов, рулей высоты и направления, фонарей кабин и прочей мелочи. Все они ВЫКЛЮЧЕНЫ - галка в инспекторе у них убрана.
К двигателю цепляется модель самолета, на главном родителе которого висит скрипт "семейства", для МиГ-23 - это Flogger, для МиГ-29 - Fulcrum, для Су-27 - Flanker, для F-15 - Eagle и тд. Сама модель самолета содержит в себе стандартные имена деталей - Airbrake_1-2-3-4, Wing_1-2, Flaps_1-2 и так далее. Фюзеляж самолета становится потолмком двигателя и через команду this.transform.parent.GetComponent<AircraftEngine>(); ищет нужный ему скрипт родителя и включает его через nameScript.enable = true. Разумеется, широко применяется public void Awake, чтобы скрипты могли общаться между собой. Включенные скрипты этим как раз и занимаются - включить можно не только скрипты анимации, но и скрипты сенсоров, ИИ, клавиатурных команд и так далее. Можно и выключить - например при перекладке крыла на МиГ-23 можно отключить скрипт работы закрылков и блокировать их анимацию (примерно так я делал в БГЕ, только там проперти были).
Конкретно сейчас клавиатурные команды при нажатии клавиши проверяют, включен ли скрипт той или иной анимации, и только потом меняют в нем переменную, это "одноразовая акция", для относительно редких команд типа выпуски уборки шасси, тормозов, смены стреловидности и так далее. Для часто используемых анимаций крена-тангажа-рыска проверки не нужны - скрипты работы рулей-элеронов-флапреонов сами проверяют в главном скрипте движения самолета команды на развороты и сами отклоняют нужные детали на нужный угол. Кстати, все скрипты применяют разовый поиск потомков с нужными именами и работают только с уже полученными на них ссылками, не отвлекаясь далее на поиск и на другие детали. Примерно так:
Код: Выделить всё
void Start ()
   {
       //Проводим поиск нужных объектов по именам и готовим на н7их ссылки
       foreach(Transform child in this.GetComponentsInChildren<Transform>())
           {
              //Debug.Log(child.name);
              if ( child.name == "Wing_1" )
                  Device_1 = child;
              if ( child.name == "Wing_2" )
                  Device_2 = child;
                 
              }
      
На скобки не смотрите - там дальше идет выставление ограничений по интервалам отклонения и скоростям отклонения для деталей, которые уже произведены скриптом "семейства".
Скрипт семейства следит за множеством мелочей, например включает-отключает нужные скрипты в определенные моменты работы остальных, также я рассчитываю повесить на него еще и работу шасси - для каждого самолета свое шасси, которое несовместимо с другими типами, так что его некуда ставить, кроме как в скрипты на фюзеляжах.
Пока данная схема вполне работает, мне осталось как раз добить работу всевозможных рулкй, но, думаю, там дело только во внимательности и трпении (кстати, получил неприятный сюрприз - не работает команда GetKeyUp- не фиксируются отпущенные клавиши, поэтому пришлось извращаться, но проблему с управлением я все же решил - крен-рыск-тангаж уже работают).
Ну и, к сожалению, опять о неприятном. Впереди у меня еще одна операция - лазерная дисцизия вторичной катаракты. В Москву ехать не надо, это и у нас делают, но на неделю меня из строя опять выбьет. Только это будет в июле-августе, так что пока буду работать, насколько это возможно - "полиэтиленовый пакет перед замочной скважиной" к большим скоростям как-то не располагает, так что сильно больших прорывов не будет (что касаемо самой вторичной катаракты, то, как мне сказала мой лечащий врач, в моем случае этого следовало ждать с вероятностью в 100 процентов, но ничего экстраординарного в этом нет).
Так что (разведя руками) пока красивых каринок не будет. Ну разве что статью в блог все же наклепаю про взаимодействие скриптов с моей дилетантской точки зрения...
актуальная версия проекта - здесь:
https://yadi.sk/d/Uf_VyC-afW5z7
Мои блоги - здесь. http://flogger-k.blogspot.ru/
ВК: https://vk.com/floggerk
Flogger-K M
авиатор
Аватара
Сообщения: 476

  • 2

Сообщение #18 Flogger-K » 10.07.2019, 18:19

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

  • 1

Сообщение #19 mageaster » 10.07.2019, 20:07

Flogger-K писал(а):Есть ли возможность в юнити сделать зеркало заднего обзора и монитор с выводимым на него изображением с другой камеры?

Да. Замороченно, но можно. В группе по Юнити ВК есть книга что-то типа "Unity 5 Cookbook", там есть про это.
Меньше слов, больше дела!
AMD Phenom II X6 1055T, 4 GiB RAM, Nvidia GeForce GTX 550 Ti, Kubuntu 18.04
Мой WIP
mageaster M
теоретик
Аватара
Откуда: оттуда
Сообщения: 2679

  • 1

Сообщение #20 exooman » 11.07.2019, 03:01

Flogger-K писал(а):И, чтоб два раза не вставать, вопрос, тем, кто знает. Есть ли возможность в юнити сделать зеркало заднего обзора и монитор с выводимым на него изображением с другой камеры? Ну, как в БГЕ видеотекстру.

Да, есть полный аналог - Render Texture называется. Работает просто - указываешь камере куда рендерить картинку и всё.
https://docs.unity3d.com/ru/current/Manual/class-RenderTexture.html
exooman M
Аватара
Сообщения: 1689


След.

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

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

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