Unity使用LineRender斷筆寫(xiě)字
做多媒體項(xiàng)目時(shí),經(jīng)常會(huì)最后來(lái)個(gè)客戶(hù)簽名并保存之類(lèi)的,簽名保存之前的博客Unity3d截圖方法合集有介紹過(guò)了,今天閑著把斷筆寫(xiě)字的也貼出來(lái)吧,以前用leap motion時(shí)嘗試用 leap motion演示中的食指寫(xiě)字,當(dāng)時(shí)的寫(xiě)字其實(shí)只能一筆畫(huà),說(shuō)白了其實(shí)就是個(gè)壽命無(wú)限長(zhǎng)的拖尾,雖然效果不太好,但是很流暢,嘗試過(guò)用leap motion斷筆寫(xiě)字,但是效果不好,很容易誤寫(xiě),然后就產(chǎn)生了此方法,就是鼠標(biāo)或者觸摸屏寫(xiě)字了。
講一下思路,就是不斷的將鼠標(biāo)的屏幕坐標(biāo)轉(zhuǎn)換成世界坐標(biāo),然后用LineRender持續(xù)畫(huà)線(xiàn),添加到隊(duì)列中,這樣做的好處是可持續(xù)撤銷(xiāo)誤寫(xiě)的筆畫(huà),知道全部撤銷(xiāo),重新寫(xiě)。
來(lái)來(lái)來(lái),鄙人寫(xiě)字很丑,不許笑,先上圖:
下面言歸正傳,這個(gè)做起來(lái)比較簡(jiǎn)單,一個(gè)腳本就能實(shí)現(xiàn)了
工程目錄圖如下:
只有一個(gè)腳本,一個(gè)材質(zhì),一個(gè)場(chǎng)景就可以了
場(chǎng)景中新建一個(gè)lineRender和write物體,write物體掛上DrawLine腳本。
下面重點(diǎn)來(lái)了,主要就是這個(gè)腳本:
using UnityEngine; using System.Collections; using System.Collections.Generic; public class DrawLine : MonoBehaviour { //線(xiàn)段預(yù)制 [Tooltip("Line renderer used for the line drawing.")] public LineRenderer linePrefab; //線(xiàn)段相關(guān)保存和下標(biāo) 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)) { // 鼠標(biāo)按下,開(kāi)始畫(huà)線(xiàn) currentLine = Instantiate(linePrefab).GetComponent<LineRenderer>(); currentLine.name = "Line" + linesDrawn.Count; currentLine.transform.parent = transform; Vector3 cursorPos = Input.mousePosition; cursorPos.z = 0f; //將鼠標(biāo)按下的屏幕坐標(biāo)轉(zhuǎn)換成世界坐標(biāo) 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)) { // 鼠標(biāo)左鍵抬起結(jié)束當(dāng)前筆畫(huà) currentLine = null; } } //撤銷(xiāo)最后一筆 public void DeleteLastLine() { if (linesDrawn.Count > 0) { GameObject goLastLine = linesDrawn[linesDrawn.Count - 1]; linesDrawn.RemoveAt(linesDrawn.Count - 1); Destroy(goLastLine); } } //持續(xù)畫(huà)線(xiàn) 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); } } } }
掛上腳本,你運(yùn)行就可以寫(xiě)字了,就這么簡(jiǎn)單,嘗試一下。
謝謝支持!有問(wèn)題或者代碼優(yōu)化建議歡迎評(píng)論。
工程下載
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:基于C#實(shí)現(xiàn)微信支付寶掃碼支付功能
欄 目:C#教程
本文標(biāo)題:Unity使用LineRender斷筆寫(xiě)字
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/4719.html
您可能感興趣的文章
- 01-10C#使用Dispose模式實(shí)現(xiàn)手動(dòng)對(duì)資源的釋放
- 01-10C#3.0使用EventLog類(lèi)寫(xiě)Windows事件日志的方法
- 01-10C#使用windows服務(wù)開(kāi)啟應(yīng)用程序的方法
- 01-10c# ArrayList的使用方法小總結(jié)
- 01-10C#使用ADO.Net部件來(lái)訪(fǎng)問(wèn)Access數(shù)據(jù)庫(kù)的方法
- 01-10C#使用Mutex簡(jiǎn)單實(shí)現(xiàn)程序單實(shí)例運(yùn)行的方法
- 01-10使用Nopcommerce為商城添加滿(mǎn)XX減XX優(yōu)惠券功能
- 01-10C#中yield用法使用說(shuō)明
- 01-10C#編程和Visual Studio使用技巧(下)
- 01-10C#編程和Visual Studio使用技巧(上)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線(xiàn)程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫(xiě)Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載