2024. 9. 15. 17:09ㆍUnreal Engine
적 패트롤 계속
GetRandomPositionInNavMesh에서 만든 GetRandomReachablePointRadius를 커스텀 함수 안에서 쓰지 않고 밖에서 바로 쓰도록 한다.
GetRandomPositionInNavMesh 함수 안에서 GetRandomReachablePointRadius 노드 복사 후
기존의 Get Random Position in Nav Mesh를 지우고 그 자리에 대체한다.
선택한 노드들은 뒤에서 또 쓸 예정이라 묶어서 FindPath이름의 Function으로 만든다. 그 전에 쓰던 GetRandomPositionInNavMesh는 삭제.
이제 BP_EnemyFSM의 MoveState로 간다.
이동과 관련 있는 노드를 선택하고 Function으로 만든다.
만든 함수인 FindAndMove 함수를 더블클릭해서 들어간다.
Me와 Target 변수를 가져다 놓고 Get Actor Location 노드를 연결하고 Return Value 부분에서 우클릭 후 Promote to Local Variable 한다.
Start, End 이름의 지역 변수를 생성했다.
이후에는 Find Path to Location Synchronously 노드를 이용해서 Start와 End 지역 변수를 연결했고 두 벡터 사이의 거리가 0보다 큰지를 확인한다. True이면 이동하고 False이면 랜덤 위치로 이동한다.
그리고 이동 뒤에 Switch on EPathFollowingRequestResult 노드와 만들었던 FindPath 노드를 붙이면 이제 목표물에 들어갔을 때 길을 찾아 움직이는 적을 볼 수 있다.
여기서 문제는 적의 탐색 범위에 잠깐 들어갔다 나오면 적이 다시 제자리 걸음을 한다는 점.
해당 노드에 토글을 걸고 입력 되는 값을 보면 Failed가 출력되어야 하기 때문에 문제가 생기는 것을 알 수 있다.
플레이어를 따라오느라 Destination을 갈 수 없게 되어버린 것.
Failed 일 때도 Find Path에 연결하면 된다.
적이 이동하면서 방향을 바꿀 때 자연스럽게 회전하도록 수정
BP_Enemy에서 Orient Rotation to Movement와 Use Controller Rotation Yaw를 체크 해제.
이 상태로 실행하면 적이 이동은 하지만 회전하지 않는다. 이제 회전을 직접 조절한다.
BP_EnemyFSM의 MoveState의 앞에 회전 관련 함수를 만든다.
FUNCITONS의 +를 눌러서 Correct Rotation 이름의 함수 생성.
Inputs에 InterpSpeed 이름의 Float 변수 생성
적의 회전 값을 가져오도록 설정.
다시 BP_EnemyFSM의 MoveState로 가서 Correct Rotatino 함수를 사용한다.
이 상태에서 실행하면 이렇게 하기 전처럼 적이 휙휙 회전하는 것을 볼 수 있다. 이 회전을 부드럽게 바꿀 것이다.
다시 Correct Rotation 함수로 들어간다.
FInterpTo 노드로 첫 Yaw 값과 끝 Yaw 값을 Interpolation하여 액터의 Yaw에 넣는다. 적의 회전은 Yaw 회전이기 때문.
다시 MoveState로 와서 Interp Speed 값에 10을 넣고 실행하면 부드럽게 회전하는 것을 볼 수 있다.
적의 목표 위치와 이동을 시각화 하기
FindAndMove 함수로 간다.
DrawNavPath 이름의 함수 생성
Inputs에 PathPoints 이름의 Vector 배열 input 생성
포인트 사이의 Line을 그려주기 위해서 아래와 같이 블루프린트 생성.
FindAndMove 함수에서 사용하려고 했는데 에러가 나서 DrawNavePath 내부에 있는 노드를 복사해서 가지고 와서 사용해야 한다.
좀 많이 복잡하게 되었지만 아래와 같이 연결하고, 적의 탐색 범위도 늘린다.
적이 나를 따라오는 선이 노란색 선으로 보이게 된다.
선이 그려지는 것을 확인 했으므로 다시 FindAndMove 함수에서 이전으로 되돌리고,
적의 탐색 범위도 다시 줄인다.
플레이어 피격 효과
피격 효과 png 다운로드
다운로드 받고 UI 폴더에 넣는다.
WBP_UIScreen으로 간다.
Image 추가해서 DamageUI로 이름 지었다.
Anchors는 Ctrl 키 눌러서 가득 차게 설정
이미지 넣기
이미지의 Render Opacity를 조절해서 보이고 안보이게 설정해 줄 것이다. 초기에는 보이지 않도록 0으로 설정.
해당 이미지를 IsVariable 체크 한다.
WBP_UIScreen의 Graph 창으로 이동한다. EventGraph 창으로 간다.
OnDamageEvent 이름의 커스텀 이벤트를 생성하여 Opacity를 조절할 수 있도록 했다.
BP_Player의 OnHitEvent 부분으로 간다.
앞 부분에 만든 이벤트를 호출하면 된다.
UI가 잘 나온다.
피격 UI 애니메이션
WBP_UIScreen의 Designer 창에서 보면 [Window] - [Animations] 창을 열 수 있다.
DamageUI를 선택한 상태로 +Animation 버튼을 눌러서 생성한 후 DamageAnim으로 이름 지었다.
+Add에서 DamageUI 선택
Render Opacity 선택
시작점에서는 1.0, 2초 뒤에는 0.0으로 되도록 해서 서서히 없어지게 애니메이션을 만들었다.
다시 WBP_UIScreen의 Graph 창으로 간다.
OnDamageEvent에 전에 연결되었던 것을 다 끊고 Play Animation을 연결한다.
실행하면 잘 작동하는 것을 볼 수 있다.
'Unreal Engine' 카테고리의 다른 글
[Unreal] 33일차 - 점수 표시 UI, 점수 데이터 저장, 플레이어 상체 움직임 (1) | 2024.09.15 |
---|---|
[Unreal] 31일차 - 무기 UI, 미니맵, 미니맵에 플레이어 표시, 적 패트롤 (2) | 2024.09.14 |
[Unreal] 30일차 - 플레이어 피격, 플레이어 HP UI 표시, Game Over UI, 무기 UI (0) | 2024.09.14 |
새로운 메타버스 월드 "칼리버스(CALIVERSE)" 후기 (0) | 2024.09.06 |
[Unreal] 29일차 - 죽는 애니메이션 후 적이 사라지게 설정, 적 네비게이션 설정, 적 생성 Spawn Points (1) | 2024.09.06 |