如何为已用Unity插件Vectrosity创建的线条添加时长可控的绘制动画?
实现Vectrosity线条的指定时长绘制动画
嘿,刚好之前用Vectrosity做过类似的线条绘制动画,给你两个实用的方案,都是基于Unity协程实现的,能完美控制绘制时长:
方案1:通用多段线条动画(支持任意点数的线条)
如果你的线条是由多个点组成的复杂路径,这个方案可以逐段逐步绘制:
using UnityEngine; using System.Collections; using System.Collections.Generic; using Vectrosity; public class LineAnimator : MonoBehaviour { void Start() { // 初始化你的线条点 var linePoints = new List<Vector2>(){new Vector2(20, 30), new Vector2(200, 300)}; // 创建线条(初始先不完成绘制) VectorLine myLine = new VectorLine("Line", linePoints, 2.0f); // 启动动画:2秒内完成绘制 StartCoroutine(AnimateLineProgressive(myLine, 2f)); } IEnumerator AnimateLineProgressive(VectorLine targetLine, float totalDuration) { float timePassed = 0f; // 备份原始的所有点,避免动画过程中被修改 List<Vector2> originalPoints = new List<Vector2>(targetLine.points2); while (timePassed < totalDuration) { // 计算当前绘制进度(0=未开始,1=完全绘制) float drawProgress = timePassed / totalDuration; // 构建当前要显示的点列表 List<Vector2> currentDisplayPoints = new List<Vector2>(); currentDisplayPoints.Add(originalPoints[0]); // 逐段计算当前进度下应该显示到哪个位置 for (int i = 1; i < originalPoints.Count; i++) { // 计算当前线段的进度(比如总进度0.3,线条有2段的话,就是第一段的30%) float segmentProgress = Mathf.Clamp01(drawProgress * (originalPoints.Count - 1) - (i - 1)); // 插值得到当前线段的终点位置 Vector2 currentSegmentEnd = Vector2.Lerp(originalPoints[i-1], originalPoints[i], segmentProgress); currentDisplayPoints.Add(currentSegmentEnd); // 如果当前线段还没走完,就停止后续线段的处理,只显示到当前位置 if (segmentProgress < 1f) { break; } } // 更新线条的点并绘制 targetLine.SetPoints(currentDisplayPoints); targetLine.Draw(); timePassed += Time.deltaTime; yield return null; // 等待下一帧 } // 动画结束后,确保线条显示完整的原始点 targetLine.SetPoints(originalPoints); targetLine.Draw(); } }
方案2:简化版直线动画(仅两个点的情况)
如果你的线条就是简单的两点直线,那可以用更简洁的代码:
using UnityEngine; using System.Collections; using System.Collections.Generic; using Vectrosity; public class StraightLineAnimator : MonoBehaviour { void Start() { var linePoints = new List<Vector2>(){new Vector2(20, 30), new Vector2(200, 300)}; VectorLine myLine = new VectorLine("Line", linePoints, 2.0f); // 1.5秒完成直线绘制 StartCoroutine(AnimateStraightLine(myLine, 1.5f)); } IEnumerator AnimateStraightLine(VectorLine targetLine, float duration) { float elapsed = 0f; Vector2 start = targetLine.points2[0]; Vector2 end = targetLine.points2[1]; while (elapsed < duration) { float progress = elapsed / duration; // 直接插值得到当前的终点位置 Vector2 currentEnd = Vector2.Lerp(start, end, progress); // 更新线条的点 targetLine.SetPoints(new List<Vector2>(){start, currentEnd}); targetLine.Draw(); elapsed += Time.deltaTime; yield return null; } // 最终显示完整线条 targetLine.SetPoints(new List<Vector2>(){start, end}); targetLine.Draw(); } }
注意事项
- 确保你的Vectrosity版本支持
SetPoints方法,部分旧版本可能需要直接赋值targetLine.points2,但优先用官方推荐的SetPoints来更新。 - 如果需要暂停或终止动画,可以调用
StopCoroutine方法,记得保存协程的引用(比如把StartCoroutine的返回值存在变量里)。 - 动画过程中如果需要调整帧率或者时间缩放,
Time.deltaTime会自动适配,不用担心时间不准确的问题。
内容的提问来源于stack exchange,提问作者IronThrone
相关产品推荐
相关产品推荐

