项目中遇到一个需求:由于模型和UI像素的原因,项目中用尺子测量东西的时候肉眼读数与实际误差过大,为了减少误差需要在unity中把尺子的刻度画出来。一开始我是有点懵的,心想这unity怎么能画出一个类似于刻度的矩形呀,后来经过组长的指导,了解到UGUI中有一个MaskableGraphic类可以画线,就研究了一下该类原理,得以实现需求。

MaskableGraphic类画线原理

实际上Unity中的每一个UI元素都是由三角面片拼接而成的,首先新建一个UI元素的空物体,新建一个脚本继承MaskableGraphic类,重写OnPopulateMesh方法,默认执行基类方法看一下效果:

将脚本挂载到空物体上:


我们可以清楚的看到一张Image图片其实就是由两个三角面片组合而成的,基于这个原理我们就可以画出一个矩形来了。

重写OnPopulateMesh方法



实现的效果

MaskableGraphic绘制的时候是根据UI物体的锚点位置开始绘制的,默认不改锚点是这个效果:


将锚点Pivot改为0之后的效果:


根据实际需求找规律重写绘制方法实现了我想要的效果:
控制绘制矩形的数量

额外的知识

OnPopulateMesh方法

重写Graphic的OnPopulateMesh方法,在CanvasUpdateRegistry布局重建和图形重建时,会调用重建序列中的Graphic的Rebuild方法,Rebuild方法会调用OnPopulateMesh方法,为CanvasRenderer的Mesh提供了顶点、顶点颜色、UV和三角形信息。OnPopulateMesh方法把顶点数据和三角形信息保存到VertexHelper中。

需要注意的事

虽然使用MaskableGraphic类能减小像素带来的误差,但是如果绘制的时候设置的像素太小的话,遇到低分辨率的电脑就看不出来,解决方法:
将要绘制的UI空物体放到不受屏幕像素影响的canvas下绘制,适当增加面片的像素,canvas的组件canvas scaler的UI Scale Mode属性修改为Constant Pixel Size即无论屏幕大小如何,UI始终保持相同像素大小。

Unity在UI上使用MaskableGraphic类画一个矩形刻度尺相关推荐

  1. WPF动态在画布(Canvas)上画一个矩形。

    应用背景,现在有一个用WPF定义好的画布, <Canvas Name="MapCanvas" Height="{Binding MapTrackCanvasHeig ...

  2. python在坐标轴上画矩形_Python使用matplotlib实现在坐标系中画一个矩形的方法

    本文实例讲述了Python使用matplotlib实现在坐标系中画一个矩形的方法.分享给大家供大家参考.具体实现方法如下: import matplotlib.pyplot as plt from m ...

  3. matlab 画一个矩形

    画一个矩形 %rectangle('Position',[x,y,w,h],'PropertyName',propertyvalue) %axis([xmin,xmax,ymin,ymax]) clc ...

  4. D2D 学习笔记第一课 初始化D2D 画一个矩形

    头文件 #include <D2D1.h> lib文件 #pragma comment(lib,"D2D1.lib") 首先 新建一个 win32 程序 加入头文件和l ...

  5. 计算机图形学(三)——画一个矩形

    画一个矩形 main.cpp #include <iostream>// GLEW #define GLEW_STATIC #include <GL/glew.h>// GLF ...

  6. D3D索引缓冲 - 画一个矩形

    索引可以定义如何绘制几何体.比如,通过创建三角形来画一个四边形,每个三角形需要3个顶点,总共就需要6个顶点来创建一个四边形.若使用索引缓冲,则只需要4个顶点就可创建一个四边形.索引列表中第一个三角形的 ...

  7. html页面画一个矩形,使用HTML5 canvas绘制一个矩形的方法

    使用HTML5 canvas绘制一个矩形的方法 发布时间:2020-08-29 11:23:12 来源:亿速云 阅读:102 作者:小新 这篇文章将为大家详细讲解有关使用HTML5 canvas绘制一 ...

  8. c++ 求四边形面积和周长_C++中运用类求一个矩形的面积和周长

    题目是这样的:/*定义一个矩形类Rectangle,包含:保护数据成员:doubleLength;//矩形的长doubleWidth;//矩形的宽公有成员函数:doubleArea();//计算矩形的 ...

  9. 怎么用Photoshop直接画一个矩形边框

    用Photoshop画矩形的时候,有时需要就画一个单一的边框,内部不需填充颜色,而且边框可以调节宽度和颜色.这时就可以用选择工具拉个矩形框,然后点主菜单,选编辑->描边,再在跳出的窗口选择相关的 ...

  10. Unity在UI上绘制直线

    prefabUILine为Image的预制作  代码 using UnityEngine;public class UILineFactory : MonoBehaviour {public Rect ...

最新文章

  1. Mybatis操作数据库实现主键自增长
  2. OpenCV-Python中的两种图像通道分离法
  3. ARM 嵌入式入门经验
  4. Python基础教程(五):数字、字符串
  5. 谷歌发安全警告:社交网络威胁用户隐私
  6. c语言爱心代码空心,c语言心形图案代码,是什么?
  7. 用完全平方数填满指定区域(洛谷P2666题题解,Java语言描述)
  8. apache php设置404页面,详细介绍通过配置Apache实现404页面替换
  9. HTML 字符实体 lt; gt: amp;等
  10. 15 Process State and O.S. Scheduling
  11. 程序员面试金典——3.4汉诺塔
  12. 数学建模算法与应用:预测算法(4)马尔可夫预测
  13. java该选择哪个城市_逃离北上广,java程序员又能选择哪些城市呢?
  14. 接口测试 如何编写接口测试用例
  15. 四咪唑基四苯乙烯,四苯基吡嗪(tetraphenylpyrazine,TPP)
  16. 手机丢了,微信、支付宝绑了银行卡,第一时间该怎么办?
  17. Gary Marcus:AI 可以从人类思维中学习的11个启示
  18. 如何打造一个让人愉快的框架
  19. WaWa的奇妙冒险(第二周集训自闭现场)
  20. C++打开文件夹中的多个文件并计算文件中数据的平均值

热门文章

  1. 机器学习-数据科学库 12 美国人口数据分析案例
  2. jupyter无法重命名,文件不可信,后台被自动关闭
  3. 一、markdown 常见公式
  4. raspberry OS buster InRelease: The following signatures couldn‘t be verified
  5. 工具----9、浏览器攻击框架--(BeEF)
  6. java+单子_Java设计模式之单子模式应用
  7. 【SIGIR2017满分论文】IRGAN:大一统信息检索模型的博弈竞争
  8. 信创办公--基于WPS的Word最佳实践系列(解决Word兼容性问题)
  9. Java实现 LeetCode 365 水壶问题
  10. mysql partition赋权_Mysql的赋权