How to Actually Use Roblox's Physics Character Controllers

I wouldn’t tie the footsteps to the character controller directly. What I would do is probably go into your walk animation, then add an animation event on each keyframe where the character’s foot touches the ground. Then I’d connect a function to those events that makes a footstep sound/effect every time the event fires

fair enough because i managed to get some code working with the character controller and was awfull… so i will probably do that ty

For some reason this method isnt working for me by now (since im using roblox animate script) though i edited it changed the anims by the ones with the events added the getreachedmarker signal thingy at line 267 but still nothing so idk what to do tbfr

i might replace it by a better one or custom coded one

Hi, this tutorial has been great help for me! but i was wondering if there was a way to completely remove the use of humanoids? as right now i’m not sure how to go about doing so.

Hi, nice tutorial!, one question, what’s the music you used in your movement demo 2 video?, it’s cool

GET ENUF by Hideki Naganuma!

<827393288374282828> (character limit)

Unfortunately there isnt really a good way to replace Humanoids without flaws (one of the biggest, if youre making client-client replicated humanoids, is the server cant physically see where the character is), however these flaws arent too big and the one I mentioned can be fixed using attributes.

I myself have designed a client-client replicated Humanoid alternative which anchors the HRP called FastHumanoid (however it doesnt deal with vertical and horizontal collisions too well because I forgot to give the character a collision hitbox :P), you can check out the source code if you don’t know where to start

Alright, i’ll probably have a look, thanks, i think i might just create a custom character controller so i can have more control over player movement, which is a crucial aspect of my game.

1 Like

im trying to make climbing work like the climbing state in humanoids with the controller manager’s ClimbController and ClimbSensor but i have no idea how to go about making this. I want to understate how did Humanoids detect ladder parts or truffel parts

local function updateControllerManagerSensor()
	local raycastParams = RaycastParams.new()
	raycastParams.FilterDescendantsInstances = {character} -- Character should not be included within things that the raycast can return
	raycastParams.FilterType = Enum.RaycastFilterType.Exclude

	local raycastToGround = workspace:Raycast(humanoidRootPart.Position, Vector3.new(0, -4.5, 0), raycastParams)

	if raycastToGround then -- Character is on the ground, raycast returned something
		groundSensor.SensedPart = raycastToGround.Instance
		groundSensor.HitNormal = raycastToGround.Normal
		groundSensor.HitFrame = CFrame.new(raycastToGround.Position)

		humanoid:ChangeState(Enum.HumanoidStateType.Running) -- Changing humanoid states so we have animations 
		controllerManager.ActiveController = groundController -- Switch the ActiveController to groundController. 
	else -- Character is midair, raycast didn't return anything
		humanoid:ChangeState(Enum.HumanoidStateType.Freefall) 
		controllerManager.ActiveController = airController
	end
	
	-- Define a constant for the multiplier in the raycast direction calculation
	local CLIMB_RAYCAST_MULTIPLIER = 2

	-- Define a function to calculate the raycast direction
	local function getRaycastDirection(humanoidRootPart)
		return (humanoidRootPart.CFrame.LookVector * CLIMB_RAYCAST_MULTIPLIER) + Vector3.new(0, 7.6, 0)
	end
	
	local raycastToLadder = workspace:Raycast(humanoidRootPart.Position, getRaycastDirection(humanoidRootPart), raycastParams)
	
	if raycastToLadder then -- Character is climbing a ladder, raycast returned something
		-- Handle the case where the raycast hit a ladder
		climbSensor.SensedPart = raycastToLadder.Instance
		climbSensor.HitNormal = raycastToLadder.Normal
		climbSensor.HitFrame = CFrame.new(raycastToLadder.Position)
		humanoid:ChangeState(Enum.HumanoidStateType.Climbing)
		controllerManager.ActiveController = climbController
		return
	else -- Character is not climbing
		climbSensor.SensedPart = nil
		controllerManager.ActiveController = groundController
		if humanoid:GetState() ~= Enum.HumanoidStateType.Jumping then
			humanoid:ChangeState(Enum.HumanoidStateType.Running)
		end

	end
end

basicly i want the climbController to do this:

but it does this:

i also want to add siting functionality as well because when the player sits a seat for VehicleSeat they get stuck and can’t jump out.

image

How would you increase jump height? BaseMoveSpeed modifies walk speed, but I can’t figure out a way to change the jump height.

You can increase the jump height by increasing the Y value of the jumpImpulse Vector3.

In this part of the code:

local function doJump(actionName, inputState)
    if actionName == "JUMP_ACTION" and inputState == Enum.UserInputState.Begin and humanoid:GetState() ~= Enum.HumanoidStateType.Ragdoll then
        local jumpImpulse = Vector3.new(0, 750, 0) -- Y is jump power. Change as you see fit.  

        controllerManager.RootPart:ApplyImpulse(jumpImpulse)
        
        humanoid:ChangeState(Enum.HumanoidStateType.Jumping) 
        
        local floor = controllerManager.GroundSensor.SensedPart
        if floor then -- Character's on the floor?  
            floor:ApplyImpulseAtPosition(-jumpImpulse, controllerManager.GroundSensor.HitNormal) -- Equal and opposite force  
        end
    end
end

The relevant part would be:

local jumpImpulse = Vector3.new(0, 750, 0)

This is where the jump force is being applied.

How about swimming? how do i activate swimming functionality

Hello, good tutorial.

Have you made any reliable methods for the “Landed” HumanoidStateType to work when character actually has landed, if yes would you mind sharing?

1 Like

Hello! When I was coding landing animations for my game, I used Humanoid.StateChanged. In particular, I checked for when the oldState was Freefall and the newState was Running. Then I simply changed the state to Landed.

Wonderful tutorial! I haven’t found alot like this in a while. I was just wondering:

Somebody already said how to detect player deaths and such previously on this thread. How can I respawn the player and stop the player from moving/controlling the character after death?

Made a full game which was only possible if this topic existed.

1 Like

You can do that by using the asset in roblox’s topic.

Now this is crazy impressive! Glad this topic was helpful

1 Like