コード例 #1
0
    public void SetUpWorld()
    {
        int         wr         = width * chunkSize.x / 2;
        int         nWRsorces  = worldInfo.worldSources.Length;
        List <Item> chunkItems = new List <Item>();

        Item[] worldItems = Item.ItemsFromIds(worldInfo.worldSources);

        for (int y = 0; y < heigth; y++)
        {
            int nItems = nWRsorces > 1? ((y * (nWRsorces - 1)) / heigth) + 1:1;
            int toAdd  = nItems - chunkItems.Count;
            while (toAdd > 0)
            {
                Item posibleItem = Item.ChanceRandomItem(worldItems);
                if (posibleItem != null)
                {
                    if (!chunkItems.Contains(posibleItem))
                    {
                        chunkItems.Add(posibleItem);
                        toAdd--;
                    }
                }
            }

            for (int x = 0; x < width; x++)
            {
                if (chunkItems == null || chunkItems.Count <= 0)
                {
                    Debug.Log("is null");
                }
                Vector2Int chunkPosition = new Vector2Int(-wr + chunkSize.x / 2 + x * chunkSize.x, -y * chunkSize.y);

                if (worldInfo.chunks[x][y] == null)
                {
                    Chunk chunk = new ProceduralChunk(40, 60, 3, 6, 2, 4, chunkSize, chunkItems.ToArray(), ground, backGround, chunkPosition);
                    worldInfo.chunks[x][y] = chunk.ChunkInfo;

                    SetTiles(IdsToTiles(worldInfo.chunks[x][y].tileInfo), chunkPosition);
                }
                else
                {
                    worldInfo.chunks[x][y].gPos = chunkPosition;
                    SetTiles(IdsToTiles(worldInfo.chunks[x][y].tileInfo), chunkPosition);
                }
            }
        }
    }
コード例 #2
0
    void Update()
    {
        ClearVisibleChunks();

        List <Vector2> visibleChunks = new List <Vector2>();

        viewerPosition = new Vector2(viewer.transform.position.x, viewer.transform.position.z) / chunkScale;
        Vector2 viewerChunkCoord = new Vector2(
            Mathf.RoundToInt(viewerPosition.x / chunkSize),
            Mathf.RoundToInt(viewerPosition.y / chunkSize));

        for (int xOffset = -chunkViewDistance; xOffset <= chunkViewDistance; xOffset++)
        {
            for (int yOffset = -chunkViewDistance; yOffset <= chunkViewDistance; yOffset++)
            {
                Vector2 currentChunkCoord = new Vector2(
                    viewerChunkCoord.x + xOffset,
                    viewerChunkCoord.y + yOffset);

                Vector2 currentChunkRealCoord = currentChunkCoord * chunkSize;
                Bounds  currentChunkBounds    = new Bounds(currentChunkRealCoord, Vector2.one * chunkSize * chunkScale);
                float   viewerChunkDistance   = Mathf.Sqrt(currentChunkBounds.SqrDistance(viewerPosition));
                // TODO: use AnimationCurve to modify LOD drop-off
                int decreaseLOD = Mathf.RoundToInt(Mathf.Clamp(viewerChunkDistance / chunkSize, 0, 8));

                if (chunks.ContainsKey(currentChunkCoord))
                {
                    ProceduralChunk currentChunk = chunks[currentChunkCoord];
                    if (currentChunk.GetLOD() != decreaseLOD)
                    {
                        currentChunk.SetLOD(decreaseLOD);
                    }
                    currentChunk.SetVisiblity(true);
                }
                else
                {
                    ProceduralChunk currentChunk = new ProceduralChunk(new ProceduralChunkProperties(
                                                                           new NoiseMapProperties(
                                                                               seed,
                                                                               chunkSizeBound,
                                                                               currentChunkRealCoord,
                                                                               scale,
                                                                               chunkScale,
                                                                               octaves,
                                                                               lacunarity,
                                                                               persistance,
                                                                               NoiseMapProperties.NormalizeType.GLOBAL),
                                                                           regions,
                                                                           mapMaterial,
                                                                           new GeometryProperties(
                                                                               meshHeightCurve,
                                                                               meshHeightMultiplier,
                                                                               decreaseLOD),
                                                                           parentTransform));

                    currentChunk.SetVisiblity(true);
                    chunks.Add(currentChunkCoord, currentChunk);
                }

                visibleChunks.Add(currentChunkCoord);
            }
        }

        lastVisibleChunks = visibleChunks;
        UpdateVisibleChunks();
    }