|  |  |  | 
|---|
|  |  |  | using System; | 
|---|
|  |  |  | using System.Collections; | 
|---|
|  |  |  | using System.Collections.Generic; | 
|---|
|  |  |  | using Unity.Collections; | 
|---|
|  |  |  | using Unity.Jobs; | 
|---|
|  |  |  | using Unity.VisualScripting; | 
|---|
|  |  |  | using UnityEngine; | 
|---|
|  |  |  | using UnityEngine.Tilemaps; | 
|---|
|  |  |  | 
|---|
|  |  |  | private void Update() | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if (playerTransform == null) return; | 
|---|
|  |  |  | Debug.Log($"Player Position: {playerTransform.position}"); | 
|---|
|  |  |  | //Debug.Log($"Player Position: {playerTransform.position}"); | 
|---|
|  |  |  | Vector2Int currentChunk = GetChunkPosition(playerTransform.position); | 
|---|
|  |  |  | Debug.Log($"Current Chunk: {currentChunk}"); | 
|---|
|  |  |  | //Debug.Log($"Current Chunk: {currentChunk}"); | 
|---|
|  |  |  | if (currentChunk != lastLoadedChunk) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | StartCoroutine(UpdateLoadedChunks(currentChunk)); | 
|---|
|  |  |  | 
|---|
|  |  |  | private IEnumerator GenerateChunk(Vector2Int chunk, List<Vector3Int> destroyedTiles) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | int startX = chunk.x * CHUNK_SIZE; | 
|---|
|  |  |  | int startY = (chunk.y * CHUNK_SIZE)-1; | 
|---|
|  |  |  | int startY = (chunk.y * CHUNK_SIZE) - 1; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // Generate ground in chunk | 
|---|
|  |  |  | for (int x = startX; x < startX + CHUNK_SIZE; x++) | 
|---|
|  |  |  | // Create job data | 
|---|
|  |  |  | var groundJob = new GenerateGroundJob | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if (x < 1 || x >= maxWidth) continue; | 
|---|
|  |  |  | chunkStartX = startX, | 
|---|
|  |  |  | chunkStartY = startY, | 
|---|
|  |  |  | chunkSize = CHUNK_SIZE, | 
|---|
|  |  |  | maxWidth = maxWidth, | 
|---|
|  |  |  | groundDepth = groundDepth, | 
|---|
|  |  |  | scale = scale, | 
|---|
|  |  |  | offsetX = offsetX, | 
|---|
|  |  |  | offsetY = offsetY, | 
|---|
|  |  |  | groundTiles = new NativeArray<bool>(CHUNK_SIZE * CHUNK_SIZE, Allocator.TempJob) | 
|---|
|  |  |  | }; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (int y = startY; y > startY - CHUNK_SIZE; y--) | 
|---|
|  |  |  | // Schedule the job | 
|---|
|  |  |  | JobHandle groundJobHandle = groundJob.Schedule(CHUNK_SIZE * CHUNK_SIZE, 64); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // Wait for the job to complete | 
|---|
|  |  |  | groundJobHandle.Complete(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // Apply the results | 
|---|
|  |  |  | for (int i = 0; i < CHUNK_SIZE * CHUNK_SIZE; i++) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if (groundJob.groundTiles[i]) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if (y < -groundDepth || y >= 0) continue; | 
|---|
|  |  |  | int x = startX + (i % CHUNK_SIZE); | 
|---|
|  |  |  | int y = startY - (i / CHUNK_SIZE); | 
|---|
|  |  |  | Vector3Int tilePos = new Vector3Int(x, y); | 
|---|
|  |  |  | if (IsTileDestroyed(tilePos)) | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | float xPerlin = ((float)x / maxWidth) * scale + offsetX; | 
|---|
|  |  |  | float yPerlin = ((float)Mathf.Abs(y) / maxDepth) * scale + offsetY; | 
|---|
|  |  |  | float perlinNoise = Mathf.PerlinNoise(xPerlin, yPerlin); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (perlinNoise <= 0.7f) | 
|---|
|  |  |  | if (!IsTileDestroyed(tilePos)) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | tilemap.SetTile(tilePos, forestRuleTile); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // Generate ores in chunk | 
|---|
|  |  |  | // Clean up native array | 
|---|
|  |  |  | groundJob.groundTiles.Dispose(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // Generate ores | 
|---|
|  |  |  | if (generateables != null) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | yield return GenerateOresInChunk(chunk, destroyedTiles); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // Don't generate borders for each chunk | 
|---|
|  |  |  | // Only generate borders when at world edges | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // Generate borders when needed | 
|---|
|  |  |  | if (startX == 0 || startX + CHUNK_SIZE >= maxWidth || | 
|---|
|  |  |  | startY == 0 || startY - CHUNK_SIZE <= -groundDepth) | 
|---|
|  |  |  | { | 
|---|