Efekt wystrzału- dym
Temat bazuje na utworzonym materiale w temacie Programowanie obiektów fbx. Do momentu wystrzału dodamy efekt dymu.
Tworzymy obiekt kuli
Ustaw działo tak, aby lufa była widoczna w jednej płaszczyźnie na przykład XY (os Y w Unity jest osią pionową) Na końcu lufy osadź pusty obiekt (Create Empty). Element ten będzie slotem dla wystrzeliwanych pocisków. Przypisz mu nazwę SlotPocisku

Zadbaj o to, aby współrzędne osadzonego slotu były zgodne ze środkiem kalibru lufy. Do slotu możesz przypisać tag, co ułatwi jego lokalizację w budowanej scenie.

Do sceny dodaj obiekt 3D typu Sphere. Nadaj mu nazwę Kula. Dopasuj rozmiar kuli do kalibru lufy. Utwórz materiał dla kuli. Do obiektu kuli podepnij ciało fizyczne (Rigidbody) oraz utworzony materiał. Patrz poniższy.

Dodaj nowy folder o nazwie Prefabrykaty i z utworzonej kuli zrób prefabrykat (więcej na temat tworzenia prefabrykatów znajdziesz pod tym linkiem https://www.afizyka.pl/unity-prefabrykat)

Usuń obiekt kuli ze sceny... Prefabrykat pocisku w postaci czarnej kuli jest gotowy.
Piszemy skrypt strzelania
W katalogu Skrypty utwórz nowy skrypt i nadaj mu nazwę Strzal. Skrypt podepnij do slotu pocisku. W skrypcie utwórz zmienną na prefabrykat pocisku oraz zmienną na współczynnik prędkości wylotowej pocisku. Poniżej kod proponowanego skryptu
Wskazówka:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Strzal : MonoBehaviour
{
[SerializeField] private GameObject prefabPocisk;
[Header("Opcje")]
[Range(10.0f,50.0f)]
[SerializeField] private float v=10.0f;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if(Input.GetKeyUp(KeyCode.Space))
{
GameObject p=Instantiate(prefabPocisk,transform.position,transform.rotation);
p.GetComponent<Rigidbody>().velocity=transform.forward*v;
//dopóki nie oprogramujemy eksplozji
//usuń obiekt pocisku po 3.5 sekundzie
Destroy(p,3.5f);
}
}
}
Do podpiętego skryptu przypisz prefabrykat pocisku, wybierz wartość współczynnika prędkości. Uruchom scenę i sprawdź efekt strzelania wciskając klawisz spacji

Efekt dymu przy wystrzale
Efekt dymu czy też spalin ciekawie opisany jest na tej stronie Tworzenie dymu spalinowego z pojazdu
Przy tworzeniu dymu zachowamy styl Low Poly. Siatkę pojedynczej chmury dumy wygenerujemy w programie Blender wychodząc z obiektu Ico Sphere. Patrz poniższy rysunek

Do siatki przypiszemy materiał/- ten sam co do działa i gruntu, ale w innym kolorze. Możemy tak dobrać kolory tekstury obłoku dymu, aby na różnych płaszczyznach były inne. Wystarczy, że w UV Editing odpowiednio rozciągniemy siatkę werteksów. Patrz poniższy rysunek.

Chmurkę dymu eksportujemy do pliku *.fbx i importujemy w Unity.
Do sceny dodajemy system efektów cząstek (Particle System).

Podmieniamy renderowanie cząstek na przygotowaną siatkę i materiał tworzonego dymu. W edytorze właściwości Particle System przejdź do zakładki Renderer i ustaw jak poniżej

Odszukaj zakładkę Shape i pole Shape ustaw na Sphere

Odszukaj zakładki Size of Lifetime. Kliknij w obszar wykresu (1) i zmień parametry krzywej rozmiaru i czasu życia pojedynczej chmurki dymu. Punkty przegięcia dodaje się do wykresu po kliknięciu prawym przyciskiem myszy w linie wykresu

Zmniejszamy ilość cząstek dymu (Max Particles=7), długość życia (Start Lifetime=1), prędkość przy starcie (Start Speed = 2)

Różne inne efekty jak przezroczystość, podwójny gradient itp. dają ciekawe kombinacje

Ustawa czas życia dymu (Duration) na 1 sekundę i wyłącz powtórzenia (Looping)

Zapisz scenę. Utworzonemu systemowi cząstek zmień nazwę na DymWystrzalu, zrób z tego obiektu prefabrykat i usuń ze sceny

Dodaj dym do wystrzału
Modyfikujemy skrypt Strzal. Dodajemy zmienną na prefabrykat dymu i wprowadzamy instrukcję tworzenia prefabrykatu oraz jego uśmiercenia. Kod skryptu po zmianach wygląda jak poniżej
Wskazówka:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Strzal : MonoBehaviour
{
[SerializeField] private GameObject prefabPocisk;
[SerializeField] private GameObject praefabDymWystrzalu;
[Header("Opcje")]
[Range(10.0f,50.0f)]
[SerializeField] private float v=10.0f;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if(Input.GetKeyUp(KeyCode.Space))
{
GameObject p=Instantiate(prefabPocisk,transform.position,transform.rotation);
p.GetComponent<Rigidbody>().velocity=transform.forward*v;
//dopóki nie oprogramujemy eksplozji
//usuń obiekt pocisku po 3.5 sekundzie
Destroy(p,3.5f);
//pokaz dym wystrzalu
GameObject d= Instantiate(praefabDymWystrzalu, transform.position, transform.rotation);
Destroy(d, 1.5f);
}
}
}
W edytorze Unity podpinamy prefabrykat do zmienionego skryptu. Uruchamiamy scenę. Powinniśmy w momencie strzału zauważyć dym oraz pocisk

Prawidłowo działający skrypt usuwa z hierarchii obiektów sceny dynamicznie dodane systemy cząstek- dym wystrzału.