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 --