Inicio     |     Sobre     |     GitHub     |     Games     |     Contato                        

sexta-feira, 22 de janeiro de 2016

[Pesquisa] Geração procedural de terrenos e ambientes Parte 2

Na parte 2 da nossa pesquisa começaremos a implementar o algoritmo utilizando o Unity, veremos alguns conceitos básicos e implementaremos um algoritmo simples, sem muitas regras para que o mesmo possa ser alterado e melhorado com o tempo conforme as necessidades. 


Parte 1http://algamecode.blogspot.com.br/2016/01/pesquisa-geracao-procedural-de-terrenos.html

Esse é o pseudocódigo da estrutura mais simples do nosso código, quero deixar claro que nem sempre estarei deixando esses pseudocódigos. A baixo é possível observar as variáveis que usaremos por hora e o método com as condições simples, nada exagerado, isso irá gerar os objetos diretamente, sem guarda-los na matriz como dissemos na parte 1, vamos guarda-los mais para frente.

// Variáveis

Inteiro x
Inteiro y
Inteiro z
Inteiro n

GameObjeto bloco

Random gerar

Método gerarSolo () {

Repita 30 vezes { // x
Repita 30 vezes { // z
Repita 5 vezes { // y
se y for igual a 0 então criar bloco na posição x, y, z atual // 100%
se não se y for igual a 1 então { // 80%
gerar número aleatório de 1 a 10 e guardar em n
se n for menor que 9 então {
criar bloco na posição x, y, z atual
} se não, não faz nada.
}
se não se y for igual a 2 então { // 50%
gerar número aleatório 0 ou 1 e guardar em n
se n for 1 então{
criar bloco na posição x, y, z atual
} se não, não acontece nada.
}
se não se y for igual a 3 então { // 30%
gerar número aleatório de 1 a 10 e guardar em n
se n for menor que 4 então{
criar bloco na posição x, y, z atual
} se não, não acontece nada.
}
se não se y for igual a 4 então { // 10%
gerar número aleatório de 1 a 10 e guardar em n
se n for menor que 2 então{
criar bloco na posição x, y, z atual
} se não, não acontece nada.
}
}
}
}
}

Como pode ser visto a unica regra é gerar um quadrado de 30 por 30 (você pode mudar isso se quiser), com altura máxima de 5 sendo que na altura 0 sempre sera gerado o solo, na altura 1 há 80% de chance de gerar, na altura 2, 50%, na altura 3, 30% e na altura 4 10%. É possível imaginar que o mapa gerado poderá não fazer nenhum sentido e ter muitos solos flutuando, posteriormente estaremos implementando a regra para evitar isso e para criar mais de um solo. Vamos ao Unity.

Para a aplicação vamos usar o unity, primeiramente crie uma nova cena (File > New Scene).



Agora vamos criar os cubos de solo, antes crie os materiais com as cores de cada solo (Create > Material).




De um nome e selecione a cor do material, crie um material para cada solo.



Agora crie um cubo (3D Object > Cube).



De o nome de Solo01.



Arraste o material equivalente no cubo.



Selecione o cubo e clique em Add Tag.



Na aba Tags, clique no + e de o nome de Solo01, já aproveite para criar as outras tags de solos.



Agora selecione o cubo e em Tag selecione a tag equivalente ao seu solo.



Crie uma pasta para colocar as prefabs dos solos.



Arraste o cubo dentro da pasta, e repita os paços criando todas as prefabs.



Agora crie um script em C# e copie o código a baixo:



using UnityEngine;
using System.Collections;

public class gpterreno01 : MonoBehaviour {

//Variaveis
int x = 0;
int z = 0;
int y = 0;
int n = 0;

public GameObject bloco01;

System.Random gerar = new System.Random();

// Use this for initialization
void Start () {
gerarsolo ();
}

// Update is called once per frame
void Update () {

}

//Gerar solo
void gerarsolo(){
for(x=0;x<30;x++){
for(z=0;z<30;z++){
for(y=0;y<5;y++){
if(y==0){
Instantiate(bloco01,new Vector3(x,y,z),Quaternion.identity);
}
else if(y==1){
n = gerar.Next(1,11);
if(n<9){
Instantiate(bloco01,new Vector3(x,y,z),Quaternion.identity);
}
}
else if(y==2){
n = gerar.Next(2);
if(n==1){
Instantiate(bloco01,new Vector3(x,y,z),Quaternion.identity);
}
}
else if(y==3){
n = gerar.Next(1,11);
if(n<4){
Instantiate(bloco01,new Vector3(x,y,z),Quaternion.identity);
}
}
else if(y==4){
n = gerar.Next(1,11);
if(n<2){
Instantiate(bloco01,new Vector3(x,y,z),Quaternion.identity);
}
}
}
}
}
}

}


O código pode ser colocado no sol, na câmera ou qualquer elemento da cena, e quando a cena for executada o resultado será similar ao seguinte:


Na próxima parte, trabalharemos em cima desse código adicionando regras e melhorando o mesmo, até a próxima.

Para saber mais, segue as referências:
https://www.youtube.com/watch?v=bYlsi890988
https://www.youtube.com/watch?v=BBytSOIvHlE


Nenhum comentário:

Postar um comentário