我的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;
}
}
}
该机制运行良好,但是动画出了点问题。
我发现这个宽度变化主题非常有趣。据我检查,有两个要点要考虑。
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
因此,当您要动态地更改线的顶点时,路径的整体宽度可能会发生变化。
因此,我认为您的算法工作正常,并且宽度变化与线渲染器组件一起出现。
我非常有信心,您的问题在于您要增加职位数一遍又一遍地。不过不是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
}
}
让我知道您是否有任何疑问。希望对您有所帮助!