Obecnie próbuję zrobić efekt świetlika na ciemnym lesie. Poziom ma bardzo słabe światło, a odtwarzacz jest jednym z niewielu źródeł światła. Aby gracz mógł lepiej widzieć poziom, staram się, aby świecące świetliki pojawiały się losowo na mapie. Jednym ze sposobów jest użycie układu cząstek. Ale nie mogę sprawić, by cząsteczki rzucały światło na otoczenie. Czy jest na to sposób?
22
Odpowiedzi:
Cząstki emitujące światło są teraz wbudowaną funkcją Unity w wersji 5.5.
Po prostu włącz Światła w inspektorze cząstek, wrzuć odniesienie do prefabrykatu światła (działają światła punktowe i punktowe) i zmień Współczynnik na 1.
I voila, cząsteczki emitujące światło:
Okazuje się, że jest to raczej zoptymalizowana konfiguracja, działająca z prędkością 1500 + fps na moim urządzeniu, nawet przy maksymalnej liczbie świateł w setkach.
Edycja: Po pewnej obserwacji wydaje mi się, że światła cząsteczkowe przełączają się między oświetleniem na fragment i oświetleniem wierzchołków (przypuszczalnie w celu optymalizacji?). Może to generować niewielkie ilości artefaktów wizualnych, jeśli maksymalna ilość światła jest ustawiona zbyt wysoko.
Edycja2: Jak wskazał DMGregory, artefakty są produktem ubocznym optymalizacji do przodu renderowania. Odroczone oświetlenie rozwiązuje problem. Dodano ładniejszy gif
źródło
Heads-up:
Ta odpowiedź jest nieaktualna. Unity obsługuje teraz natywnie punktowe cząsteczki światła. Zobacz tę odpowiedź, aby uzyskać szczegółowe informacje.
Zostawię to tutaj dla każdego, kto jest ciekawy, używa starych wersji Unity lub potrzebuje więcej ręcznej kontroli niż oferuje natywna metoda - pamiętaj tylko, że natywna obsługa będzie prawdopodobnie znacznie wydajniejsza i skalowalna niż podejście przedstawione poniżej.
Nie jestem pewien, dlaczego tak wiele odpowiedzi twierdzi, że jest to trudne lub niemożliwe. Obsługa kilkudziesięciu dynamicznych świateł punktowych jest dość konwencjonalna nowoczesnego odroczonego renderingu działającego na PC.
Oto szybki przykład, który przygotowałem:
Używam tego skryptu, aby dynamicznie odradzać wystarczającą ilość światła dla moich maksymalnych cząstek (upewnij się, że dostosujesz ustawienia Particle System, aby maksimum było rozsądne - domyślnie 1000 nie sprawi, że twoja karta graficzna będzie bardzo szczęśliwa), a następnie zaktualizuje je, aby podążały za aktywnym cząstki:
Edytować: możesz stworzyć prefabrykat , najpierw tworząc obiekt gry (w tym przypadku Utwórz -> Światło -> Punktowe światło), ustawiając go z żądaną nazwą / parametrami / skryptami / dziećmi, a następnie przeciągając go z hierarchii do twój odkrywca projektu. Zapisuje to obiekt jako zasób, który można ponownie wykorzystać w wielu scenach i skryptach, z pewnym stopniem dziedziczenia. Możesz usunąć kopię ze sceny, a zasób pozostanie w folderze Zasoby, do którego można będzie się odwoływać w razie potrzeby.
Upewnij się, że lightPrefab ma stosunkowo niewielki zasięg i nie rzuca cieni, aby zapewnić Ci najwyższą wydajność nad wszystkim, co dzieje się w Twojej scenie. Nie musisz sprawiać, aby sam lightPrefab był zielony (lub kolor twoich świetlików) - odbierze go z koloru cząsteczek.
Może się okazać, że masz lepszą kontrolę nad lotem świetlików, jeśli stworzysz każdy GameObject, z billboardowanym quadem i lampą dołączoną do niestandardowego skryptu ruchu / blinkig, ponieważ uzyskanie przekonującej wędrówki wymaga więcej artyzmu systemu cząstek niż Wiem. ;)
źródło
Wiele lat temu, zanim dynamiczne światła były dostępne, po prostu użyliśmy efektu cząstek billboardu 2D z mieszaniem dodatków. Rozjaśniłoby to scenę w kierunku bieli. Rysując go z prawidłową głębokością świetlika, uzyskuje się prawie prawidłowe sortowanie. Addytywna alfa nie wymaga sortowania, gdy sama się przesadza w porównaniu do mieszania alfa. Nie zaświeci CAŁEJ sceny, ale oświetli obszar otaczający świetlika. Możesz wtedy wziąć dynamiczne światło i wybrać co kilka sekund jedną z świetlików, aby faktycznie oświetlić scenę, jeśli jej potrzebujesz.
Jest już pytanie i odpowiedź na temat efektów blasku Jak osiągnąć takie oświetlenie w Unity dla gier 2D?
źródło
Niestety nie miałem dużego doświadczenia z Unity w jej obecnej formie (bawiłem się nim wiele lat temu), więc nie wiem dokładnie, z jakimi zestawami funkcji musisz pracować w silniku.
W każdym razie, bez względu na silnik, z którym pracujesz, dynamiczne światła są czymś, czego należy unikać, kiedy tylko możesz. Są bardzo drogie obliczeniowo i mają tendencję do zwiększania złożoności sceny w bardzo wykładniczy sposób. Jednak, podobnie jak w przypadku większości renderingu 3D, istnieje wiele sposobów na osiągnięcie podobnych efektów poprzez oszustwo;
Możliwym sposobem na uzyskanie podobnego efektu jest odwzorowanie wcześniej przygotowanej tekstury blasku na teren poniżej świetlików (przy założeniu układu współrzędnych Y = góra / dół) z pozycjami X i Z kontrolującymi położenie blasku na terenie i przesunięcie Y z terenu kontrolującego alfa tekstury (jaśniejszy = bliżej terenu)
Istnieje oczywiście kilka wad tej metody. Nie rzucasz cieni, ponieważ nie jest używane światło, i nie wpłyniesz na żadną inną geometrię na świecie (rekwizyty, liście itp.)
źródło
Używaj
Light
u źródła ognia i graj ze swoim rozmiarem w skrypcie, aby dać efekt spalania. I użyj swojego układu cząstek :)źródło