Eu queria ver se conseguiria fazer isso sem regenerar dinamicamente a malha da cachoeira a cada quadro. Acontece que há um caminho. : D
Cada objeto que pode bloquear a cascata (objetos com um WaterCatcher
script no meu protótipo) tem uma malha de contorno em volta do seu perímetro. (Isso pode ser gerado automaticamente com antecedência usando a forma do colisor)
Essa malha de estrutura de tópicos processa a água que flui ao longo do objeto. Uso um shader para extrair clip
a parte que está embaixo do objeto. Também rastreio um ponto de captura esquerdo e direito em que uma cachoeira cai no objeto e flui para a esquerda ou direita, respectivamente, para que eu possa ver clip
a parte que fica à esquerda da cachoeira direita e à direita da cachoeira esquerda.
Então as quedas verticais são apenas primitivas quad básicas, esticadas no comprimento apropriado. Eu uso outro shader para rolar a textura da cachoeira sobre as quedas e desbotá-la nas extremidades superior e inferior. Em seguida, aplico um sistema de partículas de espuma no ponto de impacto para ajudar a cobrir a mistura.
Aqui está um close para que você possa ver as peças componentes.
No topo, tenho uma cachoeira "raiz" para começar. Cada quadro, depois que todos os Update()
scripts correm para mover as coisas, ele dispara CircleCast
para baixo, para ver se a água bate em alguma coisa. Se ele atinge a WaterCatcher
, ele diz para mostrar a pele da água a jusante do ponto de acerto.
Eu determino "jusante" usando o golpe normal - se estiver muito próximo da vertical, ou se a cascata de entrada ultrapassar as bordas que se inclinam nas duas direções, então derramaremos à esquerda e à direita.
Cada WaterCatcher
um tem sua própria cachoeira esquerda e direita, que habilita e posiciona na extremidade oposta, se derramar nessa direção - caso contrário, elas permanecem ocultas. Essas cachoeiras, por sua vez, disparam CircleCast
para baixo para encontrar o que elas derramam, e assim por diante ...
O protótipo ainda tem algumas falhas visuais que podem ser melhoradas - o fluxo de água ao longo de um objeto aparece ao mesmo tempo, em vez de animar, e as regras de fluxo podem usar um pouco de tolerância ou histerese, para que não corra tão facilmente objetos rotativos. Eu acho que essas devem ser questões bastante solucionáveis.
Texturas de fundo, rochas e plataformas rotativas via Kenney
Aqui estão os truques que eu uso no meu shader de fragmento de coletor de água:
// My wraparound geometry is build so the "x+" UV direction
// points "outward" from the object.
// Using derivatives, I can turn this into a vector in screen space.
// We'll use this below to clip out water hanging off the bottom.
float2 outward = float2(ddx(i.uv.x), ddy(i.uv.x));
// i.worldX is the worldspace x position of this fragment
// (interpolated from the vertex shader)
// _LeftX is a material property representing the worldspace x coordinate
// of the rightmost water flow that's spilling left,
// and _RightX the wold x of the leftmost water flow that's spilling right.
float left = _LeftX - i.worldX; // +ve if we're to the left of a left spill.
float right = i.worldX - _RightX; // +ve if we're to the right of a right spill.
float limit = max(left, right); // +ve if we're in the path of either flow.
// If the "outward" vector is pointing down, make this negative.
limit = min(limit, outward.y + 0.001f);
// If any of the conditions above make limit <= 0, abort this fragment.
clip(limit);
// Otherwise, scroll the water texture!
// Counter-clockwise if we're in the left flow, clockwise otherwise.
i.uv.y -= sign(left) * _Time.y;
Você pode deformar a malha em cascata na colisão de objetos para corresponder ao padrão de colisor necessário.
O sistema de partículas de uso pesado mais fácil e mais preciso, mas com melhor desempenho - cria um sistema de partículas com coletores e usa todas as partículas como uma gota de água. Mas isso parece um pouco estranho se você tiver sprite padrão e se a contagem de partículas for pequena e eles forem muito grandes. Mas é um desempenho pesado, então você não quer simulação de moléculas no seu jogo.
Eu iria com 1.
Nenhuma solução fácil com bom desempenho.
Resultado do sistema de partículas: (Para alterar os valores, tive que esperar cerca de 3-4s, é lento)
fonte