当单击多个点时,如何动画行渲染器动画渲染器

发布于 2025-02-11 15:41:12 字数 2574 浏览 1 评论 0 原文

我在屏幕上有多个点,当玩家以正确的顺序点击它们时,它应该在它们之间进行动画。如果播放器单击点的速度比动画的命中率更快,则只有在上一个完成时,下一行才会动画。我遵循了这些教程,但无法设法将它们融合在一起:

https:/https:/ /www.youtube.com/watch?v=a3cs6ybxwdy&t=267s


我目前有这个


我正在使用的代码:

[SerializeField] 私有浮点动画duration = 3f;

private LineRenderer lineRenderer;

private Vector3[] linePoints;
private int pointsCount;


public Transform lastPoints;
public List<Transform> points = new List<Transform>();

private void Awake()
{
    lineRenderer = GetComponent<LineRenderer>();
}
public void MakeLine(Transform finalPoint)
{
    if (lastPoints == null)
    {
        lastPoints = finalPoint;
        points.Add(lastPoints);
    }
    else
    {
        points.Add(finalPoint);
        lineRenderer.enabled = true;
        SetupLine();
    }
}

private void SetupLine()
{
    int pointLength = points.Count;
    lineRenderer.positionCount = pointLength;

    for (int i = 0; i < pointLength; i++)
    {
        lineRenderer.SetPosition(i, points[i].position);
    }
}

这是一次动画的所有点:

public IEnumerator AnimateLine()
{
    for (int i = 0; i < pointsCount - 1; i++)
    {
        float startTime = Time.time;

        Vector3 startPos = linePoints[i];
        Vector3 endPos = linePoints[i+1];

        Vector3 pos = startPos;
        while (pos != endPos)
        {
            float t = (Time.time - startTime) / animationDuration;
            pos = Vector3.Lerp(startPos, endPos, t);
            for (int j = i+1; j < pointsCount; j++)
            {
                lineRenderer.SetPosition(j, pos);
            }
            yield return null;
        }
    }
}

单击单鼠标:

private void CheckClickDownEvent()
{
    if (Input.GetMouseButtonDown(0))
    {
        var selectedObject = RaycastObject();
        
        if(selectedObject != null)
        {
            OnObjectSelect?.Invoke(selectedObject);
        }
    }
}

private void HandlePointSelect(GameObject selectedPoint)
{
    if (spawner.points.IndexOf(selectedPoint) == 0)
    {
        selectedPoint.GetComponent<PointScript>().SelectPoint();
        spawner.points.Remove(selectedPoint);
        lineAnimator.MakeLine(selectedPoint.transform);
    }
}

I have multiple points on screen and when a player clicks them in correct order, it should animate a line between them. If player clicks on points faster than the line appear animation can go, next line is animated only when previous one is finished. I followed these tutorials, but can't manage to blend them together:

https://www.youtube.com/watch?v=a3cs6ybxWdY&t=267s

https://www.youtube.com/watch?v=RMM3BAick4I


I currently have this


Code I'm using:

[SerializeField]
private float animationDuration = 3f;

private LineRenderer lineRenderer;

private Vector3[] linePoints;
private int pointsCount;


public Transform lastPoints;
public List<Transform> points = new List<Transform>();

private void Awake()
{
    lineRenderer = GetComponent<LineRenderer>();
}
public void MakeLine(Transform finalPoint)
{
    if (lastPoints == null)
    {
        lastPoints = finalPoint;
        points.Add(lastPoints);
    }
    else
    {
        points.Add(finalPoint);
        lineRenderer.enabled = true;
        SetupLine();
    }
}

private void SetupLine()
{
    int pointLength = points.Count;
    lineRenderer.positionCount = pointLength;

    for (int i = 0; i < pointLength; i++)
    {
        lineRenderer.SetPosition(i, points[i].position);
    }
}

This one animates all points at once:

public IEnumerator AnimateLine()
{
    for (int i = 0; i < pointsCount - 1; i++)
    {
        float startTime = Time.time;

        Vector3 startPos = linePoints[i];
        Vector3 endPos = linePoints[i+1];

        Vector3 pos = startPos;
        while (pos != endPos)
        {
            float t = (Time.time - startTime) / animationDuration;
            pos = Vector3.Lerp(startPos, endPos, t);
            for (int j = i+1; j < pointsCount; j++)
            {
                lineRenderer.SetPosition(j, pos);
            }
            yield return null;
        }
    }
}

Calling on single mouse click:

private void CheckClickDownEvent()
{
    if (Input.GetMouseButtonDown(0))
    {
        var selectedObject = RaycastObject();
        
        if(selectedObject != null)
        {
            OnObjectSelect?.Invoke(selectedObject);
        }
    }
}

private void HandlePointSelect(GameObject selectedPoint)
{
    if (spawner.points.IndexOf(selectedPoint) == 0)
    {
        selectedPoint.GetComponent<PointScript>().SelectPoint();
        spawner.points.Remove(selectedPoint);
        lineAnimator.MakeLine(selectedPoint.transform);
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文