Regras e orçamentos comuns para implementar os VFX das quatro classes com custo mínimo no servidor e no cliente. Aplica-se a todas as skills do guia de VFX; o Cleanse do Fighter é o exemplo trabalhado no fim.
Nenhum VFX tem lógica, timers ou RPCs próprios no servidor. Tudo é disparado por GameplayCues associados a habilidades e efeitos que já são replicados.
Cues condicionais (proc, "havia debuffs", stance) viajam nos FGameplayCueParameters do próprio cue, sem mensagens extra.
Cada skill cabe no orçamento do seu tipo de geometria (secção 04). Exceder exige justificação e medição.
Emissores GPU ou com trajetória analítica por defeito; CPU só quando a contagem é pequena e precisa de colisão ou de eventos.
O próprio jogador vê a versão completa; os outros degradam por distância e por quantidade de efeitos em ecrã, até ficar só a silhueta.
Brilho por emissive + bloom global do jogo. Luz dinâmica só em Epic, só para o próprio, sem sombras. Nada de distorção nem translucência lit.
O servidor ativa a GA ou aplica o GE — isto já é replicado.
O GE ou a GA dispara o cue com a tag da skill e os parâmetros condicionais.
O cliente que lança prevê o cue localmente; não espera pelo servidor.
Os outros clientes recebem o cue pela replicação do ASC (multicast não fiável).
Não executa cues nem Niagara — confirmar que nenhum Blueprint de VFX corre lá.
| Situação | Classe de cue | Quando usar |
|---|---|---|
| Impacto instantâneo (cast, hit, proc) | UGameplayCueNotify_Burst | Por defeito. Não instanciado, sem actor, spawn de Niagara pelo pool. |
| Instantâneo com sequência temporizada | AGameplayCueNotify_BurstLatent | Só se precisar de vários momentos que o Niagara não consiga fazer sozinho. Evitar se possível. |
| Estados com duração (buff, debuff, CC, stance, aura, área persistente) | AGameplayCueNotify_Looping | Ligado ao GE; os efeitos de remoção tocam quando o GE sai. É aqui que vive a "quebra" dos debuffs. |
| Cosmético puro derivado de estado já replicado | ExecuteGameplayCueLocal | Quando cada cliente já sabe o que aconteceu (ex.: troca de stance vista via tag replicada). Zero tráfego. |
RawMagnitude como bitmask ou em AggregatedSourceTags. Nunca num RPC separado.Mixed; NPCs em Minimal. Os cues continuam a chegar aos proxies.| Effect Type | Para | Distância máx. | Instâncias máx. | Culling / reação |
|---|---|---|---|---|
EFT_Combat_Burst | Casts, impactos, procs | 40 m | 32 detalhadas | Significance por distância; acima do limite, os menos significativos passam ao nível Baixo |
EFT_Combat_Projectile | Projéteis, skillshots, linhas | 50 m | 48 | Trail reduzido ao longe; só núcleo no nível Baixo |
EFT_Area_Persistent | Áreas no chão, channels | 45 m | 16 | Nunca cortar o contorno da área (é informação de gameplay); cortar só o interior animado |
EFT_Status | Buffs, debuffs, CC, stances | 30 m | 64 | Fora do ecrã: pausa. Ao longe: só a marca base, sem partículas |
SpawnSystemAtLocation / SpawnSystemAttached com ENCPoolMethod::AutoRelease; fazer o prime do pool das skills mais comuns ao carregar a classe.Valores de partida para o nível Alto do próprio jogador; Médio ≈ 50 % das partículas; Baixo mantém só as camadas marcadas como silhueta. Validar com medição (secção 06) e ajustar por tipo, não por skill.
| Tipo | Draw calls | Partículas | Duração | Silhueta (fica em Baixo) | Notas |
|---|---|---|---|---|---|
| Cone / cleave | ≤ 3 | ≤ 40 | ≤ 0,6 s | Arco/cone em malha | Arco numa só malha; faíscas só no hit confirmado |
| Linha / skillshot | ≤ 3 | ≤ 40 | ≤ 0,8 s | Faixa em malha | Telegraph em decal ou quad; nunca ribbon longo com muitos segmentos |
| Projétil | ≤ 3 + 2 impacto | ≤ 30 voo · ≤ 40 impacto | voo + 0,6 s | Núcleo | Trail com ≤ 16 segmentos; impacto é um cue Burst separado |
| Tether | ≤ 2 | ≤ 20 | enquanto ligado | Ribbon fino | Um ribbon de 2 pontos + UV panning no material; pulsos por material, não por partículas |
| Rush / teleporte | ≤ 3 | ≤ 30 | ≤ 0,5 s | Chegada | Máx. 1 silhueta residual; o maior contraste no destino |
| AoE instantânea | ≤ 4 | ≤ 50 | ≤ 1,5 s | Anel + brilho no chão | O Cleanse cabe aqui (exemplo na secção 07) |
| Channel | ≤ 3 | ≤ 30 vivas | enquanto canaliza | Forma principal | Taxa de spawn baixa e constante; animação no material, não em spawn |
| Área persistente | ≤ 3 | ≤ 30 vivas | duração do GE | Contorno da área | Contorno em decal ou malha; interior com shader de ruído, poucas partículas |
| Stance / toggle | ≤ 2 | ≤ 10 | pulso ≤ 0,3 s | Marcador nos pés | Marcador persistente é malha estática com material; o pulso é Burst |
| Proc / passivo | ≤ 2 | ≤ 12 | ≤ 0,4 s | — | Só no evento; nunca aura contínua |
| Status (buff, debuff, CC) | ≤ 2 | 0 contínuas | duração do GE | Marca base | Aplicar/remover são Bursts pequenos; o estado em si é malha + material animado |
Por defeito nenhuma. Exceção: Niagara Light Renderer só em Epic, só no cast do próprio jogador, sem sombras, raio ≤ 6 m e vida ≤ 0,4 s. O "brilho no chão" em quad aditivo substitui-a nos outros níveis.
| Master material | Blend / shading | Uso | Parâmetros |
|---|---|---|---|
M_VFX_Additive | Additive · Unlit | Anéis, faíscas, brilho no chão, núcleos | Cor e intensidade por partícula; máscara em textura partilhada |
M_VFX_Flipbook | Translucent · Unlit · depth fade | Poeira, fumo | SubUV; fade de profundidade curto; sem iluminação da translucência |
M_VFX_Dissolve | Masked · Unlit ou Default Lit | Marcas de status e a sua quebra | Dissolve e cor da orla por Custom Primitive Data (sem criar instâncias dinâmicas de material) |
M_VFX_Ribbon | Additive · Unlit | Tethers, trails | UV panning e pulso por parâmetro |
stat Niagara e o Niagara Debugger: instâncias e partículas dentro do orçamento do tipo.stat GPU, ProfileGPU e Unreal Insights: custo de translucência e de Niagara GPU antes/depois da skill.Estados: dentro até +20 % com justificação acima: rever antes de integrar
GameplayCue.Fighter.Cleanse · UGameplayCueNotify_Burst · EFT_Combat_BurstRawMagnitude bitmask: 1 = removeu debuffs, 2 = cancelou displacement. Location = root do Fighter.GameplayCue.Status.Debuff.* (Looping). Ao ser removido, toca o dissolve (CPD) + burst de 7 partículas. Em Baixo, só o dissolve.NS_Fighter_Cleanse, bounds fixos 6×6×3 m, pool com prime de 8| Emissor | Sim | Epic | Alto | Médio | Baixo | Material |
|---|---|---|---|---|---|---|
| Anel (malha de 5+7 arcos) | CPU · 1 mesh | 1 | 1 | 1 | 1 | M_VFX_Additive |
| Brilho no chão (quad) | CPU · 1 mesh | 1 | 1 | 1 | 1 | M_VFX_Additive |
| Faíscas (velocity aligned) | GPU | 10 + 40 | 40 | 20 | 0 | M_VFX_Additive |
| Poeira (flipbook 2×2) | GPU | 10 | 10 | 6 | 0 | M_VFX_Flipbook |
| Luz | Light renderer | próprio, sem sombras | — | — | — | — |
Timing: antecipação 0–90 ms (brilho nos pés) → anel expande 90–280 ms (ease-out exponencial) → dissipa até 540 ms → faíscas até ~1 s → poeira até 1,7 s. Protótipo interativo com contadores: Cleanse · VFX.