Wednesday, 15 April 2020

Unity C# Creating dynamic lines using Line render

using System.Collections.Generic;
using UnityEngine;

//[RequireComponent(typeof(LineRenderer))]
public class LineRendererTest : MonoBehaviour
{
    List<Vector3> linePoints = new List<Vector3>();
    LineRenderer lineRenderer;
    public float startWidth = 1.0f;
    public float endWidth = 1.0f;
    public float threshold = 0.001f;
     public Camera thisCamera;
    int lineCount = 0;

    public GameObject linePrefab;
    public bool buttonPressed;
    public List<Vector3> mousePosArray;

    Vector3 lastPos = Vector3.one * float.MaxValue;


    void Awake()
    {
        thisCamera = Camera.main;
    }
    private void Start()
    {

    }
    void Update()
    {
       
        if (Input.GetMouseButton(0))
        {
            if(!buttonPressed)
            {
                linePoints.Clear();
                lineCount = 0;
                buttonPressed = true;
                CreateLine();
            }
        }
        if (Input.GetMouseButton(0))
        {
            UpdateLine();

        }
        if (Input.GetMouseButtonUp(0))
        {
         
            linePoints.Clear();
            lineCount = 0;
            buttonPressed = false;
        }
     
    }

    void CreateLine()
    {
       
        GameObject newLine = Instantiate(linePrefab, Input.mousePosition, Quaternion.identity);
        lineRenderer = newLine.GetComponent<LineRenderer>();

        Vector3 mousePos = Input.mousePosition;
        mousePos.z = thisCamera.nearClipPlane;
        Vector3 mouseWorld = thisCamera.ScreenToWorldPoint(mousePos);

        float dist = Vector3.Distance(lastPos, mouseWorld);
        if (dist <= threshold)
            return;

        lastPos = mouseWorld;
    }

    void UpdateLine()
    {
       
        Vector3 mousePos = Input.mousePosition;
        mousePos.z = thisCamera.nearClipPlane;
        Vector3 mouseWorld = thisCamera.ScreenToWorldPoint(mousePos);

        float dist = Vector3.Distance(lastPos, mouseWorld);
        if (dist <= threshold)
            return;

        lastPos = mouseWorld;
        if (linePoints == null)
            linePoints = new List<Vector3>();
        linePoints.Add(mouseWorld);

        lineRenderer.SetWidth(startWidth, endWidth);
        lineRenderer.SetVertexCount(linePoints.Count);

        for (int i = lineCount; i < linePoints.Count; i++)
        {
            lineRenderer.SetPosition(i, linePoints[i]);
        }
        lineCount++;
    }
}

No comments:

Post a Comment