pasha5666 Дата: Сб, 13 Июн 2015, 19:43 | Сообщение # 1
Сообщений: 1
Награды:
0
Репутация:
0
Статус: Offline
Здраствуйте, есть скрипт который генерирует макет карты.0 - равнина, 1 - горы, -1 - впадины для рек.Подскажите как рандомно сгенерировать эти впадины, чтобы было похоже на реку. Код
using UnityEngine; using System.Collections; using System; public class Map : MonoBehaviour { public int width; public int height; public string seed; public bool useRandomSeed; [Range(0,100)] public int randomFillPercent; public int[,] map; void Start () { GenerateMap(); BotomGenerate(); } void GenerateMap() { map = new int [width, height]; RandomFillMap(); for(int i = 0; i < 5; i++) { SmoothMap(); } //MeshGenerate meshGen = GetComponent<MeshGenerate>(); //meshGen.GenerateMesh(map, 1); } void RandomFillMap() { if(useRandomSeed == true) { seed = Time.time.ToString(); } System.Random pseudoRandom = new System.Random(seed.GetHashCode()); for(int x = 0; x < width; x++) for(int y = 0; y < height; y++) { if((x == 0)||(x == width - 1)||(y == 0)||(y == height - 1)) { map[x, y] = 1; } else { map[x, y] = (pseudoRandom.Next(0, 100) < randomFillPercent)? 1: 0; } } } void SmoothMap() { for(int x = 0; x < width; x++) for(int y = 0; y < height; y++) { int neighbourWallTiles = GetSorroundWallCount(x, y); if(neighbourWallTiles > 4) map[x, y] = 1; else if(neighbourWallTiles < 4) map[x, y] = 0; } } int GetSorroundWallCount(int gridX, int gridY) { int wallCount = 0; for(int neighbourX = gridX - 1; neighbourX <= gridX + 1; neighbourX++) for(int neighbourY = gridY - 1; neighbourY <= gridY + 1; neighbourY++) { if ((neighbourX >= 0)&&(neighbourX < width)&&(neighbourY >= 0)&&(neighbourY < height)) { if ((neighbourX != gridX)||(neighbourY != gridY)) { wallCount += map[neighbourX, neighbourY]; } } else { wallCount ++; } } return wallCount; } void BotomGenerate () { // } void OnDrawGizmos () { if (map != null) { for(int x = 0; x < width; x++) for(int y = 0; y < height; y++) { Gizmos.color = (map[x, y] == 1)? Color.black: Color.green; if (map[x, y] ==-1) { Gizmos.color = Color.blue; } Vector3 pos = new Vector3(-width/2 +x+0.5f,0,-height/2 +y+0.5f); Gizmos.DrawCube(pos, Vector3.one); } } } }
Сообщение Здраствуйте, есть скрипт который генерирует макет карты.0 - равнина, 1 - горы, -1 - впадины для рек.Подскажите как рандомно сгенерировать эти впадины, чтобы было похоже на реку. Код
using UnityEngine; using System.Collections; using System; public class Map : MonoBehaviour { public int width; public int height; public string seed; public bool useRandomSeed; [Range(0,100)] public int randomFillPercent; public int[,] map; void Start () { GenerateMap(); BotomGenerate(); } void GenerateMap() { map = new int [width, height]; RandomFillMap(); for(int i = 0; i < 5; i++) { SmoothMap(); } //MeshGenerate meshGen = GetComponent<MeshGenerate>(); //meshGen.GenerateMesh(map, 1); } void RandomFillMap() { if(useRandomSeed == true) { seed = Time.time.ToString(); } System.Random pseudoRandom = new System.Random(seed.GetHashCode()); for(int x = 0; x < width; x++) for(int y = 0; y < height; y++) { if((x == 0)||(x == width - 1)||(y == 0)||(y == height - 1)) { map[x, y] = 1; } else { map[x, y] = (pseudoRandom.Next(0, 100) < randomFillPercent)? 1: 0; } } } void SmoothMap() { for(int x = 0; x < width; x++) for(int y = 0; y < height; y++) { int neighbourWallTiles = GetSorroundWallCount(x, y); if(neighbourWallTiles > 4) map[x, y] = 1; else if(neighbourWallTiles < 4) map[x, y] = 0; } } int GetSorroundWallCount(int gridX, int gridY) { int wallCount = 0; for(int neighbourX = gridX - 1; neighbourX <= gridX + 1; neighbourX++) for(int neighbourY = gridY - 1; neighbourY <= gridY + 1; neighbourY++) { if ((neighbourX >= 0)&&(neighbourX < width)&&(neighbourY >= 0)&&(neighbourY < height)) { if ((neighbourX != gridX)||(neighbourY != gridY)) { wallCount += map[neighbourX, neighbourY]; } } else { wallCount ++; } } return wallCount; } void BotomGenerate () { // } void OnDrawGizmos () { if (map != null) { for(int x = 0; x < width; x++) for(int y = 0; y < height; y++) { Gizmos.color = (map[x, y] == 1)? Color.black: Color.green; if (map[x, y] ==-1) { Gizmos.color = Color.blue; } Vector3 pos = new Vector3(-width/2 +x+0.5f,0,-height/2 +y+0.5f); Gizmos.DrawCube(pos, Vector3.one); } } } }
Автор - pasha5666 Дата добавления - 13 Июн 2015 в 19:43