본문 바로가기

Unity3D/Linecast & LineRenderer

Unity 3D Linecast & LineRenderer

유니티 3D에서 Linecast() 함수와 LineRenderer 콤포넌트를 이용하여 레이저빔 만들기


레이저 빔을 발사하는 장치에서 목표물이 가시적으로 보일 경우에는 목표물을 향하여 레이저 빔을 발사하고 목표물이 장벽 뒤로 숨어서 레이저 빔 장치에서 보이지 않을 경우에는 레이저 빔을 발사하지 않도록 다음과 같은 장면을 구현해 보려고 한다




유니티 문서를 참조하면 다음과 같은 설명을 볼 수 있다

Physics.Linecast

static function Linecast(start: Vector3, end: Vector3, hitInfo: RaycastHit, layerMask: int = DefaultRaycastLayers): bool;


start 와 end 사이에 보이지 않는 직선을 그을 때 직선과 교차하는 Collider 가 있을 경우 true 를 리턴한다.

직선이 다른 오브젝트의 Collider 와 교차하면 hitInfo 에는 교차된 오브젝트의 정보가 저장된다

Linecast() 함수는 선을 그려주는 기능을 하는 것이 아니라 보이지 않는 가상의 선상에 다른 오브젝트가 교차하는지 판별할 때 사용된다


var target : Transform;

function Update () {

if (!Physics.Linecast (transform.position, target.position)) {

ProcessData.AndDoSomeCalculations();

}

}


LineRenderer

3D 공간에 선을 그릴 때 사용된다

LineRenderer 가 그리는 선은 평면이기 때문에 폭과 색상을 지정해 주어야 한다

또한 3D 공간에 선을 그리려면 최소한 두점을 나타내는 2개의 Vector3 객체가 필요하다


LineRenderer 를 사용할 때는 스크립트 만으로도 가능하고, 유니티 에디터에서 Component > Effects > Line Renderer 항목을 선택하여 특정 게임 오브젝트에 포함시킬 수도 있다. 여기서는 스크립트 안에서 LineRenderer 를 추가하고 사용하는 방법을 사용할 것이다


Transform.LookAt(target:Transform)

스크립트가 포함된 오브젝트의 전방벡터를 지정한 target 오브젝트를 향하여 회전하게 된다. 결과적으로 현재의 오브젝트는 target 오브젝트를 정면으로 향하도록 회전한다. 현재 오브젝트가 카메라 오브젝트라면 카메라는 target  오브젝트를 향하여 정면으로 회전하여 target 오브젝트가 화면의 중앙으로 오도록 조정된다. 또한 현재 오브젝트가 카메라가 아니라 할지라도 현재 오브젝트의 정면이 target 오브젝트를 향하도록 회전하게 된다



다음과 같은 스크립트를 작성하고 Hierarchy 뷰의 Laser 오브젝트로 드래그하여 넣는다

#pragma strict


var red :Color = Color.red;

var yellow:Color = Color.yellow;


var target:GameObject;


function Start() {

var lineRenderer : LineRenderer = gameObject.AddComponent(LineRenderer);

lineRenderer.SetColors(red, yellow);

lineRenderer.SetWidth(0.1, 0.1);

}

function Update() {

var hit:RaycastHit;

if(Physics.Linecast(transform.position, target.transform.position, hit)){


var lineRenderer : LineRenderer = GetComponent(LineRenderer);

if(hit.transform.name=='Target'){

transform.LookAt(target.transform); // 레이저 장치가 목표물을 정면으로 향하도록 회전한다

                        //레이저장치에서 목표물까지 선을 그린다 (레이저빔을 발사한다)

lineRenderer.enabled = true;

lineRenderer.SetPosition(0, transform.position);

lineRenderer.SetPosition(1, target.transform.position);

}else{

lineRenderer.enabled = false;

}

}

}





Play 모드에서 Game 뷰가 아니라 Scene 뷰 탭을 누르면 Target의 위치를 마우스로 드래그하여 Target의 위치를 변경하면서 테스트할 수 있다

아래의 그림과 같이 Scene 뷰의 우측 아래에 있는 Target 오브젝트가 장벽 뒷쪽에 있기 때문에 레이저 장치로 부터 보이지 않으므로 현재 레이저빔이 발사되지 않고 있는 상태이다




위의 상태에서 Target 오브젝트를 마우스로 드래그하여 좌우 방향으로 이동하면 레이저 장치로부터 보이는 상태가 되므로 레이저 빔이 발사된다

아래 그림은 Target 오브젝트가 장벽의 왼쪽으로 이동하여 레이저 장치로부터 보이는 상태가 되어서 레이저 빔이 발사되는 것을 볼 수 있다




아래 그림은 Target 오브젝트가 장벽의 오른쪽으로 이동하여 레이저 장치로부터 보이는 상태가 되어서 레이저 빔이 발사되는 것을 볼 수 있다




아래 그림은 Target 오브젝트가 장벽의 윗쪽으로 이동하여 레이저 장치로부터 보이는 상태가 되어서 레이저 빔이 발사되는 것을 볼 수 있다