
KeylessUniversal

local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
-- переменные для обновления
local humanoid
local hrp
local camera = workspace.CurrentCamera
-- ======================= НАСТРОЙКИ =======================
local KEY = Enum.KeyCode.Z
local SETTINGS = {
MOVE_SPEED = 40,
JUMP_POWER = 60,
TRAIL_INTERVAL = 0.12,
FALL_ACCEL = 196,
MAX_FALL_SPEED = 80,
}
local PROJ_SETTINGS = {
SIZE = Vector3.new(2, 5, 1),
COLOR = Color3.fromRGB(180, 70, 255),
MATERIAL = Enum.Material.Neon,
}
local TRAIL_SETTINGS = {
SIZE = Vector3.new(2, 5, 1),
COLOR = Color3.fromRGB(150, 50, 200),
MATERIAL = Enum.Material.Neon,
}
-- ======================= ПЕРЕМЕННЫЕ =======================
local isActive = false
local projPart = nil
local trailTimer = 0
local savedPositions = {}
local savedTrails = {}
local velocityY = 0
local canJump = true
-- обновить ссылки на Humanoid и HRP
local function setupCharacter(char)
character = char
humanoid = char:WaitForChild("Humanoid")
hrp = char:WaitForChild("HumanoidRootPart")
end
setupCharacter(character)
-- отслеживаем респавн
player.CharacterAdded:Connect(function(char)
setupCharacter(char)
-- если способность была активна — завершить её корректно
if isActive then
endProjection()
end
end)
-- создаёт физическую часть для проекции
local function createProjPart(cframe)
local p = Instance.new("Part", workspace)
p.Size = PROJ_SETTINGS.SIZE
p.CFrame = cframe
p.Anchored = false
p.CanCollide = true
p.Material = PROJ_SETTINGS.MATERIAL
p.Color = PROJ_SETTINGS.COLOR
p.CustomPhysicalProperties = PhysicalProperties.new(0.5,0.3,0.5)
p.Name = "ProjectionPart"
return p
end
-- создаёт визуальный след (часть)
local function createTrail(cframe)
local t = Instance.new("Part", workspace)
t.Size = TRAIL_SETTINGS.SIZE
t.CFrame = cframe
t.Anchored = true
t.CanCollide = false
t.Material = TRAIL_SETTINGS.MATERIAL
t.Color = TRAIL_SETTINGS.COLOR
t.Name = "ProjectionTrail"
table.insert(savedTrails, t)
return t
end
-- начало способности
function startProjection()
if isActive then return end
if not humanoid or not hrp then return end
isActive = true
trailTimer = 0
velocityY = 0
canJump = true
savedPositions = {}
savedTrails = {}
humanoid.WalkSpeed = 0
humanoid.JumpPower = 0
hrp.Anchored = true
projPart = createProjPart(hrp.CFrame)
end
-- конец способности
function endProjection()
if not isActive then return end
isActive = false
if projPart then
for _, cf in ipairs(savedPositions) do
if hrp then
hrp.CFrame = cf
task.wait(0.03)
end
end
end
if humanoid and hrp then
humanoid.WalkSpeed = 16
humanoid.JumpPower = 50
hrp.Anchored = false
end
if projPart then
projPart:Destroy()
projPart = nil
end
for _, trailPart in ipairs(savedTrails) do
if trailPart and trailPart.Parent then
trailPart:Destroy()
end
end
savedTrails = {}
savedPositions = {}
end
-- ввод
UserInputService.InputBegan:Connect(function(input, gp)
if gp then return end
if input.KeyCode == KEY then
startProjection()
end
end)
UserInputService.InputEnded:Connect(function(input, gp)
if gp then return end
if input.KeyCode == KEY then
endProjection()
end
end)
-- главный цикл
RunService.Heartbeat:Connect(function(delta)
if not isActive or not projPart then return end
local look = camera.CFrame.LookVector
local right = camera.CFrame.RightVector
local moveVec = Vector3.new()
if UserInputService:IsKeyDown(Enum.KeyCode.W) then
moveVec = moveVec + Vector3.new(look.X, 0, look.Z)
end
if UserInputService:IsKeyDown(Enum.KeyCode.S) then
moveVec = moveVec - Vector3.new(look.X, 0, look.Z)
end
if UserInputService:IsKeyDown(Enum.KeyCode.A) then
moveVec = moveVec - Vector3.new(right.X, 0, right.Z)
end
if UserInputService:IsKeyDown(Enum.KeyCode.D) then
moveVec = moveVec + Vector3.new(right.X, 0, right.Z)
end
if moveVec.Magnitude > 0 then
moveVec = moveVec.Unit * SETTINGS.MOVE_SPEED
end
if UserInputService:IsKeyDown(Enum.KeyCode.Space) and canJump then
velocityY = SETTINGS.JUMP_POWER
canJump = false
end
velocityY = velocityY - SETTINGS.FALL_ACCEL * delta
if velocityY < -SETTINGS.MAX_FALL_SPEED then
velocityY = -SETTINGS.MAX_FALL_SPEED
end
local newPos = projPart.Position + Vector3.new(moveVec.X * delta, velocityY * delta, moveVec.Z * delta)
projPart.CFrame = CFrame.new(newPos)
if projPart.Position.Y <= (hrp and hrp.Position.Y or 0) + 0.1 then
velocityY = 0
canJump = true
end
trailTimer = trailTimer + delta
if trailTimer >= SETTINGS.TRAIL_INTERVAL then
table.insert(savedPositions, projPart.CFrame)
createTrail(projPart.CFrame)
trailTimer = 0
end
end)



Can you make a mobile gui? I really like it but when i use keyboards i just freeze and cant move so thats why im asking