2024. 8. 23. 23:48ㆍUnreal Engine
Knockback 이어서
저번 시간에 적이 2초동안 뒤로 밀려나서 어색했다. 이 부분을 수정한다.
Damage State에서,
넉백 이동을 할지 말지 정하는 VARIABLE을 하나 만든다. 너무 멀리까지 밀리지 않는 장치이다.
만든 변수는 앞쪽에 Branch 노드와 배치했다.
멈춤 반경을 정할 변수도 하나 만들었다. 해당 반경 안에 들어오면 더이상 밀리지 않는다.
가운데에 Set으로 받아온다.
넉백의 시작점과 끝점의 변수와 넉백 방향 변수를 생성한다.
Enemy인 나의 위치와 종착지점 사이의 거리가 넉백 멈출 위치보다 작으면, True가 되어 Nuckback Playing이 체크 해제 된다.
한 가지 더 처리할 건, EndPoint 근처로 왔을 때 EndPoint에 딱 가게끔 설정한다.
Damage State의 EventGraph 전체 블루프린트
여기서 넉백 코멘트 내부 노드를 함수화 할 것이다.
On Damage Process 함수로 이동, (맞았는지 안맞았는지 판단)
Damage 상태가 됐을 때 넉백이 체크되고, 나의 현재 위치가 Start Point가 되며 End Point는 맞은 방향 * 거리를 현재 위치에 더해서 구한다.
각 변수의 Defaul 값은
Knockback Power가 500
Knockback Stop Range가 30
Knockback Distance가 100이다.
잘 작동한다.
Lerp를 이용한 넉백 움직임 구현 (from to)
Knockback 함수에서 일부 노드를 묶어 함수로 만든다.
만들어진 함수는 오른쪽 Details 창에 [Pure]를 체크하면 작아진다. ReturnValue 출력 이름은 Location으로 변경
우측에서 Lerp 이름의 함수를 하나 만든다.
우측에서 Location 이름의 Output을 하나 만든다.
[Lerp] 노드를 사용했고 A에는 적인 나의 위치, B는 End Point 위치, 기준 값이 되는 Alpha에는 얼마나 빨리 갔으면 하는지 넉백 파워에 초를 곱한 값을 넣었다.
Knockback 함수로 다시 돌아가서 P0vt 계산 되는 부분에 Lerp를 넣는다.
그리고 Knockback Power의 디폴트 값은 20으로 줄인다.
잘 돌아간다.
주어진 시간동안 이동하는 넉백 만들기
시작점과 끝점을 균등하게 나눠서 넉백 이동하게 만들 것이다.
TimeRange라는 함수를 만들어 Pure 체크하고 Location 이름의 Output을 하나 만들었다.
KnockbackTime과 KnockbackFinishTime 변수 생성. 각각 0, 1 디폴트 값 부여
노드의 연결은 아래와 같다. 넉백 시간에 계속해서 델타 타임을 더해준다. 그 값이 총 시간으로 나뉘면 전체 시간 대비 비율이 나오는데 그 비율 만큼 Start Point에서 End Point로 이동할 것이다. [Clamp] 노드는 전체 시간보다 넉백 시간이 커져도 항상 1을 출력하도록 넣은 것이다.
이 넉백 시간은 OnDamageProcess 함수 맨 끝에서 초기화 한다.
KnockbackFinishTime 변수의 디폴트 값을 3,
KnockbackDistance 변수의 디폴트를 200으로 설정하고,
넉백 함수에 만든 TimeRange 함수를 연결해서 테스트 한다.
적이 바닥에 빠진다.
Knockback 함수의 [Set Actor Location] 노드에서 [Sweep] 체크
이제 적이 바닥에 잠기지 않는다.
아니면 Sweep 체크를 풀고 OnDamageProcess 함수에서 Z 값을 0으로 유지하는 방법도 있다. 하지만 이렇게 했을 때의 단점은 경사지거나 장애물이 있으면 그냥 무시해버리기 때문에 Sweep 체크가 더 낫다.
다시 원래대로 KnockbackFinishTime은 0.2초, KnockbackDistance는 100으로 세팅
Die State 제작
DieSpeed 이름의 Float 변수 생성
적인 나의 위치에 아래로 향하는 방향 벡터에 스피드와 시간을 곱해서 더하면 아래로 이동하게 된다. 하지만 실행했을 때 바닥을 뚫고 내려가지는 않는다.
안되는 점에 대해서는 다음 시간에 계속...