помогите с скриптом

sibainuu

Member
30 Май 2025
1
0
1
У меня есть скрипт для ретро анимации (как в 2007 году), сама анимация работает корректно, но игровой персонаж летает по всей карте из-за того что каждую часть его тела тпхает на другую координату. Я пытался исправить этот "баг" заменив части тела на суставы, те leftArm -> leftShoulder и так же все остальное, но тогда анимация переставала работать, а перс переставал летать. Вот мой скрипт. Я буду очень благодарен если мне укажут на мою ошибку и подскажут что исправить. (первоначальная версия скрипта)

если что писал на Lua

local Players = game:GetService("Players")

local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")

-- Получаем части тела R6
local torso = character:WaitForChild("Torso")
local leftArm = character:WaitForChild("Left Arm")
local rightArm = character:WaitForChild("Right Arm")
local leftLeg = character:WaitForChild("Left Leg")
local rightLeg = character:WaitForChild("Right Leg")

local RunService = game:GetService("RunService")

local animationSpeed = 2 -- скорость анимации
local animationAmplitude = math.rad(15) -- амплитуда поворота в радианах

local time = 0

RunService.RenderStepped:Connect(function(deltaTime)
if humanoid.MoveDirection.Magnitude > 0 then
time = time + deltaTime * animationSpeed

-- Простая анимация ходьбы: руки и ноги качаются в противоположных фазах
leftArm.CFrame = torso.CFrame * CFrame.new(-1.5, 0.5, 0) * CFrame.Angles(math.sin(time) * animationAmplitude, 0, 0)
rightArm.CFrame = torso.CFrame * CFrame.new(1.5, 0.5, 0) * CFrame.Angles(-math.sin(time) * animationAmplitude, 0, 0)
leftLeg.CFrame = torso.CFrame * CFrame.new(-0.5, -1.5, 0) * CFrame.Angles(-math.sin(time) * animationAmplitude, 0, 0)
rightLeg.CFrame = torso.CFrame * CFrame.new(0.5, -1.5, 0) * CFrame.Angles(math.sin(time) * animationAmplitude, 0, 0)
else
-- Если персонаж стоит, возвращаем части тела в исходное положение
leftArm.CFrame = torso.CFrame * CFrame.new(-1.5, 0.5, 0)
rightArm.CFrame = torso.CFrame * CFrame.new(1.5, 0.5, 0)
leftLeg.CFrame = torso.CFrame * CFrame.new(-0.5, -1.5, 0)
rightLeg.CFrame = torso.CFrame * CFrame.new(0.5, -1.5, 0)
time = 0
end
end)
 

Dealer

Member
16 Июн 2025
6
0
1
У меня есть скрипт для ретро анимации (как в 2007 году), сама анимация работает корректно, но игровой персонаж летает по всей карте из-за того что каждую часть его тела тпхает на другую координату. Я пытался исправить этот "баг" заменив части тела на суставы, те leftArm -> leftShoulder и так же все остальное, но тогда анимация переставала работать, а перс переставал летать. Вот мой скрипт. Я буду очень благодарен если мне укажут на мою ошибку и подскажут что исправить. (первоначальная версия скрипта)

если что писал на Lua

local Players = game:GetService("Players")

local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")

-- Получаем части тела R6
local torso = character:WaitForChild("Torso")
local leftArm = character:WaitForChild("Left Arm")
local rightArm = character:WaitForChild("Right Arm")
local leftLeg = character:WaitForChild("Left Leg")
local rightLeg = character:WaitForChild("Right Leg")

local RunService = game:GetService("RunService")

local animationSpeed = 2 -- скорость анимации
local animationAmplitude = math.rad(15) -- амплитуда поворота в радианах

local time = 0

RunService.RenderStepped:Connect(function(deltaTime)
if humanoid.MoveDirection.Magnitude > 0 then
time = time + deltaTime * animationSpeed

-- Простая анимация ходьбы: руки и ноги качаются в противоположных фазах
leftArm.CFrame = torso.CFrame * CFrame.new(-1.5, 0.5, 0) * CFrame.Angles(math.sin(time) * animationAmplitude, 0, 0)
rightArm.CFrame = torso.CFrame * CFrame.new(1.5, 0.5, 0) * CFrame.Angles(-math.sin(time) * animationAmplitude, 0, 0)
leftLeg.CFrame = torso.CFrame * CFrame.new(-0.5, -1.5, 0) * CFrame.Angles(-math.sin(time) * animationAmplitude, 0, 0)
rightLeg.CFrame = torso.CFrame * CFrame.new(0.5, -1.5, 0) * CFrame.Angles(math.sin(time) * animationAmplitude, 0, 0)
else
-- Если персонаж стоит, возвращаем части тела в исходное положение
leftArm.CFrame = torso.CFrame * CFrame.new(-1.5, 0.5, 0)
rightArm.CFrame = torso.CFrame * CFrame.new(1.5, 0.5, 0)
leftLeg.CFrame = torso.CFrame * CFrame.new(-0.5, -1.5, 0)
rightLeg.CFrame = torso.CFrame * CFrame.new(0.5, -1.5, 0)
time = 0
end
end)
так это же легче делается, щас даже отдельный фрэйм для анимок есть, ее вплитаешь в локал скрипт, гайды все в инете
 

mAloy

Member
10 Сен 2025
7
0
1
Здарова! Прочитал твою проблему — это классика, все через это проходят. Ты правильно подумал насчет суставов, респект, что сам догадался.
Короче, в чем косяк:
Ты меняешь CFrame самих частей тела (leftArm.CFrame = ...). Это как если бы ты не рукой махал, а каждый кадр телепортировал её в новую точку космоса. Естественно, всего перса от этого начинает колбасить и рвать на части, потому что физика игры сходит с ума.
Как пофиксить:
Тебе нужно крутить не сами руки-ноги, а суставы, к которым они крепятся. В R6 это Motor6D. У них есть специальное свойство Transform, которое отвечает чисто за поворот.
Вот, я твой скрипт переписал. Он делает то же самое, но правильно — через суставы.

local player = game.Players.LocalPlayerlocal character = player.Character or player.CharacterAdded:Wait()local humanoid = character:WaitForChild("Humanoid")local torso = character:WaitForChild("Torso")-- Берем суставы, а не сами части телаlocal leftShoulder = torso:WaitForChild("Left Shoulder")local rightShoulder = torso:WaitForChild("Right Shoulder")local leftHip = torso:WaitForChild("Left Hip")local rightHip = torso:WaitForChild("Right Hip")local RunService = game:GetService("RunService")local time = 0RunService.RenderStepped:Connect(function(dt) -- Если перс бежит if humanoid.MoveDirection.Magnitude > 0 then time = time + dt * 8 -- сделал побыстрее, чтоб ретровее было -- Крутим суставы через .Transform leftShoulder.Transform = CFrame.Angles(math.sin(time) * 0.8, 0, 0) rightShoulder.Transform = CFrame.Angles(-math.sin(time) * 0.8, 0, 0) leftHip.Transform = CFrame.Angles(-math.sin(time) * 0.8, 0, 0) rightHip.Transform = CFrame.Angles(math.sin(time) * 0.8, 0, 0) else -- Если стоит, плавно возвращаем в ноль leftShoulder.Transform = leftShoulder.Transform:Lerp(CFrame.new(), 0.1) rightShoulder.Transform = rightShoulder.Transform:Lerp(CFrame.new(), 0.1) leftHip.Transform = leftHip.Transform:Lerp(CFrame.new(), 0.1) rightHip.Transform = rightHip.Transform:Lerp(CFrame.new(), 0.1) time = 0 endend)
Почему твой первый фикс не сработал:
Ты правильно заменил leftArm на leftShoulder, но продолжил писать leftShoulder.CFrame. А у сустава нет CFrame, у него как раз для этого и есть Transform.
Так что да, ты был в одном шаге от решения. Просто используй Transform вместо CFrame для суставов, и все будет чики-пуки.