본문 바로가기
유니티 최고/유니티 구현

유니티(Unity) LineRenderer를 이용한 여러 객체 연결하기

by Lee_story_.. 2023. 5. 16.
728x90

 

LineRenderer란?

두 지점간의 라인을 그려줄때 사용하는 함수로 아래 처럼 그려 줄 수 있습니다. 

 

약간 스플라인 느낌으로 좌표상의 길을 깔아 줄 수 있게 해주는 컴포넌트입니다. 

 

 

 

컴포넌트를 보게 되면 많은 설정값들이 있는데 각각 살펴 봅시다.

먼저 윗부분은 라인의 모양등을 조절해주는 곳으로 + 버튼을 누른후 아래 그래프에서 더블클릭으로 변경 가능합니다.

 

 

 

그다음 부분 부터는 

color : 길이에 따라 선의 색상을 제어하는 ​​그라데이션을 정의합니다.

corner vertices : 모서리를 둥글게 만들기 가능

end cap verices : 끝 테두리 조절

alignment : 선이 향하는 방향 조정  >> view  카메라가 바라보는 방향!

texture mode : 텍스처 모드

shadow bias : 그림자 이팩트 조절

generate lighting data : 조명 데이터

use world space : 월드공간 좌표인지

 

Materials : 선의 머터리얼

 

lighting : 조명 세팅

probes : 빛 반사 정도 설정

additional settings : 추가 설정 >> 모션 벡터 설정, 레이어 정렬, 순서 설정, 오클루젼 설정

 

등등.....

 

Unity - Manual: Line Renderer component

Lines, trails, and billboards Line Renderer component Switch to Scripting The Line Renderer component takes an array of two or more points in 3D space, and draws a straight line between each one. You can use a Line Renderer to draw anything from a simple s

docs.unity3d.com

 

 

 

 

너무많네요.... 하지만 저희가 사용할 부분은 매우 간단합니다.


이제 구현 시작!

 

컴포넌트에서 Materials 부분만 선에 사용할 색으로 변경해줍시다. 

 

 

 

그다음 

 

코드는 단순하게 컴포넌트를 받아와서

시작 너비와 끝너비를 지정해주고 

시작 지점과 끝 지점, 2곳을 SetPosition으로 선언해주면 끝!

temp = gameobject.GetComponent<LineRenderer>();
temp.startWidth = .5f;
temp.endWidth = .5f;
....


temp.SetPosition(0, Gameobj1.GetComponent<Transform>().position);
temp.SetPosition(1, Gameobj2.GetComponent<Transform>().position);

 

 

 

 

자 이제 여러개의 위치에다 라인을 그려주고 싶으면 어떻게 해야할까요....

 

먼가 코드만 보면 아래처럼 구성하면 될것 같습니다

temp.SetPosition(0, Gameobj1.GetComponent<Transform>().position);
temp.SetPosition(1, Gameobj2.GetComponent<Transform>().position);
temp.SetPosition(2, Gameobj2.GetComponent<Transform>().position);
temp.SetPosition(3, Gameobj3.GetComponent<Transform>().position);

 

 

 

 

하지만 안되더라구요....

 

 

여기서 하나의 변수값을 변경해야 가능하다는것을 알게되었습니다.  (중요!)

lineRenderer.positionCount = (점의 갯수);

이어지는 점의 갯수를 선택하면 아래처럼 4개의 점이 연결되는 것을 볼수있습니다.

 

 

 

여기서 리스트를 활용해 본다면 아래처럼 구성하는것도 가능했습니다. 

  List<Vector3> vectorlist=new List<Vector3>();

        for(int i = 0; i < list.Length; i++)
        {

            vectorlist.Add(list[i].transform.position);

        }

        lineRenderer.positionCount = vectorlist.Count;

        lineRenderer.SetPositions(vectorlist.ToArray());  // !! 배열로 받아들이는게 가능!

 

하지만 setPosition 이란 선이 가능 길을 그려주는것으로 

한 점에서 4방향으로 그려지게끔 구성할 수 없었습니다. 

 

 

 

 

 

그래서! 약간 비효율적이지만 선을 그리고 다시 중앙으로 돌아오는 방식으로 그려 보았습니다. (아래 그림처럼)

 

 

최종 코드!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    public GameObject[] list=new GameObject[4];
    
    LineRenderer lineRenderer;
    // Start is called before the first frame update
    void Start()
    {
        lineRenderer=gameObject.GetComponent<LineRenderer>();

        
    }

    // Update is called once per frame
    void Update()
    {

        List<Vector3> vectorlist=new List<Vector3>();

        for(int i = 0; i < list.Length; i++)
        {

            vectorlist.Add(gameObject.transform.position);
            vectorlist.Add(list[i].transform.position);

        }

        lineRenderer.positionCount = vectorlist.Count;
        lineRenderer.SetPositions(vectorlist.ToArray());
       
    }
}

 

 

 

 

제 계획대로 구현 가능했습니다! 굳굳 (비효율..)

 

 

 

 

 

 

틀린점이 있다면 댓 달아주세요!

댓글