文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

unity怎么使用LineRenderer 动态划线

2023-06-14 12:16

关注

小编给大家分享一下unity怎么使用LineRenderer 动态划线,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

代码如下:

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做的

下面是代码

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)

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 动态划线

以上是“unity怎么使用LineRenderer 动态划线”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯