
오늘 배운 내용은 LineTracing이다.
LineTracing은 유니티의 RayCast와 같은데, 내가 지정한 방향으로 무형의 선을 쏴서 탐지하는 방법이다.

LineTracing을 하기 전에 UserInterface의 Widget을 먼저 만들었다.
Widget으로 스나이퍼의 줌 효과를 만들었는데, 검정화면에 중간에 구멍이 뚫려있고 십자선이 있는 이미지를 Widget->Canvas Panel에 이미지에 넣어서 우클릭을 할 때 마다 켜지도록 했다.
Widget을 계속 하는 오브젝트를 들고오는 방법으로 들고온다.
Widget이 켜지는게 정말 신기했는데, 그냥 클래스를 생성해서 변수에 저장해놓고 실제로 보이는 공간인 ViewPort에 넣어줬다 빼는 것으로 켜주고 꺼주는 사이클을 진행할 수 있었다.


이 기능을 응용해서 슈터 게임에서 빠지면 안되는 Crosshair도 넣을 수 있었다.

그래서. LineTracing을 어떻게 진행했냐면,
처음 FVector로 시작 지점과 끝 지점을 정해준다.

그 다음에는 hitInfo를 만들어서 함수 매개변수로 보내준다. hitInfo는 LineTracing으로 감지를 하였을 때에 감지 된 부분의 위치, 노말, 오브젝트 정보 등등을 저장하는 역할을 해준다.

그리고 카메라에서 라인을 그리는 것이기 때문에 내 캐릭터가 맞을 수도 있다. 그렇기에 충돌 옵션 설정을 해주는 FCollisionQueryParam변수를 생성해 설정 후 함수에 보내준다.
라인을 쏘는 자신이 맞으면 안되기에 자신의 클래스를 넣어주었다.

그리고 마지막으로 라인을 그린다.

라인 트레이싱도 월드 내부에서 쏘는 기능이니 GetWorld()로 월드를 받아와 함수를 써준다. 함수 내에는 지금까지 만들어 왔던것을 전부 매개변수로 보내주면 된다.
중간에 존재하는 ECC라는 이름의 값 채널값으로, 말그대로 월드에 보이는 애들에게 전부 적용시키겠다는 소리이다.
카메라의 시작지점과 방향벡터에서 거리를 곱한값을 더해주기에 카메라 위치에서 거리만큼 Line을 쏜다. 그리고 만약 무언가 걸리게 된다면 hitInfo에 데이터를 던져주어 그 위치에 총알이 맞았다!라는 느낌을 줄 수 있도록 이펙트를 실행시켜주었다.
이펙트도 오브젝트 가져오듯 가져와주고, 변수에 저장해준다.
그 후 이펙트를 월드에 생성하는 코드를 실행시켜준다.
위치를 가져와서 UGameplayStatics에 있는 함수를 실행시켜준다.(::은 정적 참조? 였던걸로 기억한다.)
결과는 이런식으로 나온다.

그리고 총을 맞은 부분으로 날려주는 것을 했다.
우선 오브젝트를 static에서 moveable로 바꿔주고 simulate physics를 참으로 바꿔주어 물리 동작이 잘 수행되도록 하였다.


hitInfo에는 많은 정보가 담겨있고, 그 안에는 Normal정보도 있다. Normal정보는 맞은 부분의 면의 수직 벡터? 라고 생각하면된다. 외부로 나오기에 맞은 부분으로 날려주려면 -1을 곱해줘서 반대로 나가게 하면된다. 그리고 AddForce를 하여 힘을 주게되면 잘 날아간다.


마지막으로 소리를 재생시키는 작업이다.
소리를 재생시키기 위해 소리 에셋을 찾아오고 변수에 저장해준다.
그 후 UGameplayStatics에 내장되어있는 소리 재생 함수에 현재 월드와 소리 에셋만 넣어주게된다면 사운드 또한 재생된다. (사운드 재생 함수는 2D와 3D가 있는데, 두 개의 차이는 위치 지정에 있다고한다.)

전체적으로 들리게 하기위해 PlaySound2D를 사용했다.
언리얼에서 LineTracing(RayCast)를 쏘는 방법
사운드를 재생하는 방법
Widget을 켰다 꺼주는 사이클을 진행하는 방법