[C#, Unity] Простая имитация разрушений с использованием Unity и Blender

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
09-Сен-2020 16:34

Всем привет! недавно задался вопросом насчет разрушений в Unity, поискал в интернете что есть на эту тему, но увы я нашел лишь кучу вопросов и обсуждений.
И нет я не заявляю что моя статья единственная в своем роде, потому что метод довольно прост, но почему-то прямого туториала для этого я не нашел.
Начнем с того что в Unity НЕЛЬЗЯ РАЗРУШИТЬ/РАЗДЕЛИТЬ/РАЗРЕЗАТЬ объект, наши разрушения будут по сути то и не разрушениями вовсе, а лишь их визуальной имитацией, поскольку как я сказал выше, невозможно по другому.
СОБСТВЕННО!
Хватит лить воду и тратить ваше время в пустую(все же я посчитал нужным оставить предисловие). Для начала вам потребуется скачать из магазина стим программу под названием Blender, после чего заходим и начинаем разбираться.
Создаем новый проект, и во вкладке «Правка/Edit» ищем кнопку «Аддоны/Addons», и пишем в поиск Cell Fracture, затем ставим рядом с ним галочку дабы включить его.

После чего переходим на саму нашу сцену в Блендере, и видим там куб который есть изначально при создании сцены.
Нас интересует вкладка «Моделирование/Modeling», заходим в нее, нажимаем на объект правой кнопкой мыши > подразделить/subdivide, и видим что куб стал как-бы в «клеточку»

Теперь вернемся на первую вкладку «Макет/Layout», нажмем на кнопку объект/object > быстрые эффекты/fast effects > Cell Fracture, и нам откроется окно для управления Аддоном.

Просто нажимаем кнопку «ДА» и смотрим за результатом.
Как можно заметить, наш куб разделился визуально, значит все прошло успешно, это и есть та самая фрагментация.

Остались последние шаги в Блендере, и можно переходить к созданию сцены, нажмем на file/файл > экспортировать/export > .fbx, и сохраним в удобную для нас папку.

Открываем Unity, создаем или открываем старый проект, и приступим собственно к сборке нашей сцены.Для этого нам понадобится создать plаne и sphere, теперь из нашей папки в окно иерархии добавляем куб что мы только что экспортировали, затем перетаскиваем его уже непосредственно на сцену.
Для того чтобы Unity понимал что это физический объект, нужно добавить две вещи, нажмем на наш куб в окне иерархии, тем самым раскрыв список объектов внутри (частей из которых он состоит), затем зажав shift, выделим самый первый объект из списка, и самый последний, при помощи этой манипуляции мы выделим весь список.
Осталось нажать АddComponent, и в поиске прописав collider, выбрать «Mesh Collider».

В самом коллайдере нажимаем на «Convex», для его отображения, и все.
Теперь повторяем сделанное ранее, но только уже ищем Rigidbody.

Со сферой нужно сделать тоже самое, только без коллайдера, ведь он висит там изначально.
На этом наша подготовка закончена, и можно перейти к самому интересному, как говорится — «краткость сестра таланта», именно поэтому создаем новый C# скрипт в окне иерархии, и пишем туда следующее:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FragmentSplit : MonoBehaviour {
  public bool isdead = false; //переменная которая обозначает разрушился объект, или еще нет
  public float timeRemaining = 100;//время после которого должен удалится объект после разрушения (сделано во благо оптимизации)
  void Start()
  {
    GetComponent<Rigidbody>().isKinematic = true;//включаем у риджидбоди синематик дабы наш объект не разрушался раньше времени
  }
  void OnCollisionEnter(Collision collision)//проверяем на объект на коллизию
  {
        GetComponent<Rigidbody>().isKinematic = false;//и если он с чем-то столкнулся, отключаем синематик тем самым разрушая его
        isdead = true;//делаем переменную положительной, чтобы скрипт смог понять что обьект уже "отработан", и его можно удалить
  }
  void Update()
  {
    if (isdead)//если переменная положительная, то запускаем таймер
    {
      timeRemaining -= Time.deltaTime;//сам таймер
      if (timeRemaining < 0) //и если время таймера меньше нуля, то
      {
        Destroy (gameObject);//просто удаляем объект
      }
    }
    }
}

Теперь последний раз выделяем все объекты в списке, нажимаем на АddComponent, и добавляем наш скрипт

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

Как видим, все прекрасно работает, куб ломается, наша сфера куда-то катится.
На этом собственно все, да, возможно вы скажете что можно сделать более плавное удаление, чтобы кусочки исчезали, а не вот так вот топорно, и всякое такое.
Я лишь вам отвечу что я просто демонстрировал работу скрипта, и не вдавался в подробности того, как и когда оно будет удалять эти «обломки», а просто показал что можно и так, и ничего сложного в этом нет абсолютно.
Я не спорю что ассеты от Unity(или других разработчиков) будут лучше моих скриптов на пару строчек, но все же.
Я не делал эту статью с упором на то что меня будут читать люди знающие и понимающие Unity и язык, которые могут написать скрипт с более точечным контролем всего что происходит с объектом на сцене, я делал статью для еще обучающихся и новичков.
Не стану говорить что я хорошо и досконально знаю язык, но и не первый день в этом, в общем, на этом у меня все, надеюсь что помог кому-то, хорошего вам кода друзья!..
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_c#, #_unity, #_unity3d, #_c#, #_c#, #_unity
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 23-Ноя 00:27
Часовой пояс: UTC + 5