feat: 50 игр на Lua + импорт Roblox для всех + поддержка Lua в плеере #39
@ -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>}
|
||||||
|
/>
|
||||||
</>
|
</>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user