IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity3d 模拟鼠标框选物体 -> 正文阅读

[游戏开发]Unity3d 模拟鼠标框选物体

脚本需要挂载在相机上,材质球选择默认Sprites-Default.

/// <summary>
/// 鼠标框选屏幕选中物体
/// </summary>
public class RectRender : MonoBehaviour
{

? ? private bool onDrawingRect;//是否正在画框(即鼠标左键处于按住的状态)

? ? private Vector3 startPoint;//框的起始点,即按下鼠标左键时指针的位置
? ? private Vector3 currentPoint;//在拖移过程中,玩家鼠标指针所在的实时位置
? ? private Vector3 endPoint;//框的终止点,即放开鼠标左键时指针的位置

? ? private Selector selector;
? ?

? ? void Update()
? ? {
? ? ? ? //玩家按下鼠标左键,此时进入画框状态,并确定框的起始点
? ? ? ? if (Input.GetKeyDown(KeyCode.Mouse0))
? ? ? ? {
? ? ? ? ? ? onDrawingRect = true;
? ? ? ? ? ? startPoint = Input.mousePosition;
? ? ? ? ? ? Debug.Log("开始画框,起点:"+ startPoint);
? ? ? ? }

? ? ? ? //在鼠标左键未放开时,实时记录鼠标指针的位置
? ? ? ? if (onDrawingRect)
? ? ? ? {
? ? ? ? ? ? currentPoint = Input.mousePosition;
? ? ? ? }

? ? ? ? //玩家放开鼠标左键,说明框画完,确定框的终止点,退出画框状态
? ? ? ? if (Input.GetKeyUp(KeyCode.Mouse0))
? ? ? ? {
? ? ? ? ? ? endPoint = Input.mousePosition;
? ? ? ? ? ? onDrawingRect = false;
? ? ? ? ? ? Debug.Log("画框结束,终点:"+endPoint);
? ? ? ? ? ? //当框画完时,创建一个生效的选定框selector
? ? ? ? ? ? selector = new Selector(startPoint, endPoint);
? ? ? ? ? ? //执行框选事件
? ? ? ? ? ? CheckSelection(selector, "Player");
? ? ? ? }
? ? }

? ? //框选事件
? ? //按照选定框的范围,捕获标签为tag的所有物体,并打印这些物体的名字
? ? void CheckSelection(Selector selector, string tag)
? ? {
? ? ? ? GameObject[] objs = GameObject.FindGameObjectsWithTag(tag);
? ? ? ? foreach (GameObject ob in objs)
? ? ? ? {
? ? ? ? ? ? Vector3 screenPos = Camera.main.WorldToScreenPoint(ob.transform.position);
? ? ? ? ? ? if (screenPos.x > selector.Xmin && screenPos.x < selector.Xmax && screenPos.y > selector.Ymin && screenPos.y < selector.Ymax)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if (ob.tag==(tag))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Debug.Log("已选中目标:"+ ob.name);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }


? ? public Material GLRectMat;//绘图的材质,在Inspector中设置
? ? public Color GLRectColor;//矩形的内部颜色,在Inspector中设置
? ? public Color GLRectEdgeColor;//矩形的边框颜色,在Inspector中设置

? ? void OnPostRender()
? ? {
? ? ? ? if (onDrawingRect)
? ? ? ? {
? ? ? ? ? ? //准备工作:获取确定矩形框各角坐标所需的各个数值
? ? ? ? ? ? float Xmin = Mathf.Min(startPoint.x, currentPoint.x);
? ? ? ? ? ? float Xmax = Mathf.Max(startPoint.x, currentPoint.x);
? ? ? ? ? ? float Ymin = Mathf.Min(startPoint.y, currentPoint.y);
? ? ? ? ? ? float Ymax = Mathf.Max(startPoint.y, currentPoint.y);

? ? ? ? ? ? GL.PushMatrix();//GL入栈
? ? ? ? ? ? ? ? ? ? ? ? ? ? //在这里,只需要知道GL.PushMatrix()和GL.PopMatrix()分别是画图的开始和结束信号,画图指令写在它们中间
? ? ? ? ? ? if (!GLRectMat)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Debug.Log("请设置材质");
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }

? ? ? ? ? ? GLRectMat.SetPass(0);//启用线框材质rectMat

? ? ? ? ? ? GL.LoadPixelMatrix();//设置用屏幕坐标绘图

? ? ? ? ? ? /*------第一步,绘制矩形------*/
? ? ? ? ? ? GL.Begin(GL.QUADS);//开始绘制矩形,这一段画的是框中间的半透明部分,不包括边界线

? ? ? ? ? ? GL.Color(GLRectColor);//设置矩形的颜色,注意GLRectColor务必设置为半透明

? ? ? ? ? ? //陈述矩形的四个顶点
? ? ? ? ? ? GL.Vertex3(Xmin, Ymin, 0);//陈述第一个点,即框的左下角点,记为点1
? ? ? ? ? ? GL.Vertex3(Xmin, Ymax, 0);//陈述第二个点,即框的左上角点,记为点2
? ? ? ? ? ? GL.Vertex3(Xmax, Ymax, 0);//陈述第三个点,即框的右上角点,记为点3
? ? ? ? ? ? GL.Vertex3(Xmax, Ymin, 0);//陈述第四个点,即框的右下角点,记为点4

? ? ? ? ? ? GL.End();//告一段落,此时画好了一个无边框的矩形


? ? ? ? ? ? /*------第二步,绘制矩形的边框------*/
? ? ? ? ? ? GL.Begin(GL.LINES);//开始绘制线,用来描出矩形的边框

? ? ? ? ? ? GL.Color(GLRectEdgeColor);//设置方框的边框颜色,建议设置为不透明的

? ? ? ? ? ? //描第一条边
? ? ? ? ? ? GL.Vertex3(Xmin, Ymin, 0);//起始于点1
? ? ? ? ? ? GL.Vertex3(Xmin, Ymax, 0);//终止于点2

? ? ? ? ? ? //描第二条边
? ? ? ? ? ? GL.Vertex3(Xmin, Ymax, 0);//起始于点2
? ? ? ? ? ? GL.Vertex3(Xmax, Ymax, 0);//终止于点3

? ? ? ? ? ? //描第三条边
? ? ? ? ? ? GL.Vertex3(Xmax, Ymax, 0);//起始于点3
? ? ? ? ? ? GL.Vertex3(Xmax, Ymin, 0);//终止于点4

? ? ? ? ? ? //描第四条边
? ? ? ? ? ? GL.Vertex3(Xmax, Ymin, 0);//起始于点4
? ? ? ? ? ? GL.Vertex3(Xmin, Ymin, 0);//返回到点1

? ? ? ? ? ? GL.End();//画好啦!

? ? ? ? ? ? GL.PopMatrix();//GL出栈
? ? ? ? }
? ? }

}

/// <summary>
/// 屏幕上框选范围
/// </summary>
public class Selector
{
? ? public float Xmin, Xmax, Ymin, Ymax;
? ? public Selector(Vector3 start, Vector3 end)
? ? {
? ? ? ? Xmin = Mathf.Min(start.x, end.x);
? ? ? ? Xmax = Mathf.Max(start.x, end.x);
? ? ? ? Ymin = Mathf.Min(start.y, end.y);
? ? ? ? Ymax = Mathf.Max(start.y, end.y);
? ? }
}

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-08-26 12:27:12  更:2021-08-26 12:27:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 12:56:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码