Divine Skins
Divine Skins Wiki

Bin & Particle Dictionary

Referencja właściwości występujących w binie VFX League of Legends, uporządkowana według klasy, do której każda faktycznie należy.

Autor DAKA

Każda inna strona w tej sekcji uczy cię, jak coś zrobić. Ta jest na moment, w którym przewijasz dump .py, trafiasz na właściwość, której nigdy nie widziałeś, i po prostu chcesz wiedzieć, czym jest i gdzie się znajduje.

Wpisy są pogrupowane według klasy, która je posiada, bo w binie ta sama nazwa może pojawić się na więcej niż jednej klasie, a to, w której akurat jesteś, decyduje o tym, co wartość robi.

Czytaj to obok Ruby

Większość tych właściwości zrozumiesz szybciej, ruszając nimi, niż czytając o nich. Ruby podgląda VFX na dowolnym championie i ma wbudowany edytor binów, więc możesz zmienić wartość i patrzeć na viewport zamiast pakować moda, żeby się dowiedzieć, co zrobiła.

Skąd pochodzą te nazwy

Każda klasa, właściwość i typ na tej stronie zostały odczytane z układu klas zarejestrowanego przez sam silnik, sprawdzonego na patchu 16.16. Nazwy pól, które już nie istnieją, zostały usunięte, a te, które żyją na innej klasie, niż można by się spodziewać, mają oznaczone, gdzie faktycznie są. Kilka zachowań jest opisanych tam, gdzie silnik robi coś innego, niż sugeruje nazwa właściwości.

Dane strukturalne znajdziesz tutaj lol-meta-classes. Dokumentację meta klas i ich właściwości znajdziesz też na lol-meta-wiki.


Jak czytać bin

Bin VFX to drzewo. Kręgosłup wygląda tak:

VfxSystemDefinitionData              jeden kompletny efekt, np. recall albo Q
└── complexEmitterDefinitionData     lista emiterów należących do systemu
    └── VfxEmitterDefinitionData     jeden emiter: smuga, błysk, iskry
        ├── primitive                to, co rysuje każda cząstka
        └── wskaźniki *Definition    erozja, paleta, dystorsja, dzieci, ...

VfxSystemDefinitionData jest kontenerem. Właściwość, która nie znajduje się w systemie odtwarzanym podczas umiejętności, nie pojawi się podczas tej umiejętności.

Emiter to miejsce, gdzie spędzasz najwięcej czasu. Sam nosi 135 zarejestrowanych pól i podwiesza kilkanaście opcjonalnych obiektów sub-definicji na wskaźnikach. Pusty wskaźnik oznacza, że cała ta funkcja jest wyłączona, dlatego usunięcie bloku często jest właściwym sposobem na wyłączenie czegoś.

Opakowania wartości

Właściwości liczbowe są zwykle opakowane, żeby silnik mógł trzymać je stałe albo je zmieniać:

rate: embed = ValueFloat {
    constantValue: f32 = 20
}

Opakowania to ValueFloat, ValueColor, ValueVector2 i ValueVector3. Każde zawiera constantValue plus opcjonalny wskaźnik dynamics. To dwa osobne pola, nie dwa zapisy tego samego pola: stała jest zawsze, a dynamics to dodatkowy obiekt podwieszony pod nią.

KluczŻyje naCzym jest
constantValueopakowaniuZapisana wartość. Typ zgodny z opakowaniem: f32, vec4, vec2, vec3
dynamicsopakowaniuWskaźnik na obiekt animowanej zmiennej. Pusty oznacza, że używana jest sama stała
timesobiekcie dynamicsPozycje wzdłuż krzywej
valuesobiekcie dynamicsWartość przy każdym odpowiadającym wpisie w times
probabilityTablesobiekcie dynamicsLosowanie per cząstka. Patrz niżej
probabilityTables mnoży, nie wybiera

Tablica prawdopodobieństwa bywa czytana jako „wylosuj jedną z tych wartości”. Tak nie jest. Każda tablica przepuszcza jednorodne losowanie przez własną krzywą keyTimes do keyValues i zwraca mnożnik, który jest następnie nakładany na constantValue. Losowanie odbywa się raz na cząstkę, przy narodzinach.

Więc constantValue równe 5 z tablicą zwracającą zakres 0.5 do 1 daje każdej cząstce wartość między 2.5 a 5. Tablica, której keyValues przechodzą przez zero, jak -1 do 1, odwróci znak mniej więcej połowie cząstek. To zwykłe wyjaśnienie efektu, w którym część cząstek przewija się lub obraca w przeciwną stronę.

Zwróć uwagę, że keyTimes w tablicy prawdopodobieństwa to oś losowania, a nie wiek cząstki.

Właściwości narodzin i ich partnerzy na czas życia

Wiele właściwości występuje parami. Ta z birth* jest wyliczana raz, w momencie pojawienia się cząstki. Jej partner bez przedrostka działa przez całe życie cząstki i jest mnożony z wartością narodzin, a nie zastępuje jej.

Przy narodzinachPrzez czas życia
birthColorColor
birthScale0scale0
birthRotation0rotation0
birthVelocityvelocity
birthAccelerationacceleration
birthDragdrag

Jeśli wartość wygląda źle, a zapisana jest tylko jedna połowa pary, sprawdź drugą, zanim cokolwiek zmienisz.

Jednostki

Obroty i prędkości obrotowe są w stopniach i stopniach na sekundę. Czasy życia, okresy i opóźnienia są w sekundach. Prędkości przewijania UV są w UV na sekundę, a obrót UV w stopniach. Kanały koloru idą od 0 do 1.

Losowanie i przyrostek 0

Kilka właściwości narodzin kończy się na 0, jak birthScale0 i birthRotation0. To pozostałość po nazewnictwie, nie para minimum-maksimum. Na obecnej klasie emitera nie ma odpowiadającego birthScale1. Zmienność per cząstka pochodzi z probabilityTables, jak wyżej.

Bajty flag

Wiele wartości logicznych nie jest osobnymi polami. To pojedyncze bity upakowane we wspólne bajty flag na emiterze. Narzędzia tekstowe pokazują je pojedynczo jako flag, więc zapisujesz je po kolei, ale żyją po cztery lub osiem w bajcie. Pełna lista jest w Flagi emitera.


Poziom systemu

VfxSystemDefinitionData, najbardziej zewnętrzny kontener. 33 zarejestrowane pola na patchu 16.16.

WłaściwośćTypCo robi
particleNamestringCzytelna nazwa całego systemu. Można ją bezpiecznie zmienić i to najpewniejsza rzecz do wyszukania, gdy hash kontenera nie jest rozwiązany
particlePathstringGrupowanie ścieżek, którego silnik używa do porządkowania systemów
complexEmitterDefinitionDatalist[embed]Emitery należące do tego systemu. Właściwe ciało efektu
simpleEmitterDefinitionDatalist[embed]Starsza lista emiterów. Wciąż obecna w systemach legacy
materialOverrideDefinitionslist[embed]Nadpisania materiałów na poziomie systemu. Emiter ma własną listę o tej samej nazwie
transformmtx44Nakładany na cały system, do skalowania, przesuwania i obracania go jako całości. Patrz Matrix Scaling
flagsu16Flagi bitowe na poziomie systemu. Dwie są znane: 0x100 przełącza prędkość i drag na rozwiązanie analityczne, a 0x800 to agresywny tryb low-spec. Domyślnie 212
mEyeCandyboolOznacza system jako ozdobny, więc znika, gdy gracz włączy ukrywanie efektów ozdobnych
buildUpTimef32Okres rozbiegu systemu
visibilityRadiusf32Promień cullingu
overrideScaleCapoption[f32]Ogranicza, jak bardzo system może być przeskalowany
scaleDynamicallyWithAttachedBoneboolSkala systemu podąża za kością, do której jest przyczepiony
objectPathhashIdentyfikator ścieżki obiektu. Dodany w patchu 16.16
drawingLayeru8Do której warstwy system rysuje
ClockToUseu8Który zegar napędza czas systemu
selfIlluminationf32Ilość samoświecenia
assetRemappingTablelist[embed]Przemapowania assetów stosowane wewnątrz systemu
soundOnCreateDefaultstringDźwięk odtwarzany przy tworzeniu systemu
voiceOverOnCreateDefaultstringKwestia głosowa odtwarzana przy tworzeniu
soundPersistentDefaultstringDźwięk w pętli na czas życia systemu
mEyeCandy jest właściwością systemu

Siedzi na VfxSystemDefinitionData, nie na emiterze, dlatego należy do poziomu systemu w bloku, a nie obok ustawień renderowania emitera.


Emiter: tożsamość i czas życia

VfxEmitterDefinitionData. Wszystko od tego miejsca do Flagi emitera jest na tej klasie, chyba że wiersz mówi inaczej.

WłaściwośćTypCo robi
emitterNamestringCzytelna nazwa jednego emitera. Można bezpiecznie zmienić i warto to robić
disabledboolWyłącza emiter bez usuwania go
importanceu8Priorytet cullingu jakości, sprawdzany względem ustawienia wideo Jakość efektów. Patrz tabela niżej. Domyślnie 2
particleLifetimeValueFloatJak długo żyje każda cząstka po wyemitowaniu. Przy braku wartości domyślnie 3.0. -1 to wartownik, patrz ostrzeżenie niżej
lifetimeoption[f32]Jak długo działa sam emiter
particleLingeroption[f32]Dodatkowe sekundy, przez które cząstki pozostają widoczne po zakończeniu emitera. Przy braku wartości domyślnie particleLifetime + 10, a nie zero
emitterLingeroption[f32]Dodatkowe sekundy, przez które utrzymuje się sam emiter
particleLingerTypeu8Które zachowanie utrzymywania jest używane
LingerpointerVfxLingerDefinitionData, dla utrzymywania, które zmienia cząstkę, a nie tylko opóźnia jej zniknięcie
flexParticleLifetimepointerNadpisanie flex czasu życia cząstki
particleLifetime -1 znaczy dwie przeciwne rzeczy

-1 nie znaczy „nieskończona cząstka”. Znaczy „żyj, dopóki emiter się nie zatrzyma”, a co to daje, zależy całkowicie od isSingleParticle.

Z włączonym isSingleParticle ograniczenie okna emisji jest pomijane, więc okno zostaje bez limitu, emiter nigdy się nie kończy, a cząstka utrzymuje się w nieskończoność. Tak buduje się na stałe przyczepiony rekwizyt.

Bez isSingleParticle gałąź ograniczenia nigdy się nie wykonuje, a okno emisji zostaje na zapisanym lifetime. Emiter kończy tam i zabiera swoje cząstki ze sobą, więc ciągłe -1 znika, zamiast się utrzymywać.

Zapisane 9999 zachowuje się tak samo jak -1.

Jak importance odsiewa

importance jest sprawdzane względem ustawienia Jakość efektów gracza, gdy system buduje swoje emitery. To kategoria, nie skala, a dwie z wartości zachowują się inaczej, niż sugeruje nazwa.

Jakość efektówPomijane wartości importance
0 do 1, Bardzo niska i Niska0, 1, 5
2, Średnia0, 1
3, Wysoka0, 4
4, Bardzo wysoka4

Więc 0 do 3 rosną priorytetem, a 3 jest krytyczne dla rozgrywki i nigdy nie jest odsiewane. 4 to zamiennik niskiej jakości pokazywany tylko na niskich ustawieniach, a 5 odwrotnie, pokazywany dopiero od Średniej w górę. Sparowanie emitera 4 z emiterem 5 to sposób, w jaki jeden efekt dostarcza dwie swoje wersje.

Cztery inne rzeczy decydują, czy emiter w ogóle istnieje: disabled, colorblindVisibility, ChanceToNotExist oraz bit 0x800 we flags systemu, który usuwa wszystko poza importance 3 i 4.

rate, lifetime, particleLifetime i particleLinger są pokazane ze zrzutami ekranu na stronie Emitter Library.


Emiter: emisja i czas

WłaściwośćTypCo robi
rateValueFloatCząstki emitowane na sekundę. Na emiterze isSingleParticle ustawia zamiast tego liczbę cząstek
flexRatepointerNadpisanie flex tempa
rateByVelocityFunctionValueVector2Skaluje tempo zależnie od tego, jak szybko emiter się porusza
MaximumRateByVelocityoption[f32]Górna granica powyższego
timeBeforeFirstEmissionf32Opóźnienie przed pierwszym pojawieniem się czegokolwiek. Przydatne do rozłożenia systemu na etapy
periodoption[f32]Długość jednego cyklu emisji
timeActiveDuringPeriodoption[f32]Jaka część każdego period emiter faktycznie emituje
ChanceToNotExistf32Prawdopodobieństwo, że emiter zostanie całkowicie pominięty przy tworzeniu
SpawnShapepointerIVfxShape określający objętość, w której pojawiają się cząstki
FlexShapeDefinitionpointerWariant flex kształtu pojawiania się
emissionSurfaceDefinitionpointerPojawianie się na powierzchni zamiast w objętości
emissionMeshNamestringMesh używany jako kształt emisji
emissionMeshScalef32Skaluje ten mesh emisji
period i timeActiveDuringPeriod służą do robienia serii

Ustaw period na długość cyklu, a timeActiveDuringPeriod na krótszą wartość, a emiter będzie pulsował zamiast działać ciągle. Pozostawienie obu pustych daje równy strumień.


Emiter: umiejscowienie i orientacja

WłaściwośćTypCo robi
EmitterPositionValueVector3Gdzie cząstki się pojawiają względem początku emitera. Dodatnie Y to góra
translationOverridevec3Przesuwa emiter jako całość
rotationOverridevec3Obraca emiter jako całość
scaleOverridevec3Skaluje emiter jako całość
FlexInstanceScalepointerNadpisanie flex skali instancji
bindWeightValueFloatJak mocno cząstka podąża za tym, do czego jest przypięta. 1 podąża w pełni, 0 zostawia ją w przestrzeni świata
postRotateOrientationAxisvec3Oś używana, gdy ustawione jest hasPostRotateOrientation
offsetLifetimeScalingvec3Skaluje czas życia cząstki tym, jak daleko od emitera się pojawiła, per oś
offsetLifeScalingSymmetryModeu8Tryb symetrii dla powyższego
EmitterPosition czy translationOverride?

EmitterPosition przesuwa miejsce, w którym cząstki pojawiają się wewnątrz emitera. translationOverride przesuwa emiter jako całość. Jeśli jeden emiter jest nie na miejscu, użyj drugiego; jeśli cząstki są źle umieszczone w skądinąd poprawnym emiterze, użyj pierwszego.


Emiter: właściwości narodzin

Stan, jaki cząstka dostaje w chwili pojawienia się. Wszystko o nazwie birth* to warunek początkowy, a nie ciągły.

WłaściwośćTypCo robi
birthColorValueColorKolor startowy, RGBA
birthScale0ValueVector3Rozmiar startowy
birthRotation0ValueVector3Obrót startowy
birthRotationalVelocity0ValueVector3Startowa prędkość obrotu
birthRotationalAccelerationValueVector3Startowe przyspieszenie obrotowe
birthVelocityValueVector3Prędkość startowa
birthAccelerationValueVector3Przyspieszenie startowe
birthDragValueVector3Startowy drag
birthOrbitalVelocityValueVector3Obrót orbitalny. Patrz ostrzeżenie niżej
birthFrameRateValueFloatStartowe tempo odtwarzania animowanej tekstury
birthUVOffsetValueVector2Startowe przesunięcie w teksturze. Przydatne do desynchronizacji cząstek dzielących jeden arkusz
birthUvScrollRateValueVector2Startowe tempo przewijania UV
birthUvRotateRateValueFloatStartowe tempo obrotu UV

Każda z nich ma rodzeństwo flex* (flexBirthVelocity, flexBirthUVOffset, flexScaleBirthScale i tak dalej), które ją nadpisuje, gdy podana jest wartość flex.

birthOrbitalVelocity nie dodaje żadnej prędkości

Wbrew nazwie ta właściwość nie wnosi nic do prędkości cząstki. Działa wyłącznie na transformację: obraca własną macierz cząstki, podczas gdy jej zapisana pozycja nadal przesuwa się wyłącznie za sprawą birthVelocity i sił.

To ma znaczenie, jeśli rozważasz, jak daleko cząstka przelatuje. Potraktowanie tego jako prędkości stycznej dołożonej do obrotu liczy ruch dwa razy i daje dokładnie podwójną długość toru.


Emiter: ruch przez czas życia

Tam gdzie birth* ustawia stan startowy, te działają dalej.

WłaściwośćTypCo robi
velocityValueVector3Prędkość przez czas życia cząstki
accelerationValueVector3Przyspieszenie przez czas życia
worldAccelerationIntegratedValueVector3Przyspieszenie w przestrzeni świata niezależnie od orientacji cząstki. Grawitacja mieszka tutaj, jako ujemne Y
dragValueVector3Drag przez czas życia
scale0ValueVector3Skala przez czas życia, mnożona z birthScale0
rotation0IntegratedValueVector3Obrót przez czas życia
directionVelocityScalef32Jak bardzo cząstka rozciąga się wzdłuż kierunku ruchu wraz z prędkością. Używane z isDirectionOriented
directionVelocityMinScalef32Dolna granica tego rozciągnięcia
fieldCollectionDefinitionpointerPola sił. Patrz Pola sił

Emiter: kolor

WłaściwośćTypCo robi
birthColorValueColorKolor przy pojawieniu się
ColorValueColorKolor przez czas życia cząstki, mnożony z birthColor. Domyślnie biały
colorLookUpTypeX / colorLookUpTypeYu8Co napędza każdą oś odczytu z particleColorTexture, na przykład wiek cząstki
colorLookUpScalesvec2Skala nakładana na te współrzędne odczytu. Domyślnie 1, 1
colorLookUpOffsetsvec2Przesunięcie nakładane na te współrzędne odczytu
colorRenderFlagsu8Flagi bitowe wpływające na to, jak kolor jest nakładany przy renderowaniu
modulationFactorvec4Modulacja nakładana na finalny kolor
censorModulateValuevec4Kolor używany, gdy treść jest cenzurowana dla regionu
paletteDefinitionpointerVfxPaletteDefinitionData. Patrz Paleta
colorblindVisibilityu80 zawsze widoczne, 1 tylko w trybie normalnym, 2 tylko w trybie dla daltonistów

Czytanie wartości RGBA

birthColor: embed = ValueColor {
    constantValue: vec4 = { 1, 0.7059, 0, 1 }
}

Kanały idą od 0 do 1, a nie od 0 do 255. Żeby przeliczyć, podziel przez 255. Kanał zielony powyżej to 180, a 180 / 255 daje 0.7059.

Czwarta wartość to alfa, gdzie 0 jest całkowicie przezroczyste, a 1 całkowicie nieprzezroczyste.

Do przekolorowywania w praktyce Quartz liczy za ciebie.


Emiter: tekstura i UV

WłaściwośćTypCo robi
texturestring.dds albo .tex, który emiter rysuje. Patrz File Formats
particleColorTexturestringGradient próbkowany do kolorowania cząstek, zwykle przez ich czas życia. Celowany przez pola colorLookUp*
falloffTexturestringTekstura rampy wygaszania
textureMultpointerVfxTextureMultDefinitionData, a nie zwykły string. Patrz Texture mult
texDivvec2Dzieli teksturę na siatkę, na potrzeby animacji z arkusza
startFrameu16Pierwsza klatka animowanego arkusza
numFramesu16Ile klatek zawiera arkusz
frameRatef32Jak szybko te klatki lecą
uvModeu8Jak interpretowane są współrzędne UV
texAddressModeBaseu8Zawijanie, clamp albo lustro dla tekstury bazowej
uvRotationValueFloatObraca teksturę
uvScaleValueVector2Skaluje teksturę
uvTransformCentervec2Punkt obrotu dla rotacji i skali UV
uvParallaxScalef32Siła paralaksy na UV
emitterUvScrollRatevec2Tempo przewijania nakładane per emiter
particleUVScrollRateIntegratedValueVector2Tempo przewijania nakładane per cząstka
particleUVRotateRateIntegratedValueFloatTempo obrotu nakładane per cząstka
isTexturePixelatedboolPróbkowanie najbliższego sąsiada zamiast gładkiego filtrowania
Nie ma zwykłego scrollRate

Przewijanie jest zawsze zawężone do tego, na co wpływa. Na nowoczesnym emiterze pola to birthUvScrollRate, emitterUvScrollRate i particleUVScrollRate. Samo uvScrollRate istnieje wyłącznie na klasie legacy opisanej w Model komponentowy legacy.


Emiter: stan renderowania

WłaściwośćTypCo robi
blendModeu8Jak cząstka miesza się z tym, co jest za nią. Pełna tabela niżej
miscRenderFlagsu8Bity stanu głębi i mieszania. Patrz ostrzeżenie niżej
meshRenderFlagsu8Flagi renderowania dla prymitywów mesh
colorRenderFlagsu8Flagi renderowania wpływające na kolor
passi16Kolejność rysowania. Niższe rysuje się pierwsze i ląduje pod spodem
renderPhaseOverrideu8Wymusza konkretną fazę renderowania emitera. Domyślnie 7, czyli brak nadpisania
depthBiasFactorsvec2Przesuwa głębię, żeby współpłaszczyznowe powierzchnie się nie biły
DepthPushPullf32Popycha lub ciągnie cząstkę wzdłuż głębi. Domyślnie 0. Shader nazywa to PARTICLE_DEPTH_PUSH_PULL
alphaRefu8Próg testu alfa, 0 do 255. Piksele poniżej są odrzucane. Domyślnie 5
stencilModeu8Zachowanie stencila
stencilRefu8Wartość odniesienia stencila
StencilReferenceIdhashNazwane odniesienie stencila
disableBackfaceCullboolRysuje obie strony każdej ściany
softParticleParamspointerVfxSoftParticleDefinitionData. Patrz Soft particles
sliceTechniqueRangef32Zasięg techniki slice
CustomMaterialpointerVfxMaterialDefinitionData zastępujący domyślny materiał
materialOverrideDefinitionslist[embed]Nadpisania per materiał dla tego emitera
FilteringpointerVfxEmitterFiltering, kontrolujący, gdzie emiter ma prawo się pokazać
AudiopointerVfxEmitterAudio

Wartości blendMode

Są stałe i takie same dla każdego prymitywu. Każdy tryb wybiera źródłowy i docelowy współczynnik mieszania oraz operację mieszania.

TrybSrcDestOpZapisuje głębięMieszanie
0ONEONEADDnietak
1SRC_ALPHAINV_SRC_ALPHAADDnietak
2ZEROINV_SRC_COLORADDnietak
3taknie
4SRC_ALPHAONEADDnietak
5ONEINV_SRC_ALPHAADDnietak
6ONEONEMINnietak
7ONEONEMAXnietak
8INV_DEST_ALPHADEST_ALPHAADDnietak

Jak czytać tę tabelę w praktyce:

  • 0 i 4 to tryby addytywne. Czerń nic nie wnosi, więc to te, które bezpiecznie przekolorować w stronę czerni.
  • 1 to standardowe mieszanie alfa, najbliższe temu, co nazwiesz „normalnym”.
  • 2 przyciemnia, bo mnoży przez odwrotność koloru źródłowego.
  • 3 to tryb nieprzezroczysty. Jedyny, który zapisuje głębię, i jedyny, który w ogóle nie miesza.
  • 6 i 7 biorą minimum albo maksimum ze źródła i celu zamiast dodawać.
Bit 0 w miscRenderFlags wyłącza test głębi, odwrotnie

Bit 0 odpowiada DepthEnable w stanie depth-stencil i jest odwrócony: gdy bit jest ustawiony, test głębi jest wyłączony. Ustawienie miscRenderFlags na 1 sprawia, że cząstka rysuje się przez geometrię.

To nie jest flaga odwracania ścian, a odczyt, że wartość 4 wyłącza zapis głębi przy włączonym teście, nie broni się. O zapisie głębi decyduje blendMode i włącza go tylko tryb 3.

Używane porównanie to LESS_EQUAL, a nie LESS, i właśnie to pozwala współpłaszczyznowemu decalowi na ziemi w ogóle się narysować.


Flagi emitera

Cztery bajty na emiterze, każdy niosący do ośmiu nazwanych bitów. Narzędzia tekstowe pokazują je pojedynczo jako flag.

FlagaCo robi
TextureFlipU / TextureFlipVLustro tekstury na każdej osi
particleIsLocalOrientationOrientacja cząstki czytana w przestrzeni lokalnej
isLocalOrientationOrientacja emitera czytana w przestrzeni lokalnej
isDirectionOrientedCząstki orientują się wzdłuż kierunku ruchu
isUniformScaleSkala zablokowana na jednej wartości dla wszystkich osi
hasPostRotateOrientationNakłada postRotateOrientationAxis po obrocie
isRandomStartFrameKażda cząstka startuje na losowej klatce arkusza
doesCastShadowEmiter wnosi wkład do cieni
isRotationEnabledW ogóle włącza obrót
uvScrollClampClampuje przewijanie UV zamiast je zawijać
isFollowingTerrainCząstki podążają za wysokością terenu
isGroundLayerRysuje jako warstwa naziemna
useEmissionMeshNormalForBirthCząstki wylatują wzdłuż normalnych mesha emisji
useNavmeshMaskMaskuje efekt terenem, żeby nie wylewał się na ściany
ParticlesShareRandomValueWszystkie cząstki losują tę samą wartość
SortEmittersByPosSortuje emitery według pozycji
IsEmitterSpaceCząstki symulowane w przestrzeni emitera, a nie świata
HasVariableStartTimeCzas startu różni się per cząstka
isSingleParticleDokładnie jedna cząstka zamiast strumienia
doesParticleLifetimeScaleCzas życia cząstki skaluje się z systemem
doesLifetimeScaleCzas życia emitera skaluje się z systemem
WriteAlphaOnlyZapisuje wyłącznie kanał alfa

Prymitywy

primitive to wskaźnik decydujący o tym, co rysuje każda cząstka. Pozostawienie go pustym daje domyślny billboardowy quad zwrócony do kamery.

KlasaCo rysuje
VfxPrimitiveCameraQuadPłaski quad zawsze zwrócony do kamery. Domyślny i większość cząstek, które spotkasz
VfxPrimitiveCameraUnitQuadQuad zwrócony do kamery o jednostkowym rozmiarze
VfxPrimitiveArbitraryQuadQuad o stałej orientacji, niezwrócony do kamery
VfxPrimitiveMeshMesh
VfxPrimitiveAttachedMeshMesh przyczepiony do kości. Dodaje UseAvatarSpecificSubmeshMask
VfxPrimitiveCameraTrailSmuga zwrócona do kamery
VfxPrimitiveArbitraryTrailSmuga o stałej orientacji
VfxPrimitiveRibbonWstęga
VfxPrimitiveBeamWiązka między dwoma punktami
VfxPrimitiveCameraSegmentBeamSegmentowana wiązka zwrócona do kamery
VfxPrimitiveCameraSegmentSeriesBeamSeria segmentowanych wiązek
VfxPrimitiveLaserLaser
VfxPrimitivePlanarProjectionRzutuje teksturę na płaszczyznę. Decale na ziemi
VfxPrimitiveRayPromień
VfxPrimitiveNonRenderableNie rysuje nic. Dla emiterów istniejących tylko po to, by tworzyć dzieci albo napędzać logikę

Pola mesha

Prymitywy mesh niosą VfxMeshDefinitionData w mMesh. Zwróć uwagę na przedrostki m: nie pisze się ich tak jak własnych pól emitera.

WłaściwośćTypCo robi
mMeshNamestringMesh do narysowania
mMeshSkeletonNamestringSzkielet dla animowanego mesha
mSimpleMeshNamestringProsty mesh .scb albo .sco
mSubmeshesToDrawlist[string]Które submeshe się renderują
mSubmeshesToDrawAlwayslist[string]Submeshe renderowane zawsze
mLockMeshToAttachmentboolBlokuje mesh na punkcie przyczepienia
mAnimationNamestringAnimacja odtwarzana na meshu
mAnimationVariantslist[string]Alternatywne animacje

Prymitywy mesh niosą też AlignPitchToCamera i AlignYawToCamera na VfxPrimitiveMeshBase.

Typy plików mesh

RozszerzenieCzym jest
.scbMesh statyczny, binarny
.scoMesh statyczny, tekst ASCII, niesie jointy i materiały
.sknMesh z riggiem, standard dla modeli championów
.sklSzkielet sparowany z .skn

Para .skn i .skl w folderze cząstek oznacza animowany mesh. Patrz Meshes as Particles.

Smuga i wstęga

VfxPrimitiveTrailBase niesie VfxTrailDefinitionData w mTrail:

WłaściwośćTypCo robi
mBirthTilingSizeValueVector3Rozmiar kafelkowania przy narodzinach
mCutofff32Długość łuku, przy której smuga przestaje być przedłużana
mMaxAddedPerFramei32Limit punktów dodawanych na klatkę
mSmoothingModeu8Wygładzanie stosowane wzdłuż smugi
mModeu8Tryb smugi

VfxRibbonDefinitionData niesie birthTilingSize jako ValueVector2.


Klasy sub-definicji

Każda z nich wisi na wskaźniku na emiterze. Pusty oznacza, że funkcja jest całkowicie wyłączona.

Texture mult

VfxTextureMultDefinitionData. Druga tekstura mnożona przez bazową, ta sama idea co Multiply w edytorze grafiki. Pole textureMult emitera wskazuje na ten obiekt, a właściwa nazwa pliku to string textureMult w jego wnętrzu.

WłaściwośćTypCo robi
textureMultstringTekstura mnożąca
texDivMultvec2Podział na siatkę dla tekstury mnożącej
texAddressModeMultu8Tryb zawijania
uvScaleMultValueVector2Skala na UV mnożenia
UvRotationMultValueFloatObrót na UV mnożenia
uvTransformCenterMultvec2Punkt obrotu dla tej rotacji i skali
birthUvScrollRateMultValueVector2Tempo przewijania przy narodzinach
emitterUvScrollRateMultvec2Tempo przewijania per emiter
birthUVOffsetMultValueVector2Startowe przesunięcie UV
birthUvRotateRateMultValueFloatStartowe tempo obrotu UV
ParticleIntegratedUvScrollMultIntegratedValueVector2Przewijanie per cząstka
ParticleIntegratedUvRotateMultIntegratedValueFloatObrót per cząstka

Jej bajt flag niesie uvScrollAlphaMult, uvScrollClampMult, TextureMultFilpU, TextureMultFilpV i isRandomStartFrameMult. Te dwa naprawdę są tak zapisane w silniku, więc szukaj „Filp”, a nie „Flip”, kiedy będziesz ich szukał.

Paleta

VfxPaletteDefinitionData. Koloruje cząstki, próbkując teksturę gradientu zamiast używać płaskiej wartości.

WłaściwośćTypCo robi
paletteTexturestringObraz gradientu
PaletteTextureAddressModeu8Tryb zawijania dla gradientu
paletteSelectorValueVector3Gdzie w palecie próbkować
palleteSrcMixColorValueColorKolor mieszany z wynikiem próbkowania
PaletteUAnimationCurveValueFloatAnimuje współrzędną U
PaletteVAnimationCurveValueFloatAnimuje współrzędną V
paletteCounti32Liczba palet w teksturze
Palette czy Pallete?

Klasa i większość pól używają poprawnej pisowni. Literówka samego silnika przetrwała w dokładnie jednym polu, palleteSrcMixColor, więc szukanie „pallete” w binie ominie prawie wszystko. Szukaj „palette”.

Erozja alfa

VfxAlphaErosionDefinitionData. Rozpuszcza cząstkę za pomocą mapy. Tak zbudowany jest praktycznie każdy efekt wypalania się albo wycierania.

WłaściwośćTypCo robi
erosionMapNamestringTekstura erozji
erosionMapAddressModeu8Tryb zawijania dla mapy
erosionMapChannelMixerValueColorKtóre kanały mapy są używane i w jakim stopniu
erosionDriveCurveValueFloatJak erozja postępuje
erosionDriveSourceu8Co ją napędza, na przykład wiek cząstki
erosionFeatherIn / erosionFeatherOutf32Miękkość na każdym brzegu granicy
erosionSliceWidthf32Szerokość erodującego pasa
LingerErosionDriveCurveValueFloatOsobna krzywa używana podczas utrzymywania
UseLingerErosionDriveCurveboolWłącza tę osobną krzywą

Mapa erozji jest zwykle w odcieniach szarości, gdzie biel eroduje pierwsza, a czerń ostatnia. Mapy wielokanałowe niosą niezależny wzór na każdy kanał koloru, a erosionMapChannelMixer wybiera między nimi.

Dystorsja

VfxDistortionDefinitionData. Zniekształca to, co jest narysowane za cząstką. Fale uderzeniowe i drgania powietrza.

WłaściwośćTypCo robi
normalMapTexturestringNormal mapa napędzająca dystorsję
distortionf32Siła
distortionModeu8Który tryb dystorsji jest używany

Odbicie i fresnel

VfxReflectionDefinitionData. Blok obwódki świetlnej i odbicia. fresnel mieszka tutaj, nie na emiterze.

WłaściwośćTypCo robi
reflectionMapTexturestringMapa odbicia
reflectionOpacityDirectf32Siła odbicia na wprost
reflectionOpacityGlancingf32Siła odbicia pod kątem ślizgowym
reflectionFresnelf32Człon fresnela dla odbicia
reflectionFresnelColorvec4Kolor tego członu
fresnelf32Siła fresnela, obwódka świetlna pod kątem ślizgowym
fresnelColorvec4Kolor tej obwódki

Soft particles

VfxSoftParticleDefinitionData. Zmiękcza ostry szew tam, gdzie cząstka przecina geometrię.

WłaściwośćTypCo robi
beginInf32Przesunięcie przed rozpoczęciem wygaszania do wewnątrz
beginOutf32Przesunięcie przed rozpoczęciem wygaszania na zewnątrz
deltaInf32Dystans, jaki pokrywa wygaszanie do wewnątrz
deltaOutf32Dystans, jaki pokrywa wygaszanie na zewnątrz

Jest jeszcze piąty bajt trybu wybierający, które z dwóch wygaszeń działa. Pusty wskaźnik softParticleParams wyłącza funkcję całkowicie i nie ma osobnego pola włącz/wyłącz.

Linger

VfxLingerDefinitionData. Zmienia cząstkę podczas fazy utrzymywania, zamiast tylko opóźniać jej usunięcie.

WłaściwośćTypCo robi
LingerRotationValueVector3Obrót nakładany podczas utrzymywania
LingerScaleValueVector3Skala nakładana podczas utrzymywania
KeyedLingerVelocityValueVector3Prędkość podczas utrzymywania
KeyedLingerAccelerationValueVector3Przyspieszenie podczas utrzymywania
KeyedLingerDragValueVector3Drag podczas utrzymywania
SeparateLingerColorValueColorInny kolor podczas utrzymywania

Każda ma odpowiadającą flagę Use*: UseLingerRotation, UseLingerScale, UseKeyedLingerVelocity, UseKeyedLingerAcceleration, UseKeyedLingerDrag i UseSeparateLingerColor. Ustawienie wartości bez jej flagi nic nie daje.

Materiały i drivery

VfxMaterialDefinitionData trzyma link Material i mapę materialDrivers. Drivery animują parametr materiału, zamiast trzymać go stałym.

KlasaCo robi
VfxColorOverLifeMaterialDriverNapędza kolor przez czas życia cząstki
VfxFloatOverLifeMaterialDriverNapędza pojedynczy float przez czas życia
VfxSineMaterialDriverRozkołysuje wartość po sinusoidzie, do pulsowania

Do pracy z glowem i toon shaderem patrz Static Materials.


Pola sił

VfxFieldCollectionDefinitionData, osiągane przez fieldCollectionDefinition emitera. Tam gdzie birthVelocity wprawia cząstkę w ruch, pole działa na nią dalej.

WłaściwośćTypCo robi
fieldAccelerationDefinitionslist[embed]Stałe przyspieszenie, na przykład grawitacja
fieldAttractionDefinitionslist[embed]Przyciąga cząstki do punktu
fieldDragDefinitionslist[embed]Spowalnia cząstki
fieldNoiseDefinitionslist[embed]Dokłada turbulencję
fieldOrbitalDefinitionslist[embed]Obraca cząstki wokół osi

Kształty emisji

SpawnShape wskazuje na IVfxShape.

KlasaCo robi
VfxShapeSpherePojawianie się w kuli, z radius
VfxShapeBoxPojawianie się w prostopadłościanie
VfxShapeCylinderPojawianie się w cylindrze
VfxShapeVolumeWspólne zachowanie objętości, niesie własne flags
VfxShapeLegacyStarszy system kształtów, wciąż obecny w wielu efektach

VfxEmissionMeshData obsługuje pojawianie się z mesha, z meshName, skeletonName, AnimationName, meshScale, maxJointWeights, Submeshes i useSurfaceNormalForBirthPhysics.


Cząstki potomne

VfxChildParticleSetDefinitionData, osiągane przez childParticleSetDefinition emitera. Tak smuga sypie iskrami, a eksplozja rozrzuca odłamki.

WłaściwośćTypCo robi
childrenIdentifierslist[embed]Systemy potomne do utworzenia, jako wpisy VfxChildIdentifier
boneToSpawnAtlist[string]Kości, na których pojawiają się dzieci
childrenProbabilityValueFloatSzansa, że dziecko w ogóle się pojawi
childEmitOnDeathboolUtwórz dziecko przy śmierci cząstki rodzicielskiej, a nie przy jej narodzinach
ParentInheritanceDefinitionpointerVfxParentInheritanceParams decydujący, co dziecko dziedziczy

VfxChildIdentifier trzyma effect (link), effectKey (hash) i effectName (string).

VfxParentInheritanceParams trzyma Mode i RelativeOffset. To przesunięcie jest pełnoprawnym kanałem względem rodzica, osobnym od własnego EmitterPosition dziecka.

Dzieci pojawiają się raz, przy narodzinach

Nie ma ciągłego zasilania z rodzica do dziecka. System potomny jest tworzony dokładnie raz, w chwili narodzin niosącej go cząstki, i od tego momentu działa jako niezależny system na własnym zegarze. Jedynym demontażem jest śmierć cząstki nosiciela.

Konsekwencja warta zapamiętania: dla nosiciela isSingleParticle istnieje dokładnie jedna cząstka, a więc dokładnie jedno utworzenie dziecka, i zamknięcie okna emisji rodzica nie może tego zatrzymać.

Dziedziczenie to tryb, nie stały łańcuch

To, co dziecko dziedziczy po rodzicu, decyduje wartość Mode na VfxParentInheritanceParams. Gdy nie zapisano żadnego ParentInheritanceDefinition, dziecko działa w trybie domyślnym. Każdy model myślowy zakładający jeden stały zestaw dziedziczonych rzeczy będzie trafny dla domyślnego i błędny dla reszty.

Systemy potomne zagnieżdżają się, a silnik obchodzi je wgłąb, więc trzypoziomowe zagnieżdżenie składa się na każdym poziomie.

Częstym wzorcem jest emiter rodzicielski na VfxPrimitiveNonRenderable: nic nie rysuje i istnieje wyłącznie po to, by rozmieścić swoje dzieci.


Model komponentowy legacy

Starsze efekty używają drugiego, komponentowego modelu emitera, wciąż dostarczanego w silniku. Spotkasz go przy championach z długim stażem. Jest tu udokumentowany po to, żebyś go rozpoznał, a nie po to, żebyś pisał w nim nowe rzeczy.

KlasaRozmiarRola
VfxEmitterLegacySimple13 pólProsty emiter legacy, osiągany przez wskaźnik LegacySimple emitera
VfxLegacyRenderComponent66 pólStan renderowania legacy
VfxLegacyPhysicsComponent37 pólRuch i umiejscowienie legacy
VfxLegacyLifetimeComponent17 pólCzas legacy
VfxLegacyGeometryComponent1 poleGeometria legacy

Wiele nazw pojawia się na obu modelach. blendMode, texture, bindWeight, birthVelocity, particleLifetime i inne istnieją na nowoczesnym emiterze oraz na komponencie legacy, pod innymi offsetami. Gdy wartość zdaje się nie działać, sprawdź, który z dwóch faktycznie edytujesz.

Trzy nazwy istnieją wyłącznie na modelu legacy:

WłaściwośćTypŻyje na
uvScrollRatevec2VfxEmitterLegacySimple
particleBindvec2VfxEmitterLegacySimple
lockedToEmitterboolVfxEmitterLegacySimple

VfxEmitterLegacySimple niesie też birthScale, scale, birthRotation, birthRotationalVelocity, rotation, scaleBias, orientation, fixedOrbitType, hasFixedOrbit i scaleUpFromOrigin. Zwróć uwagę na birthScale i birthRotation bez przyrostka, w odróżnieniu od birthScale0 i birthRotation0 na nowoczesnym emiterze.

Wskaźnik LegacySimple to to, czego używają emitery z listy simpleEmitterDefinitionData systemu. Jeśli system wypełnia tę listę zamiast complexEmitterDefinitionData, to właśnie ten blok czytają jego emitery.

Właściwości, które emiter utracił

Cztery właściwości emitera zostały wycofane i pojawią się już tylko w starych binach albo starej dokumentacji.

WłaściwośćUsunięta wZastąpiona przez
shape14.1SpawnShape
Material14.1CustomMaterial i materialOverrideDefinitions
materialDrivers14.1Mapa materialDrivers na VfxMaterialDefinitionData
flexOffset15.11Nic bezpośrednio

assetCategory została usunięta z VfxSystemDefinitionData w patchu 14.15.


Rzeczy, które łatwo źle zrozumieć

Krótka lista błędnych odczytów, które kosztują najwięcej czasu.

ZałożenieJak jest naprawdę
birthScale0 i birthScale1 to para min-maksNie ma birthScale1. 0 to pozostałość po nazewnictwie, a losowość pochodzi z probabilityTables
probabilityTables wybiera jedną wartość ze zbioruMnoży constantValue przez losowanie, raz na cząstkę
birthOrbitalVelocity dodaje ruch orbitalnyDziała tylko na transformację i nie wnosi żadnej prędkości
miscRenderFlags odwraca ścianyBit 0 wyłącza test głębi, odwrotnie, więc 1 oznacza test wyłączony
Znaczenie blendMode zależy od prymitywuStan mieszania jest taki sam dla każdego prymitywu. Tylko tryb 3 zapisuje głębię
textureMult to nazwa plikuTo wskaźnik na całą klasę definicji. Nazwa pliku jest polem w środku
mEyeCandy to ustawienie emiteraJest na systemie
Istnieje zwykłe scrollRateIstnieją tylko warianty zawężone, plus uvScrollRate wyłącznie legacy
Istnieje pole włącz/wyłącz soft particlePusty wskaźnik softParticleParams jest wyłącznikiem
particleLifetime równe -1 znaczy nieskończona cząstkaZnaczy „żyj, dopóki emiter się nie zatrzyma”. Utrzymuje się tylko w parze z isSingleParticle
Brak particleLinger znaczy zeroDomyślnie wynosi particleLifetime + 10
Dziecko ginie, gdy zamyka się okno emitera rodzicaDziecko jest niezależnym systemem. Kończy się, gdy wyczerpią się jego własne emitery albo gdy zniknie niosąca je cząstka

Nazwy i typy na tej stronie zostały odczytane z układu klas zarejestrowanego przez silnik dla patcha 16.16. Jeśli jakiejś właściwości brakuje albo opis jest błędny, warto to poprawić: patrz Jak współtworzyć.