如何在Unity3D中在地面上绘制一组点?

时间:2019-04-16 06:36:28

标签: c# unity3d

我必须在Unity3D项目的地面上绘制一组点。点的2D图类似于此: Plot [1]。

蛮力方法是将游戏对象分配给每个点,但是由于有成千上万个点,所以代价很高。我正在寻找Unity粒子系统的某些可能用法以实现我的目标。实际上,任何可能的方法都可以。

我的最终目标是突出地面上的那些点,以指示玩家遵循的路径。

任何建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

看看Unity的LineRenderer组件。它接受用于绘制线的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);
}

使用线性渲染器,您可以设置各种属性,例如颜色和宽度。您还可以轻松禁用和启用整个对象。

答案 1 :(得分:0)

You might also consider filtering your points. Humans don't need and often can't use the precision that machines can generate. An example filter:

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