Prozedurale Generierung mit dem Geländesystem von Unity?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Prozedurale Generierung mit dem Geländesystem von Unity?

Post by Anonymous »

Ich habe Probleme herauszufinden, warum dieses Skript nicht nahtlos nebeneinander auf der Grundlage eines Perlin-Rauschens Blöcke generiert.
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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post