[유니티] line renderer이용해서 선 그리기

jh Seo·2024년 1월 18일
0

유니티

목록 보기
39/42

개요

커서를 움직여 선을 그리고 싶어서 line renderer에 대해 간단하게 검색해보고 적는 글이다.
https://www.youtube.com/watch?v=M4247oZ8sEI 이 유튜브를 통해 공부했다.

방법

우선 line renderer컴퍼넌트를 빈 오브젝트에게 부착한다.
그다음 새 script를 작성해야한다.

    private LineRenderer line;
    private Vector3 previousPosition;

    [SerializeField]
    private float minDistance = 0.1f;
    [SerializeField]
    private float width = 0.1f;
    private void Start()
    {
        line = GetComponent<LineRenderer>();
        line.positionCount = 1;
        line.startWidth = line.endWidth = width;
        previousPosition = transform.position;
    }

minDistance는 이전 점과 현재 점사이 거리가 멀어지면 라인을 그리게해주는 최소 거리이다.
width는 line의 너비이다.

다음은 직접 그리는 부분이다.

    private void Update()
    {
        if (Input.GetMouseButton(0))
        {
            Vector3 currentPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            currentPosition.z = 0f;

            if (Vector3.Distance(currentPosition, previousPosition) > minDistance)
            {
                //first point
                if(previousPosition == transform.position)
                {
                    line.SetPosition(0, currentPosition);
                }
                else
                { 
                    line.positionCount++;
                    line.SetPosition(line.positionCount - 1, currentPosition);
                }
                previousPosition = currentPosition;
            }
        }
    }

마우스를 누르게 되면 해당 포지션을 currentPosition에 저장한다.
그 후, previousPosition과 거리를 비교해 minDistance값보다 커지면
line.SetPosition함수를 통해 두 점 사이에 라인을 그리게된다.

의문점 및 해소

line.positionCount=1 

//first point
if(previousPosition == transform.position)
{
	line.SetPosition(0, currentPosition);
}

이 두 코드 중 하나라도 빠지면 마우스를 드래그하지도 않았는데
첫 클릭에서부터 (0,0,0)에서 그려진다.


이해가 잘 안되서 유니티 debug세팅을 통해 저장된 값들을 살펴봤다.

처음 시작할때 (0,0,0) ,(0,0,1)이 저장되어 있다.
따라서 위 두 코드를 추가하지 않으면

{ 
	line.positionCount++;
	line.SetPosition(line.positionCount - 1, currentPosition);
}

마우스를 누르자마자 이 코드가 바로 실행되고,
미리 저장된 점 두 개가 선으로 이어지며 (0,0,1)과 currentPosition이 이어져서 선이 그려지는 것이였다..

옆에서 보면 이런식으로 세 점 (0,0,0), (0,0,1), currentposition이 선으로 이어진다.

따라서 추가해줬던 두 코드는

line.positionCount=1 

positionCount를 1로 설정해서 (0,0,1)을 지워주고,

//first point
if(previousPosition == transform.position)
{
	line.SetPosition(0, currentPosition);
}

currentPosition 점의 인덱스 값을 0으로 설정해서 첫 값인 (0,0,0)을 currentPosition으로 변경한다.
line Renderer의 시작점을 설정하는 코드였다.

collider 붙여보기

게임 중에 선을 그린 후 그 위를 캐릭터가 지나다니는 게임들이 많다.
혹시 되지않을까 하고 linerenderer에 collider을 붙여보기 위해 검색해봤다.

https://forum.unity.com/threads/how-to-add-collider-to-a-line-renderer.505307/
위 포럼 질문글을 보고 실험해봤는데 된다!
linerenderer에서 제공하는 bakeMesh를 이용하는 방법이다.

테스트해보기 위해, mouse를 떼었을 때 draw스크립트 enabled를 false로 변경해줘서
더 이상 linerenderer의 setposition을 못하게 했다.

else if (Input.GetMouseButtonUp(0))
{
	this.enabled = false;
}

그 후, disable하는 부분에서 bakeMesh함수를 통해 meshcollider을 붙여줬다.

    private void OnDisable()
    {
        MeshCollider meshCollider = gameObject.AddComponent<MeshCollider>();
        Mesh mesh = new Mesh();
        line.BakeMesh(mesh, Camera.main, false);
        meshCollider.sharedMesh = mesh;
    }

마우스를 떼니 collider가 입혀져서 다른 오브젝트들이 충돌을 하였다.

생각

하지만 위 고친 점도 문제가 있으니 첫번째 문제와 똑같다.
만약 마우스를 떼고 다른 곳을 다시 클릭하면 마지막 점에서 클릭한 점으로 선이 이어진다.

따라서 다양한 그림이 필요하면
마우스를 떼었을 때, 해당 lineRenderer은 mousePosition 기록을 멈추고
다시 마우스 클릭하면 새 linerenderer가 부착된 오브젝트를 instantiate하는 식으로 구현해야 할 것 같다.

레퍼런스

https://www.youtube.com/watch?v=M4247oZ8sEI
https://forum.unity.com/threads/how-to-add-collider-to-a-line-renderer.505307/

profile
코딩 창고!

0개의 댓글