Как построить набор точек на земле в Unity3D?

#c# #unity3d

#c# #unity3d

Вопрос:

Я должен построить набор точек на земле в моем проекте Unity3D. 2D-график точек выглядит примерно так: Построить[1].

Методом грубой силы было бы назначить GameObjects для каждой точки, но поскольку точек тысячи, это будет дорого. Я ищу какое-то возможное использование системы частиц Unity для достижения своей цели. На самом деле любые возможные методы были бы хороши.

Моя конечная цель — выделить эти точки на местности, чтобы указать путь, по которому должен следовать мой игрок.

Любое предложение будет оценено.

Комментарии:

1. Этот ресурс потрясающий, его можно легко модифицировать, и вместо того, чтобы заставлять камеру следовать по пути, вы можете заставить игрока следовать по пути. Вы можете изменить эти сборные и создать то, что вы действительно хотите видеть. Это тоже эффективно

2. Вы можете Instantiate сразу игнорировать и использовать объединение объектов , это очень эффективный учебник

3. Предложенный LineRenderer ниже вариант действительно хороший. Я бы также предложил отфильтровать ваши точки, если это возможно; например, если два сегмента близки к прямым или покрывают только бесконечно малое расстояние, удалите среднюю точку.

Ответ №1:

Взгляните на компонент LineRenderer в Unity. Он принимает массив Vector3, который он использует для построения линии. Вы можете назначить точки из инспектора или использовать код для назначения всего массива сразу или по точкам.

 private LineRenderer lineRenderer;

public void AddPosition(Vector3 position)
{
    lineRenderer.positionCount  = 1;
    lineRenderer.SetPosition(lineRenderer.positionCount - 1, position);
}

public void SetPositions(Vector3[] positionArray)
{
    lineRenderer.SetPositions(positionArray);
}
  

С помощью linerenderer вы можете задавать всевозможные свойства, такие как цвет и ширина. Вы также можете легко отключить и включить весь объект.

Комментарии:

1. Я рассматривал возможность использования Debug. Drawline но я думаю, что LineRenderer был бы лучшим выбором, поскольку он виден в режиме редактирования. Я проведу еще немного исследований по другим вариантам и посмотрю, что будет наиболее подходящим для моего случая. Спасибо за ваше предложение.

Ответ №2:

Вы также можете рассмотреть возможность фильтрации ваших точек. Люди не нуждаются и часто не могут использовать точность, которую могут генерировать машины. Пример фильтра:

 const float MinDistanceSqr = 0.00001f; // Min Distance of 0.001 (1mm)
const float MaxCosine = 0.999f; // Approx 2.57 degrees

private Vector3[] FilterPoints(Vector3[] source) {

    var filtered = new Stack<Vector3>(source.Length);

    // Push first point
    filtered.Push(source[0]);

    for ( var i = 1; i < source.Length; i   ) {
        var step = filtered.Peek() - source[i];

        // Check Minimum Distance
        if (step.sqrMagnitude < MinDistanceSqr)
            continue; // ignore this point

        // if not last point
        if ( i   1 < source.Length) {
            // Check Minimum Angle to next segment
            var nextStep = source[i] - source[i   1];

            if (Vector3.Dot(step, nextStep) > MaxCosine)
                continue; // ignore this point
        }

        // Passed all filters, add to stack
        filtered.Push(source[i]);
    }


    return filtered.ToArray();
}