Hello,
In the project I’m working on, I currently use PawnSensingComponent for AI perception. I’m recently working on advanced AI behaviors and I wanted to try the newer AIPerceptionComponent.
I got the new component working, but it seems something is wrong when I try to get known perceived actor through GetKnownPerceivedActors, in blueprint.
I set a max age in the AI Perception configuration panel so when the target goes out of range, stimulus will expire after that time.
The problem is, if I set a sense to use in that node, AISense_Sight in my test, AI continues to perceive actors when it shouldn’t (target out of range).
The max age parameter seems to work only if I leave “sense to use” to none in GetKnownPerceivedActors node.
I also tried to add a AIPerceptionStimuliSource to the target player, which I’m not currently sure whether is necessary or not by the way, but this didn’t solve the issue.
I tried to setup a basic C++ third person template project from scratch to make sure the problem is not in my project, but the problem is still there.
The setup is really simple, I just duplicated the ThirdPersonCharacter, assigned it the AIPerception component and dropped in in the level.
This screenshot shows the setup for that AI.
I started investigating in the source, in the GetKnownPerceivedActors C++ function:
void UAIPerceptionComponent::GetKnownPerceivedActors(TSubclassOf<UAISense> SenseToUse, TArray<AActor*>& OutActors) const
{
const FAISenseID SenseID = UAISense::GetSenseID(SenseToUse);
OutActors.Reserve(PerceptualData.Num());
for (FActorPerceptionContainer::TConstIterator DataIt = GetPerceptualDataConstIterator(); DataIt; ++DataIt)
{
const bool bWasEverPerceived = (SenseToUse == nullptr) ? DataIt->Value.HasAnyKnownStimulus() : DataIt->Value.HasKnownStimulusOfSense(SenseID);
if (bWasEverPerceived)
{
if (DataIt->Value.Target.IsValid())
{
OutActors.Add(DataIt->Value.Target.Get());
}
}
}
}
specifically, I guess the inlined function that runs when a specific sense to use is set returns true when it shouldn’t?
FORCEINLINE bool HasKnownStimulusOfSense(FAISenseID Sense) const
{
return LastSensedStimuli.IsValidIndex(Sense) && (LastSensedStimuli[Sense].GetAge() < FAIStimulus::NeverHappenedAge);
}
This happens in both 4.18.3 and 4.19.1 versions.
Am I doing something wrong?
Thanks in advance!
doomtrinity
==================================
[UPDATE]
In the test project I accidentally added the component to the Character instead of AIController, but the problem occurs even with the component in the Controller class.