Unity使用LineRender斷筆寫字
做多媒體項(xiàng)目時(shí),經(jīng)常會(huì)最后來個(gè)客戶簽名并保存之類的,簽名保存之前的博客Unity3d截圖方法合集有介紹過了,今天閑著把斷筆寫字的也貼出來吧,以前用leap motion時(shí)嘗試用 leap motion演示中的食指寫字,當(dāng)時(shí)的寫字其實(shí)只能一筆畫,說白了其實(shí)就是個(gè)壽命無限長的拖尾,雖然效果不太好,但是很流暢,嘗試過用leap motion斷筆寫字,但是效果不好,很容易誤寫,然后就產(chǎn)生了此方法,就是鼠標(biāo)或者觸摸屏寫字了。
講一下思路,就是不斷的將鼠標(biāo)的屏幕坐標(biāo)轉(zhuǎn)換成世界坐標(biāo),然后用LineRender持續(xù)畫線,添加到隊(duì)列中,這樣做的好處是可持續(xù)撤銷誤寫的筆畫,知道全部撤銷,重新寫。
來來來,鄙人寫字很丑,不許笑,先上圖:
下面言歸正傳,這個(gè)做起來比較簡單,一個(gè)腳本就能實(shí)現(xiàn)了
工程目錄圖如下:
只有一個(gè)腳本,一個(gè)材質(zhì),一個(gè)場景就可以了
場景中新建一個(gè)lineRender和write物體,write物體掛上DrawLine腳本。
下面重點(diǎn)來了,主要就是這個(gè)腳本:
using UnityEngine; using System.Collections; using System.Collections.Generic; public class DrawLine : MonoBehaviour { //線段預(yù)制 [Tooltip("Line renderer used for the line drawing.")] public LineRenderer linePrefab; //線段相關(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)按下,開始畫線 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)前筆畫 currentLine = null; } } //撤銷最后一筆 public void DeleteLastLine() { if (linesDrawn.Count > 0) { GameObject goLastLine = linesDrawn[linesDrawn.Count - 1]; linesDrawn.RemoveAt(linesDrawn.Count - 1); Destroy(goLastLine); } } //持續(xù)畫線 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)行就可以寫字了,就這么簡單,嘗試一下。
謝謝支持!有問題或者代碼優(yōu)化建議歡迎評論。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C# BinaryReader實(shí)現(xiàn)讀取二進(jìn)制文件
在 C# 以二進(jìn)制形式讀取數(shù)據(jù)時(shí)使用的是 BinaryReader 類。本文介紹了C# BinaryReader實(shí)現(xiàn)讀取二進(jìn)制文件,感興趣的可以了解一下2021-06-06C#中this用法系列(二) 通過this修飾符為原始類型擴(kuò)展方法
定義一個(gè)靜態(tài)類,類中定義靜態(tài)方法,方法中參數(shù)類型前邊加上this修飾符,即可實(shí)現(xiàn)對參數(shù)類型的方法擴(kuò)展,下面通過實(shí)例代碼給大家介紹下,需要的朋友參考下吧2016-12-12Unity使用物理引擎實(shí)現(xiàn)多旋翼無人機(jī)的模擬飛行
這篇文章主要介紹了Unity使用物理引擎實(shí)現(xiàn)多旋翼無人機(jī)的模擬飛行,包括了詳細(xì)的原理介紹和代碼實(shí)現(xiàn),對物理引擎感興趣的同學(xué),可以參考下2021-04-04C#實(shí)現(xiàn)Excel數(shù)據(jù)導(dǎo)入到SQL server數(shù)據(jù)庫
這篇文章主要為大家詳細(xì)介紹了在C#中如何實(shí)現(xiàn)Excel數(shù)據(jù)導(dǎo)入到SQL server數(shù)據(jù)庫中,文中的示例代碼簡潔易懂,希望對大家有一定的幫助2024-03-03基于WPF實(shí)現(xiàn)3D導(dǎo)航欄控件
這篇文章主要介紹了如何基于WPF實(shí)現(xiàn)簡單的3D導(dǎo)航欄控件效果,文中的示例代碼講解詳細(xì),對我們的學(xué)習(xí)或工作有一定幫助,需要的小伙伴可以參考一下2024-03-03一篇文章教會(huì)你用Unity制作網(wǎng)格地圖生成組件
網(wǎng)格地圖這個(gè)功能在策略型游戲中應(yīng)用比較廣泛,基本情況下會(huì)將地圖分割成正方形網(wǎng)格或者六邊形網(wǎng)格,這篇文章主要給大家介紹了如何通過一篇文章學(xué)會(huì)用Unity制作網(wǎng)格地圖生成組件的相關(guān)資料,需要的朋友可以參考下2021-08-08