使用 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);
}
}
我是编码新手,正在尝试制作一个物体出现在墙上的游戏,玩家将通过一条线连接 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);
}
}