초보 코린이의 성장 일지

UE4 커브 지정 IK 실행, Particle 설명 및 Targeting 본문

언리얼

UE4 커브 지정 IK 실행, Particle 설명 및 Targeting

코오린이 2023. 2. 7. 12:51

Particle 설정에 대해 조금 알아보고 넘어갈 것이다.

 

6가지 카테고리처럼 나눠져있는게 각 효과를 표현한 것이다.

디자인 영역이지만 프로그래밍에 있어서 간단한것은 수정 할 수도 있어야하기 때문에 어느정도 살펴볼 것이다.

수정을 할때는 각 카테고리 기능들을 off 해주고 수정하는게 바람직한 방법이다.

Initlal이 붙은 기능의 뜻은 최초 초기값을 나타낸다.

 

Required 을 눌러서 Emitter이 붙은 기능들을 수정해 볼 필요가있다.

Loops = 몇번 반복할지

Duration = 전체 시간

Deleay = 방출하기까지 최초 딜레이

Low = 거기에 곱해질 비율값

 

1. Warp 같은 이동스킬을 사용할때 파티클을 무한으로 설정해 놓으면 사용이 불가능하다 그래서 반복횟수를 지정해줘야 한다.

2. Loops를 1로 만들어야 1번 반복이 일어난다. 0으로 해놓으면 무한반복

3. 딜레이도 적절하게 줘서 나중에 애니메이션 몽타주가 자연스럽게 나오도록 수치를 조정해서 사용한다.

 

1. 너무 크거나 작으면 이쁘지 않을 수 있기에 알맞게 맞춰주기 위해 Max, Min을 사용하여 크기를 조절해 주는 것도 임팩트를 이쁘게 만들어 사용하는 방법 중 하나이다.

 

이제는 Particle에 대한 설명은 끝이났고, IK 마무리 되지 못한 모션의 부자연스러움을 해결해 볼 것이다.

IK가 그냥 전부 동작에 적용되게 만들어 버리면 이질감이 드는 행동이 보이기도 한다.

이럴때는 커브를 사용하여 IK가 들어가야만 하는 부분에 정확히 사용하는 방법으로 진행해야 한다.

1. IK에 있는 Alpha 값을 사용할 것이다.

2. 1이되면 IK가 적용되고, 0이면 적용되지 않는다.

3. 만일 왼발을 0으로 수치를 변경해서 실행하게 되면 발이 묻히는 현상이 다시 발생한다.

4. 그래서 커브를 만들어 수치를 가지고 특정한 시점에만 실행되도록 만들어 볼 것이다.

커브 수치가 0이면 실행이 안되고, 1이면 실행이된다.

 

1. 우선 적용할 애니메이션이 많아지므로, 커브를 생성하여 공용으로 사용하면 된다.

2. 커브를 좌우로 나눠서 2개 생성해준다.

 

LeftFoot

1. 아무지점이나 클릭 후 Enter을 누르면 수치가 나오게 되는데 1이여야 IK가 동작하므로 1로 수치를 바꿔준다.

2. 양쪽발 다 동일하게 진행해준다.

 

Left_Foot 부분
Right_Foot 부분
Pelvis 부분
전체 IK 노드 연결

1. Get Curve Value를 선언 후 Name에 내가 설정한 커브 이름을 넣는다.

2. 설정한 값을 각 IK 노드에 연결한다.

3. 값이 먹음으로써 다시 버그없이 IK가 동작한다.

4. Pelvis 부분은 다르게 만들어줘야한다.

5. 동작원리가 발이 내려가는 지점이 더 낮은걸 따라서 허리가 움직이도록 구성되어있다. 결국 둘중에 하나라도 IK가 동작하면, 허리는 IK가 조정되어야 하기 때문에 둘중 큰값이 들어갈 확률이 더 높으므로 높게 설정해줘야한다. 허리가 큰값을 따라간다는 것은 결국 발은 내려가고 있다는 것을 의미하기 때문

 

지금까지는 평범한 상태에서 걸었을때 발과 허리가 적용된거지만, 이젠 무기를 들거나 하는 특정한 애니메이션에 동작에도 IK가 적용되게 만들어줘야 한다.

 

1. 아까 만들어준 커브를 2개 동일하게 추가해준다.  그리고 LeftFoot 기준으로 설명해 볼 것이다.

2. 위에 그림처럼 0일때 동작을 보면 왼발이 공중에있는 상태이므로, 이때는 IK가 적용되면 안되므로 Enter을 눌러서 수치 0을 주고 하나의 지점을 만들어 놓는다.

3. 9 ~ 10 프레임 사이에 가게되면, 왼쪽발이 지면에 붙게되는데 이때 IK를 켜주기 위해 Enter을 눌러 수치 1을 준다.

4. 그리고 14 ~ 15 프레임 사이에 가게되면, 다시 왼발이 공중에 뜨게 되는데 이때 다시 0으로 IK를 꺼준다.

5. 이렇게 해서 양쪽발 수치를 다 지정해주면 원하는 시점에 IK 동작이 이루어진다.

6. 대신 이러한 방법으로 하는 만큼 앞으로 모든 애니메이션에 동일한 방법으로 계속 추가를 해줘야하는 번거러움이 있다.

 

 

이제 IK는 끝이났고, 타겟팅을 할 수 있는 시스템을 구현해 볼 것이다.

1. 우선 타겟팅에 쓸 키를 세팅해준다. T는 타겟 지정, Q, E는 좌우 타겟으로 변경하는 키

 

1. 프로젝트 세팅 -> 엔진 카테고리 - 콜리전 -> 들어와서 아래 Preset 클릭

2. 새 프로파일 눌러서 Targeting 생성3

3. 사용하는 이유 객체 전부가 아닌 내가 원하는 타겟만 지정해서 사용할 것이기 때문

4. Sphere, box, capsule는 전부다 블록 연산이므로, Physics로 설정

5. 이중에 Pawn만 추적할 것이므로, Pawn 블록만 켜주면, Pawn만 찾게된다.

1. 예전에 만들어 놓은 기능중에 하나이다.

2.  다시 설명해 보자면 캐릭터 기준 정면에서 제일 가까운 타겟을 선별하기 위한 기능이다.

3. 이걸 아래에서 사용 할 것이다.

블루프린트 클래스로 TargetComponent를 생성해준다.

TargetComponent에서 사용할 함수 및 변수를 설명을 위해 미리 세팅해 놓았다.

 

BeginPlay 이벤트

1. Begin에서는 캐릭터인지 확인만 해준다.

 

Toggle_Target

1. 유효하다면 타겟을 잡고, 유효하지 않다면 타겟을 잡지 않을 것이다.

 

Begin Targeting 앞 부분
Begin Targeting 뒷 부

타겟팅을 무한대로 하는게 아닌 일정 거리에 들어오면 사용 할 수 있도록 만들 것이다.

Trace Complex를 사용하게되면 복잡한 연산은 다 하게 된다.

 

1. Profile를 사용하게되면 전부가 아닌 특정한 객체만 찾는다.

2. 캐릭터 위치를 시작과, 끝지점으로 설정하고, Profile Name를 만들어 놓은 Targeting를 넣어준다.

3. Distance로 1000 지점에서 타겟을 감지하도록 만들어 준다.

4. 이제 모든 지정을 끝낸 상태로 for문을 돌리면 그 안에 들어오는 객체는 전부 타겟이 된다.

5. GetClass를 생성해준다. 이 기능은 연결되어있는 클래스 타입을 return 해준다.

6. 캐릭터와 그 타겟이 같은 객체가 아닐때만 추적을 할 것이다.

7. Pawn을 추적하면 무조건 캐릭터가 나오긴하지만 Pawn위에 있는 Pawn 자체도 나올수도 있기 때문에 예외처리겸 형변환을 한번 더 해준다.

8. Character 배열인 Targets로 for문을 다 돌면서 타겟을 다 선발하게 된다.

9. Get Nealy Front Angle로 플레이어가 타겟들을 찾을 수 있도록 Change Target에 연결

ChangeTarget

1. 정면에 만약 타겟이 없을수도 있으므로, Null 체크해주고 만약 Null이라면 종료해준다.

2. Spawn Emitter Attached에서 어디다가 붙일지 결정하는 지점은 Enemy한테 붙일 것이다. 그리고 Name은 Mesh에 있는 최상단 Root가 된다.

3. 그리고 수치들은 조정해준다.

4. Spawn Emitter Attached을 Particle에 저장해 준다. 하나가 타겟팅이 됐고, Change Target이 다시 호출이 되서 기존에 타겟팅이 되어있는 상황이라면, 제거해주고 다시 생성해준다.

5. 그리고 In Candidate로 타겟을 설정

 

End_Target

1. Target을 Null로 비워주고, Particle이 유효하다면 돌아가고 있는 상태이므로, 지워준다.

2. 그럼 타겟팅 잡혔다가 다시 T를 누르면 다시 타겟을 잡게된다.

 

TargetComponent 이벤트그래프

타겟팅을 돌려주는건 매 프레임마다 보간을 해줘야하기 때문에 Tick에서 진행된다.

 

1. 타겟이 있을때만 수행할 것이므로 확인해준다.

2. Get Component by Class를 사용하는 이유는 Dead해버린 타겟을 지정하면 안되기 때문이다. (아래에 생성해 놓음)

3. Character, Target의 거리가 1000으로 범위를 설정해준 Trace보다 작거나 같을때만 타겟팅이 되도록 해준다.

4. 만약 작다면 타겟팅을 끝낸다.

Tick_Targeting

1. 바라보는 방향을 구하려면, 만일 타겟이 지정된 객체와 내가 바라보는 객체가 다르다면 그 사이에 값을 구해서 판단해야한다.

2. Character에 위치와 Target에 위치를 시작과 끝지점으로 정해서 사이의 값을 판단한다.

3. Owner to Target를 만들어서 저장해준다.

4. 아래 if 조건은 Control에서 Owner까지 카메라가 이동하게 되는데, 만약 둘이 같다면 이미 바라보고 있는 상태이기때문에 해줄 필요가 없다. 또한 오차범위인 각도를 Angle로 정해줘서 적절한 예외처리도 해준다.

5. 나머지는 추후에 작성하도록 하겠다. (Angle이상 차이가 난다면 그 사이를 좁혀주도록 만들어 줄 것이다.)

 

1. 위에 Enemy가 죽으면, 타겟으로 지정을 하면 안되므로, 미리 만들어 놓았다.

2. 추후에도 계속 사용할 것이다.

1. 플레이어로 가서 만들어준 TargetComponent를 추가해준다.

2. 설정해놓은 T키를 사용하기 위한 입력 세팅을 해준다.

3. 세팅에서 Draw Debug를 For Duration으로 해줘야 일정시간동안 보이도록 만들 수 있다.

 

이제 끝이나서 타겟팅이 실행된다.

 

https://www.youtube.com/watch?v=76hZuYU1PRQ 

 

- 기능이 구현되는게 신기하다

- 타겟팅은 필수

Comments