5.选择框
5.1 知识点
选择框目标图示
实现思路
记录鼠标按下后的点和当前点,根据两个点使用画线组件进行绘制
创建Controller脚本和对象,Controller对象挂着画线组件。搞一个绿色材质附加到画线组件上,注意画线组件要是世界空间,而且线框调细一点。Loop循环选项也要勾选(图中没勾,要勾上)。同时调整摄像机为俯视。
在Controller脚本中写选择框逻辑。得到画线组件,定义选择框四个点变量。在Update监听鼠标左键是否按下且用变量记录,如果鼠标按下就使用画线组件进行绘制。
public class Controller : MonoBehaviour
{
// 标记鼠标左键是否按下的布尔值
private bool isMouseDown = false;
// 用于绘制线段的 LineRenderer 组件
private LineRenderer line;
// 屏幕上的四个点,用于绘制矩形
// 记录鼠标按下时的当前鼠标位置
private Vector3 leftUpPoint;
private Vector3 rightUpPoint;
private Vector3 leftDownPoint;
private Vector3 rightDownPoint;
void Start()
{
// 获取当前 GameObject 上的 LineRenderer 组件
line = this.GetComponent<LineRenderer>();
}
void Update()
{
if(Input.GetMouseButtonDown(0))
{
// 记录当前鼠标位置
leftUpPoint = Input.mousePosition;
// 将鼠标左键按下标记设为 true
isMouseDown = true;
}
else if(Input.GetMouseButtonUp(0))
{
// 鼠标左键抬起,标记设为 false
isMouseDown = false;
// 将线段的点数量设为 0,停止绘制
line.positionCount = 0;
}
// 当鼠标左键按下时,处理线段绘制逻辑
if(isMouseDown)
{
// 注意:获取的位置是屏幕坐标系的位置
// 设置屏幕上的 4 个点的 z 坐标为 5
leftUpPoint.z = 5;
rightDownPoint = Input.mousePosition;
rightDownPoint.z = 5;
rightUpPoint.x = rightDownPoint.x;
rightUpPoint.y = leftUpPoint.y;
rightUpPoint.z = 5;
leftDownPoint.x = leftUpPoint.x;
leftDownPoint.y = rightDownPoint.y;
leftDownPoint.z = 5;
// 设置线段的点数为 4,并将点设置为世界坐标系下的位置
line.positionCount = 4;
line.SetPosition(0, Camera.main.ScreenToWorldPoint(leftUpPoint));
line.SetPosition(1, Camera.main.ScreenToWorldPoint(rightUpPoint));
line.SetPosition(2, Camera.main.ScreenToWorldPoint(rightDownPoint));
line.SetPosition(3, Camera.main.ScreenToWorldPoint(leftDownPoint));
}
}
}
5.2 知识点代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Controller : MonoBehaviour
{
// 标记鼠标左键是否按下的布尔值
private bool isMouseDown = false;
// 用于绘制线段的 LineRenderer 组件
private LineRenderer line;
// 屏幕上的四个点,用于绘制矩形
// 记录鼠标按下时的当前鼠标位置
private Vector3 leftUpPoint;
private Vector3 rightUpPoint;
private Vector3 leftDownPoint;
private Vector3 rightDownPoint;
void Start()
{
// 获取当前 GameObject 上的 LineRenderer 组件
line = this.GetComponent<LineRenderer>();
}
void Update()
{
if(Input.GetMouseButtonDown(0))
{
// 记录当前鼠标位置
leftUpPoint = Input.mousePosition;
// 将鼠标左键按下标记设为 true
isMouseDown = true;
}
else if(Input.GetMouseButtonUp(0))
{
// 鼠标左键抬起,标记设为 false
isMouseDown = false;
// 将线段的点数量设为 0,停止绘制
line.positionCount = 0;
}
// 当鼠标左键按下时,处理线段绘制逻辑
if(isMouseDown)
{
// 注意:获取的位置是屏幕坐标系的位置
// 设置屏幕上的 4 个点的 z 坐标为 5
leftUpPoint.z = 5;
rightDownPoint = Input.mousePosition;
rightDownPoint.z = 5;
rightUpPoint.x = rightDownPoint.x;
rightUpPoint.y = leftUpPoint.y;
rightUpPoint.z = 5;
leftDownPoint.x = leftUpPoint.x;
leftDownPoint.y = rightDownPoint.y;
leftDownPoint.z = 5;
// 设置线段的点数为 4,并将点设置为世界坐标系下的位置
line.positionCount = 4;
line.SetPosition(0, Camera.main.ScreenToWorldPoint(leftUpPoint));
line.SetPosition(1, Camera.main.ScreenToWorldPoint(rightUpPoint));
line.SetPosition(2, Camera.main.ScreenToWorldPoint(rightDownPoint));
line.SetPosition(3, Camera.main.ScreenToWorldPoint(leftDownPoint));
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com