I have been trying to use the “gameplay camera system”, and found out that the conditions aren’t working properly, do you have tried yourself? does it work for you?
I was trying using the motion matching as base, have smooth transition in 3 person but a linear 0.0s transition when moving from 3p to 1p and vice versa.
I’m working with the new Gameplay Camera System in Unreal Engine 5.5 (experimental feature), and I’m trying to control camera blend behavior between first-person and third-person rigs using Gameplay Tags and Conditions.
What I’m trying to do:
Swap between firstPerson and thirdPerson rigs instantly (0s linear blend).
Ensure smooth 1s transitions only when swapping between similar perspectives:
firstPerson → firstPerson
thirdPerson → thirdPerson
I’m using Gameplay Tags like firstPerson and thirdPerson assigned to the rigs.
In the Camera Mode Blends table, I’m trying to set up Conditions to control the transition behavior.
My problem:
The conditions do not seem to work as intended.
Whether I use the tags or not, all transitions either:
Blend smoothly (even when I want them to cut), or
Cut instantly (even when I want a smooth transition).
I tested this in the Motion Matching example project, editing the CameraAsset_SandboxCharacter blueprint.
Tried setting conditions like:
Only “far” rigs use Linear blend with 0s duration.
Other rigs use Smooth blend with 1s duration.
But tags and rig comparisons don’t seem to drive the blend behavior at all.
Things I tried:
Creating and assigning the tags in the rig assets.
Configuring blend conditions in the Camera Mode asset.
With and without Gameplay Tags – same behavior.
Setting different blend profiles directly on the rigs themselves.
Watching logs and debugging the camera actor – no errors, just incorrect blending.
My Questions:
Are the Gameplay Tag-based Conditions even functional right now in UE5.5’s Camera System?
Is there a working example of conditional blending between rigs using tags or rig type?
Am I misunderstanding how to structure the conditions for blend logic?
Extra context:
Engine version: Unreal Engine 5.5 (Motion Matching example project)
Asset: CameraAsset_SandboxCharacter
I spent weeks trying different combinations and searching forums/documentation, but found nothing conclusive.
Any help or pointers (even confirming it’s broken) would be appreciated!
Hello!
I bumped on the same issue and I found a bug on “Gameplay Tag” transition condition node code: indeed, the node evaluates your prev and next conditions but it will succeed in any case even with negative outcomes.
bool UGameplayTagTransitionCondition::OnTransitionMatches(const FCameraRigTransitionConditionMatchParams& Params) const
{
bool bPreviousMatches = true; // <- by default the condition is true
if (!PreviousGameplayTagQuery.IsEmpty())
{
if (Params.FromCameraRig)
{
FGameplayTagContainer TagContainer;
Params.FromCameraRig->GetOwnedGameplayTags(TagContainer);
// -> Here we evaluate the condition but we dont set the flag to false
if (TagContainer.MatchesQuery(PreviousGameplayTagQuery))
{
bPreviousMatches = true;
}
}
else
{
bPreviousMatches = false;
}
}
// same for the bNextMatches
...
return bPreviousMatches && bNextMatches;
}
I made the following fix locally to have the wanted result.
bool UGameplayTagTransitionCondition::OnTransitionMatches(const FCameraRigTransitionConditionMatchParams& Params) const
{
bool bPreviousMatches = true;
if (!PreviousGameplayTagQuery.IsEmpty())
{
// If we set a condition we will succeed only if it will be evaluated to true
bPreviousMatches = false;
if (Params.FromCameraRig)
{
FGameplayTagContainer TagContainer;
Params.FromCameraRig->GetOwnedGameplayTags(TagContainer);
if (TagContainer.MatchesQuery(PreviousGameplayTagQuery))
{
bPreviousMatches = true;
}
}
}
bool bNextMatches = true;
if (!NextGameplayTagQuery.IsEmpty())
{
bNextMatches = false;
if (Params.ToCameraRig)
{
FGameplayTagContainer TagContainer;
Params.ToCameraRig->GetOwnedGameplayTags(TagContainer);
if (TagContainer.MatchesQuery(NextGameplayTagQuery))
{
bNextMatches = true;
}
}
}
return bPreviousMatches && bNextMatches;
}
Hope it can be useful even if it requires a change on the source code.