Mundo de bloques
Leer y cambiar bloques de un mundo voxel.
Con un VoxelWorld en la escena (Crear > Mundo de bloques, o la plantilla Mundo de bloques
del Hub) hay un mundo infinito de bloques como Minecraft: biomas, cuevas, árboles, mar, luz de antorchas y colisión
con la física. La tabla Voxel lo controla. Los bloques se nombran por su número o por su nombre
("stone", "Piedra"); las coordenadas pueden ser cualquier número (se redondean hacia abajo).
Voxel.getBlock(x, y, z), Voxel.getBlockAt(pos) | Número del bloque (0 = aire). |
Voxel.setBlock(x, y, z, bloque) | Pone o quita ("air") un bloque; la luz, la malla y la colisión se rehacen solas. |
Voxel.blockInfo(bloque) | { id, name, label, solid, placeable, replaceable, hardness, drop, light }. |
Voxel.blockId(nombre), Voxel.blockCount() | Número de un bloque y cuántos hay. |
Voxel.blockColor(bloque) | Color medio de su textura (Vec3): partículas y objetos del color del bloque. |
Voxel.raycast(origen, dirección, distancia) | Primer bloque que toca: { block, normal, id, point, distance } o nil. Un bloque nuevo iría en block + normal. |
Voxel.moveBox(centro, semiejes, delta) | Mueve una caja contra los bloques (el jugador). Devuelve posición, enSuelo, techo, pared. |
Voxel.boxCollides(centro, semiejes) | Si la caja toca algún bloque sólido. |
Voxel.surfaceHeight(x, z) | Altura del terreno generado (aunque no esté cargado). |
Voxel.isReady(pos), Voxel.inWater(pos) | Si el trozo ya está generado; si ese punto está en el agua. |
Voxel.skyLight(x, y, z), Voxel.blockLight(x, y, z) | Luz del cielo y de antorchas (0–15). |
Voxel.newWorld(nombre, semilla), Voxel.loadWorld(nombre) | Mundo con nombre (se guarda). loadWorld devuelve false si no existe. |
Voxel.saveWorld(), Voxel.listWorlds(), Voxel.deleteWorld(nombre) | Guardar (también al parar), la lista { name, seed, lastPlayed, mode } y borrar. |
Voxel.setMeta(clave, texto), Voxel.getMeta(clave, porDefecto) | Datos del juego guardados con el mundo (posición del jugador, modo…). |
Voxel.worldName(), Voxel.seed(), Voxel.isActive() | Mundo actual. |
-- Poner una antorcha donde mira la cámara (clic derecho)
if Input.getMouseButtonDown(1) then
local golpe = Voxel.raycast(self.entity.position, self.entity.forward, 6)
if golpe then
local p = golpe.block + golpe.normal
Voxel.setBlock(p.x, p.y, p.z, "torch")
end
end
La plantilla Mundo de bloques trae un juego de supervivencia completo en primera persona
(
Scripts/JugadorBloques.lua): vida, hambre y aire (daño por caída y al ahogarse, muerte y reaparición),
inventario de 36 huecos con iconos (Assets/Voxel/Iconos), 13 recetas de crafteo (algunas piden mesa de trabajo),
picos para la piedra y las menas, objetos que caen y se recogen, contorno del bloque apuntado, grietas al romper
(Assets/Voxel/Grietas) y trocitos del color del bloque, pausa y guardado de todo. La propiedad
creativo lo cambia a modo creativo (romper al instante, volar, bloques sin fin).
¿Algo no queda claro o falta algo? Pregunta en el Discord.