Hello,
I would like to raise two related issues with the current occlusion API in the Wwise Unreal Engine integration, and propose a possible improvement.
1) Player Pawn is always ignored for occlusion
In the current implementation, the Player Pawn Actor is always ignored when calculating occlusion.
This becomes a problem when parts of the player actor should actually occlude sound.
A common example is a VR game where the player has objects attached to their body (umbrella, shield, large accessories, etc.) that should occlude sounds realistically.
At the moment, this is not possible because the Player Pawn is unconditionally ignored by the occlusion trace.
2) No way to define custom ignore actors per sound source
There is also no way to define custom actors to ignore for occlusion.
A simple example is a large door:
- The door emits sound while opening and closing
- The door should occlude sounds coming from the other side
- But the door should not occlude its own sound
Since the sound source is inside the door’s own collision volume, the door ends up occluding itself, which produces incorrect results.
Technical details
In the Wwise Unreal Engine plugin source code, inside AkObstructionAndOcclusionService.cpp, we can find the following:
void AkObstructionAndOcclusionService::CalculateObstructionAndOcclusionValues(const UAkComponentSet& in_Listeners, const FVector& SourcePosition, const AActor* Actor, AkRoomID RoomID, ECollisionChannel in_collisionChannel, bool bAsync /* = true */)
{
auto CurrentWorld = Actor->GetWorld();
if (!CurrentWorld)
return;
static const FName NAME_SoundOcclusion = TEXT("SoundOcclusion");
FCollisionQueryParams CollisionParams(NAME_SoundOcclusion, true, Actor);
auto PlayerController = GEngine->GetFirstLocalPlayerController(CurrentWorld);
if (PlayerController)
CollisionParams.AddIgnoredActor(PlayerController->GetPawn());
// Rest of the function...
}
This is the function used to calculate occlusion values with ray traces.
As we can see, AddIgnoredActor is called with the Player Pawn Actor to set up the collision parameters. and there is no way to extend or override the ignore list.
The function AkObstructionAndOcclusionService::CalculateObstructionAndOcclusionValues() is called by
AkObstructionAndOcclusionService::UpdateObstructionAndOcclusion(), which is in turn called directly by
AkComponent::UpdateObstructionAndOcclusion().
Proposed improvement
It would be extremely useful to expose custom occlusion ignore actors, for example by adding parameters such as:
bool bIgnorePlayerPawnActor and const TArray<const AActor*>& InIgnoreActors
This would allow:
- Choosing whether the Player Pawn Actor should be ignored or not
- Explicitly defining which actors are ignored during occlusion traces
- Solving many practical cases without forking the plugin
Ideally:
- The ignore list could be defined per AkComponent
- The default behavior (ignoring the Player Pawn) could be configurable in the Wwise Unreal integration settings
We currently use a fork of the Wwise Unreal plugin to add this functionality, but this is not ideal for team workflows or long-term maintenance.
We hope you will consider this request, as it would significantly improve flexibility and control over occlusion behavior in Unreal Engine projects using Wwise.
Best regards,