public void GenerateChunkObject(int x, int y, float[,] chunkHeights) { if (!GetTerrain()) { terrain = new GameObject(terrainGroup).transform; terrain.transform.parent = transform; } GameObject chunk = new GameObject(string.Format("{0},{1}", x, y)); chunk.transform.parent = terrain.transform; chunk.transform.localPosition = new Vector3(x * setting.ChunkSize, 0, y * setting.ChunkSize); if (setting.layerMask > 0) { chunk.layer = setting.layerMask; } Mesh mesh = ChunkMeshGenerator.Generate(chunkHeights, setting.mapScale); chunk.AddComponent <MeshFilter>().mesh = mesh; chunk.AddComponent <MeshCollider>().sharedMesh = mesh; chunk.AddComponent <MeshRenderer>().material = terrainMaterial; GameObjectUtility.SetStaticEditorFlags(chunk, StaticEditorFlags.NavigationStatic); EditorUtility.SetDirty(this); }
protected override void OnLoad() { base.OnLoad(); var(mainCamera, _) = GetAll <Camera>().First(); Set(mainCamera, (Transform)Matrix4x4.CreateTranslation(0, 26, 0)); var meshManager = Processors.GetOrThrow <MeshManager>(); var heartMesh = meshManager.Load(this, "heart.glb"); var swordMesh = meshManager.Load(this, "sword.glb"); for (var x = -12; x <= 12; x++) { for (var z = -12; z <= 12; z++) { var entity = Entities.New(); var position = Matrix4x4.CreateTranslation(x * 2, 24, z * 2); var rotation = Matrix4x4.CreateRotationY(RND.NextFloat(MathF.PI * 2)); Set(entity, (Transform)(rotation * position)); Set(entity, RND.Pick(heartMesh, swordMesh)); } } var textureManager = Processors.GetOrThrow <TextureManager>(); var texture = textureManager.Load(this, "terrain.png"); var stone = Entities.New(); var dirt = Entities.New(); var grass = Entities.New(); Set(stone, TextureCoords4.FromGrid(4, 4, 1, 0)); Set(dirt, TextureCoords4.FromGrid(4, 4, 2, 0)); Set(grass, TextureCoords4.FromGrid(4, 4, 3, 0)); void CreateChunk(ChunkPos pos) { var chunk = Entities.New(); var storage = new ChunkPaletteStorage <Block>(default(Block)); for (var x = 0; x < 16; x++) { for (var y = 0; y < 16; y++) { for (var z = 0; z < 16; z++) { var yy = (pos.Y << 4) | y; if (RND.NextBool(0.5 - yy / 48.0)) { storage[x, y, z] = new Block((yy > 16) ? grass : (yy > -16) ? dirt : stone); } } } } Set(chunk, new Chunk(pos)); Set(chunk, (Transform)Matrix4x4.CreateTranslation(pos.GetOrigin())); Set(chunk, storage); } var chunkMeshGenerator = new ChunkMeshGenerator(this); var chunkStore = (LookupDictionaryStore <ChunkPos, Chunk>)Components.GetStore <Chunk>(); void GenerateChunkMesh(ChunkPos pos) { var chunk = Entities.GetByID(chunkStore.GetEntityID(pos)) !.Value; var chunkMesh = chunkMeshGenerator.Generate(pos); if (chunkMesh == null) { return; } Set(chunk, chunkMesh.Value); Set(chunk, texture); } for (var x = -6; x < 6; x++) { for (var y = -2; y < 2; y++) { for (var z = -6; z < 6; z++) { CreateChunk(new ChunkPos(x, y, z)); } } } for (var x = -6; x < 6; x++) { for (var y = -2; y < 2; y++) { for (var z = -6; z < 6; z++) { GenerateChunkMesh(new ChunkPos(x, y, z)); } } } }