में प्रक्रियात्मक इलाके प्रोग्रामिंग मैं प्रक्रियात्मक पीढ़ी के साथ मिलकर प्रयास करने की कोशिश कर रहा हूं, मैं निश्चित रूप से एकता में समर्थक नहीं हूं, हालांकि मैं इस गाइड का पालन कर रहा था: click और कुछ परिणाम प्राप्त हुए। अभी के लिए मुझे 2 समस्याएं हैं, मेरे पास कुछ बुनियादी विचार है कि उन्हें कैसे हल किया जाए, हालांकि मैं कुछ और राय सुनना चाहता हूं।यूनिटी 3 डी
(मैंने पहले ही इस सवाल को एकता जवाब पर पोस्ट कर दिया है, हालांकि मुझे कुछ जवाब नहीं मिला है, अगर कुछ गुम जानकारी है या कुछ शब्दों में व्याख्या करना असंभव है, तो कृपया मुझे बताएं या कुछ सलाह दें मात्रा के बीच अंतराल: यह जानकारी प्राप्त करने के लिए)
मुख्य मुद्दा है
वे थोड़े गायब हो जाते हैं अगर मैं ज़ूम जाएगा, हालांकि बनावट अयोग्य रहते हैं और यह उल्लेखनीय है।
दूसरा, जैसा कि आप देख सकते हैं कि मुझे लाल रंग में समस्या है (मुझे वास्तव में यह नहीं पता कि इसे कैसे कॉल करें) जमीन पर अंक। मैंने गाइड से सामग्री का उपयोग करने की कोशिश की है, लेकिन एक ही प्रभाव मिला है।
इसके अलावा, पर्लिन शोर (मुझे पता है कि मैं डायमंड स्क्वायर या सरल का उपयोग कर सकता हूं) छद्म-यादृच्छिक एल्गोरिदम है, इसलिए यह उसी इनपुट पैरामीटर के लिए समान मान वापस कर देगा, तो इसका मतलब यह है कि मेरे भाग हमेशा रहेगा वही?
मेरे कोड (मैं गाइड से LibNoise पुस्तकालय का उपयोग कर रहा):
void Awake()
{
var settings = new TerrainChunkSettings(129, 129, 100, 40, FlatTexture, SteepTexture, TerrainMaterial);
var noiseProvider = new NoiseProvider();
for (var i = 0; i < 4; i++)
for (var j = 0; j < 4; j++)
new TerrainChunk(settings, noiseProvider, i, j).CreateTerrain();
}
public class TerrainChunkSettings
{
public int HeightmapResolution { get; private set; }
public int AlphamapResolution { get; private set; }
public int Length { get; private set; }
public int Height { get; private set; }
public Texture2D FlatTexture { get; private set; }
public Texture2D SteepTexture { get; private set; }
public Material TerrainMaterial { get; private set; }
public TerrainChunkSettings(int heightmapResolution, int alphamapResolution, int length, int height, Texture2D flatTexture, Texture2D steepTexture, Material terrainMaterial)
{
HeightmapResolution = heightmapResolution;
AlphamapResolution = alphamapResolution;
Length = length;
Height = height;
FlatTexture = flatTexture;
SteepTexture = steepTexture;
TerrainMaterial = terrainMaterial;
}
}
public class TerrainChunk
{
private Terrain Terrain { get; set; }
private TerrainChunkSettings Settings { get; set; }
private NoiseProvider NoiseProvider { get; set; }
public int X { get; private set; }
public int Z { get; private set; }
private TerrainData Data { get; set; }
private float[,] Heightmap { get; set; }
public TerrainChunk(TerrainChunkSettings settings, NoiseProvider noiseProvider, int x, int z)
{
X = x;
Z = z;
Settings = settings;
NoiseProvider = noiseProvider;
}
public void CreateTerrain()
{
var terrainData = new TerrainData();
terrainData.heightmapResolution = Settings.HeightmapResolution;
terrainData.alphamapResolution = Settings.AlphamapResolution;
var heightmap = GetHeightmap();
terrainData.SetHeights(0, 0, heightmap);
ApplyTextures(terrainData);
terrainData.size = new Vector3(Settings.Length, Settings.Height, Settings.Length);
var newTerrainGameObject = Terrain.CreateTerrainGameObject(terrainData);
newTerrainGameObject.transform.position = new Vector3(X * Settings.Length, 0, Z * Settings.Length);
Terrain = newTerrainGameObject.GetComponent<Terrain>();
Terrain.Flush();
}
private float[,] GetHeightmap()
{
var heightmap = new float[Settings.HeightmapResolution, Settings.HeightmapResolution];
for (var zRes = 0; zRes < Settings.HeightmapResolution; zRes++)
{
for (var xRes = 0; xRes < Settings.HeightmapResolution; xRes++)
{
var xCoordinate = X + (float)xRes/(Settings.HeightmapResolution - 1);
var zCoordinate = Z + (float)zRes/(Settings.HeightmapResolution - 1);
heightmap[zRes, xRes] = NoiseProvider.GetValue(xCoordinate, zCoordinate);
}
}
return heightmap;
}
private void ApplyTextures(TerrainData terrainData)
{
var flatSplat = new SplatPrototype();
var steepSplat = new SplatPrototype();
flatSplat.texture = Settings.FlatTexture;
steepSplat.texture = Settings.SteepTexture;
terrainData.splatPrototypes = new SplatPrototype[]
{
flatSplat,
steepSplat
};
terrainData.RefreshPrototypes();
var splatMap = new float[terrainData.alphamapResolution, terrainData.alphamapResolution, 2];
for (var zRes = 0; zRes < terrainData.alphamapHeight; zRes++)
{
for (var xRes = 0; xRes < terrainData.alphamapWidth; xRes++)
{
var normalizedX = (float)xRes/(terrainData.alphamapWidth - 1);
var normalizedZ = (float)zRes/(terrainData.alphamapHeight - 1);
var steepness = terrainData.GetSteepness(normalizedX, normalizedZ);
var steepnessNormalized = Mathf.Clamp(steepness/1.5f, 0, 1f);
splatMap[zRes, xRes, 0] = 1f - steepnessNormalized;
splatMap[zRes, xRes, 1] = steepnessNormalized;
}
}
terrainData.SetAlphamaps(0, 0, splatMap);
}
}
public interface INoiseProvider
{
float GetValue(float x, float z);
}
public class NoiseProvider : INoiseProvider
{
private Perlin PerlinNoiseGenerator;
public NoiseProvider()
{
PerlinNoiseGenerator = new Perlin();
}
public float GetValue(float x, float z)
{
return (float)(PerlinNoiseGenerator.GetValue(x, 0, z)/2f) + 0.5f;
}
}
क्या आप इसे और स्पष्ट कर सकते हैं कि आपका प्रश्न क्या है? मैं आपकी पोस्ट में तीन संभावित प्रश्न देखता हूं (1. अंतराल, 2. लाल अंक, और 3. पर्लिन शोर मान)। आम तौर पर, आपको स्टैक ओवरफ़्लो पर किसी प्रश्न में केवल एक चीज पूछने का प्रयास करना चाहिए, लेकिन यदि प्रश्न बहुत करीबी से संबंधित हैं तो अपवाद भी किए जा सकते हैं। साथ ही, आप इसे और अधिक स्पष्ट कर सकते हैं कि यदि आप इसे प्रश्न चिह्न के साथ समाप्त करते हैं तो कुछ सवाल है। – PJvG
पर्लिन शोर के बारे में, आप [गिटहब पर लिबनोइस लाइब्रेरी] (https://github.com/ricardojmendez/LibNoise.Unity/blob/master/Generator/Perlin.cs) में देख सकते हैं कि इसमें 'बीज' संपत्ति है । यदि आप अलग-अलग परिणाम चाहते हैं, तो आपको अपनी 'पर्लिन' ऑब्जेक्ट के लिए एक अलग बीज का उपयोग करना चाहिए। यदि आप अभी भी उलझन में हैं तो शायद छद्म यादृच्छिक जेनरेटर और बीजों पर कुछ और शोध करें। – PJvG
@PjvG मुझे प्रति पोस्ट 1 प्रश्न (फ़ोरम पर आम नियम) पता है, हालांकि मुझे वास्तव में नहीं लगता कि मुझे उन्हें अलग करना चाहिए। तो, मैं अपने आत्म को स्पष्ट करने की कोशिश करूंगा, मुख्य प्रश्न अंतराल के बारे में है, कुछ सामान्य (इस तरह से करना चाहिए) समाधान है? मैंने अंक के बारे में पूछा है अगर किसी को भी एक ही समस्या हो, तो मुझे पूरा यकीन है कि मैंने छायांकन विकल्पों में कुछ गलत किया है। – user7803907