feat(wiki): LangTabs во все 5 статей раздела E (Движение и анимация)

E1 Управление игроком: setSpeed-множитель vs Humanoid.WalkSpeed
E2 Анимации: playAnimation vs Animator:LoadAnimation
E3 Твины: game.tween vs TweenService (TweenInfo + Create + Play)
E4 Спавн/удаление: game.scene.spawn vs Instance.new + Destroy/Debris
E5 Перемещение: game.scene.move vs .Position/CFrame

Lua-примеры стандартного Roblox-стиля: workspace:WaitForChild,
Vector3.new, Enum.PartType, BrickColor.new, Debris service.
This commit is contained in:
min 2026-06-09 02:39:36 +03:00
parent 22881f5176
commit c6899c0528

View File

@ -1805,23 +1805,40 @@ end)`}</Code>}
title: 'E1. Управление игроком: скорость, прыжок, гравитация', title: 'E1. Управление игроком: скорость, прыжок, гравитация',
body: ( body: (
<> <>
<p> <p>Скриптом можно менять, как двигается игрок.</p>
Скриптом можно менять, как двигается игрок. Эти команды <LangTabs
принимают <b>множитель</b>: 1 обычно, 2 в два раза js={<>
сильнее, 0.5 в два раза слабее. <p>В JS используем команды-«множители»: 1 обычно,
</p> 2 в два раза сильнее, 0.5 в два раза слабее.</p>
<table className="docTable"> <table className="docTable">
<tbody> <tbody>
<tr><td><code>setSpeed(mul)</code></td><td>скорость бега</td></tr> <tr><td><code>game.player.setSpeed(mul)</code></td><td>скорость бега</td></tr>
<tr><td><code>setJumpPower(mul)</code></td><td>сила прыжка</td></tr> <tr><td><code>game.player.setJumpPower(mul)</code></td><td>сила прыжка</td></tr>
<tr><td><code>setGravityMul(mul)</code></td><td>сила притяжения</td></tr> <tr><td><code>game.player.setGravityMul(mul)</code></td><td>сила притяжения</td></tr>
<tr><td><code>setDoubleJump(true)</code></td><td>разрешить двойной прыжок</td></tr> <tr><td><code>game.player.setDoubleJump(true)</code></td><td>двойной прыжок</td></tr>
<tr><td><code>teleport(x,y,z)</code></td><td>мгновенно переставить</td></tr> <tr><td><code>game.player.teleport(x,y,z)</code></td><td>мгновенно переставить</td></tr>
</tbody> </tbody>
</table> </table>
</>}
lua={<>
<p>В Lua скорость и прыжок это <b>прямые значения</b>
в Humanoid (не множители). По умолчанию WalkSpeed=16,
JumpPower=50.</p>
<table className="docTable">
<tbody>
<tr><td><code>humanoid.WalkSpeed = 32</code></td><td>скорость (16 = норма)</td></tr>
<tr><td><code>humanoid.JumpPower = 80</code></td><td>сила прыжка (50 = норма)</td></tr>
<tr><td><code>workspace.Gravity = 100</code></td><td>гравитация (196 = норма)</td></tr>
<tr><td><code>humanoid:ChangeState(Enum.HumanoidStateType.Jumping)</code></td><td>прыгнуть</td></tr>
<tr><td><code>hrp.CFrame = CFrame.new(x,y,z)</code></td><td>телепорт</td></tr>
</tbody>
</table>
</>}
/>
<p>Пример «зелье скорости» при касании сферы:</p> <p>Пример «зелье скорости» при касании сферы:</p>
<ScriptKind kind="object" on="сфера-зелье" /> <ScriptKind kind="object" on="сфера-зелье" />
<Code>{`game.self.onTouch(() => { <LangTabs
js={<Code>{`game.self.onTouch(() => {
// ускоряем игрока в 2 раза // ускоряем игрока в 2 раза
game.player.setSpeed(2); game.player.setSpeed(2);
game.ui.showText('Скорость x2 на 5 секунд!', 2); game.ui.showText('Скорость x2 на 5 секунд!', 2);
@ -1834,11 +1851,29 @@ end)`}</Code>}
game.after(5, () => { game.after(5, () => {
game.player.setSpeed(1); game.player.setSpeed(1);
}); });
});`}</Code> });`}</Code>}
lua={<Code>{`local part = script.Parent
part.Touched:Connect(function(hit)
local humanoid = hit.Parent:FindFirstChild("Humanoid")
if not humanoid then return end
-- ускоряем игрока в 2 раза (16 32)
humanoid.WalkSpeed = 32
print("Скорость x2 на 5 секунд!")
-- зелье исчезает
part:Destroy()
-- через 5 секунд скорость обратно норма
task.delay(5, function()
humanoid.WalkSpeed = 16
end)
end)`}</Code>}
/>
<Note> <Note>
Не забывай возвращать скорость обратно командой Не забывай возвращать скорость обратно. Иначе игрок
<code> setSpeed(1)</code>. Иначе игрок останется быстрым останется быстрым навсегда а это может сломать твой уровень.
навсегда а это может сломать твой уровень.
</Note> </Note>
</> </>
), ),
@ -1848,21 +1883,47 @@ end)`}</Code>}
title: 'E2. Анимации-эмоции персонажа', title: 'E2. Анимации-эмоции персонажа',
body: ( body: (
<> <>
<p> <p>Персонаж умеет показывать эмоции.</p>
Персонаж умеет показывать эмоции. Команда <LangTabs
<code> game.player.playAnimation(имя)</code> проигрывает js={<p>
анимацию: <code>'wave'</code> (помахать), Команда <code>game.player.playAnimation(имя)</code> проигрывает
<code> 'dance'</code> (танец), <code>'cheer'</code> анимацию: <code>'wave'</code> (помахать),
(радость), <code>'sit'</code> (сесть). <code> 'dance'</code> (танец), <code>'cheer'</code>
</p> (радость), <code>'sit'</code> (сесть).
</p>}
lua={<p>
В Lua анимации проигрываются через Animator на Humanoid'е.
Roblox-стиль: создать Animation-объект, вызвать
<code> Animator:LoadAnimation(anim)</code>,
потом <code>track:Play()</code>.
</p>}
/>
<ScriptKind kind="global" /> <ScriptKind kind="global" />
<Code>{`// При победе персонаж радуется <LangTabs
js={<Code>{`// При победе персонаж радуется
game.player.playAnimation('cheer'); game.player.playAnimation('cheer');
// Через 3 секунды перестать // Через 3 секунды перестать
game.after(3, () => { game.after(3, () => {
game.player.stopAnimation(); game.player.stopAnimation();
});`}</Code> });`}</Code>}
lua={<Code>{`local Players = game:GetService("Players")
local player = Players.LocalPlayer
local humanoid = player.Character:WaitForChild("Humanoid")
local animator = humanoid:FindFirstChildOfClass("Animator")
-- Создаём анимацию (упрощённый шаблон в реальности нужен AnimationId)
local anim = Instance.new("Animation")
-- anim.AnimationId = "rbxassetid://..." -- свой Animation ID
local track = animator:LoadAnimation(anim)
track:Play()
-- Через 3 секунды перестать
task.delay(3, function()
track:Stop()
end)`}</Code>}
/>
</> </>
), ),
}, },
@ -1873,13 +1934,14 @@ game.after(3, () => {
<> <>
<p> <p>
<b>Твин</b> это плавное изменение чего-либо за время. <b>Твин</b> это плавное изменение чего-либо за время.
Если просто переставить объект командой <code>move</code> Если просто переставить объект он телепортируется рывком.
он телепортируется рывком. А твин <b>плавно</b> доедет А твин <b>плавно</b> доедет из точки в точку.
из точки в точку.
</p> </p>
<p>Команда: <code>game.tween(объект, что менять, настройки)</code></p>
<ScriptKind kind="global" /> <ScriptKind kind="global" />
<Code>{`// Находим платформу-лифт по имени <LangTabs
js={<>
<p>Команда: <code>game.tween(объект, что менять, настройки)</code></p>
<Code>{`// Находим платформу-лифт по имени
const lift = game.scene.findOne('Лифт'); const lift = game.scene.findOne('Лифт');
// Платформа за 2 секунды плавно поднимается на высоту 10 // Платформа за 2 секунды плавно поднимается на высоту 10
@ -1887,27 +1949,65 @@ game.tween(lift, { y: 10 }, {
duration: 2, // длительность в секундах duration: 2, // длительность в секундах
easing: 'ease' // характер движения easing: 'ease' // характер движения
});`}</Code> });`}</Code>
<p> <p><b>Полезные настройки твина:</b></p>
Твином можно менять позицию (<code>x, y, z</code>), <table className="docTable">
поворот, размер, цвет, прозрачность. <tbody>
</p> <tr><td><code>duration</code></td><td>сколько секунд длится</td></tr>
<p><b>Полезные настройки твина:</b></p> <tr><td><code>easing</code></td><td>'linear' / 'ease' / 'bounce'</td></tr>
<table className="docTable"> <tr><td><code>repeat</code></td><td>сколько раз повторить</td></tr>
<tbody> <tr><td><code>yoyo: true</code></td><td>двигаться туда-обратно</td></tr>
<tr><td><code>duration</code></td><td>сколько секунд длится</td></tr> <tr><td><code>onDone</code></td><td>что сделать, когда твин закончится</td></tr>
<tr><td><code>easing</code></td><td>'linear' (ровно), 'ease' (плавно), 'bounce' (с отскоком)</td></tr> </tbody>
<tr><td><code>repeat</code></td><td>сколько раз повторить</td></tr> </table>
<tr><td><code>yoyo: true</code></td><td>двигаться туда-обратно</td></tr> <Code>{`// Платформа вечно ездит вверх-вниз
<tr><td><code>onDone</code></td><td>что сделать, когда твин закончится</td></tr>
</tbody>
</table>
<Code>{`// Платформа вечно ездит вверх-вниз
const plat = game.scene.findOne('Качалка'); const plat = game.scene.findOne('Качалка');
game.tween(plat, { y: 8 }, { game.tween(plat, { y: 8 }, {
duration: 2, duration: 2,
yoyo: true, // обратно вниз yoyo: true,
repeat: 999 // повторять почти бесконечно repeat: 999
});`}</Code> });`}</Code>
</>}
lua={<>
<p>В Lua используется <b>TweenService</b> встроенный
сервис Roblox-стиля. Создаёшь TweenInfo и Tween, вызываешь Play.</p>
<Code>{`local TweenService = game:GetService("TweenService")
-- Находим платформу-лифт по имени
local lift = workspace:WaitForChild("Лифт")
-- Настройка анимации: 2 сек, плавно
local info = TweenInfo.new(2, Enum.EasingStyle.Quad)
-- Что менять: новая Position (поднимаем на 10 вверх)
local goal = { Position = lift.Position + Vector3.new(0, 10, 0) }
-- Создаём и запускаем твин
local tween = TweenService:Create(lift, info, goal)
tween:Play()`}</Code>
<p><b>Полезные настройки TweenInfo:</b></p>
<table className="docTable">
<tbody>
<tr><td>1-й арг секунды</td><td>сколько длится</td></tr>
<tr><td>EasingStyle</td><td>Linear / Quad / Bounce / Elastic</td></tr>
<tr><td>EasingDirection</td><td>In / Out / InOut</td></tr>
<tr><td>repeatCount</td><td>сколько раз повторить (-1 = бесконечно)</td></tr>
<tr><td>reverses</td><td>true = туда-обратно</td></tr>
<tr><td>tween.Completed:Connect</td><td>событие «закончен»</td></tr>
</tbody>
</table>
<Code>{`-- Платформа вечно ездит вверх-вниз
local plat = workspace:WaitForChild("Качалка")
local info = TweenInfo.new(
2, -- секунды
Enum.EasingStyle.Quad, -- плавно
Enum.EasingDirection.InOut,
-1, -- бесконечно
true -- туда-обратно
)
local goal = { Position = plat.Position + Vector3.new(0, 8, 0) }
TweenService:Create(plat, info, goal):Play()`}</Code>
</>}
/>
</> </>
), ),
}, },
@ -1918,33 +2018,60 @@ game.tween(plat, { y: 8 }, {
<> <>
<p> <p>
<b>Спавн</b> создание нового объекта прямо во время игры. <b>Спавн</b> создание нового объекта прямо во время игры.
Команда <code>game.scene.spawn(тип, настройки)</code>:
</p> </p>
<ScriptKind kind="global" /> <ScriptKind kind="global" />
<Code>{`// Создаём золотую монетку-сферу <LangTabs
js={<>
<p>Команда <code>game.scene.spawn(тип, настройки)</code>:</p>
<Code>{`// Создаём золотую монетку-сферу
const coin = game.scene.spawn('primitive:sphere', { const coin = game.scene.spawn('primitive:sphere', {
x: 5, y: 1, z: 0, // где появится x: 5, y: 1, z: 0, // где появится
color: '#ffd700' // золотой цвет color: '#ffd700' // золотой цвет
}); });
game.log('Создали монетку, её адрес:', coin);`}</Code> game.log('Создали монетку, её адрес:', coin);`}</Code>
<p> <p>
Тип бывает <code>'block:трава'</code>, Тип бывает <code>'block:трава'</code>,
<code> 'primitive:cube'</code>, <code>'model:tree'</code>. <code> 'primitive:cube'</code>, <code>'model:tree'</code>.
Команда <b>возвращает ref</b> это «адрес» объекта, Команда <b>возвращает ref</b> «адрес» объекта,
по которому к нему можно обращаться (двигать, удалять). по которому к нему можно обращаться.
</p> </p>
<p><b>Удаление объекта:</b></p> <p><b>Удаление объекта:</b></p>
<Code>{`// удалить сразу <Code>{`game.scene.delete(coin); // сразу
game.scene.delete(coin); game.scene.deleteAfter(coin, 3); // через 3 секунды`}</Code>
<Note>
Запоминай <code>ref</code> в переменную. Без адреса
ты потом не сможешь объект ни подвинуть, ни удалить.
</Note>
</>}
lua={<>
<p>Команда <code>Instance.new("Part")</code> создаёт новый Part:</p>
<Code>{`-- Создаём золотую монетку-сферу
local coin = Instance.new("Part")
coin.Shape = Enum.PartType.Ball
coin.Size = Vector3.new(1, 1, 1)
coin.Position = Vector3.new(5, 1, 0)
coin.BrickColor = BrickColor.new("Bright yellow")
coin.Anchored = true
coin.Parent = workspace
// удалить через 3 секунды print("Создали монетку:", coin)`}</Code>
game.scene.deleteAfter(coin, 3);`}</Code> <p>
<Note> Чтобы объект появился в игре обязательно ставь
Запоминай <code>ref</code> в переменную (<code>let coin <code> .Parent = workspace</code>.
= ...</code>). Без адреса ты потом не сможешь объект <code> Anchored = true</code> чтобы не падал.
ни подвинуть, ни удалить. </p>
</Note> <p><b>Удаление объекта:</b></p>
<Code>{`coin:Destroy() -- сразу
-- через 3 секунды
game:GetService("Debris"):AddItem(coin, 3)`}</Code>
<Note>
Сохраняй ссылку на объект в переменную (<code>local coin = ...</code>).
Без неё ты потом не сможешь объект ни подвинуть, ни удалить.
</Note>
</>}
/>
</> </>
), ),
}, },
@ -1954,20 +2081,38 @@ game.scene.deleteAfter(coin, 3);`}</Code>
body: ( body: (
<> <>
<p>Передвинуть объект скриптом можно несколькими способами:</p> <p>Передвинуть объект скриптом можно несколькими способами:</p>
<table className="docTable"> <LangTabs
<tbody> js={<table className="docTable">
<tr><td><code>game.scene.move(ref,x,y,z)</code></td><td>мгновенно переставить</td></tr> <tbody>
<tr><td><code>game.scene.rotate(ref,угол)</code></td><td>повернуть</td></tr> <tr><td><code>game.scene.move(ref,x,y,z)</code></td><td>мгновенно переставить</td></tr>
<tr><td><code>game.self.move(x,y,z)</code></td><td>скрипт двигает сам себя</td></tr> <tr><td><code>game.scene.rotate(ref,угол)</code></td><td>повернуть</td></tr>
<tr><td><code>game.tween(...)</code></td><td>плавное перемещение (E3)</td></tr> <tr><td><code>game.self.move(x,y,z)</code></td><td>скрипт двигает сам себя</td></tr>
</tbody> <tr><td><code>game.tween(...)</code></td><td>плавное перемещение (E3)</td></tr>
</table> </tbody>
</table>}
lua={<table className="docTable">
<tbody>
<tr><td><code>part.Position = Vector3.new(x,y,z)</code></td><td>мгновенно переставить</td></tr>
<tr><td><code>part.CFrame = part.CFrame * CFrame.Angles(0, math.rad(45), 0)</code></td><td>повернуть</td></tr>
<tr><td><code>script.Parent.Position = ...</code></td><td>скрипт двигает сам себя</td></tr>
<tr><td><code>TweenService:Create(...)</code></td><td>плавное перемещение (E3)</td></tr>
</tbody>
</table>}
/>
<p>Пример дверь уезжает вверх и освобождает проход:</p> <p>Пример дверь уезжает вверх и освобождает проход:</p>
<ScriptKind kind="global" /> <ScriptKind kind="global" />
<Code>{`const door = game.scene.findOne('Дверь'); <LangTabs
js={<Code>{`const door = game.scene.findOne('Дверь');
// плавно поднимаем дверь на 6 единиц вверх // плавно поднимаем дверь на 6 единиц вверх
game.tween(door, { y: 6 }, { duration: 1 });`}</Code> game.tween(door, { y: 6 }, { duration: 1 });`}</Code>}
lua={<Code>{`local TweenService = game:GetService("TweenService")
local door = workspace:WaitForChild("Дверь")
-- плавно поднимаем дверь на 6 единиц вверх
local goal = { Position = door.Position + Vector3.new(0, 6, 0) }
TweenService:Create(door, TweenInfo.new(1), goal):Play()`}</Code>}
/>
</> </>
), ),
}, },