您好,登錄后才能下訂單哦!
做多媒體項目時,經常會最后來個客戶簽名并保存之類的,簽名保存之前的博客Unity3d截圖方法合集有介紹過了,今天閑著把斷筆寫字的也貼出來吧,以前用leap motion時嘗試用 leap motion演示中的食指寫字,當時的寫字其實只能一筆畫,說白了其實就是個壽命無限長的拖尾,雖然效果不太好,但是很流暢,嘗試過用leap motion斷筆寫字,但是效果不好,很容易誤寫,然后就產生了此方法,就是鼠標或者觸摸屏寫字了。
講一下思路,就是不斷的將鼠標的屏幕坐標轉換成世界坐標,然后用LineRender持續畫線,添加到隊列中,這樣做的好處是可持續撤銷誤寫的筆畫,知道全部撤銷,重新寫。
來來來,鄙人寫字很丑,不許笑,先上圖:
下面言歸正傳,這個做起來比較簡單,一個腳本就能實現了
工程目錄圖如下:
只有一個腳本,一個材質,一個場景就可以了
場景中新建一個lineRender和write物體,write物體掛上DrawLine腳本。
下面重點來了,主要就是這個腳本:
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); } } } }
掛上腳本,你運行就可以寫字了,就這么簡單,嘗試一下。
謝謝支持!有問題或者代碼優化建議歡迎評論。
工程下載
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。