Efekt odrzutu po eksplozji

Rozwijając temat efektu eksplozji (zobacz) dodamy efekt odrzutu w wyniku fali uderzeniowej. Pomysł polega na wykorzystaniu collider'a typu sferycznego. Mając osadzonego collider'a we współrzędnych wybuchu odszukujemy obiekty należące przestrzeni określonej promieniem sfery collider'a. Każdemu znalezionemu obiektowi z ciałem fizycznym (Rigidbody) przekazujemy ułamek siły eksplozji.

Patrz poniższy film (kliknij na ilustracji, aby odtworzyć).

film efekt odrzutu po eksplozji w grach 3D Unity

Tworzymy skrzynię

Przechodzimy do Blendera, tworzymy skrzynię. W programie GIMP tworzymy teksturę. W podanym przykładzie tekstura ma rozmiar 256x256 pikseli. Gotową teksturę dołączamy do Blendera jako materiał owijający skrzynię.

tekstura apteczki skrzyni Unity

Gotową skrzynię eksportujemy z Blendera do pliku *.fbx. Sposób eksportu i importu plików fbx został opisany pod tym linkiem import obiektów fbx- zobacz.

W programie Unity importujemy plik fbx utworzonej skrzyni

skrzynia 3D Unity

Robimy prefabrykat skrzyni

Zaimportowaną siatkę skrzyni przeciągamy na scenę. Dodajemy ciało fizyczne (Rigidbody) i ustawiamy masę na dziesięć jednostek.

Rigidbody skrzynia 3D Unity

Do tworzonego obiektu skrzyni dodajemy collider'a w postaci Box collider

Box collider skrzynia 3D Unity

Z obiektu skrzyni robimy prefabrykat.

prefabrykat skrzyni 3D Unity

Roboczy obiekt skrzyni usuwamy ze sceny. Prefabrykat skrzyni jest gotowy.

Do sceny dodajemy kilka skrzyń

W dowolnych współrzędnych tworzonego świata 3D dodamy kilka skrzyń. Na scenę przeciągamy prefabrykat skrzyni i duplikujemy kilka razy.

duplikat skrzyni 3D Unity

Duplikatom zmieniamy współrzędne

duplikaty skrzyni 3D Unity

Skrypt odrzutu

Odrzut programowo wykonamy w skrypcie Eksplozja.cs utworzonym w poprzedniej części. Zawartość skryptu po modyfikacji przedstawiają poniższe linie kodu.

Wskazówka:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Eksplozja : MonoBehaviour
{
    [SerializeField] private GameObject prefabEksplozja;
    [Header("Opcje")]
    [Range(1.0f, 10.0f)]
    [SerializeField]
    private float PromienOdrzutu = 5.0f;
    [Range(10.0f, 100.0f)]
    [SerializeField]
    private float SilaOdrzutu = 20.0f;
    private float skladowaSilaPion = 5.0f;

    private void Odrzut()
    {
        //zrob listę obiektów kolidujacych wewnątrz zadanej sfery
        Collider[] kolizje = Physics.OverlapSphere(transform.position, PromienOdrzutu); 
        foreach (Collider c in kolizje) 
           { 
              Rigidbody rb=c.GetComponent<Rigidbody>();
            if (rb != null )
              rb.AddExplosionForce(SilaOdrzutu,
                                   transform.position,
                                   PromienOdrzutu, 
                                   skladowaSilaPion, 
                                   ForceMode.Impulse);
           }
    }

    private void OnDestroy()
    {
        //utwórz obiekt eksplozji
        GameObject e = Instantiate(prefabEksplozja,
                       transform.position,
                       transform.rotation);
        //usuń obiekt eksplozji
        Destroy(e, 2.5f);
        //włącz odrzut
        Odrzut();
    }
}

Po modyfikacji skryptu w programie Unity przechodzimy do prefabrykatu Kula i ustalamy parametry odrzutu (promień odrzutu, siła odrzutu)

parametry odrzutu AddExplosionForce Unity

Wszystko jest gotowe, aby sprawdzić efekt. Uruchom scenę. Wymierz w kierunku skrzyń i oddaj strzał. Prawidłowo wykonane czynności pozwolą zobaczyć podobny efekt.

AddExplosionForce Unity

Skrzynie w zależności od odległości od środka wybuchu zostaną wyrzucone na różne wysokości. Jeżeli zmienisz masę skrzyń, to też uzyskasz różny wpływ siły odrzutu. Fizyka odrzutu działa dzięki wykorzystaniu metody ciała fizycznego Rigidbody.AddExplosionForce()

Głębia tekstury

Głębia tekstury to mapowanie wypukłości. Wypukłość sprawia, że płaski obiekt nabiera dodatkowego efektu 3D. Mapowanie można przeprowadzić na dowolnej teksturze. W wyniku mapowania powstaje dodatkowy obraz, w którym kolor najciemniejszy oznacza, że taki piksel będzie położony najgłębiej, a najjaśniejszy będzie maksymalnie wytłoczony w górę. Proste mapowanie możemy wykonać w darmowym programie GIMP, używając na wybranej kopii obrazu tekstury Filtr/ Ogólne/ Mapowanie normalnych

mapowanie wypukłości Unity

Ustaw jak poniżej. Opcja skali, związana jest z głębią wypukłości.

skala mapowania wypukłości Unity

Przejdź do projektu sceny w Unity i zaimportuj obraz mapowania normalnych tekstury. Po imporcie pliku grafiki ustaw jak poniżej (Texture typ/ Normal map)

Texture typ/ Normal map Unity

Z folderze zasobów materiałów utwórz nowy materiał

Normal map Unity

W inspektorze właściwości materiału ustaw jak poniżej

właściwość materiału Normal map Unity

Gotowy materiał przeciągnij na wybraną skrzynię

właściwość materiału texture Normal map Unity

Gotowe. Patrząc na skrzynie ze zmodyfikowanym materiałem widać głębię tekstury. Płaskie powierzchnie nabrały trzeciego wymiaru. Tym prostym rozwiązaniem punktów do renderowania nie przybyło. Co oznacza, że czasowo nie obciążamy operacji graficznych związanych z transformacjami obiektów.

Układ okresowy- kod qr
Układ okresowy

Układ okresowy pierwiastków- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
Alkomat- wirtualny test kod qr
Alkomat- wirtualny test

Alkomat- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
Taklarz- olinowanie stałe kod qr
Olinowanie stałe- kalkulator średnic

Olinowanie stałe- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
przepis na gogfry

Przepis na gofry

zobacz
przepis na bitą śmietanę

Przepis na bitą śmietanę

zobacz