[TUTORIAL] Jogo estilo minecraft
2 participantes
Página 1 de 1
[TUTORIAL] Jogo estilo minecraft
Criem um projeto. Nesse projeto, criem um objeto vazio chamado 'Piece'.
Depois, criem um C# script também chamado 'Piece'
código abaixo:
Depois, coloquem o FirstpersonController em cima (fisicamente) do Piece, para assim terem um player para andar.
Após isso, criem um material chamado 'texture_tile' e coloquem a textura em 'Albedo'. Deve ter as dimensões 256 x 256, divididas em 4 partes, de forma que a primeira tenha a textura da grama, a segunda (embaixo da textura da grama), coloquem a textura da terra, a terceira(ao lado da primeira) coloquem a textura da pedra, e na última, a textura da areia, ou até vidro, claro, se conseguirem deixar está parte da textura transparente.
Coloquem o material em Piece.
Em seguida, crie outro C# script chamado 'PlayerInteraction', colem nele o seguinte código:
E joguem o script no FirstPersonCharacter (sim, ele é a camera do FPScontroller, isso é meio óbvio).
Daí, criem um canvas e criem um UI 'Image', coloquem a cor, e chamem de 'CrossHair'.
Coloquem no centro da tela e coloque como 'Screen Space'.
Deem play, e voces terão o jogo!
Agora, um desafio: eu dúvido voces conseguirem colocar blocos para fora da borda do mundo. Quem conseguir, coloque o script ou vídeo aqui neste tópico.
Depois, criem um C# script também chamado 'Piece'
código abaixo:
- Código:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Piece : MonoBehaviour {
private int size = 73;
private byte[,,]content;
//0 nada
//1 bloco
protected Mesh mesh;
protected MeshCollider meshCollider;
protected List<Vector3> vertices = new List<Vector3>();
protected List<int> triangles = new List<int>();
protected List<Vector2> uvs = new List<Vector2>();
// Use this for initialization
void Start () {
content = new byte[size,size,size];
for (int x=0; x<size; x++) {
for (int z=0; z<size; z++) {
content[x,0,z] = 2;
content[x,1,z]= (byte)Mathf.RoundToInt(Random.value);
}
}
Generate ();
}
private void GenerateBlock(int x, int y, int z, byte block){
Vector3 start = new Vector3 (x, y, z);
Vector3 dim1, dim2;
if (ItsTransparent (x, y, z - 1)) {
dim1 = Vector3.left;
dim2 = Vector3.up;
GenerateFace(start+Vector3.right+Vector3.back, dim1,dim2,block);
}
if (ItsTransparent (x, y, z + 1)) {
dim1 = Vector3.right;
dim2 = Vector3.up;
GenerateFace(start, dim1,dim2,block);
}
if (ItsTransparent (x-1, y, z)) {
dim1 = Vector3.up;
dim2 = Vector3.back;
GenerateFace(start, dim1,dim2,block);
}
if (ItsTransparent (x+1, y, z)) {
dim1 = Vector3.down;
dim2 = Vector3.back;
GenerateFace(start+Vector3.right + Vector3.up, dim1,dim2,block);
}
if (ItsTransparent (x, y-1, z)) {
dim1 = Vector3.left;
dim2 = Vector3.back;
GenerateFace(start+Vector3.right, dim1,dim2,block);
}
if (ItsTransparent (x, y+1, z)) {
dim1 = Vector3.right;
dim2 = Vector3.back;
GenerateFace(start+Vector3.up, dim1,dim2,block);
}
}
private void GenerateFace(Vector3 start, Vector3 dim1, Vector3 dim2, byte block){
int cont = vertices.Count;
vertices.Add (start);
vertices.Add (start+dim1);
vertices.Add (start+dim2);
vertices.Add (start+dim1+dim2);
Vector2 uvBase = new Vector2 (0f, 0.5f);
if(block ==2)uvBase = new Vector2 (0f, 0f);
else if(block ==3)uvBase = new Vector2 (0.5f, 0.5f);
else if(block ==4)uvBase = new Vector2 (0.5f, 0f);
uvs.Add (uvBase);
uvs.Add (uvBase + new Vector2(0f,0.5f));
uvs.Add (uvBase + new Vector2(0.5f,0f));
uvs.Add (uvBase + new Vector2(0.5f,0.5f));
triangles.Add (cont);
triangles.Add (cont+1);
triangles.Add (cont+2);
triangles.Add (cont+3);
triangles.Add (cont+2);
triangles.Add (cont+1);
}
private bool ItsTransparent(int x, int y, int z){
if ((x < 0) || (y < 0) || (z < 0) || (x >= size) || (y >= size) || (z >= size))
return true;
return content [x, y, z] == 0;
}
// Update is called once per frame
private void Generate(){
mesh = new Mesh();
GetComponent<MeshFilter> ().mesh = mesh;
meshCollider = GetComponent<MeshCollider> ();
vertices.Clear ();
triangles.Clear ();
uvs.Clear ();
mesh.triangles = triangles.ToArray ();
for (int x=0; x<size; x++) {
for (int y=0; y<size; y++) {
for (int z=0; z<size; z++) {
byte block = content[x,y,z];
if(block==0)continue;
else GenerateBlock(x,y,z,block);
}
}
}
mesh.vertices = vertices.ToArray ();
mesh.triangles = triangles.ToArray ();
mesh.uv = uvs.ToArray ();
mesh.RecalculateNormals ();
meshCollider.sharedMesh.Clear ();
meshCollider.sharedMesh = mesh;
}
public void SetBlock(int x, int y, int z, byte block){
if ((x < 0) || (y < 0) || (z < 0) || (x >= size) || (y >= size) || (z >= size))
return ;
Debug.Log (x+" "+y+" "+z);
if (content [x, y, z] != block) {
content [x, y, z] = block;
Generate();
}
}
}
Depois, coloquem o FirstpersonController em cima (fisicamente) do Piece, para assim terem um player para andar.
Após isso, criem um material chamado 'texture_tile' e coloquem a textura em 'Albedo'. Deve ter as dimensões 256 x 256, divididas em 4 partes, de forma que a primeira tenha a textura da grama, a segunda (embaixo da textura da grama), coloquem a textura da terra, a terceira(ao lado da primeira) coloquem a textura da pedra, e na última, a textura da areia, ou até vidro, claro, se conseguirem deixar está parte da textura transparente.
Coloquem o material em Piece.
Em seguida, crie outro C# script chamado 'PlayerInteraction', colem nele o seguinte código:
- Código:
using UnityEngine;
using System.Collections;
public class PlayerInteraction : MonoBehaviour {
private byte currentBlock=1;
void Start () {
}
// Update is called once per frame
void Update () {
//botao direito = criar bloco
//botao esquerdo = destruir bloco
if(Input.GetKeyDown(KeyCode.Alpha1))currentBlock=1;
if(Input.GetKeyDown(KeyCode.Alpha2))currentBlock=2;
if(Input.GetKeyDown(KeyCode.Alpha3))currentBlock=3;
if(Input.GetKeyDown(KeyCode.Alpha4))currentBlock=4;
if (Input.GetMouseButtonDown (0)) {
Ray ray = new Ray(transform.position + transform.forward/2 ,transform.forward);
RaycastHit hit;
if(Physics.Raycast(ray,out hit,10f)){
Vector3 position = hit.point - hit.normal/2;
Destroy( new Vector3(Mathf.Floor(position.x),Mathf.Floor(position.y),Mathf.Ceil(position.z)),hit.collider.gameObject);
}
}
if (Input.GetMouseButtonDown (1)) {
Ray ray = new Ray(transform.position + transform.forward/2,transform.forward);
RaycastHit hit;
if(Physics.Raycast(ray,out hit,10f)){
Vector3 position = hit.point + hit.normal/2;
Create( new Vector3(Mathf.Floor(position.x),Mathf.Floor(position.y),Mathf.Ceil(position.z)),hit.collider.gameObject);
}
}
}
void Destroy(Vector3 position, GameObject piece){
Piece p = piece.GetComponent<Piece> ();
p.SetBlock (Mathf.RoundToInt(position.x),Mathf.RoundToInt(position.y),Mathf.RoundToInt(position.z),0);
}
void Create(Vector3 position, GameObject piece){
Piece p = piece.GetComponent<Piece> ();
p.SetBlock (Mathf.RoundToInt(position.x),Mathf.RoundToInt(position.y),Mathf.RoundToInt(position.z),currentBlock);
}
}
E joguem o script no FirstPersonCharacter (sim, ele é a camera do FPScontroller, isso é meio óbvio).
Daí, criem um canvas e criem um UI 'Image', coloquem a cor, e chamem de 'CrossHair'.
Coloquem no centro da tela e coloque como 'Screen Space'.
Deem play, e voces terão o jogo!
Agora, um desafio: eu dúvido voces conseguirem colocar blocos para fora da borda do mundo. Quem conseguir, coloque o script ou vídeo aqui neste tópico.
cody0033- Avançado
- PONTOS : 2922
REPUTAÇÃO : 12
Idade : 20
Áreas de atuação : Unity, desenho e animação.
Respeito as regras :
Re: [TUTORIAL] Jogo estilo minecraft
NOSSA AMIGO! PARABÉNS PELO SEU ESFORÇO E TRABALHO! ABRAÇO E SUCESSO!
Gabriel César O- Profissional
- PONTOS : 3985
REPUTAÇÃO : 217
Idade : 23
Áreas de atuação : (ESTUDANDO SEGUNDO GRAU), (FUÇANDO NO UNITY)){
Respeito as regras :
Re: [TUTORIAL] Jogo estilo minecraft
Obrigado, mas este método é do Antonio Busson. O cara colocou 3 vídeos ensinando a fazer o jogo assim. Que eu saiba, este método é livre para modificação, então estou criando o jogo cuboid em cima disso.
cody0033- Avançado
- PONTOS : 2922
REPUTAÇÃO : 12
Idade : 20
Áreas de atuação : Unity, desenho e animação.
Respeito as regras :
Tópicos semelhantes
» [TUTORIAL] Geração de Mesh procedural (estilo Minecraft)
» O que devo estudar para criar um jogo estilo minecraft?
» Como fazer barco estilo minecraft ou estilo navio que da pra andar dentro
» [TUTORIAL] Unity 5 - Sistema básico de jogo estilo ANGRY BIRDS
» Alguém sabe algum tutorial que ensine como fazer um jogo nesse estilo?
» O que devo estudar para criar um jogo estilo minecraft?
» Como fazer barco estilo minecraft ou estilo navio que da pra andar dentro
» [TUTORIAL] Unity 5 - Sistema básico de jogo estilo ANGRY BIRDS
» Alguém sabe algum tutorial que ensine como fazer um jogo nesse estilo?
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos