Advertisement
Guest User

Chunk Class

a guest
Dec 11th, 2013
468
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.68 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4.  
  5. [System.Serializable]
  6. public class Chunk : MonoBehaviour
  7. {
  8.     public Mesh chunkMesh;
  9.    
  10.     public RVector3 chunkPosition;
  11.         public RVector3 Position{get{return chunkPosition;} set{chunkPosition=value;}}
  12.  
  13.     public RVector3 chunkSize;
  14.         public RVector3 Size{get{return chunkSize;} set{chunkSize=value;}}
  15.  
  16.     public Block[,,] chunkBlocks;
  17.         public Block[,,] ReturnChunkBlocks{get{return chunkBlocks;}}
  18.  
  19.     public Chunk ThisChunk {get{return this;}}
  20.    
  21.     List<Vector3> chunkVerticies = new List<Vector3>();
  22.     List<Vector2> chunkUV = new List<Vector2>();
  23.     List<int> chunkTriangles = new List<int>();
  24.    
  25.     int VerticiesIndex;
  26.     void Awake()   
  27.     {
  28.         chunkMesh = this.GetComponent<MeshFilter>().mesh;
  29.         GenerateChunk();
  30.     }
  31.    
  32.    
  33.    
  34.     public void GenerateChunk()
  35.     {
  36.         chunkBlocks = new Block[chunkSize.x+1,chunkSize.y+1,chunkSize.z+1];
  37.  
  38.         for(int x=0; x<=chunkSize.x; x++)  
  39.         {for(int z=0; z<=chunkSize.z; z++)
  40.             {for(int y=0; y<=chunkSize.y ; y++)
  41.                 {
  42.                     chunkBlocks[x,y,z] = new Block(false);
  43.                 }  
  44.             }  
  45.         }
  46.         UpdateChunk(); 
  47.     }
  48.  
  49.  
  50.     public void UpdateChunk()  
  51.     {
  52.         chunkVerticies = new List<Vector3>();
  53.         chunkUV = new List<Vector2>();
  54.         chunkTriangles = new List<int>();
  55.    
  56.         chunkMesh.Clear();
  57.  
  58.         float blockSize = 1;
  59.  
  60.         for (var y = 0; y<= chunkSize.y; y++)
  61.         {for (var x = 0; x<= chunkSize.x; x++)
  62.             {for (var z = 0; z<= chunkSize.z; z++)
  63.                 {
  64.                     if(!chunkBlocks[x,y,z].empty)
  65.                     {if(CheckSides(new RVector3(x,y,z),BlockFace.Top))
  66.                         {
  67.                             VerticiesIndex = chunkVerticies.Count;
  68.  
  69.                             chunkVerticies.Add(new Vector3(x,y+blockSize,z));
  70.                             chunkVerticies.Add(new Vector3(x,y+blockSize,z+blockSize));
  71.                             chunkVerticies.Add(new Vector3(x+blockSize,y+blockSize,z+blockSize));
  72.                             chunkVerticies.Add(new Vector3(x+blockSize,y+blockSize,z));
  73.  
  74.                             UpdateChunkUV();       
  75.                         }
  76.  
  77.                         if(CheckSides(new RVector3(x,y,z),BlockFace.Bottom))
  78.                         {
  79.                             VerticiesIndex = chunkVerticies.Count;
  80.  
  81.                             chunkVerticies.Add(new Vector3(x,y,z));
  82.                             chunkVerticies.Add(new Vector3(x+blockSize,y,z));
  83.                             chunkVerticies.Add(new Vector3(x+blockSize,y,z+blockSize));
  84.                             chunkVerticies.Add(new Vector3(x,y,z+blockSize));
  85.                             UpdateChunkUV();
  86.                         }
  87.  
  88.                         if(CheckSides(new RVector3(x,y,z),BlockFace.Right))
  89.                         {
  90.                            
  91.                             VerticiesIndex = chunkVerticies.Count;
  92.                            
  93.                            
  94.                            
  95.                             chunkVerticies.Add(new Vector3(x+blockSize,y,z));
  96.                             chunkVerticies.Add(new Vector3(x+blockSize,y+blockSize,z));
  97.                             chunkVerticies.Add(new Vector3(x+blockSize,y+blockSize,z+blockSize));
  98.                             chunkVerticies.Add(new Vector3(x+blockSize,y,z+blockSize));
  99.  
  100.                             UpdateChunkUV();
  101.                         }
  102.  
  103.                         if(CheckSides(new RVector3(x,y,z),BlockFace.Left))
  104.                         {
  105.                            
  106.                             VerticiesIndex = chunkVerticies.Count;
  107.  
  108.                             chunkVerticies.Add(new Vector3(x,y,z+blockSize));
  109.                             chunkVerticies.Add(new Vector3(x,y+blockSize,z+blockSize));
  110.                             chunkVerticies.Add(new Vector3(x,y+blockSize,z));
  111.                             chunkVerticies.Add(new Vector3(x,y,z));
  112.                             UpdateChunkUV();
  113.                         }
  114.  
  115.                         if(CheckSides(new RVector3(x,y,z),BlockFace.Far))
  116.                         {
  117.                            
  118.                             VerticiesIndex = chunkVerticies.Count;
  119.  
  120.                             chunkVerticies.Add(new Vector3(x,y,z+blockSize));
  121.                             chunkVerticies.Add(new Vector3(x+blockSize,y,z+blockSize));
  122.                             chunkVerticies.Add(new Vector3(x+blockSize,y+blockSize,z+blockSize));
  123.                             chunkVerticies.Add(new Vector3(x,y+blockSize,z+blockSize));
  124.                             UpdateChunkUV();   
  125.                         }
  126.  
  127.                         if(CheckSides(new RVector3(x,y,z),BlockFace.Near))
  128.                         {
  129.                            
  130.                             VerticiesIndex = chunkVerticies.Count;
  131.  
  132.                             chunkVerticies.Add(new Vector3(x,y,z));
  133.                             chunkVerticies.Add(new Vector3(x,y+blockSize,z));
  134.                             chunkVerticies.Add(new Vector3(x+blockSize,y+blockSize,z));
  135.                             chunkVerticies.Add(new Vector3(x+blockSize,y,z));
  136.                             UpdateChunkUV();
  137.                         }
  138.                     }
  139.                 }
  140.             }
  141.         }
  142.         FinalizeChunk();
  143.     }
  144.  
  145.     public bool CheckSides(RVector3 blockPosition, BlockFace blockFace)
  146.     {
  147.        
  148.         int x,y,z;
  149.         x = blockPosition.x;
  150.         y = blockPosition.y;
  151.         z = blockPosition.z;
  152.  
  153.         switch(blockFace)  
  154.         {
  155.         case BlockFace.Top:    //Checks top face
  156.            
  157.             if(y+1<=chunkSize.y)
  158.             {
  159.                 if(!chunkBlocks[x,y+1,z].empty)
  160.                 {return false;}
  161.             }
  162.             break;
  163.  
  164.         case BlockFace.Bottom:    //Checks bottom face
  165.  
  166.             if(y-1>=0 && !chunkBlocks[x,y-1,z].empty)
  167.             {return false;}
  168.             break;    
  169.  
  170.         case BlockFace.Right:    //Checks right face
  171.  
  172.             if(x+1<=chunkSize.x)
  173.             {
  174.                 if(!chunkBlocks[x+1,y,z].empty)
  175.                 {return false;}
  176.             }
  177.             break;
  178.  
  179.         case BlockFace.Left:    //Checks Left face
  180.  
  181.             if(x-1>=0)
  182.             {
  183.                 if(!chunkBlocks[x-1,y,z].empty)
  184.                 {return false;}
  185.             }
  186.             break;        
  187.            
  188.         case BlockFace.Far:    //Checks Far face
  189.  
  190.             if(z+1<=chunkSize.z)
  191.             {
  192.                 if(!chunkBlocks[x,y,z+1].empty)
  193.                 {return false;}
  194.             }
  195.             break;
  196.  
  197.         case BlockFace.Near:    //Checks Near face
  198.  
  199.             if(z-1>=0)
  200.             {
  201.                 if(!chunkBlocks[x,y,z-1].empty)
  202.                 {return false;}
  203.             }
  204.             break;    
  205.         }
  206.         return true;   
  207.     }
  208.  
  209.     void UpdateChunkUV()
  210.        
  211.     {
  212.         chunkTriangles.Add(VerticiesIndex);
  213.         chunkTriangles.Add(VerticiesIndex+1);
  214.         chunkTriangles.Add(VerticiesIndex+2);
  215.        
  216.         chunkTriangles.Add(VerticiesIndex+2);
  217.         chunkTriangles.Add(VerticiesIndex+3);
  218.         chunkTriangles.Add(VerticiesIndex);
  219.  
  220.         chunkUV.Add(new Vector2(0,0));
  221.         chunkUV.Add(new Vector2(0,1));
  222.         chunkUV.Add(new Vector2(1,1));
  223.         chunkUV.Add(new Vector2(1,0));
  224.     }
  225.  
  226.     void FinalizeChunk()
  227.     {
  228.         chunkMesh.vertices = chunkVerticies.ToArray();
  229.         chunkMesh.triangles = chunkTriangles.ToArray();
  230.         chunkMesh.uv = chunkUV.ToArray();
  231.         chunkMesh.RecalculateNormals();
  232.     }
  233. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement