前段时间项目有个需求,要在三维场景中动态添加矩形框标记区域块,研究了下,搞定了在三维场景中画矩形框,后来这个需求不需要了也就没继续下去了,在此纪录下如何在三维场景中画矩形吧。效果如下;
首先确定画线使用LineRenderer,在Start方法里设置LineRenderer的属性;
void Start(){
lineRenderer = GetComponent<LineRenderer>();
lineRenderer.positionCount = 0; // 初始化顶点数
lineRenderer.material.color = Color.black; // 设置线颜色
lineRenderer.startWidth = 0.1f;
}
在三维场景中添加一个带碰撞器的Quad充当画布,并将它的位置转化为二维空间的坐标;
public Transform canvasGO;
private Vector3 canvasGOScreenPos;
void Start()
{
lineRenderer = GetComponent<LineRenderer>();
lineRenderer.positionCount = 0; // 初始化顶点数
lineRenderer.material.color = Color.black; // 设置线颜色
lineRenderer.startWidth = 0.1f;
canvasGOScreenPos = Camera.main.WorldToScreenPoint(canvasGO.transform.position);
}
加下来在Update方法中添加画矩形的代码;
void Update()
{
if (Input.GetMouseButtonDown(0) && mouseDown==false) // 检测鼠标左键是否按下
{
lineRenderer.positionCount = 0; // 重置顶点数
vertexCount = 0; // 重置顶点计数器
mouseDown = true; // 标记鼠标按下
startPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, canvasGOScreenPos.z-0.1f);
startPos = Camera.main.ScreenToWorldPoint(startPos);
}
if (Input.GetMouseButtonUp(0)) // 检测鼠标左键是否松开
{
mouseDown = false; // 标记鼠标松开
}
if(mouseDown)
{
endPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, canvasGOScreenPos.z - 0.1f);
endPos = Camera.main.ScreenToWorldPoint(endPos);
Vector3 pos2 = new Vector3(endPos.x, endPos.y, startPos.z);
Vector3 pos4 = new Vector3(startPos.x, endPos.y, endPos.z);
Vector3[] tempPoints = new Vector3[4] { startPos,pos2,endPos,pos4 };
lineRenderer.positionCount = 4;
lineRenderer.SetPositions(tempPoints);
}
}
这样就可以了,完整代码如下;
public Transform canvasGO;
private Vector3 canvasGOScreenPos;
private LineRenderer lineRenderer;
private int vertexCount = 0; // 顶点数计数器
private bool mouseDown = false; // 鼠标状态标记
private Vector3 startPos;
private Vector3 endPos;
void Start()
{
lineRenderer = GetComponent<LineRenderer>();
lineRenderer.positionCount = 0; // 初始化顶点数
lineRenderer.material.color = Color.black; // 设置线颜色
lineRenderer.startWidth = 0.1f;
canvasGOScreenPos = Camera.main.WorldToScreenPoint(canvasGO.transform.position);
}
void Update()
{
if (Input.GetMouseButtonDown(0) && mouseDown==false) // 检测鼠标左键是否按下
{
lineRenderer.positionCount = 0; // 重置顶点数
vertexCount = 0; // 重置顶点计数器
mouseDown = true; // 标记鼠标按下
startPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, canvasGOScreenPos.z-0.1f);
startPos = Camera.main.ScreenToWorldPoint(startPos);
}
if (Input.GetMouseButtonUp(0)) // 检测鼠标左键是否松开
{
mouseDown = false; // 标记鼠标松开
}
if(mouseDown)
{
endPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, canvasGOScreenPos.z - 0.1f);
endPos = Camera.main.ScreenToWorldPoint(endPos);
Vector3 pos2 = new Vector3(endPos.x, endPos.y, startPos.z);
Vector3 pos4 = new Vector3(startPos.x, endPos.y, endPos.z);
Vector3[] tempPoints = new Vector3[4] { startPos,pos2,endPos,pos4 };
lineRenderer.positionCount = 4;
lineRenderer.SetPositions(tempPoints);
}
}
有用的话帮忙点个赞呗!