服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - unity 如何使用LineRenderer 动态划线

unity 如何使用LineRenderer 动态划线

2022-11-12 14:58小小De程序员 C#

这篇文章主要介绍了unity 使用LineRenderer 动态划线的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

我就废话不多说了,大家还是直接看代码吧~

?
1
2
3
4
5
6
7
8
9
10
11
12
private LineRenderer line1;       
//画线
line1 = this.gameObject.AddComponent<LineRenderer>();
//只有设置了材质 setColor才有作用
line1.material = new Material(Shader.Find("Particles/Additive"));
line1.SetVertexCount(2);//设置两点
line1.SetColors(Color.yellow, Color.red); //设置直线颜色
line1.SetWidth(5f, 10f);//设置直线宽度     
//设置指示线的起点和终点
line1.SetPosition(0, A.transform.position);
line1.SetPosition(1, B.transform.position);
Destroy(this.gameObject.GetComponent<LineRenderer>());

补充:Unity LineRenderer绘制物体行走路线

我是用的角色控制器(Character Controller)+LineRenderer做的

下面是代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerTest : MonoBehaviour
{
    public GameObject clone;//这是个空物体  只添加了一个LineRenderer组件
    public float speed = 5;
    public float jumpSpeed = 10f;
    public float luodi = 15;
    private Vector3 movePos = Vector3.zero;
    public CharacterController controller;
    private LineRenderer line;
    Vector3[] path;
    private float time = 0;
    List<Vector3> pos=new List<Vector3> ();
    void Awake()
    {
              path = pos.ToArray();//初始化
              line = clone.GetComponent<LineRenderer>();//获得该物体上的LineRender组件
              line.SetColors(Color.blue, Color.red);//设置颜色
              line.SetWidth(0.2f, 0.1f);//设置宽度
    }
    void Update()
    {
        time += Time.deltaTime;
        if (time>0.1)//每0.1秒绘制一次
        {
            time = 0;
            pos.Add(transform.position);//添加当前坐标进链表
            path = pos.ToArray();//转成数组
        }
        if (controller.isGrounded)//判断人物是否落地
        {
            movePos = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
            movePos = transform.TransformDirection(movePos);
            movePos *= speed;
            if (Input.GetButton("Jump")) {
                movePos.y = jumpSpeed;
              }
        }
        movePos.y -= luodi * Time.deltaTime;
        controller.Move(movePos * Time.deltaTime);
        if (path.Length!=0)//有数据时候再绘制
        {
            line.SetVertexCount(path.Length);//设置顶点数     
            line.SetPositions(path);//设置顶点位置
        }        
    }
}

补充:Unity组件 — LineRenderer动态添加碰撞

基础知识:

选中要添加组件的gameObject,在Inspector面板,点击“Add Component”按钮,选中LineRenderer组件,添加。

unity 如何使用LineRenderer 动态划线

cast Shadows : 蒙上阴影

Receive Shadows : 是否接受阴影

Dynamic Occludee : 是否动态遮罩

Materials 中的属性:

size : 材质球的数量

Element : 具体的材质球

Positions 中的属性:

size : 位置的数量

Element : 具体的位置

Use World Space : 是否使用世界坐标系,还是使用相对坐标系

Width : 线条的宽度

Color : 线条的颜色,注:如果没有赋值材质,无论怎样改变Color的值,颜色都不会有改变。

Corner Vertices : 可形成线条的圆角效果

End Cap Vertices : 影响线条的两端的圆角效果。

注:当line Renderer拥有了材质,可以通过修改Color来改变颜色。当时当修改了Color后,line的颜色没有改变,应该是Material和Color属性结合不好。将Material修改为Sprites/Default,Color的颜色就可以成功的显示在line上面了。

动态添加碰撞器(Polygon Collider2D)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MouseTrack : MonoBehaviour
{
    /// <summary>
    /// 获取LineRenderer组件
    /// </summary>
    [Header("获得LineRenderer组件")]
    public LineRenderer lineRenderer;
    //获得鼠标跟踪位置
    private Vector3[] mouseTrackPositions = new Vector3[20];
    private Vector3 headPosition;   //头位置
    private Vector3 lastPosition;   //尾位置
    private int positionCount = 0;  //位置计数
    [Header("设置多远距离记录一个位置")]
    public float distanceOfPositions = 0.01f;
    private bool firstMouseDown = false;    //第一次鼠标点击
    private bool mouseDown = false;     //鼠标点击
    PolygonCollider2D polygonCollider;   //添加多边形碰撞
    void Start()
    {
        polygonCollider = gameObject.GetComponent<PolygonCollider2D>();
    }
    void Update()
    {
        //鼠标点击的时候
        if (Input.GetMouseButtonDown(0))
        {
            polygonCollider.enabled = true;
            lineRenderer.positionCount = 20;
            firstMouseDown = true;
            mouseDown = true;
        }
        if (Input.GetMouseButtonUp(0))
        {
            mouseDown = false;
 
            //ClearColliderAndLineRenderer();
        }
        OnDrawLine();
        firstMouseDown = false;
    }
    //画线
    private void OnDrawLine()
    {
        if (firstMouseDown == true)
        {
            positionCount = 0;
            //头坐标
            headPosition = Camera.main.ScreenToViewportPoint(Input.mousePosition + new Vector3(0, 0, 11));
            lastPosition = headPosition;
        }
        if (mouseDown == true)
        {
            headPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition + new Vector3(0, 0, 11));
            //判断头坐标到尾坐标的距离是否大于记录点位
            if (Vector3.Distance(headPosition, lastPosition) > distanceOfPositions)
            {
                //用于保存位置
                SavePosition(headPosition);
                positionCount++;
            }
            lastPosition = headPosition;
        }
        //设置线性渲染器的位置
        SetLineRendererPosition(mouseTrackPositions);
    }
    //保存位置
    private void SavePosition(Vector3 pos)
    {
        pos.z = 0;
        if (positionCount <= 19)
        {
            for (int i = positionCount; i < 20; i++)
            {
                mouseTrackPositions[i] = pos;
            }
        }
        else
        {
            for (int i = 0; i < 19; i++)
            {
                mouseTrackPositions[i] = mouseTrackPositions[i + 1];
            }
        }
        mouseTrackPositions[19] = pos;
 
        //创建碰撞路径
        List<Vector2> colliderPath = GetColliderPath(mouseTrackPositions);
        polygonCollider.SetPath(0, colliderPath.ToArray());
    }
    //计算碰撞体轮廓
    float colliderWidth;
    List<Vector2> pointList2 = new List<Vector2>();
    List<Vector2> GetColliderPath(Vector3[] pointList3)
    {
        //碰撞体宽度
        colliderWidth = lineRenderer.startWidth;
        //Vector3转Vector2
        pointList2.Clear();
        for (int i = 0; i < pointList3.Length; i++)
        {
            pointList2.Add(pointList3[i]);
        }
        //碰撞体轮廓点位
        List<Vector2> edgePointList = new List<Vector2>();
        //以LineRenderer的点位为中心, 沿法线方向与法线反方向各偏移一定距离, 形成一个闭合且不交叉的折线
        for (int j = 1; j < pointList2.Count; j++)
        {
            //当前点指向前一点的向量
            Vector2 distanceVector = pointList2[j - 1] - pointList2[j];
            //法线向量
            Vector3 crossVector = Vector3.Cross(distanceVector, Vector3.forward);
            //标准化, 单位向量
            Vector2 offectVector = crossVector.normalized;
            //沿法线方向与法线反方向各偏移一定距离
            Vector2 up = pointList2[j - 1] + 0.5f * colliderWidth * offectVector;
            Vector2 down = pointList2[j - 1] - 0.5f * colliderWidth * offectVector;
            //分别加到List的首位和末尾, 保证List中的点位可以围成一个闭合且不交叉的折线
            edgePointList.Insert(0, down);
            edgePointList.Add(up);
            //加入最后一点
            if (j == pointList2.Count - 1)
            {
                up = pointList2[j] + 0.5f * colliderWidth * offectVector;
                down = pointList2[j] - 0.5f * colliderWidth * offectVector;
                edgePointList.Insert(0, down);
                edgePointList.Add(up);
            }
        }
        //返回点位
        return edgePointList;
    }
    //设置线条渲染器位置
    private void SetLineRendererPosition(Vector3[] position)
    {
        lineRenderer.SetPositions(position);
    }
    //用于清除碰撞和线性渲染
    void ClearColliderAndLineRenderer()
    {
        if (polygonCollider)
        {
            polygonCollider.enabled = false;
        }
        lineRenderer.positionCount = 0;
    }
}

效果图:

unity 如何使用LineRenderer 动态划线

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。

原文链接:https://blog.csdn.net/weixin_43705303/article/details/93197334

延伸 · 阅读

精彩推荐
  • C#详解C#开发Android应用程序的流程

    详解C#开发Android应用程序的流程

    在本篇文章里小编给大家分享了关于C#开发Android应用程序的流程和相关技巧,需要的朋友们跟着学习下。...

    C#教程网4682022-07-16
  • C#C#-WinForm跨线程修改UI界面的示例

    C#-WinForm跨线程修改UI界面的示例

    这篇文章主要介绍了C#-WinForm跨线程修改UI界面的示例,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...

    UP技术控11232022-10-26
  • C#c# 识别图片格式的方法

    c# 识别图片格式的方法

    这篇文章主要介绍了c# 识别图片格式的方法,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...

    UP技术控8172022-11-01
  • C#c#判断email地址是否为合法

    c#判断email地址是否为合法

    输入email地址使用c#语言检测出email地址是否是合法的,这篇文章主要介绍了c#判断email地址是否为合法的相关资料,需要的朋友可以参考下...

    WinTuzi4102021-12-01
  • C#WPF自定义TreeView控件样式实现QQ联系人列表效果

    WPF自定义TreeView控件样式实现QQ联系人列表效果

    TreeView控件在项目中使用比较频繁,下面这篇文章主要给大家介绍了关于WPF自定义TreeView控件样式实现QQ联系人列表效果的相关资料,文中通过示例代码介绍...

    小明GG9172022-02-23
  • C#C# Socket的TCP通讯的实例代码

    C# Socket的TCP通讯的实例代码

    本篇文章主要介绍了C# Socket的TCP通讯,socket通讯方式有两种:同步和异步,详细的介绍了这两种方法,有兴趣的可以了解一下。...

    James-ping6622021-12-15
  • C#C#中#define后面只加一个参数的解释

    C#中#define后面只加一个参数的解释

    今天小编就为大家分享一篇关于C#中#define后面只加一个参数的解释,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随...

    passtome7922022-07-20
  • C#Unity实现枚举类型中文显示

    Unity实现枚举类型中文显示

    这篇文章主要为大家详细介绍了Unity实现枚举类型中文显示,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    被代码折磨的狗子9282022-11-02