# PlayerTurning Logic 

**URL:** <https://forums.unrealengine.com/t/playerturning-logic/2842975>\
**Category:** Blueprint\
**Tags:** unreal-engine, Blueprint, question\
**Created:** [October 20, 2026, 6:08pm UTC](https://forums.unrealengine.com/t/playerturning-logic/2842975 "2026-10-20T18:08:17Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![cjwag5](https://d1ap1mz92jnks1.cloudfront.net/user_avatar/forums.unrealengine.com/cjwag5/32/1213331_2.png) [@cjwag5](https://forums.unrealengine.com/u/cjwag5)\
**Post date:** [October 20, 2026, 6:08pm UTC](https://forums.unrealengine.com/t/playerturning-logic/2842975/1 "2026-10-20T18:08:17Z")

</div>

![Screenshot 2026-10-18 180143](https://d3kjluh73b9h9o.cloudfront.net/original/4X/5/9/0/59069a967c973600ec1ca13f5db77f7c9b559acb.png)I Am new to this type of thing, i dont know C++ so i am using Data Blocks for as long as i possibly can, i want to make a semi-complicated character idling system, basically what i want to do is have the character move their head, torso and legs in a “comfortable zone” radius while idle, here in this instance i want the root to rotate (the character to turn) whenever the camera’s facing direction surpasses a certain threshold of about 27 degrees left or right, originally i had it alot more complicated but have dumbed it down a little bit since then,

now in this image i’m trying to fall back onto using the Character BP’s useControllerYaw setting, basically when the player is moving i want Unreal to do its normal Unreal thing and allow the character to move freely while facing the camera, basic thing, yknow? well i got it to work but the issue NOW is that the character snaps to position instead of turning smoothly, i dont have my ABP set up yet to play anims for this particular occurence, but i assume that the root needs to rotate smoothly, because with the system like that, it automatically solves any issues with regular player-like movements, like turning in a specific position and then sprinting, the root moves cleanly to its normal place while the anticipation part of the sprint animation is still busy playing

i dont know if i am over explaining this, or if i’ve typed too much to bother reading, again i’m very new to this typa stuff, and i dont know many node or datablock coding, i think my only specialty is ideas and animation making at this point.

---

<div class="post-metadata">

**Author:** ![ShadowBr0kerz](https://d1ap1mz92jnks1.cloudfront.net/user_avatar/forums.unrealengine.com/shadowbr0kerz/32/1201558_2.png) [@ShadowBr0kerz](https://forums.unrealengine.com/u/ShadowBr0kerz)\
**Post date:** [October 20, 2026, 7:20pm UTC](https://forums.unrealengine.com/t/playerturning-logic/2842975/2 "2026-10-20T19:20:33Z")

</div>

the snap comes from flipping useControllerYaw as a bool, that sets the rotation instantly with no interp. keep bUseControllerRotationYaw off and do the turn yourself on tick: get the delta between controller yaw and actor yaw, and only when it passes your 27 degrees, feed the controller yaw into an RInterpTo driving SetActorRotation with a turn speed around 5 to 10. that gives the smooth root turn and the sprint anticipation still blends cleanly.

for the head and torso idle zone later, look at an aim offset or a layered blend per bone on top of the idle, that way the root handles the big turns and the upper body does the small comfortable zone shifts without fighting it. dont try to rotate meshes by hand, the interp node plus one aim offset covers the whole system.

---

<div class="post-metadata">

**Author:** ![illspiritx](https://d3kjluh73b9h9o.cloudfront.net/original/4X/2/8/5/28502927f1d97ba1051b3b47ccfe17233bf41ef0.png) [@illspiritx](https://forums.unrealengine.com/u/illspiritx)\
**Post date:** [October 20, 2026, 11:04pm UTC](https://forums.unrealengine.com/t/playerturning-logic/2842975/3 "2026-10-20T23:04:21Z")

</div>

Instead of using useControllerYaw, try turning on bUseControllerDesiredRotation when the delta exceeds your comfort zone. ControllerDesiredRotation will make the char smoothly turn towards where controller is pointed, based on their rotation rate. Also set a new bool called bIsCatchingUpRotation or something to true when you turn on UseControllerDesiredRot and check somewhere in tick if that’s true AND yaw delta is \<5 or so, then reset new bool and UsControlDesiredRot backto false.

I nuked my bp code for this some time ago when I moved the aim logic in my action RPG project to c++. but here’s what tick looks like in my character’s cpp file, if it helps:

```cpp
void AGoblinCharacter::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	UCharacterMovementComponent* MoveComp = GetCharacterMovement();
	if (!MoveComp) return;

	// First person enforces its own rotation rules. Skip third-person catch-up logic entirely.
	if (IsFirstPerson()) return;

	// Out of combat: turn off all custom rotation gates entirely
	if (!IsWeaponActive())
	{
		bIsCatchingUpRotation = false;
		MoveComp->bUseControllerDesiredRotation = false;
		return;
	}

	const float GroundSpeed = GetVelocity().Size2D();

	if (GroundSpeed > 5.0f)
	{
		// MOVING IN COMBAT: Smoothly track the camera view direction while running
		bIsCatchingUpRotation = false;
		MoveComp->bUseControllerDesiredRotation = true;
	}
	else
	{
		// STATIONARY IN COMBAT: Run the threshold catch-up logic
		const FRotator ControlRotation = GetControlRotation();
		const FRotator ActorRotation = GetActorRotation();
		const float StandingRootYawOffset = FRotator::NormalizeAxis(ControlRotation.Yaw - ActorRotation.Yaw);
		const float AbsoluteOffset = FMath::Abs(StandingRootYawOffset);

		// State Reset Gate: If we just stopped running, bIsCatchingUpRotation is false but 
		// bUseControllerDesiredRotation is still true. Unlock the capsule to generate an offset.
		if (!bIsCatchingUpRotation && MoveComp->bUseControllerDesiredRotation)
		{
			MoveComp->bUseControllerDesiredRotation = false;
		}

		// THRESHOLD ROTATION GATE
		if (!bIsCatchingUpRotation && AbsoluteOffset > 89.0f)
		{
			bIsCatchingUpRotation = true;
			MoveComp->bUseControllerDesiredRotation = true;
		}
		else if (bIsCatchingUpRotation && AbsoluteOffset < 5.0f)
		{
			bIsCatchingUpRotation = false;
			MoveComp->bUseControllerDesiredRotation = false;
		}
	}
}

```

Obviously my threshold is way higher than 27°, but, yea.

ETA:

Owait, I still had bp logic in a test project:

 ![aim-or-turn](https://d3kjluh73b9h9o.cloudfront.net/original/4X/6/4/6/6464bad205e4c34d90a8aa4c1d96d29da3c55646.jpeg)

I ran a function like that in tick after setting AimOffsetYaw from delta between actor and controller rotatons.

---

<div class="post-metadata">

**Author:** ![cjwag5](https://d1ap1mz92jnks1.cloudfront.net/user_avatar/forums.unrealengine.com/cjwag5/32/1213331_2.png) [@cjwag5](https://forums.unrealengine.com/u/cjwag5)\
**Post date:** [October 31, 2026, 10:13pm UTC](https://forums.unrealengine.com/t/playerturning-logic/2842975/4 "2026-10-31T22:13:48Z")

</div>

alright, thank you. i’ll try that soon, hopefully it works cause this has been quite confusing to do.

---

<div class="post-metadata">

**Author:** ![cjwag5](https://d1ap1mz92jnks1.cloudfront.net/user_avatar/forums.unrealengine.com/cjwag5/32/1213331_2.png) [@cjwag5](https://forums.unrealengine.com/u/cjwag5)\
**Post date:** [October 31, 2026, 10:16pm UTC](https://forums.unrealengine.com/t/playerturning-logic/2842975/5 "2026-10-31T22:16:08Z")

</div>

interesting, i’ll have to try this system later as well as the other suggestion. Thank you, cause i really got no idea what i’m doing
