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); } } } }
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(); }