当前位置: 首页 > news >正文

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是一个面向开源及私有软件项目的托管平台&#xff0c;它建立在Git这个分布式版本控制系统之上&#xff0c;为开发者提供了在云端存储、管理和共享代码的便捷方式。以下是对GitHub的详细介绍&#xff1a; ### 一、GitHub的基本功能 1. **代码托管**&#xff1a;GitHub允…...

【鸿蒙学习】HarmonyOS应用开发者基础 - 构建更加丰富的页面之Tabs(三)

学完时间&#xff1a;2024年8月14日 一、前言叨叨 学习HarmonyOS的第六课&#xff0c;人数又成功的降了500名左右&#xff0c;到了3575人了。 本文接上一文章【鸿蒙学习】HarmonyOS应用开发者基础 - 构建更加丰富的页面&#xff08;一&#xff09;&#xff0c;继续记录构建更…...

Detectron2 安装指南

文章目录 前言Detectron2官方文档官方指南 安装 Detectron2虚拟环境安装 PyTorch安装 Detectron2 总结 前言 Detectron2 是 Meta AI 的一个机器视觉相关的库&#xff0c;建立在 Detectron 和 maskrcnn-benchmark 基础之上&#xff0c;可以进行目标检测、语义分割、全景分割&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官方文档写的挺详细的&#xff0c;但是也不算特别详细。 按照上面的文档&#xff0c;执行到cmake的时候&#xff0c;会提示“srtp 未找到, WebRTC 相关功能打开失败”&#xff0c;但是cmke还是可以继续啊。此时看文档说webrtc比较复杂&#xff0c;默认是不编译的&am…...

KEEPALIVED高可用集群最详解

目录 一、高可用集群 1.1 集群的类型 1.2 实现高可用 1.3 VRRP&#xff1a;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基础学习

前言&#xff1a;LLaMA-Factory项目的目标是整合主流的各种高效训练微调技术&#xff0c;适配市场主流开源模型&#xff0c;形成一个功能丰富&#xff0c;适配性好的训练框架。 目录 1. 前期准备2. 原始模型直接推理3. 自定义数据集4. 模型训练5. 模型合并并导出 1. 前期准备 …...

【Java】如何使用jdbc连接并操作MySQL,一文读懂不迷路,小白也能轻松学会

JDBC的原理 JDBC&#xff08;Java Database Connectivity&#xff09;是Java提供的用于连接和操作数据库的API。它允许Java应用程序与各种数据库进行交互&#xff0c;以下是JDBC的基本原理&#xff1a; 驱动程序管理&#xff1a;JDBC使用不同的数据库驱动程序来连接不同类型的…...

新手学习VR全景需要知道的几个问题

1.什么是720云 720云是一家专注于VR全景内容制作与展示的技术平台&#xff0c;提供从拍摄、编辑到发布的一站式解决方案。它的核心功能包括全景图像的制作和编辑工具&#xff0c;以及VR全景内容的在线展示和分享服务。720云的技术广泛应用于房地产、旅游、教育、文化展示等多个…...

上海知名泌尿外科专家常态化坐诊黄山新晨医院,让前列腺癌看得更早、更准!

继7月28日上海第四人民医院泌尿外科专家在黄山新晨医院开展义诊之后&#xff0c;8月9日和10日&#xff0c;该团队领头人周铁教授又完成了合作以来的首次坐诊&#xff0c;标志着双方合作从此进入常态化阶段。 周铁主任在查看患者的检查报告 周铁主任曾任中华医学会泌尿外科分会…...

Elasticsearch: 非结构化的数据搜索

r很多大数据组件在快速原型时期都是Java实现&#xff0c;后来因为GC不可控、内存或者向量化等等各种各样的问题换到了C&#xff0c;比如zookeeper->nuraft(https://www.yuque.com/treblez/qksu6c/hu1fuu71hgwanq8o?singleDoc# 《olap/clickhouse keeper 一致性协调服务》)&…...

44 个 React 前端面试问题

1.你知道哪些React hooks&#xff1f; useState&#xff1a;用于管理功能组件中的状态。useEffect&#xff1a;用于在功能组件中执行副作用&#xff0c;例如获取数据或订阅事件。useContext&#xff1a;用于访问功能组件内的 React 上下文的值。useRef&#xff1a;用于创建对跨…...

LLMs之Framework:Hugging Face Accelerate后端框架之FSDP和DeepSpeed的对比与分析

LLMs之Framework&#xff1a;Hugging Face Accelerate后端框架之FSDP和DeepSpeed的对比与分析 导读&#xff1a;该文章阐述了FSDP和DeepSpeed在实现上的差异&#xff0c;Accelerate如何统一它们的行为&#xff0c;并提供指导帮助用户在两种后端之间切换。同时也讨论了低精度优化…...

HarmonyOS应用开发学习-ArkTs声明式UI描述

ArkTs声明式UI描述 1 创建组件 声明式UI描述 ArKTS以声明方式组合和扩展组件来描述应用程序的UI&#xff0c;同时还提供了基本的属性、事件和子组件配置方法&#xff0c;帮助开发者实现应用交互逻辑 创建组件 根据组件构造方法的不同&#xff0c;创建组件包含有参数和无参…...

Redis20-通信协议

目录 RESP协议 概述 数据类型 模拟Redis客户端 RESP协议 概述 Redis是一个CS架构的软件&#xff0c;通信一般分两步&#xff08;不包括pipeline和PubSub&#xff09;&#xff1a; 客户端&#xff08;client&#xff09;向服务端&#xff08;server&#xff09;发送一条命…...

Unity Shader变体优化与故障排除技巧

在 Unity 中编写着色器时&#xff0c;我们可以方便地在一个源文件中包含多个特性、通道和分支逻辑。在构建时&#xff0c;着色器源文件会被编译成着色器程序&#xff0c;这些程序包含一个或多个变体。变体是该着色器在满足一组条件后生成的版本&#xff0c;这通常会导致线性执行…...

数据结构——时间复杂度和空间复杂度

目录 时间复杂度 什么是时间复杂度 常见时间复杂度类型 如何计算时间复杂度 空间复杂度 什么是空间复杂度 常见的空间复杂度类型 如何计算空间复杂度 时间复杂度和空间复杂度是评估算法性能的两个重要指标。 时间复杂度 什么是时间复杂度 时间复杂度描述了算法执行所需…...

(echarts) 饼图设置滚动图例

(echarts) 饼图设置滚动图例 效果&#xff1a; 代码&#xff1a; // 图例 legend: {type: scroll,orient: vertical,right: 10,top: 20,bottom: 20,data: data.legendData},参考&#xff1a;官网-可滚动的图例 https://echarts.apache.org/examples/zh/editor.html?cpie-leg…...

Java spring SSM框架--mybatis

一、介绍 Spring 框架是一个资源整合的框架&#xff0c;可以整合一切可以整合的资源&#xff08;Spring 自身和第三方&#xff09;&#xff0c;是一个庞大的生态&#xff0c;包含很多子框架&#xff1a;Spring Framework、Spring Boot、Spring Data、Spring Cloud…… 其中Spr…...

LoRA微调实战:零基础在笔记本上高效微调大模型

1. 项目概述&#xff1a;为什么LoRA让普通人也能“调教”大模型你有没有过这种时刻&#xff1a;盯着屏幕上那个动辄上百GB的开源大模型权重文件&#xff0c;手指悬在下载按钮上&#xff0c;心里却在盘算——我的笔记本连显存都快被Chrome吃光了&#xff0c;真要跑起来&#xff…...

Android Frida检测实战:基于模拟器的三重系统级痕迹识别

1. 这不是教你怎么用Frida Hook&#xff0c;而是教你如何一眼识破它很多人一听到“Frida检测”&#xff0c;第一反应是&#xff1a;“哦&#xff0c;又一个防逆向的花活儿”&#xff0c;然后随手搜几篇Hook绕过教程&#xff0c;抄两行Process.isDebuggerConnected()就以为万事大…...

RAID5瘫痪抢救实录:硬盘物理故障下的数据恢复实战

1. 这不是数据丢失预警&#xff0c;而是RAID5信任危机的现场直播“凌晨三点&#xff0c;监控告警邮件炸了——/dev/md0状态DEGRADED&#xff0c;紧接着是两块盘离线。”这是我上个月在值班日志里写下的第一行字。没有夸张&#xff0c;没有铺垫&#xff0c;就是这么一句干巴巴的…...

APT32F110 RTC模块深度测评:从硬件原理到低功耗应用实战

1. 项目概述与核心价值最近在捣鼓爱普特APT32F110这块开发板&#xff0c;发现它的RTC&#xff08;实时时钟&#xff09;功能挺有意思。对于很多嵌入式项目来说&#xff0c;比如智能家居的定时开关、数据采集设备的定时唤醒、或者简单的电子钟&#xff0c;一个靠谱的RTC模块是必…...

RK3576开发板RTC硬件扩展与Linux时间管理实战指南

1. 项目概述与核心价值在嵌入式开发中&#xff0c;尤其是在像RK3576这类高性能AIoT开发板上&#xff0c;一个稳定可靠的实时时钟&#xff08;RTC&#xff09;往往是项目从“玩具”走向“产品”的关键一步。它不仅仅是显示个时间那么简单&#xff0c;更是系统日志时间戳准确、定…...

2026年研究生开题报告降AI攻略:开题报告AIGC超标4.8元一次过知网完整处理指南

2026年研究生开题报告降AI攻略&#xff1a;开题报告AIGC超标4.8元一次过知网完整处理指南 从AI率71%到5.9%&#xff0c;我用了一个晚上。研究生开题报告降AI完整经历。 核心工具&#xff1a;嘎嘎降AI&#xff08;www.aigcleaner.com&#xff09;&#xff0c;4.8元&#xff0c…...

武林外传十年之约手游官网下载:武林外传十年之约最新官方下载渠道

《武林外传十年之约》又名《武林外传手游》《武林外传怀旧版》《武林外传正版复刻》&#xff0c;由安徽游昕联合忆往游戏运营的正版武侠 MMORPG 手游。1:1 复刻同福客栈、七侠镇、五霸岗、十八里铺等经典场景&#xff0c;完美还原枪豪、剑客、术士、医师四大职业体系&#xff0…...

NotebookLM时间线创建全流程拆解(从零到专业级时间叙事)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;NotebookLM时间线创建全流程拆解&#xff08;从零到专业级时间叙事&#xff09; NotebookLM 的时间线&#xff08;Timeline&#xff09;功能并非内置独立模块&#xff0c;而是依托其“脚注驱动叙事”机制&am…...

Cortex-M7 WIC模块移除的影响与工程实践

1. Cortex-M7中移除WIC的影响解析在嵌入式系统设计中&#xff0c;Cortex-M7处理器的WIC&#xff08;Wakeup Interrupt Controller&#xff09;模块是一个值得深入探讨的组件。作为一位从事ARM架构开发多年的工程师&#xff0c;我经常遇到客户询问关于WIC配置的问题。这个看似简…...

别再手动写远程搜索了!手把手教你封装一个通用的 Element Plus el-select-v2 组件

打造高复用性远程搜索组件&#xff1a;Element Plus el-select-v2 深度封装指南 在Vue 3和Element Plus构建的中后台系统中&#xff0c;远程搜索下拉框几乎是每个表单页面的标配功能。当项目中有十几个甚至几十个表单都需要实现类似功能时&#xff0c;直接复制粘贴代码不仅导致…...