使用 Line Renderer 在运行时在两点之间绘制线

Draw line between two points at runtime using Line Renderer

我是编码新手,正在尝试制作一个物体出现在墙上的游戏,玩家将通过一条线连接 2 个匹配项(这个游戏感觉是 2D,但实际上是 3D)。

我的第一步只是能够在两点之间画一条线。稍后我会尝试弄清楚是否使用布尔值、触发器或碰撞器或什么来确定玩家是否连接了正确的对象。

我遇到了很多麻烦。我想单击屏幕一次以确定起点,然后第二次确定直线渲染器的终点。然后换行重复这一切。

这个脚本几乎可以正常工作,但出于某种原因,我的第一个点总是设置为 (0, 0, 0),我不知道为什么。这是我当前的脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DrawLine_2PT : MonoBehaviour


{
    // Apply these values in the editor
    public LineRenderer Line;
    public GameObject newLine;
   
    public float minimumVertexDistance = 0.1f;

    public Vector3 GetWorldCoordinate(Vector3 mousePosition)
    {
        Vector3 mousePos = new Vector3(mousePosition.x, mousePosition.y, 1);
        return Camera.main.ScreenToWorldPoint(mousePos);
    }

    void Start()
    {
        // set the color of the line
        Line.startColor = Color.red;
        Line.endColor = Color.red;

        // set width of the renderer
        Line.startWidth = 0.3f;
        Line.endWidth = 0.3f;
        Line.positionCount = 0;
    }


    void Update()
    {
        if ((Input.GetMouseButtonDown(0)) && Line.positionCount == 0)

        {
            Vector3 mousePos = GetWorldCoordinate(Input.mousePosition);
            Line.SetPosition(0, mousePos);
            Line.positionCount = Line.positionCount + 2;
            
               
        }

        
        if (Input.GetMouseButtonDown(0) && Line.positionCount == 2)

        {
            Vector3 mousePos = GetWorldCoordinate(Input.mousePosition);
            Line.SetPosition(1, mousePos);
            Instantiate(newLine, transform.position, Quaternion.Euler(0, 0, 0));
            GetComponent<DrawLine_2PT>().enabled = false;

        }

    }

}

最后一位在创建第二个点后生成一条新线,并关闭初始线渲染器。同样,除了第一个点总是在 (0, 0, 0) 而不是鼠标位置生成外,似乎一切正常。

Any/all 非常感谢您的建议。

谢谢

你在做

Line.positionCount = Line.positionCount + 2;

你打电话后

Line.SetPosition(0, mousePos);

所以这还没有效果,因为当您尝试设置它时还没有积分。

然后您添加的两个位置都保持默认位置 0,0,0,直到您稍后覆盖第二个位置。

先增加计数再设置位置

另请注意,实际上您的两个代码块将在同一帧中执行,因为在增加计数后第二个条件也匹配。这是故意的吗?

我宁愿期待像这样的东西

void Update()
{
    if ((Input.GetMouseButtonDown(0))
    {
        if(Line.positionCount == 0))
        {
            Line.positionCount = 1;
            var mousePos = GetWorldCoordinate(Input.mousePosition);
            Line.SetPosition(0, mousePos);            
        }    
        else
        {
            Line.positionCount = 2;
            var mousePos = GetWorldCoordinate(Input.mousePosition);
            Line.SetPosition(1, mousePos);
            Instantiate(newLine, transform.position, Quaternion.Euler(0, 0, 0));
            GetComponent<DrawLine_2PT>().enabled = false;
        }
    }
}

如果您愿意,您甚至可以在用户绘制线条时直观地更新线条,例如

void Update()
{
    if ((Input.GetMouseButtonDown(0))
    {
        if(Line.positionCount == 0))
        {
            Line.positionCount = 1;
            Vector3 mousePos = GetWorldCoordinate(Input.mousePosition);
            Line.SetPosition(0, mousePos);            
        }    
        else
        {
            Line.positionCount = 2;
            var mousePos = GetWorldCoordinate(Input.mousePosition);
            Line.SetPosition(1, mousePos);
            Instantiate(newLine, transform.position, Quaternion.Euler(0, 0, 0));
            GetComponent<DrawLine_2PT>().enabled = false;
        }
    }
    else if(Line.positionCount == 1)
    {
        var mousePos = GetWorldCoordinate(Input.mousePosition);
        Line.SetPosition(1, mousePos);
    }
}