Hello fellow devs. I've run into something. I wrote this script which handles moving of part perfectly like , but I don't take turning into account.
-- Made By GooierApollo664 -- 11/07/2019 -- Services local UserInputService = game:GetService("UserInputService") local Players = game:GetService("Players") -- Variables local Heli = script.Parent.Parent local GyroScope = script.Parent local Thrust = Heli:FindFirstChild("BodyThrust") local Reaction = Heli:FindFirstChild("BodyReaction") local Force = Heli:FindFirstChild("BodyForce") -- Physics Variables local m = Heli:GetMass() local g = workspace.Gravity local cf = CFrame.new() local vector = Vector3.new() -- Other local enum = Enum.KeyCode -- Movement Table local Movement = {[tostring(enum.T)] = CFrame.Angles(0, 0, math.rad(20)), [tostring(enum.F)] = CFrame.Angles(math.rad(10), 0, 0), [tostring(enum.H)] = CFrame.Angles(math.rad(-10), 0, 0), [tostring(enum.G)] = CFrame.Angles(0, 0, math.rad(-20)), [tostring(enum.Y)] = Vector3.new(0, 100, 0), [tostring(enum.R)] = Vector3.new(0, -100, 0) } -- Constants local Keys = {[tostring(enum.T)] = cf, [tostring(enum.F)] = cf, [tostring(enum.G)] = cf, [tostring(enum.H)] = cf, [tostring(enum.Y)] = vector, [tostring(enum.R)] = vector } -- The loop game:GetService("RunService").Stepped:Connect(function() local W = Keys[tostring(enum.T)] local A = Keys[tostring(enum.F)] local D = Keys[tostring(enum.G)] local S = Keys[tostring(enum.H)] local Y = Keys[tostring(enum.Y)] local R = Keys[tostring(enum.R)] -- Gravity work Thrust.Force = Vector3.new(0, 2*m*g, 0) Reaction.Force = -Vector3.new(0, m*g, 0) Heli.Velocity = Heli.Velocity - Heli.Velocity/10 -- adding Force values Force.Force = R + Y GyroScope.CFrame = W * A * S * D end) UserInputService.InputBegan:Connect(function(input) Keys[tostring(input.KeyCode)] = Movement[tostring(input.KeyCode)] end) UserInputService.InputEnded:Connect(function(input) Keys[tostring(input.KeyCode)] = cf end)
https://gyazo.com/3b81764428846bf1bf6ebf1d26342a7b
So I added few things to this code to make it turn using BodyAngularVelocity.
local AngularVelocity = Heli:FindFirstChild("BodyAngularVelocity") -- Physics Variables local m = Heli:GetMass() local g = workspace.Gravity local cf = CFrame.new() local vector = Vector3.new() -- Other local enum = Enum.KeyCode -- Movement Table local Movement = {-- leaning Forward, Left, Right and back [tostring(enum.T)] = {CFrame.Angles(0, 0, math.rad(-20)), Vector3.new(0,(m*g)/27, 0)}, [tostring(enum.R)] = {CFrame.Angles(math.rad(10), 0, 0), Vector3.new(0,(m*g)/67, 0)}, [tostring(enum.Y)] = {CFrame.Angles(math.rad(-10), 0, 0), Vector3.new(0,(m*g)/67, 0)}, [tostring(enum.G)] = {CFrame.Angles(0, 0, math.rad(20)), Vector3.new(0,(m*g)/17,0)}, -- Left And Right turn with angular velocity [tostring(enum.H)] = {Vector3.new(0, -2, 0), 0}, [tostring(enum.F)] = {Vector3.new(0,2, 0), 0}, -- Up and Down [tostring(enum.J)] = {Vector3.new(0, 100, 0), 0}, [tostring(enum.LeftShift)] = {Vector3.new(0, -100, 0), 0} } local Keys = {-- leaning Forward, Left, Right and back [tostring(enum.T)] = {cf, vector}, [tostring(enum.R)] = {cf, vector}, [tostring(enum.Y)] = {cf, vector}, [tostring(enum.G)] = {cf, vector}, -- Left And Right turn with angular velocity [tostring(enum.H)] = {vector, vector}, [tostring(enum.F)] = {vector, vector}, -- -- Up and Down [tostring(enum.J)] = {vector, vector}, [tostring(enum.LeftShift)] = {vector, vector} } -- Constants local Nulls = {-- leaning Forward, Left, Right and back [tostring(enum.T)] = {cf, vector}, [tostring(enum.R)] = {cf, vector}, [tostring(enum.Y)] = {cf, vector}, [tostring(enum.G)] = {cf, vector}, -- Left And Right turn with angular velocity [tostring(enum.F)] = {vector, vector}, [tostring(enum.H)] = {vector, vector}, -- Up and Down [tostring(enum.J)] = {vector, vector}, [tostring(enum.LeftShift)] = {vector, vector} } -- The loop game:GetService("RunService").Stepped:Connect(function() local Position = Heli.Position local dir = Heli.CFrame.LookVector local W = Keys[tostring(enum.T)] local A = Keys[tostring(enum.F)] local S = Keys[tostring(enum.G)] local D = Keys[tostring(enum.H)] local Y = Keys[tostring(enum.Y)] local R = Keys[tostring(enum.R)] local J = Keys[tostring(enum.J)] local Shift = Keys[tostring(enum.LeftShift)] -- Reaction Force Thrust.Force = Vector3.new(0, 2*m*g, 0) Reaction.Force = -Vector3.new(0, m*g, 0) -- Friction/Resistance Heli.Velocity = Heli.Velocity - Heli.Velocity/10 -- adding Force/CFrame values AngularVelocity.AngularVelocity = A[1] + D[1] Force.Force = J[1] + Shift[1] + W[2] + S[2] + R[2] + Y[2] GyroScope.CFrame = W[1] * S[1] * R[1] * Y[1] end) UserInputService.InputBegan:Connect(function(input) Keys[tostring(input.KeyCode)] = Movement[tostring(input.KeyCode)] end) UserInputService.InputEnded:Connect(function(input) Keys[tostring(input.KeyCode)] = Nulls[tostring(input.KeyCode)] end)
https://gyazo.com/af5d7a647b6b5968c30082a264119ba2
Here I added another Table to hold nulls, that I call values which should be applied when helicopter is stopped(or no key is pressed, to be precise). The problem I have to solve, is that I should rotate Gyro based on lookVector and constantly update it, but I have trouble figuring out how to do it with this code. I came up with this solution
function Cframe(x, z) if x or z then return CFrame.Angles(x, 0, z) else return CFrame.Angles(0, 0, 0) end end
this is the function I made which would replace cframe.Angles in tables.
local Movement = {-- leaning Forward, Left, Right and back [tostring(enum.T)] = {Cframe, Vector3.new(0,(m*g)/27, 0)}, [tostring(enum.R)] = {Cframe, Vector3.new(0,(m*g)/67, 0)}, [tostring(enum.Y)] = {Cframe, Vector3.new(0,(m*g)/67, 0)}, [tostring(enum.G)] = {Cframe, Vector3.new(0,(m*g)/17,0)}, -- Left And Right [tostring(enum.H)] = {Vector3.new(0, -2, 0), 0}, [tostring(enum.F)] = {Vector3.new(0,2, 0), 0}, -- Up and Down [tostring(enum.J)] = {Vector3.new(0, 100, 0), 0}, [tostring(enum.LeftShift)] = {Vector3.new(0, -100, 0), 0} } local Keys = {-- leaning Forward, Left, Right and back [tostring(enum.T)] = {cf, vector}, [tostring(enum.R)] = {cf, vector}, [tostring(enum.Y)] = {cf, vector}, [tostring(enum.G)] = {cf, vector}, -- Left And Right turn with angular velocity [tostring(enum.H)] = {vector, vector}, [tostring(enum.F)] = {vector, vector}, -- -- Up and Down [tostring(enum.J)] = {vector, vector}, [tostring(enum.LeftShift)] = {vector, vector} } -- Constants local Nulls = {-- leaning Forward, Left, Right and back [tostring(enum.T)] = {cf, vector}, [tostring(enum.R)] = {cf, vector}, [tostring(enum.Y)] = {cf, vector}, [tostring(enum.G)] = {cf, vector}, -- Left And Right turn with angular velocity [tostring(enum.F)] = {vector, vector}, [tostring(enum.H)] = {vector, vector}, -- Up and Down [tostring(enum.J)] = {vector, vector}, [tostring(enum.LeftShift)] = {vector, vector} } local dir = heli.CFrame.LookVector local W = Keys[tostring(enum.T)] local S = Keys[tostring(enum.G)] local Y = Keys[tostring(enum.Y)] local R = Keys[tostring(enum.R)] GyroScope.CFrame = W[1](-(dir.X), -(dir.Z)) * S[1](dir.X, dir.Z) * R[1] * Y[1] UserInputService.InputBegan:Connect(function(input) Keys[tostring(input.KeyCode)] = Movement[tostring(input.KeyCode)] end) UserInputService.InputEnded:Connect(function(input) Keys[tostring(input.KeyCode)] = Nulls[tostring(input.KeyCode)] end)
The problem with this is, that if I release W key or S Key, in Nulls Table first element is just CFrame.new() so passing arguments like that is not possible.
Maybe there's some methods I don't know(which there clearly are), or I'm missing something obvious. Note:I use T, R, Y, G, H, F and J keys in tables, because they are not available in studio Run test mode.