Ich bin ziemlich neu in der prozeduralen Generierung, aber nicht neu in Unity und C#.
Ich habe dieses Skript hier erstellt. Es generiert Geländeblöcke um die Hauptkamera herum und lässt jeden Block zufällig von einer prozedural generierten Höhenkarte beeinflussen, einem ähnlichen System, das in Ähnlichem zu sehen ist von Minecraft.
Natürlich habe ich es auf diese Weise gemacht, in der Hoffnung auf ein System, bei dem sich der Spieler für immer um die Welt bewegen und die Welt um sich herum generieren kann, je nachdem, wo er sich befindet, mit einem Chunk-System, um Verzögerungen usw. zu reduzieren.
Das Problem ist, dass jeder einzelne Chunk nicht nahtlos mit den angrenzenden Chunks übereinzustimmen scheint. Ich gehe davon aus, dass das daran liegt, dass ich das Perlin-Rauschen nicht verstehe, aber ich kann das Problem nicht lösen, obwohl ich schwöre, dass es richtig funktionieren sollte, wenn ich den Code selbst durchgehe.
Es generiert jedoch korrekt dieselbe Höhenkarte mit demselben Startwert und für dieselben Blöcke an denselben Positionen.
Code: Select all
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Generator : MonoBehaviour
{
[SerializeField] private int seed; // Seed for random generation
[SerializeField] private int chunkSize; // Size of chunks in Unity units
[SerializeField] private int chunkLoadRadius; // Number of chunks to load around target
[SerializeField] private GameObject[] objectPrefabs; // Prefabs of objects to generate
[SerializeField] private int maxItemsPerChunk;
private Dictionary loadedChunks = new Dictionary(); // Dictionary to store loaded chunks
private Vector2Int lastChunkCoord; // Coordinates of last loaded chunk
private Transform targetTransform; // Transform of target
[SerializeField] private Transform cityParent;
[SerializeField] private float depth;
[SerializeField] private float scale;
private void Start()
{
targetTransform = Camera.main.transform;
lastChunkCoord = GetChunkCoord(targetTransform.position);
GenerateChunksAroundTarget();
}
private void Update()
{
// Check if target has moved into a new chunk
Vector2Int currentChunkCoord = GetChunkCoord(targetTransform.position);
if (currentChunkCoord != lastChunkCoord)
{
lastChunkCoord = currentChunkCoord;
GenerateChunksAroundTarget();
}
}
private void GenerateChunksAroundTarget()
{
// Unload any previously loaded chunks that are outside of the chunk load radius
List chunksToUnload = new List();
foreach (KeyValuePair loadedChunk in loadedChunks)
{
if (Vector2Int.Distance(loadedChunk.Key, lastChunkCoord) > chunkLoadRadius)
{
chunksToUnload.Add(loadedChunk.Key);
foreach (GameObject obj in loadedChunk.Value)
{
Destroy(obj);
}
}
}
foreach (Vector2Int chunkCoord in chunksToUnload)
{
loadedChunks.Remove(chunkCoord);
}
// Load any new chunks that are within the chunk load radius
for (int x = -chunkLoadRadius; x
Mobile version