Playing [Tween A], cancelling, then playing [Tween B] prevents [A] from working until [A] is played to completion or played & cancelled again

When [Tween A], affecting [ Property of Instance ] is played and cancelled – then [Tween B] affecting the same [Property of Instance] is played (cancelled or not), [Tween A], when played again, will not actually change [Property of Instance] until it is played through to completion or cancelled.

Working Examples

Tween A is played, cancelled, and played again. Value changes print in output as expected:

local numberValue = Instance.new("NumberValue") 
numberValue:GetPropertyChangedSignal("Value"):Connect(function()
	print(numberValue.Value)
end)

local tweenA = game.TweenService:Create(numberValue, TweenInfo.new(1), {Value = 1})
local tweenB = game.TweenService:Create(numberValue, TweenInfo.new(1), {Value = 0})

tweenA:Play()
print(tweenA.PlaybackState) -- Playing
-- Value changes print as expected --
task.wait(0.5) 
tweenA:Cancel()
print(tweenA.PlaybackState) -- Cancelled
tweenA:Play()
print(tweenA.PlaybackState) -- Playing
-- Value changes continue to print as expected --

Tween A is played to completion. Tween B is played to completion. Tween A is played again and values print as expected:

local numberValue = Instance.new("NumberValue") 
numberValue:GetPropertyChangedSignal("Value"):Connect(function()
	print(numberValue.Value)
end)

local tweenA = game.TweenService:Create(numberValue, TweenInfo.new(1), {Value = 1})
local tweenB = game.TweenService:Create(numberValue, TweenInfo.new(1), {Value = 0})

tweenA:Play()
print("A", tweenA.PlaybackState) -- A Playing
-- Value changes print as expected --

task.wait(1)
print("A", tweenA.PlaybackState) -- A Completed

tweenB:Play()
print("B", tweenB.PlaybackState) -- B Playing

task.wait(1)
print("B", tweenB.PlaybackState) -- B Completed
tweenA:Play()
print("A", tweenA.PlaybackState) -- A Playing
-- Value changes print as expected --

Bugged Example

Tween A is played, then cancelled.. Tween B is played to completion. Tween A is played once Tween B is completed – Tween A shows ‘Playing’ state but values do not change. Tween is played again after reaching completion-- then, values change.

local numberValue = Instance.new("NumberValue") 
numberValue:GetPropertyChangedSignal("Value"):Connect(function()
	print(numberValue.Value)
end)

local tweenA = game.TweenService:Create(numberValue, TweenInfo.new(1), {Value = 1})
local tweenB = game.TweenService:Create(numberValue, TweenInfo.new(1), {Value = 0})

tweenA:Play()
print("A", tweenA.PlaybackState) -- A Playing
-- Value changes print as expected --

task.wait(0.5) 
tweenA:Cancel()
tweenB:Play()
print("A", tweenA.PlaybackState) -- A Cancelled
print("B", tweenB.PlaybackState) -- B Playing

task.wait(1)
print("B", tweenB.PlaybackState) -- B Completed

tweenA:Play()
print("A", tweenA.PlaybackState) -- Playing
-- Value changes do not print as expected --

task.wait(1)
print("A", tweenA.PlaybackState) -- Completed
tweenA:Play()
print("A", tweenA.PlaybackState) -- Playing
-- Value changes now print as expected --

Workaround

Play A, cancel, play B. Play A, immediately cancel, immediately play A again - changes print as expected

local numberValue = Instance.new("NumberValue") 
numberValue:GetPropertyChangedSignal("Value"):Connect(function()
	print(numberValue.Value)
end)

local tweenA = game.TweenService:Create(numberValue, TweenInfo.new(1), {Value = 1})
local tweenB = game.TweenService:Create(numberValue, TweenInfo.new(1), {Value = 0})

tweenA:Play()
print("A", tweenA.PlaybackState) -- A Playing
-- Value changes print as expected --

task.wait(0.5) 
tweenA:Cancel()
tweenB:Play()
print("A", tweenA.PlaybackState) -- A Cancelled
print("B", tweenB.PlaybackState) -- B Playing

task.wait(1)
print("B", tweenB.PlaybackState) -- B Completed

task.wait(1)
-- Workaround: Play, cancel, then play again
tweenA:Play()
tweenA:Cancel()
tweenA:Play()
print("A", tweenA.PlaybackState) -- A Playing
-- Value changes now print as expected --