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组件,添加。

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;
    }
}

效果图:

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

(0)

相关推荐

  • Unity 通过LineRenderer绘制两点之间的直线操作

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

  • Unity 如何获取鼠标停留位置下的物体

    根据UGUI的射线检测机制获取当前鼠标下的UI: /// <summary> /// 获取鼠标停留处UI /// </summary> /// <param name="canvas"></param> /// <returns></returns> public GameObject GetOverUI(GameObject canvas) { PointerEventData pointerEventData

  • unity 实现摄像机绕某点旋转一周

    在Update函数中执行: if (turnAround) { playerCamera.RotateAround(transform.localPosition, transform.up, Time.deltaTime * rotateSpeed); degree += Time.deltaTime * rotateSpeed; if (degree >= 360) { turnAround = false; degree = 0; } } 补充:unity 摄像机围绕某个物体进行旋转放大缩

  • Unity3D实现播放gif图功能

    Unity是不识别Gif格式图的,需要我们使用c#将gif里多帧图转化为Texture2D格式.需要使用System.Drawing.dll.此dll在unity安装目录下就可以找到.由于unity没有gif格式的文件,所以我们无法在面板指定,需要动态加载.所以将gif图放在StreamingAssets文件夹下.以下为源代码: using System; using System.Collections; using System.Collections.Generic; using Syst

  • Unity之绕轴进行旋转的操作

    先上一张效果图 using UnityEngine; using System.Collections; public class TestRotateRound : MonoBehaviour { public GameObject Sphere; private float curtTime = 0.0f; void Update() { //使用C#封装好的代码RotateAround gameObject.transform.RotateAround(Sphere.transform.p

  • unity AudioSource播放完声音后要执行的函数或条件操作

    将脚本挂在要判断声音是否播放完毕的物体上 using System.Collections; using UnityEngine; using UnityEngine.Events; [RequireComponent(typeof(AudioSource))] public class AudioManager : MonoBehaviour { public static AudioManager instence = null; private AudioSource _audio; vo

  • Unity解析gif动态图操作

    工作需求,要播放一张gif图片,又不想转成视频播放,就开始研究怎样解析gif,在网上也看了不少教程,最后根据自己需求写了个脚本. 首先,Unity是不支持gif的(至少我没找到方法),而又要在NGUI中显示gif图片.所以就想到了将gif解析成序列帧再去循环播放. 有人说可以找软件解析,然后导入Unity做动画,最终我没有采用,自己再Unity中以代码解析,然后播放的. 代码如下 (在Awake中解析的,因为要在其他脚本调用,实时解析的话,到时候会花费一会时间): using System.Co

  • Unity 实现给物体替换材质球

    下面先看一下效果图 using UnityEngine; using System.Collections; public class textMesh : MonoBehaviour { public Material meshRender = null; public Renderer rend; public Texture texture; void Start () { //把名字为bangongshi4 的材质球放到Resources文件夹下 meshRender = Resourc

  • Unity3d 使用Gizmos画一个圆圈

    Gizmos是场景视图里的一个可视化调试工具. 在做项目过程中.我们常常会用到它,比如:绘制一条射线等. Unity3D 4.2版本号截至.眼下仅仅提供了绘制射线,线段,网格球体,实体球体,网格立方体,实体立方体,图标.GUI纹理,以及摄像机线框. 假设须要绘制一个圆环还须要自己写代码 using UnityEngine; using System; public class HeGizmosCircle : MonoBehaviour { public Transform m_Transfor

  • 解决unity rotate旋转物体 限制物体旋转角度的大坑

    今天可是遇到一个很简单的需求,但是却让我蛋疼了半天. 滑动屏幕控制物体旋转,但是旋转的角度要在-60到60之间. 乍一听这简直是小儿科啊. 判断一下角度不就行了.相比这四元数,欧拉角虽然有时会出现万向锁,但是简洁明了啊. 这不,我就中了一个简洁明了的大坑. 图中,如果你以为transform.eulerAngles =(-1,0,90) 那就大错特错了. 因为对于旋转来说.360度是一个循环.-1° 也可以算是就是359° 而且unity就是这样认为的.面板上虽然显示的是-1.但是他运行时是35

随机推荐