Used to customize how AISense Sight checks the visibility of an actor.

Usage

Override CanBeSeenFrom. A basic implementation as follows:

Note: Below implementation is still functional as of 5.2, but there’s a new override you should use instead:

virtual UAISense_Sight::EVisibilityResult CanBeSeenFrom(const FCanBeSeenFromContext& Context, FVector& OutSeenLocation, int32& OutNumberOfLoSChecksPerformed, int32& OutNumberOfAsyncLosCheckRequested, float& OutSightStrength, int32* UserData = nullptr, const FOnPendingVisibilityQueryProcessedDelegate* Delegate = nullptr)

It works mostly the same, but check the IAISightTargetInterface.h file for details on how the EVisibilityResult is intended to be used.

AMyCharacter::AMyCharacter()
{
	//This gets the sight trace channel that's configured in project settings
	DefaultSightCollisionChannel = GET_AI_CONFIG_VAR(DefaultSightCollisionChannel);
}
 
bool AMyCharacter::CanBeSeenFrom(const FVector& ObserverLocation, FVector& OutSeenLocation, int32& NumberOfLoSChecksPerformed, float& OutSightStrength, const AActor* IgnoreActor) const
{
	FHitResult HitResult;
	//check against location first - this is about in the center of the character
	bool IsHit = GetWorld()->LineTraceSingleByChannel(HitResult, ObserverLocation, GetActorLocation()
        , DefaultSightCollisionChannel, FCollisionQueryParams(SCENE_QUERY_STAT(AILineOfSight), true, IgnoreActor));
 
	NumberOfLoSChecksPerformed = 1;
	
	if(!IsHit || HitResult.GetActor() != this)
	{
		//if we don't see the center of the character, look for the camera location which is where the
		//player's point of view is, which allows the enemies to see the player in a more reasonable fashion
		//if the body is partially obscured
		IsHit = GetWorld()->LineTraceSingleByChannel(HitResult, ObserverLocation, Camera->GetComponentLocation()
			, DefaultSightCollisionChannel, FCollisionQueryParams(SCENE_QUERY_STAT(AILineOfSight), true, IgnoreActor));
 
		NumberOfLoSChecksPerformed++;
	}
 
	OutSeenLocation = HitResult.Location;
	OutSightStrength = 1;
	
	return IsHit && HitResult.GetActor() == this;
}
 

The DefaultSightCollisionChannel value assigned in the sample constructor is the default sight channel which can be adjusted from project settings under the AI settings.