Unity使用LineRender断笔写字

做多媒体项目时,经常会最后来个客户签名并保存之类的,签名保存之前的博客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);
      }
    }
  }
}

挂上脚本,你运行就可以写字了,就这么简单,尝试一下。

谢谢支持!有问题或者代码优化建议欢迎评论。

工程下载

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Unity实现VR中在黑板上写字效果

    本文实例为大家分享了Unity实现VR中在黑板上写字的具体代码,供大家参考,具体内容如下 一.工具 1.开发用的是Unity 5.6.2版本 2.VR中的物理交互用的是VRTK插件,这个插件集成了比较好的物理交互功能: 3.HTC Vive 二.概述 实现的功能: 在一个白板上,用不同颜色的笔,在白板画出任何想要的图形: 因为只是一个初级篇所以只是用两个脚本简单的实现,而且并没有黑板擦等功能 ,也不能两个笔同时画画,这些功能将会在未来的升级篇中写出: 三.知识点 其实这个功能很简单,只是简单的运

  • unity实现屏幕上写字效果

    本文实例为大家分享了unity实现屏幕上写字效果的具体代码,供大家参考,具体内容如下 先建立一个RawImage,然后再在这个图片上加个LineRenderer组件,再建个材质球,把材质球的Shader改成Particles/Additive,把材质球拖给LineRenderer组件的Materials/Element 0(不拖也可以),最后再把代码拖给空物体即可,代码的Target是RawImage,下面的代码 using System.Collections; using System.Co

  • Unity使用LineRender断笔写字

    做多媒体项目时,经常会最后来个客户签名并保存之类的,签名保存之前的博客Unity3d截图方法合集有介绍过了,今天闲着把断笔写字的也贴出来吧,以前用leap motion时尝试用 leap motion演示中的食指写字,当时的写字其实只能一笔画,说白了其实就是个寿命无限长的拖尾,虽然效果不太好,但是很流畅,尝试过用leap motion断笔写字,但是效果不好,很容易误写,然后就产生了此方法,就是鼠标或者触摸屏写字了. 讲一下思路,就是不断的将鼠标的屏幕坐标转换成世界坐标,然后用LineRender

  • Unity使用LineRender实现绘画功能

    本文实例为大家分享了Unity LineRender实现绘画功能的具体代码,供大家参考,具体内容如下 老规矩,直接上代码: using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class DrawLine_ZH : MonoBehaviour { private GameObject _Clone; private LineRenderer _Lin

  • Unity使用LineRender实现签名效果

    本文为大家分享了Unity制作签名功能的具体代码,供大家参考,具体内容如下 前言:项目中需要做一个签名的功能,同时需要两个两个屏幕进行显示,但是都是在UI上,从网上查了大量资料. 找到两种方法: 1.修改图片像素点  但是是马赛克效果,不满足需求 2.使用LineRenderer 的3D签名制作出2D效果 改像素点: 先上代码 using System.Collections; using System.Collections.Generic; using UnityEngine; using

  • Unity绘制二维动态曲线

    一.前言 之前用Line Render实现过这个动态曲线的绘制,使用这个实在太不方便了,一直寻思怎么在一张图片上通过控制图片的像素值实现曲线的动态绘制.参考了Unity的官网教程实现了这个,效果图如图所示: 这样实现的效果比LineRender 要好,并且不怎么消耗计算和渲染 二.实现 1.代码创建一个背景贴图,并将这个贴图给UGUI的RawImage控件 //创建背景贴图 widthPixels = (int)(Screen.width * width); heightPixels = (in

  • Unity使用EzySlice实现模型多边形顺序切割

    Unity使用EzySlice实现模型切割,供大家参考,具体内容如下 老规矩,直接上代码: 注意:脚本搭载和需要的材质球以及切割数组填充 EzySlice 多边形顺序切割 using System.Collections; using System.Collections.Generic; using UnityEngine; using EzySlice; public class SplitterModel_ZH : MonoBehaviour { //切割预制体材质 public Mate

  • unity 如何使用LineRenderer 动态划线

    我就废话不多说了,大家还是直接看代码吧~ private LineRenderer line1; //画线 line1 = this.gameObject.AddComponent<LineRenderer>(); //只有设置了材质 setColor才有作用 line1.material = new Material(Shader.Find("Particles/Additive")); line1.SetVertexCount(2);//设置两点 line1.SetCo

  • Unity实现物体运动时画出轨迹

    本文实例为大家分享了Unity实现物体运动时画出轨迹的具体代码,供大家参考,具体内容如下 1.新建空物体,上赋LineRenderer 2.新建空物体,把轨迹画出来,设计和脚本. 3.LineMark的脚本是 using System.Collections; using System.Collections.Generic; using UnityEngine; public class LineMark : MonoBehaviour { private GameObject clone;

  • Unity实现物体运动轨迹的绘制

    本文实例为大家分享了unity物体运动轨迹绘制的具体代码,供大家参考,具体内容如下 ① create empty,命名为LineRender ② 在Assects中新建材质,选择Shader为Sprites/Default,并设置轨迹颜色,如下图: ③ 选择①中创建的object,添加Line Render属性,然后将②中新建的材质赋给该object,如下图: 展开Line Render,拖动Width可设置轨迹宽度 ④ 创建c#脚本,拖至运动物体上,代码如下: using System.Col

随机推荐