Mapa de hexágonos com geração procedural

Fala galera, sou novo aqui no fórum. Queria mostrar para vocês esse script que eu fiz hoje. Ele gera um mapa de hexágonos aleatório como no jogo Hexaria do roblox:

Para gerar a grade de hexágonos eu usei a seguinte fórmula:

F(x, y) = x * w - [w / 2 * (Y mod 2)], y * (a + h) / 2

Onde X e Y correspondem a posição dos hexágonos na grade, W e H correspondem respectivamente a largura e altura do hexágono e A é a medida da aresta do hexágono.
A função retorna 2 valores no final, que correspondem à X e Z do Vector3.

Para gerar o Y e deixar o terreno com montanhas etc, eu usei o perlin noise. Para conseguir um valor entre 0 e 1, usei a função sigmoid:

Sigmoid(x) = 1 / (1 + exp(-x))

Aqui está o script para quem quiser usar: https://www.roblox.com/library/4845354922/Hexagon-Grid-Map

4 Curtidas

que top po, serio msm, adorei!

Pessoal, atualizei o script:

Agora as cores estão mais bonitas e a geração do mundo ficou melhor.
Essa é a função para calcular a posição de cada hexagono:

function CalcHexagonPosition(X, Z, Width, Height, Edge)
	local xPos = X * Width - (Width / 2 * (Z % 2))
	local zPos = Z * (Edge + Height) / 2
	return Vector3.new(xPos, 0, zPos)
end

Onde X e Z são as posições do hexagono na grade, Width e Height correspondem a largura e a altura do hexagono e Edge é o tamanho da aresta do hexagono.

Para usar o script no roblox, acesse esse link: https://www.roblox.com/library/4849673081/Hexagon-World-Generator

1 Curtida

ei po, pq tu n tipo, leva a serio a criação de um game no roblox tlgd? Acho que tu é capaz

Eu não tenho criatividade para fazer jogos e nem ideias legais, só sou bom com scripting mesmo. Nem sei modelar.

ah vdd, modelagem ne, esse é um grande problema.

Me ajuda a fazer algo assim na unity?

Ai complica, mas até que é parecido. Você já tem o hexagono pronto?
Se tiver, você precisa achar esses 3 valores:

  • O tamanho da aresta (tamanho do lado)
  • A altura do hexagono
  • A largura do hexagono

Ai depois que você achar esses 3 valores, é só botar nessa fórmula (Acredito que você esteja usando C#):

private Vector3 GetHexagonPosition(X, Z, Width, Height, Edge) 
{
	float xPos = X * Width - (Width / 2 * (Z % 2));
	float zPos = Z * (Edge + Height) / 2;
	Vector3 vector = new Vector3(xPos, 0, zPos);
	return vector;
}

Ai, lembrando que:
X -> Posição X do hexagono na sua grid.
Z -> Posição Z do hexagono na sua grid.
Width -> Largura do seu hexagono.
Height -> Altura do seu hexagono.
Edge -> Tamanho da aresta do seu hexagono.

Vou ver se consigo criar uma fórmula para achar o Width e a Height através do tamanho da aresta.

EDIT:

Consegui criar uma fórmula para achar a Width e a Height só pelo tamanho da aresta:
Height = Aresta * 2
Width = Aresta * 1.732

Logo a função do Unity vai ficar assim:

private Vector3 GetHexagonPosition(X, Z, Edge) 
{
	float Height = Edge * 2;
	float Width = Edge * 1.732F;
	float xPos = X * Width - (Width / 2 * (Z % 2));
	float zPos = Z * (Edge + Height) / 2;
	Vector3 vector = new Vector3(xPos, 0, zPos);
	return vector;
}

Ta ai a função que você vai usar no Unity para calcular a posição de cada hexagono da grid.
Você só vai precisar do tamanho do lado.

Na teoria isso deve funcionar, mas na prática pode dar muito errado, porque eu não se se o Unity adota como ponto de referência da posição do objeto o centro ou o primeiro pixel. Esse cálculo só se aplica se a posição do objeto partir do centro dele, como o roblox faz.

3 Curtidas