How to smoothly transition between M1 animations?

hey guys, lately I’ve been working on M1s for my fighting game, and I’ve encountered an animation transition issue. this is what I have right now:
(Watch knife m1 showcase 2 | Streamable)
(even in this clip, u can see a little bit of overlap error)

it has to do with animations with the same animation priority overlapping on each other, and it looks rlly weird when I play 2 at once. I have read abt how to stop and transition animations, but I’m not rlly sure on how to translate that into my code that I have right now (issue shown more clearly)
(Watch knife anim issue | Streamable)

block of code
local tool = script.Parent
local handle = tool:FindFirstChild("Handle")

local player = nil
local char = nil
local humanoid = nil
local animator = nil

local m1Folder = tool:FindFirstChild("M1s")
local m1Count = 0
local m1Debounce = false

local trail = handle:FindFirstChild("Trail")

tool.Equipped:Connect(function()
	char = tool.Parent
	player = game.Players:GetPlayerFromCharacter(char)
	humanoid = char:FindFirstChild("Humanoid")
	animator = humanoid:WaitForChild("Animator")
end)

tool.Activated:Connect(function()
	local m1Anims = {
		[1] = animator:LoadAnimation(m1Folder:FindFirstChild("1")),
		[2] = animator:LoadAnimation(m1Folder:FindFirstChild("2"))
	}
	
	--M1 logic
	local m1Min = 1
	local m1Max = 2
	
	if m1Debounce then
		print("debounce!")
		return
	end
	
	--THIS IS THE PART FOR THE ANIMATION LOGIC
	if m1Count < m1Max then	
		m1Count += 1
		m1Anims[m1Count]:Play(0.2)
		
	elseif m1Count == m1Max then
		m1Count = 1
		m1Anims[m1Count]:Play()
	end
	
	--First M1 events
	m1Anims[1]:GetMarkerReachedSignal("Stun"):Connect(function()
		m1Debounce = true
		humanoid.WalkSpeed = 8
		print("stunned!")
	end)
	
	m1Anims[1]:GetMarkerReachedSignal("Unstun"):Connect(function()
		m1Debounce = false
		humanoid.WalkSpeed = 16
		print("unstunned!")
	end)
	
	m1Anims[1]:GetMarkerReachedSignal("TrailStart"):Connect(function()
		trail.Enabled = true
	end)

	m1Anims[1]:GetMarkerReachedSignal("TrailEnd"):Connect(function()
		trail.Enabled = false
	end)
	
	--Second M1 events
	m1Anims[2]:GetMarkerReachedSignal("Stun"):Connect(function()
		m1Debounce = true
		humanoid.WalkSpeed = 8
		print("stunned!")
	end)
	
	m1Anims[2]:GetMarkerReachedSignal("Unstun"):Connect(function()
		m1Debounce = false
		humanoid.WalkSpeed = 16
		print("unstunned!")
	end)
end)

if anybody has any solutions, please help me out! thanks :happy2:

I know only a bit about animating, but I do know scripting. My first thought would be to add a script that plays a different animation if the player is walking, but I realized you can just remove the frames for the legs to not make the legs be bricks.

HAHA yeah, I knew about it but I haven’t fixed that part, thanks tho

You’re running into overlap because the M1 animations are playing at the same priority without properly stopping the previous one. You should always stop the last animation before playing the next one.

Don’t stack animations. Make sure each one fully stops before the next starts. That should fix the blending issue.

yep, I figured that was the case. I read about stopping animations and transitioning them, but I’m just not sure how to implement that into my code

this is what I tried writing, but sadly it didn’t work

if m1Count < m1Max then
	--I've tried writing logic for stopping it here, but not sure how to incorporate it
	if m1Count > 1 then
		m1Anims[m1Count - 1]:Stop(0.1)
	end
		
	m1Count += 1
	m1Anims[m1Count]:Play(0.2)
		
elseif m1Count == m1Max then
	m1Count = 1
	m1Anims[m1Count]:Play()
end

Yeah, you’re on the right track. The problem is that you’re not fully stopping the last animation every time before playing the next one.

Instead of just checking if m1Count > 1, always stop any currently playing M1 before starting a new one. You can store the last played animation in a variable and stop it:

if lastAnim then
    lastAnim:Stop(0.1)
end

lastAnim = m1Anims[m1Count]
lastAnim:Play(0.2)

That makes sure only one is playing at a time, and you avoid any overlap or blending.