You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为已用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:02:17