Unity3d. Уроки от Unity 3D Student (B13-B16)

    Предыдущие уроки вы можете найти по следующим ссылкам:
    Уроки B01-B03
    Уроки B04-B08
    Уроки B09-B12

    PS: Так же исправленны некоторые ошибки в предыдущих уроках, большое спасибо хабравчанинам ufomesh и MikhailS.




    Базовый Урок 13 — Определение столкновений с триггером




    В уроке рассказывается, как определить столкновения между невидимыми для игрока объектами, используя неосязаемые «триггер коллайдеры» (trigger colliders).

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

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

    На нашей сцене имеется куб («box» с rigidbody), который падает на синюю платформу («platform»).
    b1300
    b1301

    Естественно платформа останавливает куб, поскольку среди ее компонентов присутствует box collider.
    b1302

    У компонента box collider есть чекбокc Is Trigger. Если включить
    его и запустить сцену снова, то куб провалиться через платформу.
    b1303

    Таким образом мы можем создавать столкновения, которые не должны быть видны пользователю. Например, отключим компонент Mesh Renderer у нашей платформы. Мы по прежнему видем зеленый контур объекта, если выделим его в Hierarchy View.
    b1304

    Если мы нажмем play, то куб провалиться через нивидимую платформу, но пока мы не можем ничего узнать о произошедшем.
    b1305

    Создадим скрипт, назовем его Trigger и добавим в тело класса следующий код
    // Обнаруживаем столновение с триггером 
    // myTrigger - коллайдер, который столкнулся
    void OnTriggerEnter(Collider myTrigger) 
    {
      if (myTrigger.gameObject.name == "box")
      {
        Debug.Log("Box went through!");
      }
    }
    


    Добавим скрипт к платформе. Теперь, как тольку куб пройдет сквозь платформу, вы увидете сообщение «Box went through!» в консоли.

    Ссылка на оригинальный урок




    Базовый Урок 14 — GUI текст и счетчики





    В уроке рассказывается, как отобразить информацию о счетчике на экран используя компонент GUI Text

    Чтобы отображать текстовую информацию на экран воспользуемся элементом GUI Text.
    Добавим его на сцену — Game Object->Create Other->GUI Text.
    b1400

    Так же, обратите внимание, чтоб у камеры был включен компонент GUILayer.
    b1401

    Текст можно редактировать напрямую через редактор (поле Text).
    b1402

    Но мы воспользуемся скриптом для этого. Добавим скрипт (GUITextExample). Код будем писать в метод Update():

    Немного о GUI Text
    GUI Text это компонент gameObject'а, поэтому с самим объектом вы можете обращаться как с обычным gameObject'ом.Компонент расположен в Component->Rendering->GUIText. Т.е. создавая GameObject->Create Other->GUI Text, вы создаете Empty GameObject с соответствующим компонентом.


      guiText.text = "Hey What's Up?";
    


    Если зайти в стравку о параметре guiText.text, то увидите следующие:
    var text: String
    Description
    The text to display.

    То есть, при передачи параметра мы должны быть уверены что передаем string.

    Теперь если запустить игру, то текст поменяется.
    b1403

    Попробуем отобразить счетчик. В класс добавим переменную-счетчик (Counter) и немного подправим код в методе Update().
    private int Counter = 0;
      
      void Update () 
      { 
        ++Counter;
        guiText.text = Counter;
      }
    


    В итоге Unity выдаст ошибку:
    Cannot implicitly convert type `int' to `string'
    


    Нам требуется привести переменную типа int к типу string.
    Это можно сделать многими способами. Вот некоторые из них:
    ...
    // ToString() - Возвращает строку, которая представляет текущий объект
    guiText.text = Counter.ToString();
    ...
    // Convert.ToString(value) - Строковое представление параметра value или String.Empty, если параметр value имеет значение null.
    guiText.text = Convert.ToString(Counter)
    ...
    // Оператор '+' служит для объединения строк. 
    guiText.text = "" + Counter;
    ...
    //etc
    


    Примечание с MSDN
    Строки являются неизменяемыми: содержимое строкового объекта невозможно изменить после создания объекта, хотя из-за синтаксиса изменения кажутся возможными. Например, при написании этого кода (имеется ввиду оператор '+') компилятор на самом деле создает новый строковый объект для новой последовательности знаков.


    Воспользуемся последним способом, только вместо пустой строки напишем текст:
    guiText.text = "Counter is:" + Counter;
    


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

    Мы так же можем изменить шрифт текста, если у вас в проекте есть дополнительный шрифт (font).

    Чтоб поменять шрифт, достаточно перетащить его в соответствующие поле компонента GUIText (Font).
    b1405

    Тут же можно поменять другие параметры, такие как размер (font size), выравнивание (alignment) и некоторые другие.

    Ссылка на оригинальный урок




    Базовый Урок 15 — Добавление компонентов с помощью скриптов





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

    Для того, чтобы добавить компонент в run-time воспользуемся скриптами.
    В нашем примере у нас снова есть платформа («platform») и ящик(«box» с rigidbody) который на нее падает.


    Попробуем добивать компонент к платформе, как только ящик упадёт на неё.
    Добавим скрипт addComp В класс добивим следующий код:
    void OnCollisionEnter(Collision myCollision) 
    {
      if (myCollision.gameObject.name == "Platform")
      { 
        myCollision.gameObject.AddComponent(Rigidbody);
      }
    }
    


    Скрипт добавим к ящику. Жмем play и видим — как только ящик падает на платформа, она тоже начнёт падать.


    Но в консоле вы увидите предупреждение:
    Can't add component 'Rigidbody' to Platform because such a component is already added to the game object!
    


    Мы получили это сообщение, поскольку пытаемся добавить компонент Rigidbody каждый раз, когда ящик сталкивается с платформой, то есть — мы добавляем его более одного раза. Чтоб этого не происходило, нам нужно добавить проверку и добавлять компонент, только в случае его отсутствия. Добавим в OnCollisionEnter() еще одно условие:
    void OnCollisionEnter(Collision myCollision) 
    {
      if (myCollision.gameObject.name == "Platform")
      { 
        if(!myCollision.gameObject.rigidbody)
        {
          myCollision.gameObject.AddComponent("Rigidbody");
        }
      }
    }
    


    Теперь запустим приложение и убедимся, что в консоли отсутствует предупреждение.

    Ссылка на оригинальный урок




    Базовый Урок 16 — Переключение между сцен





    В уроке рассказывается, как написать скрипт, для переключения между сценами в проекте Unity.

    Для полноценной работы с Unity нужно уметь переключаться между различными сценами, для загрузки разных уровней, меню и другого контента. Для этого воспользуемся методом LoadLevel() класса Application.

    В нашем примере есть 2е сцены. Первая («Level») — с кубом и плоскостью («floor»), на которую куб падает.Вторая («gameover») — с зеленым фотон и GUI Text'ом — «YOU WIN!»
    b1600
    b1601

    Добавим скрипт (LoadLevel) со следующим кодом:
    void OnCollisionEnter (Collision myCollision)
    {
      if (myCollision.gameObject.name == "floor")
      {
        Application.LoadLevel("gameover");
      } 
    }
    


    Жмем play. В итоге в консоли появилась ошибка:
    Level 'gameover' (-1) couldn't be loaded because it has not been added to the build settings.
    To add a level to the build settings use the menu File->Build Settings...
    


    Дело в том, что когда мы работаем с классом Application, мы должны указывать в настройках сборки (Build Settings) все сцены, которые хотим загружать в итоговом приложении. Перейдем в настройки сборки File->Build Settings и перетащим сцены Level и gameover из Project View в верхнее поле Buil Settings
    b1602

    Немного подредактируем наш скрипт так, чтоб мы могли указывать имя уровня из окна редактора, таким образом мы делаем наш скрипт более «гибким».
    public string myLevel;
    
    void OnCollisionEnter (Collision myCollision)
    {
      if (myCollision.gameObject.name == "floor")
      {
        Application.LoadLevel(myLevel);
      } 
    }
    


    В окне редактора, на против соответствующего поля компонента, напишем название сцены, которую хотим загрузить.
    b1603

    Ссылка на оригинальный урок

    Похожие публикации

    Средняя зарплата в IT

    120 000 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 6 051 анкеты, за 1-ое пол. 2021 года Узнать свою зарплату
    Реклама
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее

    Комментарии 7

      0
      А что означает буква «B» в номере если не секрет?
      0
      в 15 примере у меня выдал ошибку в
      myCollision.gameObject.AddComponent("Rigidbody");
      решилось так:
      myCollision.gameObject.AddComponent<Rigidbody>();
        0
        точнее в
        myCollision.gameObject.AddComponent(Rigidbody);
        0
        отлично!
        продолжения не планируется? :)
          0
          Спасибо! Планируется перевод официальных уроков unity3d.com/learn
          0
          Эх, закончились )) Спасибо за уроки )) Жду с нетерпением новые!

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое