Unity创建了点之间存在间隙的线

时间:2017-01-25 17:24:12

标签: unity3d line

我试图创造一种类似于Curve Fever的游戏,其中有一些蛇'随着尾巴越来越多。我想要达到的目标是每隔x秒就会在线间产生间隙。

目前我正在使用LineRenderer并设置如下所示的点:

void Update() {
    if(Vector3.Distance(points.Last(), snake.position) > pointSpacing)
        SetPoint();
}

public void SetPoint(){
    if (noGap)
    {
        if (points.Count > 1)
            coll.points = points.ToArray<Vector2>();

        points.Add(snake.position);

        line.numPositions = points.Count;
        line.SetPosition(points.Count - 1, snake.position);
    }

}

public IEnumerator LineGap(){
    while (enabled)
    {  
        yield return new WaitForSeconds(2f);
        noGap = false;
        yield return new WaitForSeconds(.5f);
        noGap = true;
    }
}

使用上面的协程我尝试不是每2秒创建一次点数0.5秒,但是LineRenderer会在每2点之间创建一条线。

有没有办法实现我想要做的事情?也许通过使用另一种渲染器?

1 个答案:

答案 0 :(得分:1)

一种选择是为每个线段创建一个新的LineRenderer。然后你的蛇将跟踪一个LineRenderers列表。如果您将LineRenderer GameObject作为预制件,则可以很容易地动态生成它。你的Snake课程看起来像这样:

public class Snake
{
    public GameObject LinePrefab;           //Prefab gameobject with LineRenderer
    private List<LineRenderer> pathList;    //List of line segments
    private LineRenderer line;              //Current line


    private void Start(){
        this.pathList = new List<LineRenderer>();
        SpawnNewLineSegment();

        //Other initialization code
    }

    public void Update(){
        if (!noGap && Vector3.Distance(points.Last(), snake.position) > pointSpacing)
            SetPoint()
    }

    public void SetPoint(){
        if (points.Count > 1)
            coll.points = points.ToArray<Vector2>();

        points.Add(snake.position);

        //Increment the number of points in the line
        line.numPositions = line.numPositions + 1;
        line.SetPosition(line.numPositions - 1, snake.position);
    }

    public IEnumerator LineGap(){
        while (enabled)
        {  
            yield return new WaitForSeconds(2f);
            noGap = false;
            yield return new WaitForSeconds(.5f);
            noGap = true;

            //We are starting a new line, create a new line segment
            SpawnNewLineSegment();
        }

    private LineRenderer SpawnNewLineSegment(){
        //Spawn the gameobject as a parent of this object
        GameObject go = Instantiate(this.LinePrefab, this.transform);
        this.line = go.GetComponent<LineRenderer>();
        this.pathList.Add(this.line)

        //Set the first point on the line
        SetPoint()
    } 
}

唯一的问题是你想如何处理你的碰撞(我认为这是coll的意思)。碰撞是否跨越间隙或是否在那里留下了一个洞?如上所述,看起来对撞机将是连续的(没有间隙)。

如果您担心在运行时生成新GameObjects的性能,您可以在初始化时创建它们的池,然后在需要它们之前禁用它们。