5.选择框

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

×

喜欢就点赞,疼爱就打赏