Процедурная генерация с использованием системы ландшафта Unity?C#

Место общения программистов C#
Ответить
Anonymous
 Процедурная генерация с использованием системы ландшафта Unity?

Сообщение Anonymous »

Мне трудно понять, почему этот скрипт не может плавно генерировать фрагменты рядом друг с другом на основе шума Перлина.
Я совершенно новичок в процедурной генерации, но не новичок в Unity и C#.
Я создал этот скрипт здесь. Он будет генерировать фрагменты ландшафта вокруг основной камеры, и каждый фрагмент будет случайным образом подвергаться воздействию процедурно сгенерированной карты высот, аналогичная система, которую можно увидеть на вроде Minecraft.
Очевидно, я сделал это в надежде на систему, в которой игрок мог бы перемещаться по миру вечно и генерировать мир вокруг себя в зависимости от того, где он находился, с помощью системы фрагментов, чтобы уменьшить задержку и тому подобное.
Проблема в том, что каждый отдельный фрагмент, кажется, не объединяет плавно соседние фрагменты. Я предполагаю, что это из-за моего непонимания шума Перлина, но я не могу решить эту проблему, хотя и клянусь, что она должна работать правильно, когда я сам просматриваю код.
Однако он ДЕЛАЕТ правильно генерирует одну и ту же карту высот с тем же начальным значением и для тех же фрагментов в тех же позициях.

Код: Выделить всё

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 

Подробнее здесь: [url]https://stackoverflow.com/questions/75872629/procedural-generation-using-unitys-terrain-system[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»