Tweening rotation from -90 to 0 rotates inefficiently

(i’ve just now noticed after finishing to write this post that i should have actually written an angle of -90 as 270, but i forgot thats how rotation for GUI’s actually work, so please keep in mind when you see -90 that i meant 270 lol)

I’ve just finished making a script for a radial menu (like in GTA’s weapons selection menu apparently) and have used TweenService to smoothly rotate a highlight across each option you hover over. The problem is, when the rotation begins at -90, and is tweened to 0, it would expectedly move clockwise, the quickest path to the goal. Instead, it moves anti-clockwise, and zips around the menu with a really jarring look in comparison to the expected behaviour. (same problem in this post)

I’ve annotated the angle for each segment thingy, and the grey arrow shows what is obviously EXPECTED to occur, however in actuality, for some reason it goes aaaaaall the way around like in the red arrow.

does anyone know a way to force tweenservice to move the right way in this specific scenario?
I am definitely not going to do something like partially/completely remake tweenservice as i wouldn’t even know where to begin, let alone how not to make it cook the users device, so any tips or ideas for how to make my existing system function would be appreciated

Alright, so I don’t really know if that would work but I have this function right here:

local function LookAtUI(O1:GuiObject,O2:GuiObject)
	local dist = O1.Position-O2.Position
	local vector =,dist.Y).Unit
    return math.deg(math.acos(vector.X))*math.sign(math.asin(vector.Y))

You would need to set O1 to the object that you want to rotate and you would need to set O2 to the object that O1 will look to.

and then here you will do this:

local function LookAtUI(O1:GuiObject,O2:GuiObject)
	local dist = O1.Position-O2.Position
	local vector =,dist.Y).Unit
    return math.deg(math.acos(vector.X))*math.sign(math.asin(vector.Y))

local angle = LookAtUI(O1, O2)
local convertedRotation = part.Orientation.Y % 360

-- Here you will do the tweening and set the Goal to {["Rotation"] = convertedRotation}

Hope this helps!!
Let me know if it doesn’t work. I haven’t tested it.

The problem is that Roblox can assign more than 360 in Rotation, instead of -90 write 270, and instead of 0 write 360 ​​and try again.


local TweenService = game:GetService("TweenService")
local CurrentTweenActions = {}

local Button = script.Parent.Button -- Event
local Frame = script.Parent.Frame -- Object To Rotate

	local TweenAction = TweenService:Create(Frame,, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {
		Rotation = 360
	table.insert(CurrentTweenActions, TweenAction)
	for _, CurrentAction in pairs(CurrentTweenActions) do
		if CurrentAction.PlaybackState == Enum.PlaybackState.Playing then
	CurrentTweenActions = {}
	Frame.Rotation = 0

im not sure if you understood, i already have all the angles set up and getting them isnt the problem, however my issue is that tweening from an original angle of 270 means that when i set the goal as 0, the tween gets confused and sends the rotation the wrong way.

Oh, sorry for misunderstanding. I think this post may help you.

Wouldn’t this only work for 0* rotation?
He has 4 sections, repeating the same code for every section will be a bad practice.

Yes, you can integrate this code for yourself. Unfortunately, I cannot know about all the parameters of its UI, so I provide the code as an example.

1 Like

sorry for the slow reply, i went to sleep yesterday before i had time to see if this response was true and was the solution; and it was!

i think (from what you were trying to say) you were right in that TweenService was literally tweening from 270 aaaaaall the way down to 0, which was causing the erratic anticlockwise motion. I now created a special parameter which causes it to rotate the right way if it tries to do this, by tweening from 270 all the way to 360, and it works!

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.