초보 코린이의 성장 일지

UE4 파쿠르 객체, 범위 판단 본문

언리얼

UE4 파쿠르 객체, 범위 판단

코오린이 2023. 2. 10. 15:38

파쿠르가 특정한 객체들만 판단해야 하고, 지형 지물에 따라 판단 조건이 까다로워서 예외나 계산할게 너무 많다

 

1. 프로젝트 세팅 -> 콜리전으로 들어오면 채널을 지정해 주는 창이 있다. 설정해 줄게 있다.

2. 겹침과 블럭을 둘다 사용해야하는 경우가 있다면 오브젝트 유형에 나누고

3. 선이나 박스들은 위에 트레이스 유형에 정리한다고 생각하면 된다.

1. Trace 채널을 Parkour로 등록해주고, 기본 반응은 Ignore로 설정해준다.

2. 이제 검출할 객체를 선택해주기 위한 Profile를 만들어 준다. 이름은 Parkour_Profile로 해주고, 콜리전 설정은 Collsion Enabled로 선택해준다.

3. Line나 Trace는 기본 연산이 블록으로 되어있다. 그래서 Parkour 일때만은 블록으로 처리해준다.

1. 타고 올라갈 객체를 클릭해서 콜리전 설정란으로 가서 방금 만들어준 Parkour_Profile를 선택해준다.

2. 그럼 위에 설명대로 추적을 시작할때 정해진 객체만을 가리키게 된다.

 

1. Player로 가서 만들어 놓은 Component를 추가해준다.

 

우선 사용할 함수, 변수들을 선언해 놓았다.

 

Line Trace 앞 부분
Line Trace 뒷 부분

1. 받아 놓은 Arrow Component를 가져다가 임시변수 Arrow에 저장해 놓는다.

2. 유형은 Linear Color로 로컬변수 Color을 가져와서 색을 나눠준다.

3. Center를 먼저 체크해주고, 나머지를 체크해 줄 것이기 때문에, 이제 Arrow에서 선을 일직선으로 쏴 확인을 해야하므로 Start로 저장해준다. 왜냐면 몸쪽에서 화살표 방향이 진행되기 때문

4. 전방으로 선을 쏘기 때문에 그 쏘는 객체는 화살표로 해도되고, Character로 선택해줘도 된다. 

5. 얼마만큼 거리에서 보낼거냐를 판단해야 하므로, Trace 객체에 거리와 곱하기를 해서 End로 보내준다.

6. 자신의 Character는 체크 못하도록 배열로 제거, Draw Debug Type는 만들어놓은 열거형을 넣어준다. 

7. Hit Result를 통해 해당 위치를 체크해준다. 그 체크해서 넣어 줄 위치는 Parkour Arrow Type가 된다. 그러면서 충돌 결과를 해당 배열에 넣어주게 된다. 이제 해당 각각 화살표마다 해당 결과가 들어가는걸 알 수 있다.

 

GetHitResultByArrowType

1. 1:1로 매칭 시켜서 저장해 놨기 때문에 Hit Result로 배열을 받아준다.

2. 그리고 결과를 리턴해준다.

 

CheckTrace_Center 시퀀스 1

1. 처음에는 Center부터 체크해 줄 것이다. 그리고 나머지를 체크 할 것

2. 리턴함수 ResultByArrowType를 사용해서 Center 결과를 받아준다. 그렇게 되면 결과값이 나올텐데 break로 연결해준다. true면 나머지들을 체크할 것이고, false면 체크를 할 필요가 없기 때문

3. Location은 충돌체가 아닌 충돌한 삼각형(Mesh)의 위치이고, Import가 충돌체를 나타낸다 Import가 붙으면 충돌체라고 생각하면 된다. 그리고 연결해준다.

4. Distance를 연결해주면, 충돌된 거리가 나온다.

5. Impact Normal에 -1을 곱해준다. 그중에 Yaw값만 사용할 것이다.

6. Max, Min으로 핀분활을해서 각 축마다 둘을 빼주면 각 축에대한 부피가 나오게된다. 음수가 나오면 안되므로, 절대값을 취해준다. 그리고 그값이 Extrnt로 들어간다.

 

Impact Noraml을 쓰는 이유는, 위에서 물체를 봤을때 사각형이라면, 모든 면 밖으로 화살표가 나갈 것이다.

그 방향을 보기위한 Yaw값을 판단하기 위해 사용한다.

또한 캐릭터가 비스듬히 Hit될 객체를 바라보고, 그 객체는 직선으로 바라보고 있다면, 그 사이값을 구해서 판단해줘야 한다. 그래서 절대값으로 음수가 발생하지 않도록 막아준다.

 

이벤트그래프 Tick 부

1. HitObstacle가 Center에 충돌했으면, Null이 아닐것이고 충돌안했으면 Null일 것이라 검증된 Get으로 판단을 먼저 해준다.

2. 각 만들어 놓은 위치에 화살표들을 Trace해준다. 이 충돌된 값들은 함수 Line Trace에 저장된다.

 

 

이제 지정된 객체를 바라봤을때 Center이 닿는순간 다른 부위도 판단하면서 선이 보인다.

 

DoParkour

1. 현재 값이 Max랑 같다는것은 아무것도 선택되지 않아 수행되지 않고 있다는 뜻이다. 파쿠르가 만약 수행중이면 타이빙 들어가게 될것이다.

2. 그리고 파쿠르를 실행하는 조건은 Idle 모드여야만 가능하다.

3. 파쿠루를 수행 할 수 있는 상태인지 체크를 해줄 것이다. 그 함수가 CheckDoParkour 리턴함수가 될 것이다.

 

Check_DoParkour 앞 부분
Check_DoParkour 뒷 부분

1. Center, Left, Right 각 결과들을 가져와서 전달해준다.

2. Center 기준으로 Impact Point, Impact Normal을 저장해준다.

3. 모드 조건 체크에는 일단 Blocking는 되여야 한다. 또 한 왼쪽, 센터, 오른쪽이 정확하게 닿아야 결국 파쿠르를 실행할 수 있는 조건이 될 수 있으므로, and로 엮어준다.

4. 세면의 표면 노말이 같아야하는 이유는, 모서리 위치나 너무 높은 곳이나 너무 먼 곳 등등 많은 경우에 수를 판단하기 위해서 

5.  회전값 중 Yaw만 사용 이유는 사이에 있는 각을 구해서 판단할 수 있어야 하기 때문

6. 음수를 판단하지 않기 위해 절대값을 취해준다. 각 차이를 비교하기 위해 - 를 해주고 또 음수가 발생할 수 있으므로, 절대값을 취해준다. 

7. 지정한 각 내에 있을때만 파쿠르를 할 수 있게 해준다. 각도가 너무 틀어져있으면, 이상하게 동작할 수 있기 때문에, 더군다나 위에서 설명한대로 각을 판단할때도 중요한 요소가 될 수 있기 때문, 만약 동작이 되더라도 너무 이상하게 억지로 되는것도 방지해주고자 한 것이다.

 

 

BP_Player 이벤트그래프

1. 조건으로 값 출력을 위해서 Bow Mode로 조건 판단해서 연결해준다.

 

 

https://www.youtube.com/watch?v=ma-VNCVVaaM 

 

- 파쿠르할 수 있는 객체가 아니면, 오른쪽 마우스를 눌러도 값 표시가 안보인다.

- 파쿠르가 가능한 곳이라면, 값이 표시되고 모서리는 판단을 하지 않는다.

Comments