conditions bug - Gameplay Camera System

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.

Well let me rewrite and add some detail:

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:
    • firstPersonfirstPerson
    • thirdPersonthirdPerson
  • 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:

  1. Are the Gameplay Tag-based Conditions even functional right now in UE5.5’s Camera System?
  2. Is there a working example of conditional blending between rigs using tags or rig type?
  3. 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.

Cheers.

2 Likes