当前位置:
首页 > Python基础教程 >
-
Unity使用LineRender断笔写字
做多媒体项目时,经常会最后来个客户签名并保存之类的,签名保存之前的博客Unity3d截图方法合集有介绍过了,今天闲着把断笔写字的也贴出来吧,以前用leap motion时尝试用 leap motion演示中的食指写字,当时的写字其实只能一笔画,说白了其实就是个寿命无限长的拖尾,虽然效果不太好,但是很流畅,尝试过用leap motion断笔写字,但是效果不好,很容易误写,然后就产生了此方法,就是鼠标或者触摸屏写字了。
讲一下思路,就是不断的将鼠标的屏幕坐标转换成世界坐标,然后用LineRender持续画线,添加到队列中,这样做的好处是可持续撤销误写的笔画,知道全部撤销,重新写。
来来来,鄙人写字很丑,不许笑,先上图:
下面言归正传,这个做起来比较简单,一个脚本就能实现了
工程目录图如下:
只有一个脚本,一个材质,一个场景就可以了
场景中新建一个lineRender和write物体,write物体挂上DrawLine脚本。
下面重点来了,主要就是这个脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
using UnityEngine; using System.Collections; using System.Collections.Generic; public class DrawLine : MonoBehaviour { //线段预制 [Tooltip( "Line renderer used for the line drawing." )] public LineRenderer linePrefab; //线段相关保存和下标 private List<GameObject> linesDrawn = new List<GameObject>(); private LineRenderer currentLine; private int lineVertexIndex = 2; void Update() { //删除最近一笔 if (Input.GetKeyDown(KeyCode.U)) { // U-key means Undo DeleteLastLine(); } if (currentLine == null && Input.GetMouseButton(0)) { // 鼠标按下,开始画线 currentLine = Instantiate(linePrefab).GetComponent<LineRenderer>(); currentLine.name = "Line" + linesDrawn.Count; currentLine.transform.parent = transform; Vector3 cursorPos = Input.mousePosition; cursorPos.z = 0f; //将鼠标按下的屏幕坐标转换成世界坐标 Vector3 cursorSpacePos = Camera.main.ScreenToWorldPoint(cursorPos); cursorSpacePos.z = 0f; currentLine.SetPosition(0, cursorSpacePos); currentLine.SetPosition(1, cursorSpacePos); lineVertexIndex = 2; linesDrawn.Add(currentLine.gameObject); StartCoroutine(DrawLines()); } if (currentLine != null && Input.GetMouseButtonUp(0)) { // 鼠标左键抬起结束当前笔画 currentLine = null ; } } //撤销最后一笔 public void DeleteLastLine() { if (linesDrawn.Count > 0) { GameObject goLastLine = linesDrawn[linesDrawn.Count - 1]; linesDrawn.RemoveAt(linesDrawn.Count - 1); Destroy(goLastLine); } } //持续画线 IEnumerator DrawLines() { while (Input.GetMouseButton(0)) { yield return new WaitForEndOfFrame(); if (currentLine != null ) { lineVertexIndex++; currentLine.SetVertexCount(lineVertexIndex); Vector3 cursorPos = Input.mousePosition; cursorPos.z = 0f; Vector3 cursorSpacePos = Camera.main.ScreenToWorldPoint(cursorPos); cursorSpacePos.z = 0f; currentLine.SetPosition(lineVertexIndex - 1, cursorSpacePos); } } } } |
挂上脚本,你运行就可以写字了,就这么简单,尝试一下。
谢谢支持!有问题或者代码优化建议欢迎评论。
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式