Skip to content

Instantly share code, notes, and snippets.

@hasanbayatme
Last active March 3, 2023 03:37
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hasanbayatme/5c18d3070d022834e004b2c43e77479f to your computer and use it in GitHub Desktop.
Save hasanbayatme/5c18d3070d022834e004b2c43e77479f to your computer and use it in GitHub Desktop.
Unity (Game Engine) Line Drawing with mouse using Line Renderer. Useful for painting, drawing 2d physics lines.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DrawLine2D : MonoBehaviour
{
[SerializeField]
protected LineRenderer m_LineRenderer;
[SerializeField]
protected bool m_AddCollider = false;
[SerializeField]
protected EdgeCollider2D m_EdgeCollider2D;
[SerializeField]
protected Camera m_Camera;
protected List<Vector2> m_Points;
public virtual LineRenderer lineRenderer
{
get
{
return m_LineRenderer;
}
}
public virtual bool addCollider
{
get
{
return m_AddCollider;
}
}
public virtual EdgeCollider2D edgeCollider2D
{
get
{
return m_EdgeCollider2D;
}
}
public virtual List<Vector2> points
{
get
{
return m_Points;
}
}
protected virtual void Awake ()
{
if ( m_LineRenderer == null )
{
Debug.LogWarning ( "DrawLine: Line Renderer not assigned, Adding and Using default Line Renderer." );
CreateDefaultLineRenderer ();
}
if ( m_EdgeCollider2D == null && m_AddCollider )
{
Debug.LogWarning ( "DrawLine: Edge Collider 2D not assigned, Adding and Using default Edge Collider 2D." );
CreateDefaultEdgeCollider2D ();
}
if ( m_Camera == null ) {
m_Camera = Camera.main;
}
m_Points = new List<Vector2> ();
}
protected virtual void Update ()
{
if ( Input.GetMouseButtonDown ( 0 ) )
{
Reset ();
}
if ( Input.GetMouseButton ( 0 ) )
{
Vector2 mousePosition = m_Camera.ScreenToWorldPoint ( Input.mousePosition );
if ( !m_Points.Contains ( mousePosition ) )
{
m_Points.Add ( mousePosition );
m_LineRenderer.positionCount = m_Points.Count;
m_LineRenderer.SetPosition ( m_LineRenderer.positionCount - 1, mousePosition );
if ( m_EdgeCollider2D != null && m_AddCollider && m_Points.Count > 1 )
{
m_EdgeCollider2D.points = m_Points.ToArray ();
}
}
}
}
protected virtual void Reset ()
{
if ( m_LineRenderer != null )
{
m_LineRenderer.positionCount = 0;
}
if ( m_Points != null )
{
m_Points.Clear ();
}
if ( m_EdgeCollider2D != null && m_AddCollider )
{
m_EdgeCollider2D.Reset ();
}
}
protected virtual void CreateDefaultLineRenderer ()
{
m_LineRenderer = gameObject.AddComponent<LineRenderer> ();
m_LineRenderer.positionCount = 0;
m_LineRenderer.material = new Material ( Shader.Find ( "Particles/Additive" ) );
m_LineRenderer.startColor = Color.white;
m_LineRenderer.endColor = Color.white;
m_LineRenderer.startWidth = 0.2f;
m_LineRenderer.endWidth = 0.2f;
m_LineRenderer.useWorldSpace = true;
}
protected virtual void CreateDefaultEdgeCollider2D ()
{
m_EdgeCollider2D = gameObject.AddComponent<EdgeCollider2D> ();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment