CMZTECH.NET
  • Blog
  • Graphics
  • Virtual Reality
  • 3D Printing
  • Fun Stuff
  • Contact

How to draw lines in Unity

5/14/2016

0 Comments

 
There are a couple of wrinkles to rending lines in Unity depending on what you are trying to do.  Line rendering is achieved with the LineRenderer.  A Game Object can only have a single LineRenderer attached so you need to create a new GameObject for each LineRenderer.  If you need to dynamically create and destroy lines you'll need to keep track of them in a list.

 //have to add a new game object per line renderer
 LineRenderer lineRenderer = new GameObject().AddComponent<LineRenderer>();


The other issue is that if your lines are using a shader that isn't referenced anywhere else in your scene, the Unity Editor won't include them in your package and the lines won't render in a build project although they will work in the editor.

 // force the shader to be copied into the resource folder using
// Edit->ProjectSettings->Graphics->Always Included Shaders 
Material whiteDiffuseMat = new Material(Shader.Find("Unlit/Color")); 
lineRenderer.material = whiteDiffuseMat;


Not completely horrible but still, hoops to be jumped through...

using UnityEngine;
using System.Collections;

public class basicRender : MonoBehaviour {
    
    void RenderCircle(Vector3 pos, float rad, Color col)
    {
        float angle = 0.0f;
        int segments = 128;
    
        //have to add a new game object per line renderer
        LineRenderer lineRenderer = new GameObject().AddComponent<LineRenderer>();

        // force the shader to be copied into the resource folder using Edit->ProjectSettings->Graphics->Always Included Shaders 
        Material whiteDiffuseMat = new Material(Shader.Find("Unlit/Color")); 
        lineRenderer.material = whiteDiffuseMat;

        lineRenderer.SetColors(new Color(1.0f,1.0f,1.0f,1.0f), new Color(1.0f,1.0f,1.0f,1.0f));
        lineRenderer.SetWidth(0.02F, 0.02F);
        lineRenderer.SetVertexCount(1+segments);

        for (int i = 0; i < (segments + 1); i++)
        {
            Vector3 p = new Vector3();
            p.x = pos.x + (Mathf.Sin (Mathf.Deg2Rad * angle)*rad);
            p.y = pos.y + (Mathf.Cos (Mathf.Deg2Rad * angle)*rad);
            p.z = pos.z;
            lineRenderer.SetPosition (i,p);
            angle += (360.0f / segments);
        }
    }

    // Use this for initialization
    void Start () 
    {
        float r = 0.6f;

        for (int i = 0; i<20; i++) 
        {
            RenderCircle(new Vector3(0.0f,0.0f,0.0f),r,new Color(1.0f,1.0f,1.0f,1.0f));
            r+=0.6f;
        }
   }
    
    // Update is called once per frame
    void Update () 
    {
    if (Input.GetKeyDown(KeyCode.Escape)) Application.Quit();
    }


    private void OnDestroy()
    {
        Destroy(this.GetComponent<Renderer>().material);
    }
}




0 Comments



Leave a Reply.

    David Coombes

    Making stuff

    Categories

    All
    3D Graphics
    3D Printing
    3D Scanning
    AI
    Blender
    Cycling
    Development
    Environment
    Futurism

    Archives

    February 2023
    November 2022
    April 2022
    February 2022
    January 2022
    February 2021
    January 2021
    November 2020
    May 2020
    April 2020
    March 2020
    February 2020
    December 2019
    November 2019
    September 2019
    August 2019
    July 2019
    January 2019
    December 2018
    October 2018
    August 2018
    June 2018
    April 2018
    March 2018
    February 2018
    January 2018
    July 2017
    June 2017
    May 2017
    April 2017
    March 2017
    January 2017
    September 2016
    August 2016
    July 2016
    May 2016
    April 2016
    March 2016
    December 2015
    November 2015
    August 2015
    July 2015
    June 2015
    April 2015
    March 2015
    February 2015
    January 2015
    December 2014
    November 2014
    October 2014

    RSS Feed