I'm curious, what is the definition of your Block type?
By that, do you mean my main block class?
I mean your class named "Block".
Block[,,] blocks = new Block[16, 16, 16];
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[System.Serializable]
public class Block
{
public enum Direction { north, east, south, west, up, down };
public struct Tile { public int x; public int y;}
const float tileSize = 0.0625f;
//Base block constructor
public Block()
{
}
public virtual MeshData Blockdata
(PlanetChunk planetchunk, int x, int y, int z, MeshData meshData)
{
meshData.useRenderDataForCol = true;
if (!planetchunk.GetBlock(x, y + 1, z).IsSolid(Direction.down))
{
meshData = FaceDataUp(planetchunk, x, y, z, meshData);
}
if (!planetchunk.GetBlock(x, y - 1, z).IsSolid(Direction.up))
{
meshData = FaceDataDown(planetchunk, x, y, z, meshData);
}
if (!planetchunk.GetBlock(x, y, z + 1).IsSolid(Direction.south))
{
meshData = FaceDataNorth(planetchunk, x, y, z, meshData);
}
if (!planetchunk.GetBlock(x, y, z - 1).IsSolid(Direction.north))
{
meshData = FaceDataSouth(planetchunk, x, y, z, meshData);
}
if (!planetchunk.GetBlock(x + 1, y, z).IsSolid(Direction.west))
{
meshData = FaceDataEast(planetchunk, x, y, z, meshData);
}
if (!planetchunk.GetBlock(x - 1, y, z).IsSolid(Direction.east))
{
meshData = FaceDataWest(planetchunk, x, y, z, meshData);
}
if (Light() == true)
{
if (planetchunk.GetBlock(x - 1, y, z).IsSolid(Direction.east) == false || planetchunk.GetBlock(x + 1, y, z).IsSolid(Direction.west) == false || planetchunk.GetBlock(x, y, z - 1).IsSolid(Direction.north) == false ||
planetchunk.GetBlock(x, y, z + 1).IsSolid(Direction.south) == false || planetchunk.GetBlock(x, y - 1, z).IsSolid(Direction.up) == false || planetchunk.GetBlock(x, y + 1, z).IsSolid(Direction.down) == false)
{
meshData.AddLight(x, y, z, LightColor(), LightRange(), LightIntensity());
}
}
return meshData;
}
protected virtual MeshData FaceDataUp
(PlanetChunk planetchunk, int x, int y, int z, MeshData meshData)
{
meshData.AddVertex(new Vector3(x - 0.5f, y + 0.5f, z + 0.5f));
meshData.AddVertex(new Vector3(x + 0.5f, y + 0.5f, z + 0.5f));
meshData.AddVertex(new Vector3(x + 0.5f, y + 0.5f, z - 0.5f));
meshData.AddVertex(new Vector3(x - 0.5f, y + 0.5f, z - 0.5f));
meshData.AddQuadTriangles();
meshData.uv.AddRange(FaceUVs(Direction.up));
return meshData;
}
protected virtual MeshData FaceDataDown
(PlanetChunk planetchunk, int x, int y, int z, MeshData meshData)
{
meshData.AddVertex(new Vector3(x - 0.5f, y - 0.5f, z - 0.5f));
meshData.AddVertex(new Vector3(x + 0.5f, y - 0.5f, z - 0.5f));
meshData.AddVertex(new Vector3(x + 0.5f, y - 0.5f, z + 0.5f));
meshData.AddVertex(new Vector3(x - 0.5f, y - 0.5f, z + 0.5f));
meshData.AddQuadTriangles();
meshData.uv.AddRange(FaceUVs(Direction.down));
return meshData;
}
protected virtual MeshData FaceDataNorth
(PlanetChunk planetchunk, int x, int y, int z, MeshData meshData)
{
meshData.AddVertex(new Vector3(x + 0.5f, y - 0.5f, z + 0.5f));
meshData.AddVertex(new Vector3(x + 0.5f, y + 0.5f, z + 0.5f));
meshData.AddVertex(new Vector3(x - 0.5f, y + 0.5f, z + 0.5f));
meshData.AddVertex(new Vector3(x - 0.5f, y - 0.5f, z + 0.5f));
meshData.AddQuadTriangles();
meshData.uv.AddRange(FaceUVs(Direction.north));
return meshData;
}
protected virtual MeshData FaceDataEast
(PlanetChunk planetchunk, int x, int y, int z, MeshData meshData)
{
meshData.AddVertex(new Vector3(x + 0.5f, y - 0.5f, z - 0.5f));
meshData.AddVertex(new Vector3(x + 0.5f, y + 0.5f, z - 0.5f));
meshData.AddVertex(new Vector3(x + 0.5f, y + 0.5f, z + 0.5f));
meshData.AddVertex(new Vector3(x + 0.5f, y - 0.5f, z + 0.5f));
meshData.AddQuadTriangles();
meshData.uv.AddRange(FaceUVs(Direction.east));
return meshData;
}
protected virtual MeshData FaceDataSouth
(PlanetChunk planetchunk, int x, int y, int z, MeshData meshData)
{
meshData.AddVertex(new Vector3(x - 0.5f, y - 0.5f, z - 0.5f));
meshData.AddVertex(new Vector3(x - 0.5f, y + 0.5f, z - 0.5f));
meshData.AddVertex(new Vector3(x + 0.5f, y + 0.5f, z - 0.5f));
meshData.AddVertex(new Vector3(x + 0.5f, y - 0.5f, z - 0.5f));
meshData.AddQuadTriangles();
meshData.uv.AddRange(FaceUVs(Direction.south));
return meshData;
}
protected virtual MeshData FaceDataWest
(PlanetChunk planetchunk, int x, int y, int z, MeshData meshData)
{
meshData.AddVertex(new Vector3(x - 0.5f, y - 0.5f, z + 0.5f));
meshData.AddVertex(new Vector3(x - 0.5f, y + 0.5f, z + 0.5f));
meshData.AddVertex(new Vector3(x - 0.5f, y + 0.5f, z - 0.5f));
meshData.AddVertex(new Vector3(x - 0.5f, y - 0.5f, z - 0.5f));
meshData.AddQuadTriangles();
meshData.uv.AddRange(FaceUVs(Direction.west));
return meshData;
}
public virtual Tile TexturePosition(Direction direction)
{
Tile tile = new Tile();
tile.x = 0;
tile.y = 0;
return tile;
}
public virtual Vector2[] FaceUVs(Direction direction)
{
Vector2[] UVs = new Vector2[4];
Tile tilePos = TexturePosition(direction);
UVs[0] = new Vector2(tileSize * tilePos.x + tileSize,
tileSize * tilePos.y);
UVs[1] = new Vector2(tileSize * tilePos.x + tileSize,
tileSize * tilePos.y + tileSize);
UVs[2] = new Vector2(tileSize * tilePos.x,
tileSize * tilePos.y + tileSize);
UVs[3] = new Vector2(tileSize * tilePos.x,
tileSize * tilePos.y);
return UVs;
}
public virtual bool IsSolid(Direction direction)
{
switch (direction)
{
case Direction.north:
return true;
case Direction.east:
return true;
case Direction.south:
return true;
case Direction.west:
return true;
case Direction.up:
return true;
case Direction.down:
return true;
}
return false;
}
public virtual int Temperature()
{
// -100 to 100
return 0;
}
public virtual bool Light()
{
return false;
}
public virtual Color32 LightColor()
{
return new Color32(0, 0, 0, 0);
}
public virtual float LightRange()
{
return 0;
}
public virtual float LightIntensity()
{
return 0;
}
public virtual int Density()
{
// 0 to 100
return 0;
}
public virtual string BaseBlock()
{
//For ores, the block it replaces
return "null";
}
public virtual float Rarity()
{
//For ore, the rarity. Normally between -1 and 1. Bigger is rarer.
return 0;
}
public virtual float Illumination()
{
//How much light the block gives out, 0 to 255
return 0.0f;
}
public virtual bool ore()
{
return false;
}
public virtual string BlockName()
{
return "Undefined!";
}
}