SanctaMMO · Unreal Engine 5 · GAS + Niagara

Ficha técnica de VFX das skills

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.

01

Princípios

S1 O servidor não sabe que o VFX existe

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.

S2 Os estados vêm nos parâmetros

Cues condicionais (proc, "havia debuffs", stance) viajam nos FGameplayCueParameters do próprio cue, sem mensagens extra.

C1 Orçamento fixo por tipo de skill

Cada skill cabe no orçamento do seu tipo de geometria (secção 04). Exceder exige justificação e medição.

C2 Zero trabalho por partícula no CPU

Emissores GPU ou com trajetória analítica por defeito; CPU só quando a contagem é pequena e precisa de colisão ou de eventos.

C3 Escala com a significância

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.

C4 Sem luz, sem refração, sem pós próprio

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.

02

Rede e GameplayCues

Habilidade

O servidor ativa a GA ou aplica o GE — isto já é replicado.

Cue

O GE ou a GA dispara o cue com a tag da skill e os parâmetros condicionais.

Previsão

O cliente que lança prevê o cue localmente; não espera pelo servidor.

Proxies

Os outros clientes recebem o cue pela replicação do ASC (multicast não fiável).

Servidor dedicado

Não executa cues nem Niagara — confirmar que nenhum Blueprint de VFX corre lá.

SituaçãoClasse de cueQuando usar
Impacto instantâneo (cast, hit, proc)UGameplayCueNotify_BurstPor defeito. Não instanciado, sem actor, spawn de Niagara pelo pool.
Instantâneo com sequência temporizadaAGameplayCueNotify_BurstLatentSó 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_LoopingLigado 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á replicadoExecuteGameplayCueLocalQuando cada cliente já sabe o que aconteceu (ex.: troca de stance vista via tag replicada). Zero tráfego.
03

Niagara: configuração comum

Effect TypeParaDistância máx.Instâncias máx.Culling / reação
EFT_Combat_BurstCasts, impactos, procs40 m32 detalhadasSignificance por distância; acima do limite, os menos significativos passam ao nível Baixo
EFT_Combat_ProjectileProjéteis, skillshots, linhas50 m48Trail reduzido ao longe; só núcleo no nível Baixo
EFT_Area_PersistentÁreas no chão, channels45 m16Nunca cortar o contorno da área (é informação de gameplay); cortar só o interior animado
EFT_StatusBuffs, debuffs, CC, stances30 m64Fora do ecrã: pausa. Ao longe: só a marca base, sem partículas
04

Orçamentos por tipo de skill

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.

TipoDraw callsPartículasDuraçãoSilhueta (fica em Baixo)Notas
Cone / cleave≤ 3≤ 40≤ 0,6 sArco/cone em malhaArco numa só malha; faíscas só no hit confirmado
Linha / skillshot≤ 3≤ 40≤ 0,8 sFaixa em malhaTelegraph em decal ou quad; nunca ribbon longo com muitos segmentos
Projétil≤ 3 + 2 impacto≤ 30 voo · ≤ 40 impactovoo + 0,6 sNúcleoTrail com ≤ 16 segmentos; impacto é um cue Burst separado
Tether≤ 2≤ 20enquanto ligadoRibbon finoUm ribbon de 2 pontos + UV panning no material; pulsos por material, não por partículas
Rush / teleporte≤ 3≤ 30≤ 0,5 sChegadaMáx. 1 silhueta residual; o maior contraste no destino
AoE instantânea≤ 4≤ 50≤ 1,5 sAnel + brilho no chãoO Cleanse cabe aqui (exemplo na secção 07)
Channel≤ 3≤ 30 vivasenquanto canalizaForma principalTaxa de spawn baixa e constante; animação no material, não em spawn
Área persistente≤ 3≤ 30 vivasduração do GEContorno da áreaContorno em decal ou malha; interior com shader de ruído, poucas partículas
Stance / toggle≤ 2≤ 10pulso ≤ 0,3 sMarcador nos pésMarcador 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)≤ 20 contínuasduração do GEMarca baseAplicar/remover são Bursts pequenos; o estado em si é malha + material animado

Luz dinâmica

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.

05

Materiais e texturas

Master materialBlend / shadingUsoParâmetros
M_VFX_AdditiveAdditive · UnlitAnéis, faíscas, brilho no chão, núcleosCor e intensidade por partícula; máscara em textura partilhada
M_VFX_FlipbookTranslucent · Unlit · depth fadePoeira, fumoSubUV; fade de profundidade curto; sem iluminação da translucência
M_VFX_DissolveMasked · Unlit ou Default LitMarcas de status e a sua quebraDissolve e cor da orla por Custom Primitive Data (sem criar instâncias dinâmicas de material)
M_VFX_RibbonAdditive · UnlitTethers, trailsUV panning e pulso por parâmetro
06

Validação

Estados: dentro até +20 % com justificação acima: rever antes de integrar

07

Exemplo aplicado: Fighter · Cleanse

Tipo
AoE instantânea (orçamento ≤ 4 draw calls, ≤ 50 partículas, ≤ 1,5 s)
Cue do cast
GameplayCue.Fighter.Cleanse · UGameplayCueNotify_Burst · EFT_Combat_Burst
Parâmetros
RawMagnitude bitmask: 1 = removeu debuffs, 2 = cancelou displacement. Location = root do Fighter.
Quebra dos debuffs
Não é do Cleanse: cada debuff tem o seu GameplayCue.Status.Debuff.* (Looping). Ao ser removido, toca o dissolve (CPD) + burst de 7 partículas. Em Baixo, só o dissolve.
Sistema
NS_Fighter_Cleanse, bounds fixos 6×6×3 m, pool com prime de 8
EmissorSimEpicAltoMédioBaixoMaterial
Anel (malha de 5+7 arcos)CPU · 1 mesh1111M_VFX_Additive
Brilho no chão (quad)CPU · 1 mesh1111M_VFX_Additive
Faíscas (velocity aligned)GPU10 + 4040200M_VFX_Additive
Poeira (flipbook 2×2)GPU101060M_VFX_Flipbook
LuzLight rendererpró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.