Beispiel #1
0
    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);
    }
Beispiel #2
0
        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));
                    }
                }
            }
        }