Найти максимальное и минимальное значение высоты на terrain(Unity)?
Возникла потребность поставить флажок, где в точке максимальная и минимальная высота terrain. Есть ответы как это сделать но они не работают. Мне надо вернуть мин, мак точки в формате Vector3. Сейчас я делаю так по этому примеру :
if (flag) {
if (GUILayout.Button ("Min")) {
if (TerrainList.Count () == 0) {
TerrainList = LofP.setTerrain ();
}
Vector3 min = default(Vector3);
float min_height=0;
int count = 0;
foreach (var terrain in TerrainList)
{
if(count == 0) {
min= terrain.terrainData.bounds.min;
min_height = terrain.terrainData.bounds.min.y;
} else{
if(min_height >= terrain.terrainData.bounds.min.y) {
min= terrain.terrainData.bounds.min;
min_height = terrain.terrainData.bounds.min.y;
}
}
}
GameObject min_flag = Resources.Load<GameObject> ("Flag/Mesh/flag point");
min_flag.name = "min_flag";
Instantiate(min_flag, min, Quaternion.identity);
}
if (GUILayout.Button ("Max")) {
if (TerrainList.Count () == 0) {
TerrainList = LofP.setTerrain ();
}
Vector3 max = default(Vector3);
float max_height=0;
int count = 0;
foreach (var terrain in TerrainList)
{
if(count == 0) {
max= terrain.terrainData.bounds.max;
max_height = terrain.terrainData.bounds.max.y;
} else{
if(max_height <= terrain.terrainData.bounds.max.y) {
max= terrain.terrainData.bounds.max;
max_height = terrain.terrainData.bounds.max.y;
}
}
}
GameObject max_flag = Resources.Load<GameObject> ("Flag/Mesh/flag point");
max_flag.name = "max_flag";
Instantiate(max_flag, max, Quaternion.identity);
}
}
Но флажки устанавливаются не в тех местах.
Ответы (1 шт):
Автор решения: Ivan Triumphov
→ Ссылка
internal bool flag = true;
internal float verificationStep = 2f;
...
flag = EditorGUILayout.Foldout (flag, "Min Max height terrain");
if (flag) {
verificationStep = EditorGUILayout.Slider ("Шаг проверки",verificationStep, 0.1f, 10f);
if (GUILayout.Button ("Min")) {
if (TerrainList.Count () == 0) {
TerrainList = LofP.setTerrain ();
}
Vector3 min = default(Vector3);
float min_height=1000;
int count = 0;
foreach (var terrain in TerrainList)
{
for (float x =terrain.GetPosition ().x;x<terrain.GetPosition ().x+terrain.terrainData.size.x;x=x+verificationStep) {
for (float z =terrain.GetPosition ().z;z<terrain.GetPosition ().z+terrain.terrainData.size.z;z=z+verificationStep) {
if(min_height >= terrain.SampleHeight(new Vector3(x,0,z))) {
min_height = terrain.SampleHeight(new Vector3(x,0,z));
min = new Vector3(x,min_height,z);
}
}
}
count++;
}
GameObject min_flag = Resources.Load<GameObject> ("Flag/Mesh/flag point");
min_flag.name = "min_flag";
Instantiate(min_flag, min, Quaternion.identity);
}
if (GUILayout.Button ("Max")) {
if (TerrainList.Count () == 0) {
TerrainList = LofP.setTerrain ();
}
Vector3 max = default(Vector3);
float max_height=0;
int count = 0;
foreach (var terrain in TerrainList)
{
for (float x =terrain.GetPosition ().x;x<terrain.GetPosition ().x+terrain.terrainData.size.x;x=x+verificationStep) {
for (float z =terrain.GetPosition ().z;z<terrain.GetPosition ().z+terrain.terrainData.size.z;z=z+verificationStep) {
if(max_height <= terrain.SampleHeight(new Vector3(x,0,z))) {
max_height = terrain.SampleHeight(new Vector3(x,0,z));
max = new Vector3(x,max_height,z);
}
}
}
count++;
}
GameObject max_flag = Resources.Load<GameObject> ("Flag/Mesh/flag point");
max_flag.name = "max_flag";
Instantiate(max_flag, max, Quaternion.identity);
}
}
