【UE4】AIPerception의 Detect by Affiliation이 블루프린트에서만 작동하지 않는 이유
4261 단어 위 4UnrealEngine
소개
이 기사는 다음 기사에 나름대로의 보충을 더한 것입니다.
AI Perception in Unreal Engine 4 – How to Setup Written by Denis Rizov
htps : //로 에 s 리조 v. 코 m/2017/05/08/아이-페르세p 치온-인-응아아 l-엔기네-4-호 w-토세트 p/
링크처의 기사에는 Detect by Affiliation을 기능시키기 위한 순서가 해설되어 있으므로 흥미가 있는 분은 꼭 읽어 주시면 좋겠습니다.
Blueprint만으로는 팀 설정을 할 수 없다
현재(4.18.3)에서는 IGenericTeamAgentInterface가 갖고 있는 함수는 BP측에 공개되어 있지 않으며, 팀 설정을 하기 위해서는 C++를 피할 수 없습니다.
이 섹션에서는 블루프린트에서 팀을 설정할 수 없는 이유를 설명합니다.
GenericTeamId에 멤버를 설정하는 노드가 있나요?
블루프린트 에디터에서 ``GenericTeam''을 검색하면 다음과 같은 후보가 나옵니다.
GenericTeamId에는 멤버를 설정하는 노드가 있으며, 이것을 사용하면 문제없이 TeamID를 설정할 수 있을 것입니다만 불행히도 실제로는 설정되지 않습니다.
AIPerception이 TeamID를 얻기 위한 함수 GetTeamIdentifier를 호출하는 타이밍은 BP의 Construction Script나 Begin Play보다 이전이므로 BP측에서 노드가 호출되는 것은 TeamID가 취득된 후에이므로 의미가 없습니다. 그래서 클래스의 생성자에서 TeamID를 설정해야합니다.
AIPerception이 TeamID를 얻을 때까지 실행 순서
UAIPerceptionComponent::OnRegister
↓
UAIPerceptionSystem::UpdateListener
↓
FPerceptionListener::UpdateListenerProperties
↓
UAIPerceptionComponent::GetTeamIdentifier
플레이어 BP의 인터페이스에 GenericTeamAgentInterface라는 것을 선택할 수 있지만?
BP의 클래스 설정을 열면 "인터페이스"라는 항목이있어 추가 버튼에서 각종 인터페이스를 갖출 수 있습니다.
추가 후보 중에는 GenericTeamAgentInterface라는 인터페이스가 있지만 불행히도 이것을 선택해도 의미는 없습니다.
아마도 여기에서 후보로 표시되는 GenericTeamAgentInterface는 GetGenericTeamId 함수가 정의 된 인터페이스 클래스가 아니라고 생각합니다.
GenericTeamAgentInterface.h에는 다음과 같이 두 가지 인터페이스가 있습니다.
UINTERFACE()
class AIMODULE_API UGenericTeamAgentInterface : public UInterface
{
GENERATED_UINTERFACE_BODY()
};
class AIMODULE_API IGenericTeamAgentInterface
{
GENERATED_IINTERFACE_BODY()
// 省略
};
후보로 언급된 GenericTeamAgentInterface는 UInterface를 상속한 UGenericTeamAgentInterface가 아닐까 생각합니다.
본명의 IGenericTeamAgentInterface에는 AIPerception의 자극 대상이 어느 팀에 속하는지를 판정하는 함수 GetTeamAttitudeTowards가 있습니다.
플레이어 BP에 GenericTeamAgentInterface를 추가해도 아래 화살표 부분에서 실패합니다.
virtual ETeamAttitude::Type GetTeamAttitudeTowards(const AActor& Other) const
{
// ↓ NULLが返される(キャスト失敗)
const IGenericTeamAgentInterface* OtherTeamAgent = Cast<const IGenericTeamAgentInterface>(&Other);
以下省略
}
요약
FGenericTeamId는 USTRUCT에서 블루프린트 측에서 접하게 되어 있습니다만 GenericTeamId에 멤버를 설정 노드를 호출해도 실행 순서의 관계로 특별히 의미를 이루지 않고, BP측에서 GenericTeamAgentInterface를 추가했다고 해도 아마 IGenericTeamAgentInterface 그래서 캐스팅에 실패합니다.
이러한 이유로 Detect by Affiliation을 블루프린트만으로 기능시킬 수는 없다고 생각됩니다.
솔직히 번거롭지만 Detect by Affiliation에서 적 아군의 판별을 시킬 때는 C++가 필수입니다. 다행히 C++에서의 구현 방법은 기사 상부에 있는 링크처의 기사에 정리하고 있으므로, 구현되는 분은 꼭 읽어 주셨으면 합니다.
Reference
이 문제에 관하여(【UE4】AIPerception의 Detect by Affiliation이 블루프린트에서만 작동하지 않는 이유), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Dv7Pavilion/items/12b523424997a744eb5f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
현재(4.18.3)에서는 IGenericTeamAgentInterface가 갖고 있는 함수는 BP측에 공개되어 있지 않으며, 팀 설정을 하기 위해서는 C++를 피할 수 없습니다.
이 섹션에서는 블루프린트에서 팀을 설정할 수 없는 이유를 설명합니다.
GenericTeamId에 멤버를 설정하는 노드가 있나요?
블루프린트 에디터에서 ``GenericTeam''을 검색하면 다음과 같은 후보가 나옵니다.
GenericTeamId에는 멤버를 설정하는 노드가 있으며, 이것을 사용하면 문제없이 TeamID를 설정할 수 있을 것입니다만 불행히도 실제로는 설정되지 않습니다.
AIPerception이 TeamID를 얻기 위한 함수 GetTeamIdentifier를 호출하는 타이밍은 BP의 Construction Script나 Begin Play보다 이전이므로 BP측에서 노드가 호출되는 것은 TeamID가 취득된 후에이므로 의미가 없습니다. 그래서 클래스의 생성자에서 TeamID를 설정해야합니다.
AIPerception이 TeamID를 얻을 때까지 실행 순서
UAIPerceptionComponent::OnRegister
↓
UAIPerceptionSystem::UpdateListener
↓
FPerceptionListener::UpdateListenerProperties
↓
UAIPerceptionComponent::GetTeamIdentifier
플레이어 BP의 인터페이스에 GenericTeamAgentInterface라는 것을 선택할 수 있지만?
BP의 클래스 설정을 열면 "인터페이스"라는 항목이있어 추가 버튼에서 각종 인터페이스를 갖출 수 있습니다.
추가 후보 중에는 GenericTeamAgentInterface라는 인터페이스가 있지만 불행히도 이것을 선택해도 의미는 없습니다.
아마도 여기에서 후보로 표시되는 GenericTeamAgentInterface는 GetGenericTeamId 함수가 정의 된 인터페이스 클래스가 아니라고 생각합니다.
GenericTeamAgentInterface.h에는 다음과 같이 두 가지 인터페이스가 있습니다.
UINTERFACE()
class AIMODULE_API UGenericTeamAgentInterface : public UInterface
{
GENERATED_UINTERFACE_BODY()
};
class AIMODULE_API IGenericTeamAgentInterface
{
GENERATED_IINTERFACE_BODY()
// 省略
};
후보로 언급된 GenericTeamAgentInterface는 UInterface를 상속한 UGenericTeamAgentInterface가 아닐까 생각합니다.
본명의 IGenericTeamAgentInterface에는 AIPerception의 자극 대상이 어느 팀에 속하는지를 판정하는 함수 GetTeamAttitudeTowards가 있습니다.
플레이어 BP에 GenericTeamAgentInterface를 추가해도 아래 화살표 부분에서 실패합니다.
virtual ETeamAttitude::Type GetTeamAttitudeTowards(const AActor& Other) const
{
// ↓ NULLが返される(キャスト失敗)
const IGenericTeamAgentInterface* OtherTeamAgent = Cast<const IGenericTeamAgentInterface>(&Other);
以下省略
}
요약
FGenericTeamId는 USTRUCT에서 블루프린트 측에서 접하게 되어 있습니다만 GenericTeamId에 멤버를 설정 노드를 호출해도 실행 순서의 관계로 특별히 의미를 이루지 않고, BP측에서 GenericTeamAgentInterface를 추가했다고 해도 아마 IGenericTeamAgentInterface 그래서 캐스팅에 실패합니다.
이러한 이유로 Detect by Affiliation을 블루프린트만으로 기능시킬 수는 없다고 생각됩니다.
솔직히 번거롭지만 Detect by Affiliation에서 적 아군의 판별을 시킬 때는 C++가 필수입니다. 다행히 C++에서의 구현 방법은 기사 상부에 있는 링크처의 기사에 정리하고 있으므로, 구현되는 분은 꼭 읽어 주셨으면 합니다.
Reference
이 문제에 관하여(【UE4】AIPerception의 Detect by Affiliation이 블루프린트에서만 작동하지 않는 이유), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Dv7Pavilion/items/12b523424997a744eb5f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(【UE4】AIPerception의 Detect by Affiliation이 블루프린트에서만 작동하지 않는 이유), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Dv7Pavilion/items/12b523424997a744eb5f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)