I’m trying to move a character using BodyPosition but its only moving along the X, Y, Z axis and not diagonally etc… Can i somehow use BodyPosition and move my character diagonally?
What do you mean by diagonally, do you mean rotation?
Yes im changing the character’s rotation but the position is still moving along the X, Y, Z axis i was wondering if i could make it so the player could move freely without having to stick on these
Do you have any code to show what you’re doing?
I’m making a custom humanoid specifically for my game here’s the code…
I wanted to make it so the position moves relatively to the part’s rotation
Ah, I see what’s going on. I think that’s because you have the force of two axis instead of one when going diagonal. The issue is that you’re fighting against the BodyPosition instead of using it to move the character I think.
Also yes, you can use CFrame as long as you convert to a Vector3 when using BodyPosition .
So to fix that issue, should i use bodyforce instead of bodyposition?
I meant BodyPosition, but BodyForce can be used too. BodyVelocity is probably better than either for your application. But I forget if MoveVector is relative or not. If it isn’t, then BodyVelocity ill work perfectly. Otherwise, you’ll have to adjust for that.
Thanks alot, ill try doing what you said converting cframes into vector3 then executing that.
If you still need help, I decided to give it a shot myself:
local walkSpeed = 16
local T = game:GetService('TweenService')
function tween(o,t,l,s,d)
s = s or Enum.EasingStyle.Linear
d = d or Enum.EasingDirection.InOut
local i = TweenInfo.new(l,s,d)
return T:Create(o,i,t)
end
local UI = game:GetService('UserInputService')
local P = game:GetService('Players')
local p = P.LocalPlayer
local force = Instance.new('BodyVelocity')
force.MaxForce = Vector3.new(math.huge,0,math.huge)
force.Velocity = Vector3.new()
local character = script.Parent
local root = character:WaitForChild('HumanoidRootPart')
local control = require(p:WaitForChild('PlayerScripts'):WaitForChild('PlayerModule')):GetControls()
local humanoid = character:WaitForChild('Humanoid')
local cam = workspace.CurrentCamera
humanoid.WalkSpeed = 0
force.Parent = root
game:GetService('RunService').Stepped:Connect(function()
local rotation = table.pack(cam.CFrame:ToOrientation())
local moveVector = control:GetMoveVector()
local cframe = CFrame.new(root.Position) * CFrame.Angles(0,rotation[2],0) * CFrame.new(moveVector)
local vector = cframe.Position - root.Position
local speed = (walkSpeed / (math.abs(moveVector.X) + math.abs(moveVector.Z))) * 1.4
local look = CFrame.new(root.Position,cframe.Position)
local lookRotation = table.pack(look:ToOrientation())
if lookRotation[2] == lookRotation[2] and moveVector.magnitude > 0 then
task.spawn(function()
local rotTween = tween(root,{CFrame = CFrame.new(root.Position) * CFrame.Angles(0,lookRotation[2],0)},0.075)
rotTween:Play()
task.wait(0.025)
rotTween:Pause()
end)
end
force.Velocity = vector * math.clamp(speed,0,walkSpeed)
end)
That would go in StarterCharacterScripts. I essentially recreated the normal movement feel as best as I could, excluding the jump. But that should be easy enough to add if needed.