unity 画线写字
效果

1.界面设置



2.涉及两个脚本UIDraw.cs和UIDrawLine.cs
UIDraw.cs
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class UIDraw : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler , IPointerDownHandler, IPointerUpHandler
{public Color DrawColor = Color.red;[Range(3,10)]public int DrawWidth = 3;public Color BgColor = new Color(0, 0, 0, 0);Vector2 lastPosition;public UIDrawLine UIDrawLine;List<Vector2> Vertics = new List<Vector2>();List<List<Vector2>> CachVertics = new List<List<Vector2>>();void Awake(){}public RectTransform Drawer;void Update(){if (canDraw){Drawer.position = Input.mousePosition;DrawPoint(Drawer.anchoredPosition);#if UNITY_ANDROID||UNITY_IPHONE #endif}}public void OnPointerDown(PointerEventData eventData){canDraw = true;}public void OnPointerUp(PointerEventData eventData){canDraw = false;//添加结尾lastPosition = Vector2.zero;AddPoint(lastPosition);//添加到缓存AddToCach();}bool canDraw;public void OnPointerEnter(PointerEventData eventData){}public void OnPointerExit(PointerEventData eventData) {lastPosition = Vector2.zero;AddPoint(lastPosition);}public void DrawPoint(Vector2 point){if (lastPosition == Vector2.zero){lastPosition = point;}UpdateColor(lastPosition, point, DrawWidth, DrawColor);}public void UpdateColor(Vector2 start_point, Vector2 end_point, int width, Color color){float distance = Vector2.Distance(start_point, end_point);if (distance < 0.1f) return;AddPoint(end_point) ;lastPosition = end_point;}void AddPoint(Vector2 v){Vertics.Add(v);UIDrawLine.Vertices.Add(v);UIDrawLine.SetAllDirty();}private void AddToCach(){List<Vector2> list = new List<Vector2>();list.AddRange(Vertics);CachVertics.Add(list);Vertics.Clear();}public void UnDo(){if (CachVertics.Count == 0) return;CachVertics.RemoveAt(CachVertics.Count-1);UIDrawLine.Vertices.Clear();for (int i = 0; i < CachVertics.Count; i++){UIDrawLine.Vertices.AddRange(CachVertics[i]);}UIDrawLine.SetAllDirty();}public void Send(){//UIDrawLine.Vertices;Clear();//gameObject.SetActive(false);}internal void Clear(){UIDrawLine.Vertices.Clear();UIDrawLine.SetAllDirty();Vertics.Clear();CachVertics.Clear();}void OnDisable() {Clear();}}
UIDrawLine.cs
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;[AddComponentMenu("UI/Extensions/UI Line")]
public class UIDrawLine : MaskableGraphic
{[SerializeField]Texture m_Texture;public float thickness = 5;public List<Vector2> Vertices=new List<Vector2> ();private float size = 0;public override Texture mainTexture{get{return m_Texture == null ? s_WhiteTexture : m_Texture;}}public Texture texture{get{return m_Texture;}set{if (m_Texture == value) return;m_Texture = value;SetVerticesDirty();SetMaterialDirty();}}protected override void OnEnable(){Vertices.Clear();}void Update(){}protected UIVertex[] SetVbo(Vector2[] vertices, Vector2[] uvs){UIVertex[] vbo = new UIVertex[4];for (int i = 0; i < vertices.Length; i++){var vert = UIVertex.simpleVert;vert.color = color;vert.position = vertices[i];vert.uv0 = uvs[i];vbo[i] = vert;}return vbo;}//生成方格的四个点protected override void OnPopulateMesh(VertexHelper vh){vh.Clear();Vector2 uv0 = new Vector2(0, 1);Vector2 uv1 = new Vector2(1, 1);Vector2 uv2 = new Vector2(1, 0);Vector2 uv3 = new Vector2(0, 0);Vector2 lastPos0 = Vector2.zero;Vector2 lastPos1 = Vector2.zero;Vector2 lastPos2 = Vector2.zero;Vector2 lastPos3 = Vector2.zero;for (int i = 1; i < Vertices.Count; i++){//当有0是说明是结束点,开始下个画线if (Vertices[i - 1]==Vector2.zero || Vertices[i]== Vector2.zero){lastPos0 = Vector2.zero;continue;}Vector2 v = Rotate90(Vertices[i] - Vertices[i - 1]).normalized;Vector2 pos0 = Vertices[i - 1]- v * thickness * 0.5f;Vector2 pos1 = Vertices[i]- v * thickness * 0.5f;Vector2 pos2 = pos1 + v * thickness;Vector2 pos3 = pos0 + v * thickness;vh.AddUIVertexQuad(SetVbo(new[] { pos0, pos1, pos2, pos3 }, new[] { uv0, uv1, uv2, uv3 }));//角if (lastPos0!=Vector2.zero){Vector2 p0 = pos0;Vector2 p1 = lastPos1;Vector2 p2 = pos3;Vector2 p3 = lastPos2;vh.AddUIVertexQuad(SetVbo(new[] { p0, p1, p2, p3 }, new[] { uv0, uv1, uv2, uv3 }));}lastPos0 = pos0;lastPos1 = pos1;lastPos2 = pos2;lastPos3 = pos3;}}private Vector2 Rotate90(Vector2 p){return new Vector2(p.y, -p.x);}}
相关文章:
unity 画线写字
效果 1.界面设置 2.涉及两个脚本UIDraw.cs和UIDrawLine.cs UIDraw.cs using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public class UIDraw : MonoBehaviour, IPointerEnterHandler, IPointerEx…...
GitHub的详细介绍
GitHub是一个面向开源及私有软件项目的托管平台,它建立在Git这个分布式版本控制系统之上,为开发者提供了在云端存储、管理和共享代码的便捷方式。以下是对GitHub的详细介绍: ### 一、GitHub的基本功能 1. **代码托管**:GitHub允…...
【鸿蒙学习】HarmonyOS应用开发者基础 - 构建更加丰富的页面之Tabs(三)
学完时间:2024年8月14日 一、前言叨叨 学习HarmonyOS的第六课,人数又成功的降了500名左右,到了3575人了。 本文接上一文章【鸿蒙学习】HarmonyOS应用开发者基础 - 构建更加丰富的页面(一),继续记录构建更…...
Detectron2 安装指南
文章目录 前言Detectron2官方文档官方指南 安装 Detectron2虚拟环境安装 PyTorch安装 Detectron2 总结 前言 Detectron2 是 Meta AI 的一个机器视觉相关的库,建立在 Detectron 和 maskrcnn-benchmark 基础之上,可以进行目标检测、语义分割、全景分割&am…...
亚马逊 Linux mysql5.7 安装纪录
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz cp /home/admin/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz /usr/local/mysql #解压压缩包 tar -zxvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz 重命名mysql-…...
ZLMediaKit编译webrtc
ZLMediaKit官方文档写的挺详细的,但是也不算特别详细。 按照上面的文档,执行到cmake的时候,会提示“srtp 未找到, WebRTC 相关功能打开失败”,但是cmke还是可以继续啊。此时看文档说webrtc比较复杂,默认是不编译的&am…...
KEEPALIVED高可用集群最详解
目录 一、高可用集群 1.1 集群的类型 1.2 实现高可用 1.3 VRRP:Virtual Router Redundancy Protocol 1.3.1 VRRP相关术语 1.5.2 VRRP 相关技术 二、部署KEEPALIVED 2.1 keepalived 简介 2.2 Keepalived 架构 2.3 Keepalived 环境准备 2.3.1 实验环境 2…...
【大模型】llama-factory基础学习
前言:LLaMA-Factory项目的目标是整合主流的各种高效训练微调技术,适配市场主流开源模型,形成一个功能丰富,适配性好的训练框架。 目录 1. 前期准备2. 原始模型直接推理3. 自定义数据集4. 模型训练5. 模型合并并导出 1. 前期准备 …...
【Java】如何使用jdbc连接并操作MySQL,一文读懂不迷路,小白也能轻松学会
JDBC的原理 JDBC(Java Database Connectivity)是Java提供的用于连接和操作数据库的API。它允许Java应用程序与各种数据库进行交互,以下是JDBC的基本原理: 驱动程序管理:JDBC使用不同的数据库驱动程序来连接不同类型的…...
新手学习VR全景需要知道的几个问题
1.什么是720云 720云是一家专注于VR全景内容制作与展示的技术平台,提供从拍摄、编辑到发布的一站式解决方案。它的核心功能包括全景图像的制作和编辑工具,以及VR全景内容的在线展示和分享服务。720云的技术广泛应用于房地产、旅游、教育、文化展示等多个…...
上海知名泌尿外科专家常态化坐诊黄山新晨医院,让前列腺癌看得更早、更准!
继7月28日上海第四人民医院泌尿外科专家在黄山新晨医院开展义诊之后,8月9日和10日,该团队领头人周铁教授又完成了合作以来的首次坐诊,标志着双方合作从此进入常态化阶段。 周铁主任在查看患者的检查报告 周铁主任曾任中华医学会泌尿外科分会…...
Elasticsearch: 非结构化的数据搜索
r很多大数据组件在快速原型时期都是Java实现,后来因为GC不可控、内存或者向量化等等各种各样的问题换到了C,比如zookeeper->nuraft(https://www.yuque.com/treblez/qksu6c/hu1fuu71hgwanq8o?singleDoc# 《olap/clickhouse keeper 一致性协调服务》)&…...
44 个 React 前端面试问题
1.你知道哪些React hooks? useState:用于管理功能组件中的状态。useEffect:用于在功能组件中执行副作用,例如获取数据或订阅事件。useContext:用于访问功能组件内的 React 上下文的值。useRef:用于创建对跨…...
LLMs之Framework:Hugging Face Accelerate后端框架之FSDP和DeepSpeed的对比与分析
LLMs之Framework:Hugging Face Accelerate后端框架之FSDP和DeepSpeed的对比与分析 导读:该文章阐述了FSDP和DeepSpeed在实现上的差异,Accelerate如何统一它们的行为,并提供指导帮助用户在两种后端之间切换。同时也讨论了低精度优化…...
HarmonyOS应用开发学习-ArkTs声明式UI描述
ArkTs声明式UI描述 1 创建组件 声明式UI描述 ArKTS以声明方式组合和扩展组件来描述应用程序的UI,同时还提供了基本的属性、事件和子组件配置方法,帮助开发者实现应用交互逻辑 创建组件 根据组件构造方法的不同,创建组件包含有参数和无参…...
Redis20-通信协议
目录 RESP协议 概述 数据类型 模拟Redis客户端 RESP协议 概述 Redis是一个CS架构的软件,通信一般分两步(不包括pipeline和PubSub): 客户端(client)向服务端(server)发送一条命…...
Unity Shader变体优化与故障排除技巧
在 Unity 中编写着色器时,我们可以方便地在一个源文件中包含多个特性、通道和分支逻辑。在构建时,着色器源文件会被编译成着色器程序,这些程序包含一个或多个变体。变体是该着色器在满足一组条件后生成的版本,这通常会导致线性执行…...
数据结构——时间复杂度和空间复杂度
目录 时间复杂度 什么是时间复杂度 常见时间复杂度类型 如何计算时间复杂度 空间复杂度 什么是空间复杂度 常见的空间复杂度类型 如何计算空间复杂度 时间复杂度和空间复杂度是评估算法性能的两个重要指标。 时间复杂度 什么是时间复杂度 时间复杂度描述了算法执行所需…...
(echarts) 饼图设置滚动图例
(echarts) 饼图设置滚动图例 效果: 代码: // 图例 legend: {type: scroll,orient: vertical,right: 10,top: 20,bottom: 20,data: data.legendData},参考:官网-可滚动的图例 https://echarts.apache.org/examples/zh/editor.html?cpie-leg…...
Java spring SSM框架--mybatis
一、介绍 Spring 框架是一个资源整合的框架,可以整合一切可以整合的资源(Spring 自身和第三方),是一个庞大的生态,包含很多子框架:Spring Framework、Spring Boot、Spring Data、Spring Cloud…… 其中Spr…...
OpenOCD配置文件进阶指南:手把手教你定制STM32F0x的swj-dp.tcl脚本
OpenOCD深度定制:STM32F0x调试接口脚本开发实战 嵌入式开发中,调试工具的灵活配置往往决定着开发效率。对于STM32F0x系列芯片而言,OpenOCD作为开源调试工具链的核心组件,其配置文件的可定制性为开发者提供了极大的灵活性。本文将深…...
ZeroOmega代理规则引擎:构建智能化网络访问策略
ZeroOmega代理规则引擎:构建智能化网络访问策略 【免费下载链接】ZeroOmega Manage and switch between multiple proxies quickly & easily. 项目地址: https://gitcode.com/gh_mirrors/ze/ZeroOmega 在数字化生活中,我们每天都在与各种网络…...
Android开发避坑指南:RecyclerView最后一行被截断的5种原因及对应解决方案
Android开发避坑指南:RecyclerView最后一行被截断的5种原因及对应解决方案 在Android应用开发中,RecyclerView作为列表展示的核心组件,其灵活性和高性能深受开发者喜爱。然而,在实际项目中,我们经常会遇到一个令人头疼…...
Java 新纪元 — JDK 25 + Spring Boot 4 全栈实战(十七):Boot 3 → Boot 4 迁移避坑指南——那些文档不会告诉你的迁移血泪史
系列导航 | ← 上一篇:D16 Spring Boot 4 + AI推理后端集成 | 下一篇:D18 云原生部署:Docker + K8s + GraalVM → 适用读者:正在从 Spring Boot 3.x 升级到 4.x 的开发者,或在评估升级可行性的架构师。 前置知识:熟悉 Spring Boot 3.x 开发,了解 JDK 21+ 基本特性。 本文…...
跨境电商卖家的成长路径:你在哪个阶段?爆单AI选品后开始爆发了吗?
不是所有卖家都叫“跨境电商卖家”,有人在做生意,有人在混日子做跨境电商久了,我发现一个有意思的现象:同样是“跨境电商卖家”,不同的人,状态完全不一样。有人每天研究数据、优化流程、复盘总结࿰…...
若依分离版集成Activiti7:从零构建企业级流程中心
1. 环境准备与版本兼容性检查 在开始整合之前,我们需要先确认几个关键点。若依分离版是基于SpringBoot的前后端分离架构,而Activiti7作为新一代工作流引擎,两者整合最需要注意的就是版本兼容性。我去年在金融项目里就遇到过因为版本不匹配导致…...
Debian/Ubuntu 上 KVM 虚拟化环境搭建全攻略:从源码到实战
Debian/Ubuntu 上 KVM 虚拟化环境搭建全攻略:从源码到实战 在当今云计算和容器化技术蓬勃发展的时代,虚拟化技术依然是基础设施领域不可或缺的基石。KVM(Kernel-based Virtual Machine)作为Linux内核原生支持的虚拟化解决方案&…...
清音刻墨Qwen3快速上手:拖拽上传,自动生成,一键下载
清音刻墨Qwen3快速上手:拖拽上传,自动生成,一键下载 1. 为什么选择清音刻墨Qwen3? 视频字幕制作一直是内容创作者的痛点。传统方法要么需要逐字听写,要么使用普通语音识别工具生成文字后,还得手动调整时间…...
Charles抓取WebSocket全链路解析:从配置到实战避坑指南
Charles抓取WebSocket全链路解析:从配置到实战避坑指南 WebSocket协议调试一直是开发者的痛点,传统抓包工具难以解析其长连接特性。本文详解如何通过Charles实现WebSocket请求的捕获与分析,包括SSL证书配置、协议升级拦截等核心步骤…...
RWKV7-1.5B-g1a部署教程:适配A10/A100/V100等主流GPU,显存占用稳定3.8GB
RWKV7-1.5B-g1a部署教程:适配A10/A100/V100等主流GPU,显存占用稳定3.8GB 1. 模型简介 rwkv7-1.5B-g1a是基于新一代RWKV-7架构的多语言文本生成模型,特别适合中文场景下的轻量级应用。这个1.5B参数的版本在保持较高生成质量的同时࿰…...
