폰(Pawn)을 사용하는 BTTask
이번에는 AI 시야에 플레이어가 들어오면 AI가 사격을 하도록 기능을 추가해보자.
이에 앞서 기존 시야에 들었을 시 플레이어 위치까지 오는 범위를 늘려주자.
해당 범위가 너무 좁으면 AI가 총을 플레이어와 너무 가까운 위치에서 사격을 하게 되므로 수정해주는 것이 좋다.
그리고 추가적으로 Observe Blackboard Value 값도 활성화 해주자.
해당 기능을 활성화 하지 않았을 시 AI가 플레이어를 따라올 때 자연스럽게 계속 따라오는 것이 아니라 우선 플레이어 위치까지 이동 후에 다시 변경된 플레이어 위치로 이동한다.
우리는 자연스럽게 계속 업데이트된 플레이어 위치로 따라오는 것을 원하기에 해당 값을 활성화 해주자.
이제 쏘는 기능을 추가하기 위해 또 새롭게 C++ 클래스를 생성해주자.
이번에는 단순히 쏘기만 할 것이기 때문에 블랙보드 키 값은 필요없다.
그러니 BTNode를 베이스로 선택해주자.
저번 ClearBlackboard 태스크를 만들 때와 마찬가지로 생성자를 통해 노드 이름을 설정해주고,
ExecuteTask 함수를 선언해주자.
그리고 사격 기능으로 우리는 기존의 ShooterCharacter2 클래스에 있는 Shoot 함수를 사용할 것이다.
따라서 해당 함수를 기존의 private에서 public으로 바꿔주자.
이제 해당 Shoot 함수에 접근할 수 있어야 한다.
이를 위해 Pawn에 접근해야할 필요가 있다.
Pawn은 GetPawn 함수를 통해 얻을 수 있지만, GetPawn 함수를 사용하기 위해서는 그 이전에 또 AIController 를 얻어야 할 필요가 있다.
이는 GetAIOwner 함수를 통해 가능한데, 해당 함수는 UBehaviorTreeComponent에의 상위 컴포넌트인 UBrainComponent에 속한 함수이다.
따라서 ExecuteTask의 OwnerComp를 통해 GetAIOwner 함수 호출이 가능하다.
이 과정을 통해 GetPawn 함수를 사용하여 Pawn을 얻고, 해당 Pawn을 기존 AShooterCharacter로 Cast하여 최종적으로 얻은 AShooterCharacter 포인터를 통해 shoot 함수를 호출하게 된다.
이러한 과정에서 AIController와 ShooterCharacter의 헤더 파일도 선언해주어야 한다.
그리고 해당 AIController와 Character가 null인지 아닌지 체크를 해주는 것이 좋다.
만약 null이라면 EBTNodeResult 반환 값중 하나인 Failed 값을 반환해주자.
이제 행동 트리에서 Shoot 태스크를 할당해주자.
이때 그냥 할당하면 엄청난 속도로 총을 발사하므로, 쏘고 1초후에 다시 쏘는 시퀸스를 만들어주자.
이제 실행해보면 플레이어의 일정 거리 앞에서 총을 쏘는 AI를 볼 수 있다.
현재 AI가 총을 쏘는 방향이 플레이어가 아닌 AI 자신으로 쏘고, 해당 총에 자기 자신이 데미지를 입는 현상이 있다.
이는 이어지는 강의에서 수정해보도록 하자.
'Unreal > Udemy 강의' 카테고리의 다른 글
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 6-37 (0) | 2024.07.15 |
---|---|
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 6-36 (0) | 2024.07.14 |
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 6-34 (0) | 2024.07.13 |
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 6-33 (0) | 2024.07.12 |
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 6-32 (0) | 2024.07.11 |