From ee1703b69b7977a8cd6d37dd097f425c8c905882 Mon Sep 17 00:00:00 2001 From: miepzerino <o.skotnik@gmail.com> Date: Thu, 03 Apr 2025 22:24:35 +0000 Subject: [PATCH] #42 added jobs for tile generation --- Assets/Scripts/Jobs/GenerateGroundJob.cs | 43 +++++++++++++++++++++ Assets/Scripts/Jobs.meta | 8 ++++ Assets/Scripts/Jobs/GenerateGroundJob.cs.meta | 11 +++++ Assets/Scripts/GenerateTileMap.cs | 54 ++++++++++++++++++--------- 4 files changed, 98 insertions(+), 18 deletions(-) diff --git a/Assets/Scripts/GenerateTileMap.cs b/Assets/Scripts/GenerateTileMap.cs index d74153b..36ffa81 100644 --- a/Assets/Scripts/GenerateTileMap.cs +++ b/Assets/Scripts/GenerateTileMap.cs @@ -1,6 +1,8 @@ using System; using System.Collections; using System.Collections.Generic; +using Unity.Collections; +using Unity.Jobs; using Unity.VisualScripting; using UnityEngine; using UnityEngine.Tilemaps; @@ -76,9 +78,9 @@ 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)); @@ -232,38 +234,54 @@ 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) { diff --git a/Assets/Scripts/Jobs.meta b/Assets/Scripts/Jobs.meta new file mode 100644 index 0000000..7bc6c47 --- /dev/null +++ b/Assets/Scripts/Jobs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c530f47158920ad4890aa10e7869b090 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Jobs/GenerateGroundJob.cs b/Assets/Scripts/Jobs/GenerateGroundJob.cs new file mode 100644 index 0000000..ce435a5 --- /dev/null +++ b/Assets/Scripts/Jobs/GenerateGroundJob.cs @@ -0,0 +1,43 @@ +using System.Collections; +using System.Collections.Generic; +using Unity.Burst; +using Unity.Collections; +using Unity.Jobs; +using Unity.Mathematics; +using UnityEngine; + + +// Add these struct definitions at the top of the file, outside the class +[BurstCompile] +public struct GenerateGroundJob : IJobParallelFor +{ + public int chunkStartX; + public int chunkStartY; + public int chunkSize; + public int maxWidth; + public int groundDepth; + public float scale; + public float offsetX; + public float offsetY; + + [WriteOnly] + public NativeArray<bool> groundTiles; + + public void Execute(int index) + { + int x = chunkStartX + (index % chunkSize); + int y = chunkStartY - (index / chunkSize); + + if (x < 1 || x >= maxWidth || y < -groundDepth || y >= 0) + { + groundTiles[index] = false; + return; + } + + float xPerlin = ((float)x / maxWidth) * scale + offsetX; + float yPerlin = ((float)math.abs(y) / groundDepth) * scale + offsetY; + float perlinNoise = noise.cnoise(new float2(xPerlin, yPerlin)); + + groundTiles[index] = perlinNoise <= 0.7f; + } +} diff --git a/Assets/Scripts/Jobs/GenerateGroundJob.cs.meta b/Assets/Scripts/Jobs/GenerateGroundJob.cs.meta new file mode 100644 index 0000000..e76efd2 --- /dev/null +++ b/Assets/Scripts/Jobs/GenerateGroundJob.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 760375a37b380d24d8d322b70f0937de +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: -- Gitblit v1.9.3