【Unity小功能开发实战教程】在UI画布上画网格线

news/2024/5/10 20:52:56/文章来源:https://blog.csdn.net/qq_42437783/article/details/127267411

文章目录

      • 👉一、前言
      • 👉二、Unity上画网格线的效果
      • 👉二、画网格线的原理
      • 👉三、完整代码
      • 👉三、注意事项

👉一、前言

在大多软件中,网格线常常起到辅助线条的作用,像word中的网格线主要用来帮助用户将word文档中的图形、图像、文本框、艺术字等对象沿网格线对齐,并且在打印时网格线不被打印出来。接下来,我们就学习一下Unity中如何实现在UI画布上绘制网格线。

👉二、Unity上画网格线的效果

在这里插入图片描述
2.
在这里插入图片描述
3.

👉二、画网格线的原理

同样是使用了using UnityEngine.UI这个命名空间下的MaskableGraphic类来绘制网格线。
根据面向对象的思想,我们先抽象出画网格线的一些成员:线宽、线的颜色和线的间隔。
根据这些成员我们就可以计算得到一个个矩形面片的顶点信息,然后利用MaskableGraphic来绘制出一定数量的矩形面片,效果上形成我们想要的网格线样式。如下:
1.在水平方向上绘制出一条条垂直线
在这里插入图片描述
2.在垂直方向上绘制出一条条水平线
在这里插入图片描述

👉三、完整代码

using UnityEngine;
using UnityEngine.UI;public class Grid : MaskableGraphic
{/// <summary>/// 网格线间隔/// </summary>public int gridSpace = 50;/// <summary>/// 网格线的像素宽度/// </summary>public float gridLineWidth = 1.0f;//可以自定义网格线颜色、如渐变色等,这里我是直接使用基类的颜色protected override void OnPopulateMesh(VertexHelper vh){vh.Clear();//取整数float width = Mathf.RoundToInt(rectTransform.rect.width);float height = Mathf.RoundToInt(rectTransform.rect.height);gridSpace = (int)Mathf.Clamp(gridSpace, 0, width);//先画水平方向上的线,从左到右绘制垂直线段for (int i = 0; i < width; i += gridSpace){//四个点可以绘制一个矩形面片var horizontal_A = new Vector2(i, 0);var horizontal_B = new Vector2(i, height);var horizontal_C = new Vector2(i + gridLineWidth, height);var horizontal_D = new Vector2(i + gridLineWidth, 0);vh.AddUIVertexQuad(GetRectangleQuad(color, horizontal_A, horizontal_B, horizontal_C, horizontal_D));}//最后画垂直方向上的线,从下到上绘制水平线段for (int i = 0; i < height; i += gridSpace){var vertical_A = new Vector2(0, i);var vertical_B = new Vector2(0, i + gridLineWidth);var vertical_C = new Vector2(width, i + gridLineWidth);var vertical_D = new Vector2(width, i);vh.AddUIVertexQuad(GetRectangleQuad(color, vertical_A, vertical_B, vertical_C, vertical_D));}}//得到一个矩形面片private UIVertex[] GetRectangleQuad(Color color, params Vector2[] points){UIVertex[] vertexs = new UIVertex[points.Length];for (int i = 0; i < vertexs.Length; i++){vertexs[i] = GetUIVertex(points[i], color);}return vertexs;}//得到一个顶点信息private UIVertex GetUIVertex(Vector2 point, Color color){UIVertex vertex = new UIVertex{position = point,color = color,uv0 = Vector2.zero};return vertex;}
}

👉三、注意事项

  1. 以上代码挂载到任意空物体即可使用。
  2. 调整网格线参数时需手动输入数值看效果,如用鼠标拖拽改变数值过快可能导致Unity编辑器卡崩掉(目前还没定位到具体原因)。
  3. 根据代码规律绘制网格线,需将空物体的锚点设置为(0,0);布局设置为Left。(当然你可根据你的需要自定义,具体看你需要那种效果的网格线)
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_22279.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python作业4

1 2 3 4 5 6 7 8 9 10 实战 1 2 3 4 5 6

(5)catanddong_用resnet18迁移学习分类和测试

1、数据集制作 (1)将从kaggle下载的数据集中的train目录下的图片分类为cat和dog文件夹,每个文件夹下12500张图片 (2)使用教程1的方法进行数据的划分 (1)数据集的划分_chencaw的博客-CSDN博客 2、使用resnet18的预训练模型迁移训练 (1)使用了dqtm查看进度 参考了tqdm…

面向对象(上)01

面向对象(上)01 Java面向对象学习的三条主线: (第4 - 6章) 1. Java类和类的成员 : 属性, 方法, 构造器; 代码块, 内部类. 1. 面向对象的三大特征 : 封装性, 继承性, 多态性 , (抽象性) . 1. 其他关键字 : this , super , static , final , abstract , interface , package , i…

websocket协议详解

websocket是什么&#xff1f; websocket是一种浏览器与服务器进行全双工通信的网络技术&#xff0c;属于 应用层协议。它 基于TCP传输协议&#xff0c;并 复用HTTP 的握手通道&#xff0c;用来弥补HTTP协议在持久通信能力上的不足。 ws 默认端口&#xff1a;80wss 默认端口&a…

Java高并发编程实战7,ConcurrentHashMap详解

一、ConcurrentHashMap详解 1、HashMap 在JDK1.8以前&#xff0c;HashMap是基于数组 链表来实现的&#xff0c;HashMap是一个数组&#xff0c;每个数组元素又是一张链表。 当向HashMap中增加元素时&#xff0c;会先根据此元素Key的hash值计算出该元素将要保存在数组中的下标…

SqlServer2008R2自动删除备份

https://blog.51cto.com/u_15162069/2776830 首先我们打开SqlServer管理工具(SSMS),在左侧目录中找到 管理-->右键维护计划-->新建维护计划双击左侧下方目录:创建 ”清除维护“ 任务双击后打开提示窗口,我们设置 “清除维护” 任务内容:即:在删除本机数据库中,C:\T…

手写数字识别的数据集讲解

CLASS torchvision.datasets.MNIST(root: str, train: bool True, transform: Optional[Callable] None, target_transform: Optional[Callable] None, download: bool False) root (string)&#xff1a; 表示数据集的根目录&#xff0c;其中根目录存放MNIST/processed/tra…

【初学者】Vue使用axios向Node.js发起请求以及跨域问题的解决

目录 项目创建 代码 解决跨域问题 几个注意点 运行结果展示 axios官方文档&#xff1a;起步 | Axios 中文文档 | Axios 中文网 项目创建 本文实例用到的两个项目&#xff0c;分别命名为server和vue-axios。 server是node.js项目&#xff0c;创建方式&#xff1a; # 创建…

Codeforces Round #825 (Div. 2)

A. Make A Equal to B Sample input 5 3 1 0 1 0 0 1 4 1 1 0 0 0 1 1 1 2 1 1 1 1 4 1 0 0 1 0 1 1 0 1 0 1 Sample output 1 2 0 1 1 题意&#xff1a; 你有两个长度为n的数组a和b&#xff0c;你可以进行一次操作&#xff0c;将a数组的某个位置的数取反&#xff0c;或者…

LVM与磁盘配额

分区的缺点: 1、一旦建立无法修改 想修改得重新格式化 数据丢失 2、不够灵活 空间只能来自一块硬盘,且必须是连续的空间 3、没有备份冗余功能 需要工程师手动备份如果没有lvm可以下载:yum install lvm2 -y LVM的管理命令 主要命令:LVM为我们提供了逻辑概念上的磁盘,使得文…

usb sop and eop

USB包(packet)由SOP,SYNC,Packet内容和EOP组成. SOP信号-------------瞬态信号 协议中的描述&#xff1a;7.1.7.4.1 The start of a packet (SOP) is signaled by the originating port by driving the D and D- lines from the Idle state to the opposite logic level (K …

实验六:倾斜开关实验

OK,周一周二一共10节课,比较辛苦,昨天下午还有咨询师模拟演练,很累,就早早休息了 今天早上就想写一个实验指导书 也就是现在的实验六 一会十点有《C语言程序设计》的课,不过,今天好在就只有两节课(课时,一次大课2个课时,习惯说2节课) 感觉又是我最喜欢和擅长的C…

JSON——简介

JSON——简介 JSON——基础语法 JSON——json数据与java对象的转换// 将java对象转为json字符串User user = new User(1,"zahngsan","123");// 转换String jsonString = JSON.toJSONString(user);System.out.println(jsonString);// 将json字符串转为jav…

java基于vue+springboot 的体育用品销售购物网站 多商家 nodejs

用户在打开网站之后首先打开的是首页部分&#xff0c;在首页部分可以看到一些推荐的信息 环境需要 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;这是目前最稳定的JDK也是被使用最多的JDK版本。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse都可以。推荐IDEA; 3.to…

移动端IM产品RainbowChat[专业版] iOS端 v6.0版已发布!

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持UDP 、TCP 、WebSocket 三种协议&#xff0c;支持iOS、Android、H5、标准Java平台&#xff0c;服务端基于Netty编写。 工程开源地址是&…

分治法实现二分查找(python)

问题描述&#xff1a; 改写二分查找算法&#xff1a;设a[1…n]是一个已经排好序的数组&#xff0c;改写二分查找算法: 当搜索元素x不在数组中时&#xff0c;返回小于x的最大元素位置i&#xff0c;和大于x的最小元素位置j&#xff1b; (即返回x的左、右2个元素) 当搜索元素x在…

系动词使役动词

系动词 系动词的作用就是赋值 I am a rabbit 把 a rabbit赋值给i我 我是一只兔子 The rabbit is smart 这兔子是聪明的 smart赋值给兔子 系动词连系的方式,就是简简单单把它前后的概念含义连起来而已 所以系动词又叫连系动词 (Linking Verb) 就是把前后两端连起来(link)就好…

基于侧影轮廓的三维模型构建

建模过程 图像的获取 由于待建模物体具有较多细节,因此选择在同一个方向拍摄两个角度的照片(手机倾斜角大约为60度和45度,如下图所示),以及顶部细节照片,最终拍摄的有效照片为35张。模型构建 新建项目,并导入所有拍摄的照片照片掩饰 可以先采用自动掩饰工具将物体轮廓从…

kotlin koin

介绍 Koin是一个面向Android developer的依赖注入框架使用场景 为什么要用依赖注入框架? 比如我们有一个下载器对象Downloader,需要下面三个对象才能完成构造。但是这个下载器对象在各个活动中使用频繁val executor = Executor() val client = HttpClient() val request = Re…

使用 Zpan 搭建低成本个人私有网盘,还不限速

摘要&#xff1a;本文就介绍一个不限速的低成本个人网盘——ZPan&#xff0c;相较于老牌的私有网盘 OwnCloud 等&#xff0c;Zpan 有一个独有的优势&#xff1a;不限速。本文分享自华为云社区《使用 Zpan 搭建低成本个人私有网盘》&#xff0c;作者&#xff1a; 云存储开发者支…