R15 weird animation behaviour

You can write your topic however you want, but you need to answer these questions:
What i want to achieve:
I want a sliding animation that makes the player “slide” while mantaining the body position and rotation and so without any kind of physics as here is shown:

What’s the issue?
The issue is that being an R15 based game, some avatars like in the previous clip behave correctly and the animation has no problems while in this second clip i seem to tilt forward?

What solutions have you tried so far? Did you look for solutions on the Developer Hub?

I noticed that to fix this problem i can set the humanoid.AutomaticScalingEnabled to false and as you can see in the previous clip it seems to fix the problem, however i still don’t understand why this is happening and if this is the only way since if i were to disable the AutomaticScaling other things could break like the HipHeight etc.

I tried asking multiple AIs about this topic and nothing seems to work, even on forums i can’t find a real answer nor a solution. Please im getting crazy any help is appreciated. Thanks.

Hey there! I stumbled across this post just now and had the answer for it.

The reason you “tilt forward” is because each R15 body part has CanCollide on,

I’m assuming the animation is not floating but instead manually placed on the floor. You should instead make the animation have the rig hovering, as in the default position of the LowerTorso.
Unfortunately this does mean you have to manually set the position for each keyframe.

Finally, you want a script to manually set the user’s HipHeight. Nothing too low like 0(As that causes the humanoid to get stuck in the floor and scoot around) but something low enough to achieve the goal.

I hope this reply was helpful and that you find a solution!

Hi! Thanks for the reply. So if i understood correctly i can keep the AutomaticScaling on True and the next things i should do are:

Make the slide animation not lower but instead make the animation where it is and thus like “floating” and then after the animation plays i manually lower the character by changing the HipHeight.

So the problem was the animation being set already on the floor rather than manually changing the player HipHeight.

Did i understand correctly? Thanks again.

I will answer your questions using a list,

  • You should keep AutomaticScaling set to default.

  • This is a comparison image, the one on the left is what the animaton should be like, and the one on the right is what your animation (I assume) looks like (don’t actually make the animation look like this, just take the one you’re using and make it float).

  • The second you begin crouching, set the HipHeight. And when you stop crouching, set it back to the default amount(you should set scaling to default in settings if you want to make your life slightly easier).

  • Yes, that is the issue.
    You did understand correctly, I’m glad I was able to help!

Ok i understood what to do however there seems to be a strange thing happening…

Here i tried manually testing the HipHeight with AutomaticScalingEnabled on True and i happen to “clip” into the floor:

Something even stranger happens when i turn OFF and ON AutomaticScalingEnabled and then try again to change the HipHeight manually. It seems to work correctly after i do this process for some reason ?!

Thanks for the answers, this is getting really hard for me lol.

also, i just read that AutomaticScalingEnabled is read only so i can’t even manipulate it via scripts. So even if it somehow fixes it i can’t use it as a fix…

No problem, I’m happy I’ve been able to help so far.

I do find it quite strange that AutomaticScaling seems to be the issue. However it may be due to your avatar’s height. Try setting the game’s scaling to Classic and see what that helps with.

Damn this is hard. I really wanted R15 but this problem is beyond fixing by myself. Is there anyone who could have any ideas im getting crazy ahah

Howdy! This might be a result of your character’s humanoid “HipHeight” property being too low.
Can you try increasing it slighty?

Ok i found out the issue after a lot of tries… it seems like my server scripts which handles the Collision Groups is breaking the animation.

I didn’t personally make this script but rather my friend.

Here is the script and disabling it made the animation and HipHeight adjustment flawlessly:

local Players = game:GetService("Players")
local PhysicsService = game:GetService("PhysicsService")
local Debug = false

PhysicsService:RegisterCollisionGroup("CharacterGroup")
PhysicsService:RegisterCollisionGroup("HitboxGroup")
PhysicsService:RegisterCollisionGroup("NoCollisionGroup")
PhysicsService:RegisterCollisionGroup("GroundGroup")

PhysicsService:CollisionGroupSetCollidable("CharacterGroup", "GroundGroup", true)
PhysicsService:CollisionGroupSetCollidable("CharacterGroup", "CharacterGroup", false)
PhysicsService:CollisionGroupSetCollidable("CharacterGroup", "HitboxGroup", false)
PhysicsService:CollisionGroupSetCollidable("CharacterGroup", "NoCollisionGroup", false)
PhysicsService:CollisionGroupSetCollidable("HitboxGroup", "GroundGroup", false)
PhysicsService:CollisionGroupSetCollidable("HitboxGroup", "HitboxGroup", false)
PhysicsService:CollisionGroupSetCollidable("HitboxGroup", "CharacterGroup", false)
PhysicsService:CollisionGroupSetCollidable("HitboxGroup", "NoCollisionGroup", true)
PhysicsService:CollisionGroupSetCollidable("NoCollisionGroup", "GroundGroup", true)
PhysicsService:CollisionGroupSetCollidable("NoCollisionGroup", "NoCollisionGroup", false)

local function assignCollisionGroups(character)
	for _, part in pairs(character:GetDescendants()) do
		if part:IsA("BasePart") then
			part.CanCollide = true
			part.CollisionGroup = "CharacterGroup"
			if Debug then
				print("Debug: CollisionGroup assigned to part:", part.Name)
			end
		end
	end
end

local function assignGroundGroup(folder)
	for _, part in pairs(folder:GetDescendants()) do
		if part:IsA("BasePart") then
			part.CollisionGroup = "GroundGroup"
			part.CanCollide = true
			if Debug then
				print("Debug: CollisionGroup assigned to part in Ground folder:", part.Name)
			end
		end
	end
end

local function assignHitboxGroup(hitbox)
	if hitbox:IsA("BasePart") then
		hitbox.CanCollide = true
		hitbox.CollisionGroup = "HitboxGroup"
		if Debug then
			print("Debug: CollisionGroup assigned to hitbox:", hitbox.Name)
		end
	end
end

local function assignCollisionFolder()
	for _, folder in pairs(workspace:GetDescendants()) do
		if folder:IsA("Folder") then
			for _, subFolder in pairs(folder:GetChildren()) do
				if subFolder:IsA("Folder") and subFolder.Name == "Collision" then
					for _, part in pairs(subFolder:GetDescendants()) do
						if part:IsA("BasePart") then
							part.CollisionGroup = "CollisionGroup"
							if Debug then
								print("Debug: CollisionGroup assigned to part in Collision folder:", part.Name)
							end
						end
					end
				end
			end
		end
	end
end

local function assignObstaclesFolder()
	for _, folder in pairs(workspace:GetDescendants()) do
		if folder:IsA("Folder") then
			for _, subFolder in pairs(folder:GetChildren()) do
				if subFolder:IsA("Folder") and subFolder.Name == "Obstacles" then
					for _, part in pairs(subFolder:GetDescendants()) do
						if part:IsA("BasePart") then
							part.CollisionGroup = "NoCollisionGroup"
							if Debug then
								print("Debug: CollisionGroup assigned to obstacle:", part.Name)
							end
						end
					end
				end
				if subFolder:IsA("Folder") and subFolder.Name == "Ground" then
					assignGroundGroup(subFolder)
				end
			end
		end
	end
end

Players.PlayerAdded:Connect(function(player)
	player.CharacterAdded:Connect(function(character)
		character:WaitForChild("HumanoidRootPart")
		assignCollisionGroups(character)
	end)
end)

for _, player in pairs(Players:GetPlayers()) do
	if player.Character then
		assignCollisionGroups(player.Character)
	end
end

assignObstaclesFolder()

assignCollisionFolder()

assignObstaclesFolder()

workspace.DescendantAdded:Connect(function(descendant)
	if descendant:IsA("BasePart") and descendant.Name == "Ground" then
		descendant.CollisionGroup = "GroundGroup"
		descendant.CanCollide = true
	elseif descendant:IsA("BasePart") and string.find(descendant.Name, "_Hitbox") then
		assignHitboxGroup(descendant)
	elseif descendant:IsA("Folder") and descendant.Name == "Collision" then
		for _, part in pairs(descendant:GetDescendants()) do
			if part:IsA("BasePart") then
				part.CollisionGroup = "CollisionGroup"
				part.CanCollide = true
				if Debug then
					print("Debug: CollisionGroup assigned to part in Collision folder:", part.Name)
				end
			end
		end
	elseif descendant:IsA("Folder") and descendant.Name == "Obstacles" then
		for _, part in pairs(descendant:GetDescendants()) do
			if part:IsA("BasePart") then
				part.CollisionGroup = "NoCollisionGroup"
				if Debug then
					print("Debug: CollisionGroup assigned to obstacle:", part.Name)
				end
			end
		end
	elseif descendant:IsA("Folder") and descendant.Name == "Ground" then
		assignGroundGroup(descendant)
	end
end)

Thanks for your help and sorry if i didn’t find this earlier. Much appreciated.

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