Единство, получить «актуальную» текущую местность? - PullRequest
0 голосов
/ 15 сентября 2018

Unity имеет функцию Terrain.sampleHeight(point), которая великолепна, она мгновенно дает вам высоту ландшафта под ногами, вместо того, чтобы бросать.

Тем не менее, любой нетривиальный проект имеет более одного ландшафта. (Действительно, любая физически большая сцена неизбежно имеет рельеф местности , так или иначе.)

В Unity есть функция Terrain.activeTerrain, которая - не составляет этого - дает вам "первый загруженный", следовательно, бесполезен.

Есть ли на самом деле быстрый способ получить Terrain "под себя" - чтобы затем использовать быструю функцию .sampleHeight?

{Обратите внимание, конечно, что вы могли бы ... разыграть, чтобы найти Terrain под вами! Но тогда у вас будет высота, так что вам не придется беспокоиться о .sampleHeight!}

Короче говоря, есть ли подходящая функция для использования с sampleHeight, которая позволяет этой функции знать , какую местность использовать для данного xyz?

(Или действительно sampleHeight - просто бесполезная демонстрационная функция, которую можно использовать только в демонстрациях с одним ландшафтом?)

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Оказывается, ответ просто НЕТ, Unity не предоставляет такой функции.

0 голосов
/ 17 сентября 2018

Есть ли на самом деле быстрый способ получить Terrain "под себя" - чтобы затем использовать быструю функцию .sampleHeight?

Да, это можно сделать.

(Или действительно, sampleHeight - это просто довольно бесполезная демонстрационная функция, используемая только в демонстрациях с одним Terrain?)

Нет


Тамравен Terrain.activeTerrain, который возвращает основной ландшафт в сцене.Существует также Terrain.activeTerrains (обратите внимание на «s» в конце), который возвращает активных ландшафтов в сцене.

Получите ландшафты с Terrain.activeTerrains, которыевозвращает массив Terrain, затем использует функцию Terrain.GetPosition, чтобы получить его позицию.Получить текущую местность, найдя ближайшую местность с позиции игрока.Вы можете сделать это путем сортировки позиции местности, используя Vector3.Distance или Vector3.sqrMagnitude (быстрее).

Terrain GetClosestCurrentTerrain(Vector3 playerPos)
{
    //Get all terrain
    Terrain[] terrains = Terrain.activeTerrains;

    //Make sure that terrains length is ok
    if (terrains.Length == 0)
        return null;

    //If just one, return that one terrain
    if (terrains.Length == 1)
        return terrains[0];

    //Get the closest one to the player
    float lowDist = (terrains[0].GetPosition() - playerPos).sqrMagnitude;
    var terrainIndex = 0;

    for (int i = 1; i < terrains.Length; i++)
    {
        Terrain terrain = terrains[i];
        Vector3 terrainPos = terrain.GetPosition();

        //Find the distance and check if it is lower than the last one then store it
        var dist = (terrainPos - playerPos).sqrMagnitude;
        if (dist < lowDist)
        {
            lowDist = dist;
            terrainIndex = i;
        }
    }
    return terrains[terrainIndex];
}

ИСПОЛЬЗОВАНИЕ:

Предполагая, что позиция игрокаis transform.position:

//Get the current terrain
Terrain terrain = GetClosestCurrentTerrain(transform.position);
Vector3 point = new Vector3(0, 0, 0);
//Can now use SampleHeight
float yHeight = terrain.SampleHeight(point);

Хотя это можно сделать с помощью Terrain.SampleHeight, это можно упростить с помощью простого радиопередачи от позиции игрока до ландшафта.

Vector3 SampleHeightWithRaycast(Vector3 playerPos)
{
    float groundDistOffset = 2f;
    RaycastHit hit;
    //Raycast down to terrain
    if (Physics.Raycast(playerPos, -Vector3.up, out hit))
    {
        //Get y position
        playerPos.y = (hit.point + Vector3.up * groundDistOffset).y;
    }
    return playerPos;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...