초보 코린이의 성장 일지

UE4 텔레포트 기술 추가 - (Warp) 본문

언리얼

UE4 텔레포트 기술 추가 - (Warp)

코오린이 2023. 1. 26. 16:14

ABP_Player로 가서 미리 애니메이션을 추가해 주고 진행할 것이다. 스테이트 머신과 포즈 추가

 

필요한 애니메이션 몽타주를 생성해 준다. 엑셀표에 넣어줘야 하기 때문이다

FullBody로 바꿔주고, 시작지점과 끝지점 설정 그리고 임팩트를 넣어줄 파티클 하나를 노티파이 추가해주고 넣어준다.

파티클은 P_Cube_Mesh_Test로 설정, Attached는 체크안해주면 안나온다.

 

Warp는 Weapon_Combo를 상속 받는게 아니다 휘두르는 무기가 아닌 스킬같은 것으로 Weapon으로부터 직접 상속을 받아서 진행할 것이다.

 

엑셀가져와서 이름만 바꿔서 수정해 준다. 

 

DT_Equip_Warp
DT_DoAction_Warp

안에 값 수정, 1번만 사용할 것이므로 다 지워주고 몽타주만 레퍼런스 복사 후 넣어준다.

Weapon_Warp를 만들어 주고 임포트한 데이터들을 알맞게 설정해준다.

 

무기를 관리해주는 Weapon_Component로 가서 함수 똑같이 추가해주고 모드 설정해준다.

 

설정이 끝났으니 입력을 받기위해 플레이어로 돌아가 노드 연결, 4번을 Warp로 사용

 

이제는 워프가 순간이동을 할 지점을 나타나게끔 만들어 볼 것이다.

 

사용할 머터리얼인데 이런 모양이 나온다. 알맞은 크기로 설정하고 마우스 위치에 따라 나오게끔 구현할 것이다.

위에 머터리얼에 오른쪽 클릭 후 인스턴스 생성

다시 워프로 돌아와서

컴포넌트로 Decal을 추가해 주고 Y축 회전 90 및 데칼 크기를 설정해준다. 또한 머터리얼 인스턴스 만든거 선택

 

우선 이 상태로 실행해보면 캐릭터 아래에 설정한 데칼이 등장한다.

 

우선 시작하면 오버라이딩을 했기 때문 부모를 호출해주고 만든 데칼을 Set Visibility로 숨겨주고 시작한다.

Unequip일때도 숨겨줘야 하기 때문에 똑같이 연결해준다.

Equip(장착) 중 일때는 보여줘야하기 때문에 체크 해준다.


1. 투영공간이란 이론을 이해하고 넘어가야 마우스 커서에 따른 이동을 쉽게 이해 할 수 있다.

2. 월드공간에 무언가를 담고 이동, 회전, 늘리고 줄이고 하게되는데 이 공간을 어찌보면 직육면체라 비교해서 볼 수 있다. 

3. 피라미드를 위에서 보면 옆에서 보는 모습이 아닌 작은 네모가 앞에 보이고 큰 네모가 뒤에 보인다. 이걸 원근감이라 말한다. 원근이 존재하지 않는다면 모든게 수직선상(Orthographic)에 같이 올라와 보이게 된다. 앞에 보이는것은 크고 뒤에 보이는것은 작게 보여야(Perspective) 정상적인 시야임을 우리는 알 수 있다.

4. 뷰포트는 3D에서 2D로 거처서 ndc 공간으로 나오게 된다. 화면의 크기가 다르듯이 뷰포트 공간도 다르다 그래서 그걸 

-1 ~ +1 까지 숫자로 공간을 나타낸다. ndc로 나온것을 빽버퍼에 얼마만큼 매치를 시킬것인지(늘릴지, 줄일지) 또는 어디에서부터 보여줄지 또한 결정해준다.

5. 뷰포트는 2D임에도 깊이를 나타낸다 그 이유는 누구를 가려줄 것인지 파악해야 하기 때문이다. 그리고 x, y, z축 중에 z축은 -1이 존재하지 않는다 왜냐 뒤는 그릴 필요가 없기 때문에 -1은 필요가 없다. 그래서 0과 1만 존재한다.

6. 3D -> 2D로 가는걸 Projection이라 부르고 2D -> 3D로 가는걸 UnProjection이라 부른다.

7. 마우스 커서도 동일하다 화면에서 2D 마우스 위치를 3D로 바꾸는 직선이 멀리있는 방향으로 쐈을때 삼각형으로된 물체가 걸리면 그 물체는 선택된걸로 판단한다.


플레이어 쪽에서 Controller을 관리하기 때문에 변수선언 변수 유형은 이름과 동일하다 

Location은 변수유형 vector로 선언해준다

캐릭터를 가져다가 컨트롤러가 있는지 확인해주고 가져온다. 그리고 플레이어 컨트롤러로 형변환이 됐다면 셋팅을 해주고 변환이 안됐다면 Null이 들어가면서 플레이어가 아닌 누군가가 된다는것을 알 수 있다.

함수를 선언해주고 출력에 3가지 파라미터를 추가해준다.

함수로 들어와서 플레이어(소유주가 플레이어일때) 컨트롤러가 있으면  Get Hit Result Under Cursor by Channel로 지정한다 이유는 보이는것은 전부 추적할거기 때문이다. 또 한 2D공간을 3D로 변환된 Hit된 위치를 리턴해준다.

유효하지 않다면 return으로 끝내준다.

break로 노드를 연결해주고 Hit 되었을때 if로 넘어간다 안됐으면 할 필요가 없다

Location은 Mesh에 위치를 가져와주고 Inpact Point는 충돌체를 가져올 것이다.

충돌체 노드를 연결하면 RotationFromXVector이 나오게되는데 이게 중요하다. 왜냐 회전값을 구해야하고 어떤 축이 0값이 나오는지를 알아야 하기 때문.

OutHit =  히트가 되었다는 뜻

Tick이벤트로 위에서 2D에서 3D로 잘 변환이 되었는지 확인하기 위해 In Equip으로 장착되었을때 and로 엮어서 조건문에 넣어준다. true일때는 Decal을 가져다 숨겨져 있었다면 보이도록 Set Visibility을 체크해준다.

false일때는 플레이어가 아닐때를 나타내므로 체크해제해 줘서 커서를 숨겨준다.

그다음 Decal의 위치를 만들어준 함수 SetWorldLocationAndRotation 통해 옮겨준다.

잘 되었는지 위치값, 회전값 OutLocation, OutRotation을 가져와서 연결해준다.

이제 마우스 커서 위치에 따라 지정된 임팩트가 나오면서 보이게된다. 이제는 클릭을 했을때 이동이 되도록 만들어 볼 것이다.

 

이제 같은 위치에서 함수 오버라이딩을 2개한다.

 

DoAction

우선 Do Action Datas로 액션 데이터가 있는지 확인한다.

크기가 0보다 커야하므로 length로 연결해서 확인해준다.

그리고 동작이 State Idle Mode여야 실행할 수 있게된다.

이 모든게 성공했다면 State로 Action Mode를 실행해준다.

일단은 만든 몽타주가 실행되야한다.

 

DoAction 뒷부분

이제 이동해야한다. 최초 시작할때 위치를 기록해준다 그래서 다시한번 위치를 구해준다.

OutHit가 true일때 Location으로 위치를 구한다.

이동할 방향으로 회전시키고 몽타주를 실행시킬 것이다.

캐릭터 위치랑 GetActorLocation으로 연결, 이동하려는 위치를 Find Look at Rotation으로 연결해주고 축값은 Make Rotation에 연결해주면서 z축만 가지고 간다.

그다음 캐릭터를 가져다가 SetActorRotation으로 회전시켜준다.

 

Begin Do Action

이제 캐릭터와 위치를 받아서 움직여준다.

 

 

https://www.youtube.com/watch?v=GINKCea3aNQ 

 

- 버그가 발생할때가 있다

- 수정해야한다.

Comments