- Home /
Question by
ivantriumphov · Dec 25, 2019 at 04:17 PM ·
prefabterraindata
Perhaps all the settings that apply to prefab apply to terrain.terrainData settings?
I have a brush widget in which the following settings:
Can I apply all these settings to terrain.terrainData? Common settings terrainData and brush are : Random Scale(Min,Max)=Tree Height, Brush Fill Rate = Tree Density, Brush Size = Brush Size.
My method processing prefab with writing to terrainData:
public static void DrawTreeNew(float step, List<float> angle, List<float> min_height, List<float> max_height, List<Vector3> drawcord, List<Terrain> terrains, List<int> idprefab, List<int> idsecondprefab = null, List<int> texture = null)
{
float mapoffsetx = marijnz.EditorCoroutines.PlacementObjects.mapoffsetx;
float mapoffsety = marijnz.EditorCoroutines.PlacementObjects.mapoffsetz;
if (drawcord[0].x != drawcord[drawcord.Count - 1].x && drawcord[0].z != drawcord[drawcord.Count - 1].z) //если линия, ограничивающая полигон не замкнута
drawcord.Add(drawcord[0]); //добавляем замыкающую вершину
// /*сортируем индексы префабов по возрастанию*/
// idprefab.Sort(delegate (int first, int second)
// {
// if (first == null && second == null) return 0;
// else if (first == null) return -1;
// else if (second == null) return 1;
// else return first.CompareTo(second);
// });
float[] metricIn = new float[drawcord.Count * 2]; //дополнительный массив вершин, пересчитанный для проверки нахождения точки внутри полигона
drawcord[0] = new Vector3(drawcord[0].x - mapoffsetx, 0, drawcord[0].z - mapoffsety); //расчет 0-ой вершины в единицах Unity (метры)
metricIn[0] = drawcord[0].x; metricIn[1] = drawcord[0].z; //запись 0-ой вершины в дополнительный массив. x-координаты под четными индексами, Z-координаты под нечетными индексами
float minpointx = drawcord[0].x; //минимальная x-координата
float maxpointx = drawcord[0].x; //максимальная х-координата
float minpointz = drawcord[0].z; //минимальная y-координата
float maxpointz = drawcord[0].z; //максимальная у-координата
/*сортируем террейны по возрастанию (имени)*/
terrains.Sort(delegate (Terrain first, Terrain second)
{
if (first.name == null && second.name == null) return 0;
else if (first.name == null) return -1;
else if (second.name == null) return 1;
else return first.name.CompareTo(second.name);
});
/*Цикл обработки вершин. начинается 1-ой вершины*/
for (int i = 1; i < drawcord.Count; i++)
{
drawcord[i] = new Vector3(drawcord[i].x - mapoffsetx, 0, drawcord[i].z - mapoffsety); //расчет i-ой вершины в единицах Unity (метры)
metricIn[i * 2] = drawcord[i].x; //запись i-ой вершины в дополнительный массив. x-координаты под четными индексами
metricIn[i * 2 + 1] = drawcord[i].z; //запись i-ой вершины в дополнительный массив. z-координаты под нечетными индексами
/*поиск максимальных и минимальных координат по x и максимальных и минимальных координат по z*/
if (drawcord[i].x < minpointx)
minpointx = drawcord[i].x;
if (drawcord[i].x > maxpointx)
maxpointx = drawcord[i].x;
if (drawcord[i].z < minpointz)
minpointz = drawcord[i].z;
if (drawcord[i].z > maxpointz)
maxpointz = drawcord[i].z;
}
float f = Area(drawcord); //Вызов функции для расчета площади полигона
float density = f * (1 / step); //расчет требуемого числа деревьев в зависимости от пплощади и шага
System.Random random = new System.Random();
int breakcount = 0; //счетчик количества деревьев
/*Цикл прекращается, когда высажено достаточное количество деревьев*/
do
{
/*pos - случайная точка внутри прямоугольника, в который вписан полигон*/
Vector3 pos = new Vector3(random.Next(Convert.ToInt32(minpointx), Convert.ToInt32(maxpointx) + 1), 0, random.Next(Convert.ToInt32(minpointz), Convert.ToInt32(maxpointz) + 1));
if (figures_Included(pos.x, pos.z, metricIn, drawcord.Count) == true) //вызываем функцию проверки нахождения точки внутри полигона, если точки внутри то идем в цикл
/*Цикл проходит по всем террейнам*/
foreach (var t in terrains)
{
if (pos.x >= t.GetPosition().x && pos.x <= t.GetPosition().x + t.terrainData.size.x
&& pos.z >= t.GetPosition().z && pos.z <= t.GetPosition().z + t.terrainData.size.z) //если точка находится на текущем террейне
{
int random_int = random.Next(0, idprefab.Count);
// Debug.Log("idprefab[random_int] angle[random_int], min_height[random_int], max_height[random_int] " + idprefab.Count + angle.Count + min_height.Count + max_height.Count);
//Debug.Log("idprefab[random_int] angle[random_int], min_height[random_int], max_height[random_int] " + idprefab[random_int]+ angle[random_int]+ min_height[random_int]+ max_height[random_int]);
DrawTree_Point(t, idprefab[random_int], new Vector3((pos.x - t.GetPosition().x) / t.terrainData.size.x, 0, (pos.z - t.GetPosition().z) / t.terrainData.size.z), angle[random_int], min_height[random_int], max_height[random_int]); //вызов функции высадки одного дерева
}
breakcount++; //добавление дерева к счетчику
}
} while (breakcount <= density);
}
You can see the brush settings by downloading it and opening it in the Unity3D:
Comment
Your answer
Follow this Question
Related Questions
Array of prefabs 0 Answers
Getting last sprite from prefab. 1 Answer