Unity使用LineRender斷筆寫(xiě)字
做多媒體項(xiàng)目時(shí),經(jīng)常會(huì)最后來(lái)個(gè)客戶簽名并保存之類的,簽名保存之前的博客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à)線,添加到隊(duì)列中,這樣做的好處是可持續(xù)撤銷誤寫(xiě)的筆畫(huà),知道全部撤銷,重新寫(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
{
//線段預(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)按下,開(kāi)始畫(huà)線
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;
}
}
//撤銷最后一筆
public void DeleteLastLine()
{
if (linesDrawn.Count > 0)
{
GameObject goLastLine = linesDrawn[linesDrawn.Count - 1];
linesDrawn.RemoveAt(linesDrawn.Count - 1);
Destroy(goLastLine);
}
}
//持續(xù)畫(huà)線
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í)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#編程實(shí)現(xiàn)查看剪切板內(nèi)容的方法
這篇文章主要介紹了C#編程實(shí)現(xiàn)查看剪切板內(nèi)容的方法,涉及C#針對(duì)剪切板操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
C# OpenCvSharp利用白平衡技術(shù)實(shí)現(xiàn)圖像修復(fù)功能
這篇文章主要為大家詳細(xì)介紹了C# OpenCvSharp如何利用白平衡技術(shù)實(shí)現(xiàn)圖像修復(fù)功能,文中的示例代碼講解詳細(xì),希望對(duì)大家有一定的幫助2024-02-02
C#實(shí)現(xiàn)控制Windows系統(tǒng)關(guān)機(jī)、重啟和注銷的方法
這篇文章主要介紹了C#實(shí)現(xiàn)控制Windows系統(tǒng)關(guān)機(jī)、重啟和注銷的方法,涉及C#調(diào)用windows系統(tǒng)命令實(shí)現(xiàn)控制開(kāi)機(jī)、關(guān)機(jī)等操作的技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-04-04
C# Char結(jié)構(gòu)中IsLetterOrDigit(Char)的方法詳解
這篇文章給大家介紹了C#的Char 結(jié)構(gòu)的IsLetterOrDigit(Char)的方法,并通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-02-02
C#調(diào)用RabbitMQ實(shí)現(xiàn)消息隊(duì)列的示例代碼
這篇文章主要介紹了C#調(diào)用RabbitMQ實(shí)現(xiàn)消息隊(duì)列的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
C#如何將DataTable導(dǎo)出到Excel解決方案
由于公司項(xiàng)目中需要將系統(tǒng)內(nèi)用戶操作的所有日志進(jìn)行轉(zhuǎn)存?zhèn)浞荩紤]到以后可能還需要還原,所以最后決定將日志數(shù)據(jù)備份到Excel中2012-11-11

