Unity3D 画笔实现系列01-LineRender

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D 画笔实现系列01-LineRender相关的知识,希望对你有一定的参考价值。

前言:刚从Python转到U3D时,第一个项目涉及到画线,刚开始想那还不简单吗,不就是获取位置后着色吗,H5中的Canvas就能实现,当我看了Unity的文档后一脸懵逼,居然没有相关的方法。没办法只能在网上找,涉及到画线的很多,各种坑。

Unity画线最简单的实现方法LineRender组件:

     LineRender实现起来比较简单,

技术分享图片
 1 public class line : MonoBehaviour
 2 {
 3     /*
 4      LineRenderer画线优点是简单,易控制,在移动端效果较好
 5      缺点:1.线宽不能高度定制(毛笔效果不好实现),
 6      2.不能重复贴图(蜡笔)(2017版本后贴图可以重复但效果不是很好--Texture Mode 设置成repeat),
 7      3,橡皮擦实习起来比较复杂:
 8         1.再用一个LineRenderer画白色线条
 9         2.把图片渲染到RendererTexture上
10         3.利用shader扣掉白色(缺点不能画白色)
11      4,保存方法自能截图
12      5,保存恢复记录的东西太多了     
13     */
14     private GameObject lineRendererObj;
15     private LineRenderer lineRenderer;
16     private List<Vector3> worldPos = new List<Vector3>();
17     public GameObject lineRendererPre;
18     private bool moving;
19     private void Update()
20     {
21 
22         #region 画笔
23         if (Input.GetMouseButtonDown(0))
24         {
25             moving = true;
26             InitLine(Color.red);
27 
28         }
29         if (Input.GetMouseButtonUp(0))
30         {
31             moving = false;
32             worldPos.Clear();
33         }
34         #endregion
35 
36 
37 
38         #region 橡皮
39         if (Input.GetMouseButtonDown(1))
40         {
41             moving = true;
42             InitLine(Color.white);
43 
44         }
45         if (Input.GetMouseButtonUp(1))
46         {
47             moving = false;
48             worldPos.Clear();
49         } 
50         #endregion
51         if (moving)
52         {
53             Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);//取得点击点的世间坐标
54             pos.z = 0;//设置为0效果更好
55             if (worldPos.Count > 1)
56             {
57                 if (Vector3.Distance(pos, worldPos[worldPos.Count - 1]) < 0.08f)
58                 {
59                     return;
60                 }
61             }
62            
63                 worldPos.Add(pos);
64              Draw();
65             //BezierPathDraw();//贝塞尔曲线优化画笔效果差别不大,很卡
66 
67         }
68     }
69 
70     private void InitLine(Color color)
71     {
72         lineRendererObj = Instantiate(lineRendererPre, this.transform);
73         lineRenderer = lineRendererObj.GetComponent<LineRenderer>();
74         lineRenderer.numCapVertices = 5;//控制在结尾处添加的点数越多越圆滑
75         lineRenderer.numCornerVertices = 5;//控制在折角处添加的点数越多越圆滑
76         lineRenderer.startColor = color;//开始的颜色
77         lineRenderer.endColor = color;//结束的颜色 
78         lineRenderer.startWidth = 0.2f;//开始的宽度
79         lineRenderer.endWidth = 0.2f;//结束的宽度
80     }
81     private void Draw()
82     {
83        lineRenderer.positionCount = worldPos.Count;
84        lineRenderer.SetPositions(worldPos.ToArray());
85     }
View Code

 

以上是关于Unity3D 画笔实现系列01-LineRender的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D 画笔实现系列02-UnityGL

Unity3D 画笔实现系列04-Texture2D

Unity3D 画笔实现系列05-Texture2D深入

[Unity3D插件]2dToolKit系列三 碰撞检测功能的实现以及障碍物的随机摆放

Unity3D应用案例系列时钟钟表小组件开发

Unity3D应用案例系列时钟钟表小组件开发