Unity3d LineRenderer画线

LineRenderer线渲染器主要是用于在3D中渲染线段,虽然我们也可以使用GL图像库来渲染线段,但是使用LineRenderer我们可以对线段进行更多的操作,例如:设置颜色,宽度等。在这里要注意LineRenderer渲染出的线段的两个端点是3D世界中的点,即他是属于世界坐标(World Point)中的。

       LineRenderer是以组件形成存在的,首先我们新建一个空的Game Object,然后我们选择“Component→Effects→Line Renderer”,即可为其添加LineRenderer组件了。


其实我们也可以通过脚本来为其添加LineRenderer组件:

LineRenderer lineRenderer = gameObject.AddComponent<LineRenderer>();

获取LineRenderer组件:

lineRenderer = GetComponent<LineRenderer>();

【 案例】根据鼠标左击的位置,来持续绘制线段

首先我们在场景中新建一个空的 GameObject,并Reset一下。然后将Script1脚本添加给他。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
//[RequireComponent(typeof(LineRenderer))]
public class DrawLine : MonoBehaviour
{
    private LineRenderer line;
    private bool isMousePressed;
    private List<Vector3> pointsList;
    private Vector3 mousePos;
    //private Vector3 m_DownCamPos;
    //private Vector3 m_mouseDownStartPos;
    //主相机节点下
    // Structure for line points
    struct myLine
    {
        public Vector3 StartPoint;
        public Vector3 EndPoint;
    };
    //	-----------------------------------	
    void Awake() {
        _Init();
    }

    private void _Init() {
        if (m_init) return;
        m_init = true;
        // Create line renderer component and set its property
        //line = this.GetComponent<LineRenderer>();
        line = gameObject.AddComponent<LineRenderer>();
        line.material = new Material(Shader.Find("Particles/Additive"));
        line.SetVertexCount(0);
        line.SetWidth(0.1f, 0.1f);
        line.SetColors(Color.green, Color.green);
        line.useWorldSpace = true;

        isMousePressed = false;
        pointsList = new List<Vector3>();
        line.sortingLayerName = "Ignore Raycast";
        line.sortingOrder = 999;
        //		renderer.material.SetTextureOffset(
        //m_mainCam = this.GetComponent<Camera>();
    }
    bool m_init = false;
    //Camera m_mainCam;
    //	-----------------------------------	
    void Update() {
        // If mouse button down, remove old line and set its color to green
        if (Input.GetMouseButtonDown(1)) {
            isMousePressed = true;
            line.SetVertexCount(0);
            pointsList.RemoveRange(0, pointsList.Count);
            line.SetColors(Color.green, Color.green);
            //m_DownCamPos = Camera.main.transform.position;
            //m_mouseDownStartPos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane + 1f)); 

        }
        else if (Input.GetMouseButtonUp(1)) {
            isMousePressed = false;
        }
        
        //if (Input.GetMouseButton(0) || Input.GetMouseButton(1) || Input.GetMouseButton(2)) {
        //    Vector3 crelpos = Camera.main.transform.position;
        //    for (int i = 0; i < pointsList.Count; i++) {
        //        line.SetPosition(i, crelpos + pointsList[i]);
        //        //line.SetPosition(pointsList.Count - 1, (Vector3)pointsList[pointsList.Count - 1]);
        //    }
        //}
        // Drawing line when mouse is moving(presses)
        if (isMousePressed) {
            Vector3 crelpos = Camera.main.transform.position;
            //将鼠标点击的屏幕坐标转换为世界坐标,然后存储到position中
            mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane + 1f));
            Vector3 offsetpos = mousePos - crelpos;
            //Vector3 hitp = Vector3.zero;
            //bool ok = GetRayCastZero2DPlanePoint(Camera.main, Camera.main.transform.TransformPoint(0f, 0f, Camera.main.nearClipPlane + 1f).z, out hitp);
            //mousePos = hitp;
            if (!pointsList.Contains(offsetpos)) {
                pointsList.Add(offsetpos);
                line.SetVertexCount(pointsList.Count);
               
                for (int i = 0; i < pointsList.Count; i++) {
                    line.SetPosition(i, crelpos + pointsList[i]);
                    //line.SetPosition(pointsList.Count - 1, (Vector3)pointsList[pointsList.Count - 1]);
                }
                if (isLineCollide()) {
                    isMousePressed = false;
                    line.SetColors(Color.red, Color.red);
                }
            }
        }
    }
    
    //	-----------------------------------	
    //  Following method checks is currentLine(line drawn by last two points) collided with line 
    //	-----------------------------------	
    private bool isLineCollide() {
        if (pointsList.Count < 2)
            return false;
        int TotalLines = pointsList.Count - 1;
        myLine[] lines = new myLine[TotalLines];
        if (TotalLines > 1) {
            for (int i = 0; i < TotalLines; i++) {
                lines[i].StartPoint = (Vector3)pointsList[i];
                lines[i].EndPoint = (Vector3)pointsList[i + 1];
            }
        }
        for (int i = 0; i < TotalLines - 1; i++) {
            myLine currentLine;
            currentLine.StartPoint = (Vector3)pointsList[pointsList.Count - 2];
            currentLine.EndPoint = (Vector3)pointsList[pointsList.Count - 1];
            if (isLinesIntersect(lines[i], currentLine))
                return true;
        }
        return false;
    }
    //	-----------------------------------	
    //	Following method checks whether given two points are same or not
    //	-----------------------------------	
    private bool checkPoints(Vector3 pointA, Vector3 pointB) {
        return (pointA.x == pointB.x && pointA.y == pointB.y);
    }
    //	-----------------------------------	
    //	Following method checks whether given two line intersect or not
    //	-----------------------------------	
    private bool isLinesIntersect(myLine L1, myLine L2) {
        if (checkPoints(L1.StartPoint, L2.StartPoint) ||
            checkPoints(L1.StartPoint, L2.EndPoint) ||
            checkPoints(L1.EndPoint, L2.StartPoint) ||
            checkPoints(L1.EndPoint, L2.EndPoint))
            return false;

        return ((Mathf.Max(L1.StartPoint.x, L1.EndPoint.x) >= Mathf.Min(L2.StartPoint.x, L2.EndPoint.x)) &&
               (Mathf.Max(L2.StartPoint.x, L2.EndPoint.x) >= Mathf.Min(L1.StartPoint.x, L1.EndPoint.x)) &&
               (Mathf.Max(L1.StartPoint.y, L1.EndPoint.y) >= Mathf.Min(L2.StartPoint.y, L2.EndPoint.y)) &&
               (Mathf.Max(L2.StartPoint.y, L2.EndPoint.y) >= Mathf.Min(L1.StartPoint.y, L1.EndPoint.y))
               );
    }
}




  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rains卍Soft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值