#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();
}