본문 바로가기
언리얼엔진 개발/Developing

[UnrealEngine5]LineTrace로 충돌 감지하기

by yeni_0224 2023. 3. 13.
728x90
반응형

드디어 언리얼엔진 개발에 대한 게시물을 올리기 시작한다. 

정말 많이 사용하는 LineTrace에 대한 것부터 작성하기로 했다.

총을 발사했을 때 물체와 충돌이 되는지 확인하기 위해 Linetrace를 사용해줄것인데

Linetrace라고 함은 충돌을 감지하기 위한 가상의 선을 그어주는 것이다.

 

<이번 코드의 목적>

오브젝트향해 총을 발사했을 때 맞추었을 때 충돌되는지 확인하기.

단, 

총, 총알 오브젝트는 따로 만들어두지 않은 상태

현재 VR환경에서 총알을 발사하는 프로젝트를 생성한 상황이다.

/*헤더파일에 변수와 함수 선언해주기*/
    
    //인스턴스 크로스헤어
	UPROPERTY()
	AActor* CrossHair;

	UPROPERTY()
	void LinTrace();
	//시작점
	FVector startPos = RightAim->GetComponentLocation();

	//끝점
	FVector endPos = startPos + RightAim->GetForwardVector() * 10000;

	//충돌정보 저장 : LineTrace 쏴서 충돌체크 할 것이다
	FHitResult HitInfo;
	//충돌 체크
	bool bHit = HitTest(startPos, endPos, HitInfo);
	// >>충돌이 발생하면
	if (bHit)
	{
		//   >>충돌한 지점에 크로스헤어 표시
		CrossHair->SetActorLocation(HitInfo.Location);
	}
	// >>그렇지 않으면
	else 
	{
		//   >>그냥 끝점에서 크로스헤어 표시
		CrossHair->SetActorLocation(endPos);
	}

1. 시작점, 끝점의 위치에 대한 정보를 만들어준다.

2. FHitResult 자료형을 사용해 변수 HitInfo에 충돌 정보를 저장해준다.

3. 충돌했는지에 대한 여부를 변수에 담아 저장해준다.

    충돌했는지 확인하는 것은 HitTest라는 함수를 이용해준다.

4. 그 다음 충돌했을 경우, 그렇지 않을 경우를 만들어 CrossHair는 끝점에 위치하도록 한다.

 

그 다음 크로스헤어 인스턴스 객체를 생성해주었다.

이렇게 해야 엔진의 레벨에 올렸을 때 크로스헤어가 제대로 보일 수 있다.

이 작업은 BeginPlay에서 해주었다.

	//크로스헤어 인스턴스 객체 만들기
	if (CrossHairFactory)
	{
		CrossHair = GetWorld()->SpawnActor<AActor>(CrossHairFactory);
		//보이게 할지에 대한 여부 : 항상 보여줄 것이므로 이대로 마무리
		//CrossHair
	}

 

그 다음 엔진에 들어와서 BP_VRPlayer에 crosshair 연결해준다. 화면 상단의 가운데 쯤에 있는 class default 버튼 눌러주고 crosshair을 검색해주면 뜬.

크로스헤어의 고정(화면을 상하로 움직일 때 손이 이동하지 않는다. 좌우로는 된다.) 아마 에임과 손의 위치가 회전방향에 일치하며 따라가지 않는 현상인듯 하다.

손이 카메라에 일치하도록 설정해줄것인데. RightHand는 손 전체를 의미하고 RightAim은 총을 발사하는 위치를 컨트롤 하는 집게손가락을 의미한다. 앞부분에 총을 발사하는 환경에 대한 설명은 다음 게시물에 들고 올 예정이다.

 

그런 다음 라인트레이스로 충돌을 감지하는 저 함수 전체 구문을 Tick에서 호출해주도록 한다.

혹시 함수를 어떻게 호출하는지 모르는 분들을 위하여

예를 들어 위에 라인 트레이스를 구현한 전체 부분을 void LineTrace() {    } 로 이름을 지어줬다면

그냥 Tick 함수 안에서 LineTrace(); 이렇게 적어주면 된다. 

 

이렇게 하면 충돌 감지를 하는 LineTrace를 구현하는 것은 완성된 듯하다.

728x90
반응형