【UE4】AIPerception을 AIController와 Character에 첨부했을 때의 차이
5673 단어 위 4UnrealEngine
소개
과거에 쓴 AIPerception의 소개 기사( 【UE4】AI Perception의 소개와 사용법 , 【UE4】AI Perception 의 소개와 사용법 그 2 )에서는
AI Perception 컴퍼넌트에서는 「컨트롤러측에 컴퍼넌트를 추가한다」라고 하는 형태가 됩니다.
라고 설명했습니다.
기억이 멋지지만 처음 소개 기사를 쓴 시점에서 AIPerception은 AIController로 첨부되었을 때에만 동작했다고 생각합니다. 그래서 소개 기사에서는 컨트롤러 측에 컴포넌트를 추가하라고 썼습니다.
최근 AIPerception을 Character 측에 첨부하여 문제 없이 동작하는 장면(그 때는 AISense_Sight였습니다)를 보고 버렸기 때문에 “Character 측에 붙여도 문제 없다면, AIController에 붙이는 의미와는 일체... ?」라고 생각해, 나름대로 검증해 보았으므로 그 결과를 써 갑니다.
검증 처리
검증에 사용한 버전은 4.18.3입니다.
Character를 계승한 Blueprint에 AIPerception을 붙인 것. AIController를 상속한 Blueprint에 AIPerception을 붙여, Character를 상속했을 뿐의 Blueprint에 그 AIController를 세트 한 것의 2 종류 준비했습니다.
AIPerception이 붙어 있는 분에게는 각각 이하와 같은 처리를 추가했습니다.
AISense_Team 및 AISense_Touch에 대해서는 확인하지 않았습니다.
검증 결과
AISense_Damage 및 AISense_Prediction이 작동하지 않음
【UE4】AI Perception 의 소개와 사용법 그 2 에서 소개한 AISense_Damage와 AISense_Prediction은 Character측에 AIPerception을 붙였을 경우, 동작하지 않았습니다.
AISense_Damage.cpp에 정의된 Update 함수는 다음과 같이 작성됩니다.
float UAISense_Damage::Update()
{
//~~ 省略 ~~
UAIPerceptionComponent* PerceptionComponent = PerceptionListener->GetPerceptionComponent();
if (PerceptionComponent != nullptr && PerceptionComponent->GetListenerId().IsValid())
{
// this has to succeed, will assert a failure
FPerceptionListener& Listener = ListenersMap[PerceptionComponent->GetListenerId()];
if (Listener.HasSense(GetSenseID()))
{
Listener.RegisterStimulus(Event.Instigator, FAIStimulus(*this, Event.Amount, Event.Location, Event.HitLocation));
}
}
}
}
RegisteredEvents.Reset();
//~~ 省略 ~~
}
PerceptionListener->GetPerceptionComponent()를 호출 AIPerceptionComponent를 취득하고 있습니다. (이 함수는 AIController에 정의되어 있습니다)
Character 측에 AIPerception 을 붙일 경우, 함수 GetPerceptionComponent 는 NULL 가 돌려주어, 자극이 등록되지 않고, Blueprint 측에서 쓴 OnPerceptionUpdate 가 불려 가지 않습니다.
AISense_Prediction도 함수Update의 형태는 거의 같기 때문에 같은 이유로 받은 자극이 등록되지 않고, OnPerceptionUpdate로 정의한 Damage와 Prediction의 자극을 받았을 때의 처리를 통과하지 않습니다.
그럼 AISense_Sight와 AISense_Hearing은?
이 2개의 검증은 위에서 나타낸 검증 코드의 브랜치 부분을 각각 AISense_Sight와 AISense_Hearing로 변경해, PrintString의 내용을 바꾼 것입니다.
AISense_Sight나 AISense_Hearing은 AIPerception을 붙였을 때 반드시라고 말해 좋은 만큼 추가되는 자극입니다만, 이 2개의 자극에 대해서는 Character측에 붙이지만 AIController측에 붙이는 것이 문제 없게 동작합니다.
엔진 코드를 보면 2개의 클래스의 함수 Update에서는 함수 GetPerceptionComponent를 호출 조건 분기시키는 부분이 없기 때문에, Character에 붙여도 AIController에 붙여도 영향은 받지 않는 것 같습니다.
결론
간단한 검증이지만 얻은 결과로
Character측에 AIPerception을 붙였을 경우 AISense_Sight와 AISense_Hearing은 동작하지만 AISense_Damage와 AISense_Prediction은 동작하지 않는다.
AIController측의 경우는 4개의 AISense는 문제없이 동작한다.
라는 것을 알았습니다.
Reference
이 문제에 관하여(【UE4】AIPerception을 AIController와 Character에 첨부했을 때의 차이), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Dv7Pavilion/items/63ae78dbee298642eccb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
검증에 사용한 버전은 4.18.3입니다.
Character를 계승한 Blueprint에 AIPerception을 붙인 것. AIController를 상속한 Blueprint에 AIPerception을 붙여, Character를 상속했을 뿐의 Blueprint에 그 AIController를 세트 한 것의 2 종류 준비했습니다.
AIPerception이 붙어 있는 분에게는 각각 이하와 같은 처리를 추가했습니다.
AISense_Team 및 AISense_Touch에 대해서는 확인하지 않았습니다.
검증 결과
AISense_Damage 및 AISense_Prediction이 작동하지 않음
【UE4】AI Perception 의 소개와 사용법 그 2 에서 소개한 AISense_Damage와 AISense_Prediction은 Character측에 AIPerception을 붙였을 경우, 동작하지 않았습니다.
AISense_Damage.cpp에 정의된 Update 함수는 다음과 같이 작성됩니다.
float UAISense_Damage::Update()
{
//~~ 省略 ~~
UAIPerceptionComponent* PerceptionComponent = PerceptionListener->GetPerceptionComponent();
if (PerceptionComponent != nullptr && PerceptionComponent->GetListenerId().IsValid())
{
// this has to succeed, will assert a failure
FPerceptionListener& Listener = ListenersMap[PerceptionComponent->GetListenerId()];
if (Listener.HasSense(GetSenseID()))
{
Listener.RegisterStimulus(Event.Instigator, FAIStimulus(*this, Event.Amount, Event.Location, Event.HitLocation));
}
}
}
}
RegisteredEvents.Reset();
//~~ 省略 ~~
}
PerceptionListener->GetPerceptionComponent()를 호출 AIPerceptionComponent를 취득하고 있습니다. (이 함수는 AIController에 정의되어 있습니다)
Character 측에 AIPerception 을 붙일 경우, 함수 GetPerceptionComponent 는 NULL 가 돌려주어, 자극이 등록되지 않고, Blueprint 측에서 쓴 OnPerceptionUpdate 가 불려 가지 않습니다.
AISense_Prediction도 함수Update의 형태는 거의 같기 때문에 같은 이유로 받은 자극이 등록되지 않고, OnPerceptionUpdate로 정의한 Damage와 Prediction의 자극을 받았을 때의 처리를 통과하지 않습니다.
그럼 AISense_Sight와 AISense_Hearing은?
이 2개의 검증은 위에서 나타낸 검증 코드의 브랜치 부분을 각각 AISense_Sight와 AISense_Hearing로 변경해, PrintString의 내용을 바꾼 것입니다.
AISense_Sight나 AISense_Hearing은 AIPerception을 붙였을 때 반드시라고 말해 좋은 만큼 추가되는 자극입니다만, 이 2개의 자극에 대해서는 Character측에 붙이지만 AIController측에 붙이는 것이 문제 없게 동작합니다.
엔진 코드를 보면 2개의 클래스의 함수 Update에서는 함수 GetPerceptionComponent를 호출 조건 분기시키는 부분이 없기 때문에, Character에 붙여도 AIController에 붙여도 영향은 받지 않는 것 같습니다.
결론
간단한 검증이지만 얻은 결과로
Character측에 AIPerception을 붙였을 경우 AISense_Sight와 AISense_Hearing은 동작하지만 AISense_Damage와 AISense_Prediction은 동작하지 않는다.
AIController측의 경우는 4개의 AISense는 문제없이 동작한다.
라는 것을 알았습니다.
Reference
이 문제에 관하여(【UE4】AIPerception을 AIController와 Character에 첨부했을 때의 차이), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Dv7Pavilion/items/63ae78dbee298642eccb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
float UAISense_Damage::Update()
{
//~~ 省略 ~~
UAIPerceptionComponent* PerceptionComponent = PerceptionListener->GetPerceptionComponent();
if (PerceptionComponent != nullptr && PerceptionComponent->GetListenerId().IsValid())
{
// this has to succeed, will assert a failure
FPerceptionListener& Listener = ListenersMap[PerceptionComponent->GetListenerId()];
if (Listener.HasSense(GetSenseID()))
{
Listener.RegisterStimulus(Event.Instigator, FAIStimulus(*this, Event.Amount, Event.Location, Event.HitLocation));
}
}
}
}
RegisteredEvents.Reset();
//~~ 省略 ~~
}
간단한 검증이지만 얻은 결과로
Character측에 AIPerception을 붙였을 경우 AISense_Sight와 AISense_Hearing은 동작하지만 AISense_Damage와 AISense_Prediction은 동작하지 않는다.
AIController측의 경우는 4개의 AISense는 문제없이 동작한다.
라는 것을 알았습니다.
Reference
이 문제에 관하여(【UE4】AIPerception을 AIController와 Character에 첨부했을 때의 차이), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Dv7Pavilion/items/63ae78dbee298642eccb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)