动画绘制具有多个位置的LineRenderer

问题描述 投票:1回答:2

我的LineRenderer具有很多位置,并尝试从a-> b,b-> c,...为线设置动画。

首先,我保存该行的所有位置,然后重置positionCount,使其在开始时不可见。但是,当我在循环中绘制lineR时,增加positionCount,并在绘制下一行时开始,上一行会稍微晃动,宽度会瞬间变化。

这里是代码:

public float LineDrawSpeed;

void Start()
{
  lineRenderer = GetComponent<LineRenderer>();
  int lineCountInLineRenderer = lineRenderer.positionCount - 1;
  var startPositions = new Vector3[lineRenderer.positionCount];
  lineRenderer.GetPositions(startPositions);
  lineRenderer.positionCount = 1;
  StartCoroutine(LineDrawCoroutine(startPositions));
}

这里是协程:

IEnumerator LineDrawCoroutine(Vector3[] positions)
{
  for (int i = 0; i < positions.Length - 1; i++)
  {
    if (lineRenderer.positionCount <= i + 1)
    lineRenderer.positionCount++;

    lineRenderer.SetPosition(i, positions[i]);
    float timePass = 0f;
    while (timePass < LineDrawSpeed)
    {
      var factor = timePass / LineDrawSpeed;
      factor = Mathf.SmoothStep(0, 1, factor);

      lineRenderer.SetPosition(i + 1, Vector3.Lerp(positions[i], positions[i + 1], factor));

      timePass += Mathf.Min(Time.deltaTime, LineDrawSpeed - timePass);
      yield return null;
    }
  }
}

该机制运行良好,但是动画出了点问题。

c# unity3d
2个回答
1
投票

我发现这个宽度变化主题非常有趣。据我检查,有两个要点要考虑。

1.- LineRenderer渲染广告牌线。

https://docs.huihoo.com/unity/5.3/Documentation/en/Manual/class-LineRenderer.html

Billboards是嵌入3D世界中的2D元素,其方向会自动计算出来,使其始终面向相机。这说明了宽度变化以及相机移动。

2.-如果摄像机未移动,请考虑到以下因素:根据文档中的定义,width属性定义:“宽度值和曲线值,用于控制路径沿其长度的宽度。曲线是在每个顶点处采样的,因此其精度受路径中顶点数的限制。路径的总宽度由宽度值控制。“

https://docs.unity3d.com/Manual/class-LineRenderer.html

因此,当您要动态地更改线的顶点时,路径的整体宽度可能会发生变化。

因此,我认为您的算法工作正常,并且宽度变化与线渲染器组件一起出现。


0
投票

我非常有信心,您的问题在于您要增加职位数一遍又一遍地。不过不是100%肯定。

不管怎样,下面的代码都是如何逐步增加行长的工作代码。它只是一个IEnumerator,但是您可以在StartCoroutine中调用它,它应该可以工作

这将适用于直线,但将对曲线进行一些调整(但我想如果需要的话,可以使其起作用。

为了对此进行一些额外说明,而不是增加和增加positionCount,然后添加矢量,我只是将positionCount设置为所需的矢量数量,然后用所需的位置增量填充每个矢量。立刻将它们设置为默认值时,它们默认为0,0,0,因此请确保不会对您造成任何问题。

下面是我使用的代码:

//  Using IEnumerator to ensure that the line is drawn over a specific amount of time
private IEnumerator DrawLine()
{
    float renderTime = 2f;                                      // total time for full line render
    int renderSteps = 75;                                       // desired resolution of render (higher amt of steps creates smoother render)
    float timeBetweenSteps = renderTime / renderSteps;          // time between each render step

    //  Grab the LineRenderer component that is attached to the gameObject and defined in Inspector
    LineRenderer lineRenderer = yourGameObject.GetComponent<LineRenderer>();

    //  Declare the endpoint
    Vector3 endPoint = new Vector3(0, 5, 0);

    //  Take the end point and break into the amount of steps we need in order to create 
    //  fully rendered line
    //  Create an additiveVector for the forLoop that will step through the renderSteps
    //  >>  Start at zero becuase zero is the localOrigin
    Vector3 stepVector = endPoint / renderSteps;
    Vector3 additiveVector = Vector3.zero;

    //  Setting the line's position element count to the render resolution because we will
    //  have to step through 
    lineRenderer.positionCount = renderSteps;

    //  For Loop that steps through each position element in the Line
    for (int i = 0; i != lineRenderer.positionCount; i++)
    {
        lineRenderer.SetPosition(i, additiveVector);            // set the position element to the additiveVEctor
        additiveVector += stepVector;                           // add one step to the additiveVector
        yield return new WaitForSeconds(timeBetweenSteps);      // Wait the appropriate step time before repeating the loop
    }
}

让我知道您是否有任何疑问。希望对您有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.