Prologue

이 글은 LineRenderer Component 를 사용하여 Unity(C#) 화면에 선을 그리는 방법에 대한 흥미로운 내용을 담고 있습니다.


Unity Documentation 는 here 에서 아주 명확한 방법으로 그것을 설명하기 위하여 작성되어 있습니다.

그러나 실행 시 사용되는 스크립트, 즉 예제를 추가하는 방법에는 어떤 정보가 없습니다.


기본적인 이해를 돕기 위해 이 곳에 예제를 작성해봅니다.


First Time

새로운 C# script 을 Main Camera에 추가합니다. 추가한 script 를 열고 밑에 있는 코드를 적습니다. :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using UnityEngine;
using System.Collections;
 
public class DrawLineTest : MonoBehaviour {
    private LineRenderer line;
    private Vector3 mousePos;
    private Vector3 startPos;
    private Vector3 endPos;
 
    // Update is called once per frame
    void Update ()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (line == null)
                createLine();
            mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            mousePos.z = 0;
            line.SetPosition(0, mousePos);
            line.SetPosition(1, mousePos);
            startPos = mousePos;
        }
        else if (Input.GetMouseButtonUp(0) && line)
        {
            if (line)
            {
                mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                mousePos.z = 0;
                line.SetPosition(1, mousePos);
                endPos = mousePos;
                addColliderToLine();
                line = null;
            }
        }
        else if (Input.GetMouseButton(0))
        {
            if (line)
            {
                mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                mousePos.z = 0;
                line.SetPosition(1, mousePos);
            }
        }
    }
    // Following method creates line runtime using Line Renderer component
    private void createLine()
    {
        line = new GameObject("Line").AddComponent<LineRenderer>();
        line.material = new Material(Shader.Find("Diffuse"));
        line.SetVertexCount(2);
        line.SetWidth(0.1f, 0.1f);
        line.SetColors(Color.black, Color.black);
        line.useWorldSpace = true;
    }
    // Following method adds collider to created line
    private void addColliderToLine()
    {
        BoxCollider col = new GameObject("Collider").AddComponent<BoxCollider>();
        col.transform.parent = line.transform; //Collider is added as child object of line
        float lineLength = Vector3.Distance(startPos, endPos); //length of line
        // size of collider is set where X is length of line, Y is width of line, Z will be set as per requirement
        col.size = new Vector3(lineLength, 0.1f, 1f);
        Vector3 midPoint = (startPos + endPos) / 2;
        col.transform.position = midPoint; // setting position of collider object
        // Following lines calculate the angle between start Pos and endPos
        float angle = (Mathf.Abs(startPos.y - endPos.y) / Mathf.Abs(startPos.x - endPos.x));
        if ((startPos.y < endPos.y && startPos.x > endPos.x) || (endPos.y < startPos.y && endPos.x > startPos.x))
        {
            angle *= -1;
        }
 
        if (angle != angle) // check NaN        
        {
            Destroy(line.gameObject); // NaN? Destroy gameObject
        }
        else // Not NaN
        {
            angle = Mathf.Rad2Deg * Mathf.Atan(angle);
            col.transform.Rotate(00, angle);
        }    
    }
}
cs


script 를 저장한 후 Unity 로 돌아갑니다.


인제 Scene 을 실행을 하면 화면에 아무것도 없는 것을 보고 실망을 했을 수 있습니다.

하지만 당신은 이미 Line 을 만들 수 있습니다!


화면에서 오른쪽 버튼을 누른 채 드래그를 하면 Line 이 생성되는 것을 볼 수 있습니다.


감사합니다~

'Programming > Unity3D' 카테고리의 다른 글

AssetBundle 관련 정리  (0) 2020.04.23
[Unity3d] 경로 보여주는 툴  (0) 2019.11.15
UForm (Unity3D + WinForm) 에 대한 고찰...  (0) 2015.07.27
AssetBundle 관하여... #1  (0) 2015.07.23
Unity + WinForm 을 구현해보자! 2편  (1) 2015.07.20
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기