public bool Generate(ChunkGenerateInfo info, out IChunkObject generated) { generated = null; float noise = Seed.GetNoise(info.maxPos, perlinScale, originIndex); if (noise < minLimit) { return(false); } GameObject go = new GameObject(type.ToString()); go.transform.position = new Vector3(info.maxPos.x + (info.maxValue - 0.4f) * 10, info.maxPos.y + (info.maxValue - 0.4f) * 5, 0); if (type == PlanetType.PLANET) { generated = go.AddComponent <Planet>(); ((Planet)generated).GeneratePlanet(noise); } else if (type == PlanetType.SUN) { generated = go.AddComponent <Sun>(); go.transform.localScale *= 20 * (noise * noise + 0.5f); } else if (type == PlanetType.BLACKHOLE) { generated = go.AddComponent <BlackHole>(); go.transform.localScale *= 20 * (noise * noise + 0.5f); } return(true); }
// 计算新来的Chunk, 判断它是否能生成星球 static bool CountChunk(Chunk chunk, out ChunkGenerateInfo maxInfo) { maxInfo = new ChunkGenerateInfo(); maxInfo.pos = chunk.Position; float maxNoise = 0; Vector2 maxPos = Vector2.zero; for (int i = 0; i < Chunk.SIZE; i += Chunk.SIZE - 1) { for (int j = 0; j < Chunk.SIZE; j += Chunk.SIZE - 1) { Vector2 pos = new Vector2((float)i + (float)maxInfo.pos.x * Chunk.SIZE, (float)j + (float)maxInfo.pos.y * Chunk.SIZE); float noiseValue = Seed.GetNoise(pos, perlinScale, perlinOriginIndex); if (noiseValue > maxNoise) { maxNoise = noiseValue; maxPos = pos; } } } Vector2 center = new Vector2((float)Chunk.SIZE / 2 + (float)maxInfo.pos.x * Chunk.SIZE, (float)Chunk.SIZE / 2 + (float)maxInfo.pos.y * Chunk.SIZE); float centerNoise = Seed.GetNoise(center, perlinScale, perlinOriginIndex); if (centerNoise <= maxNoise) { return(false); } maxInfo.maxValue = centerNoise; maxInfo.maxPos = center; return(true); }
public static void Generate(Chunk chunk) { ChunkGenerateInfo centerInfo = new ChunkGenerateInfo(); if (!CountChunk(chunk, out centerInfo)) { return; } IChunkObject mayGenerated; foreach (GenerateInfo toGen in generateQueue) { // 只生成一个 if (toGen.Generate(centerInfo, out mayGenerated)) { ((Component)mayGenerated).transform.SetParent(generateRoot); chunk.AddChild(mayGenerated); return; } } }