【问题标题】:How to extend diagonal line renderer line over a certain duration如何在一定时间内延长对角线渲染线
【发布时间】:2018-04-19 02:44:21
【问题描述】:

我通过将以下脚本附加到一个空的游戏对象来创建了一个对角线渲染器。如何将两端的线延长一半长度,以及如何将线沿 x 轴延长 1 个单位?两者都在一段时间内。

public class DiagonalLine : MonoBehaviour {

bool firstLineComplete = false;
LineRenderer diagLine;

public Vector3 startPoint = new Vector3 (0, 0, 0);
public Vector3 endPoint = new Vector3 (1.0f, 1.0f, 0);

public float lineDrawSpeed;
// Use this for initialization
void Start () {

    diagLine = gameObject.AddComponent<LineRenderer>();
    diagLine.material = new Material (Shader.Find ("Sprites/Default"));
    diagLine.startColor = diagLine.endColor = Color.green;
    diagLine.startWidth = diagLine.endWidth = 0.15f;

    diagLine.SetPosition (0, startPoint);
    diagLine.SetPosition (1, endPoint);

    }
}

【问题讨论】:

  • 你试过了吗?有什么问题吗?
  • 是的,我刚刚回复了。

标签: c# unity3d


【解决方案1】:

把你的问题分解成几部分:

1.将线两边延长x个单位:

这是通过Ray 类完成的。从startPointendPoint 变量创建一个新的Ray 实例,然后使用Ray.GetPoint 函数扩展该行。您必须在两边都这样做才能获得新的延长线。

Ray 类的简单包装器以简化此操作:

Vector3 extendLine(Vector3 startPoint, Vector3 endPoint, ExtendDirection extendDirection, float extendDistance)
{
    Ray ray = new Ray();

    //Start
    if (extendDirection == ExtendDirection.START_POINT)
    {
        ray.origin = startPoint;
        ray.direction = startPoint - endPoint;
    }

    //End
    else if (extendDirection == ExtendDirection.END_POINT)
    {
        ray.origin = endPoint;
        ray.direction = endPoint - startPoint;
    }

    //Extend
    Vector3 newUnityPoint = ray.GetPoint(extendDistance);
    //Debug.DrawLine(ray.origin, newUnityPoint, Color.blue);
    return newUnityPoint;
}

public enum ExtendDirection
{
    START_POINT, END_POINT
}

向左延伸

Vector3 newStartPos = extendLine(startPoint, endPoint, ExtendDirection.START_POINT, 4);
diagLine.SetPosition(0, newStartPos);

延伸到右端

Vector3 newEndPos = extendLine(startPoint, endPoint, ExtendDirection.END_POINT, 4);
diagLine.SetPosition(1, newEndPos);

2。要随时间动画/移动它,请使用协程和Time.deltaTime。每帧使用Time.deltaTime 增加一个变量,然后使用Vector3.Lerp 来处理from 和to 值。

例如参见this 函数。

将两者结合起来,以下是随着时间的推移扩展两条线的完整功能:

bool isRunning = false;

IEnumerator extentLineOverTime(LineRenderer targetLineRenderer, float extendDistance, float duration)
{
    //Calculate Left from extension length
    Vector3 fromValLeftPos = targetLineRenderer.GetPosition(0);
    //Calculate Right from extension length
    Vector3 fromValRightPos = targetLineRenderer.GetPosition(1);

    //Calculate Left to extension length
    Vector3 newLeftPos = extendLine(fromValLeftPos, fromValRightPos, ExtendDirection.START_POINT, extendDistance);
    //Calculate Right to extension length
    Vector3 newRightPos = extendLine(fromValLeftPos, fromValRightPos, ExtendDirection.END_POINT, extendDistance);

    //Make sure there is only one instance of this function running
    if (isRunning)
    {
        yield break; ///exit if this is still running
    }
    isRunning = true;

    float counter = 0;


    while (counter < duration)
    {
        counter += Time.deltaTime;

        //Move to left overtime
        Vector3 tempLeftPos = Vector3.Lerp(fromValLeftPos, newLeftPos, counter / duration);
        targetLineRenderer.SetPosition(0, tempLeftPos);

        //Move to Right overtime
        Vector3 tempRightPos = Vector3.Lerp(fromValRightPos, newRightPos, counter / duration);
        targetLineRenderer.SetPosition(1, tempRightPos);

        yield return null;
    }
    isRunning = false;
}

用法

LineRenderer diagLine;

public Vector3 startPoint = new Vector3(0, 0, 0);
public Vector3 endPoint = new Vector3(1.0f, 1.0f, 0);

// Use this for initialization
void Start()
{
    diagLine = gameObject.AddComponent<LineRenderer>();
    diagLine.material = new Material(Shader.Find("Sprites/Default"));
    diagLine.startColor = diagLine.endColor = Color.green;
    diagLine.startWidth = diagLine.endWidth = 0.15f;

    diagLine.SetPosition(0, startPoint);
    diagLine.SetPosition(1, endPoint);

    //Extend Line Over time
    StartCoroutine(extentLineOverTime(diagLine, 4, 3));
}

StartCoroutine(extentLineOverTime(diagLine, 4, 3)); 将在 3 秒内将线从两侧延长 4 个单位。

【讨论】:

  • 我刚试过你的例子,它完美地延伸了两边的线。只是当我将值更改为 startPoint = new Vector3 (-1.0f, -1.0f, 0);endPoint = new Vector3 (1.0f, 1.0f, 0);StartCoroutine(extentLineOverTime(diagLine, 2, 3)); 时,行的长度减少了。另外,如果我只对延长线的宽度感兴趣,而不管它的高度如何,就像我的问题中的下图一样。
  • 好的,我明白了。您的解决方案加上对线路的 Everts 计算给了我我需要的东西。谢谢。还有一件事。随着长度的增加,我将如何增长/扩展 box2dcollider 以匹配线渲染器?
  • 您可以访问对撞机的大小或删除对撞机(销毁),然后添加一个新的。它会自动让对撞机匹配新的尺寸。
  • @Hilarious404 抱歉回复晚了。我不必重新创建问题。我今天做了,发现一些问题。答案现在已更新以修复它们。我建议你问有关 BoxCollider 的新问题。
  • 抱歉回复晚了。我没有时间重新创建问题。我今天做了,发现一些问题。答案现在已更新并修复它们。查看新代码。我建议您创建有关 BoxCollider 问题的新问题。
【解决方案2】:

这是基本的向量数学。

你有一行(从头到尾):

 Vector3 v = start - end;

然后你将每一边都延长一半,如果它:

 extensionA = start + (v * 0.5f);
 extensionB = end + (v * -0.5f);

如果需要扩展 1 则归一化:

 Vector3 v = (start - end).normalized;
 extensionA = start + v;
 extensionB = end + (v * -1f);

【讨论】:

  • 好的,那我怎样才能像动画一样在一段时间内延长线呢?
  • 对于动画使用协程和 for(float t = 0; t
  • 我猜你的解决方案与程序员的结合使它完整
猜你喜欢
  • 2021-11-24
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多