feat(wiki): LangTabs в C3 и C4 (GUI оживление, поле ввода)

C3 кнопка: game.gui.onClick vs MouseButton1Click + PlayerGui:FindFirstChild
C4 поле ввода: onSubmit vs FocusLost + box.Text

C1, C2, C5 — без кода (общая теория), Picker сверху всё равно есть.
This commit is contained in:
min 2026-06-09 02:44:29 +03:00
parent 76fba9cb35
commit e3bff777b2

View File

@ -1013,35 +1013,55 @@ game.self.onUntouch(() => {
<> <>
<p> <p>
Нарисованная кнопка сама по себе ничего не делает Нарисованная кнопка сама по себе ничего не делает
нужен скрипт. Самый простой способ повесить скрипт нужен скрипт.
прямо на кнопку.
</p> </p>
<ScriptKind kind="object" on="кнопку" /> <ScriptKind kind="object" on="кнопку" />
<Code>{`// Скрипт висит на кнопке. <LangTabs
js={<Code>{`// Скрипт висит на кнопке.
// game.self это сама кнопка. // game.self это сама кнопка.
game.self.onClick(() => { game.self.onClick(() => {
game.ui.showText('Кнопка нажата!', 2); game.ui.showText('Кнопка нажата!', 2);
game.sound.play('click'); game.sound.play('click');
});`}</Code> });`}</Code>}
<p> lua={<Code>{`-- Скрипт висит на кнопке (TextButton)
Можно и наоборот управлять кнопкой из глобального -- script.Parent это сама кнопка.
скрипта, если найти её по имени: local btn = script.Parent
</p>
btn.MouseButton1Click:Connect(function()
print("Кнопка нажата!")
end)`}</Code>}
/>
<p>Можно и наоборот управлять кнопкой из глобального скрипта:</p>
<ScriptKind kind="global" /> <ScriptKind kind="global" />
<Code>{`// Находим кнопку по имени и вешаем на неё клик <LangTabs
js={<Code>{`// Находим кнопку по имени и вешаем на неё клик
const btnId = game.gui.find('Кнопка старта'); const btnId = game.gui.find('Кнопка старта');
game.gui.onClick(btnId, () => { game.gui.onClick(btnId, () => {
game.ui.showText('Игра началась!', 2); game.ui.showText('Игра началась!', 2);
// спрятать кнопку после нажатия game.gui.hide(btnId); // спрятать кнопку после нажатия
game.gui.hide(btnId); });`}</Code>}
});`}</Code> lua={<Code>{`local Players = game:GetService("Players")
local player = Players.LocalPlayer
local gui = player:WaitForChild("PlayerGui")
-- Находим кнопку по имени (она лежит где-то в PlayerGui)
local btn = gui:FindFirstChild("Кнопка старта", true)
btn.MouseButton1Click:Connect(function()
print("Игра началась!")
btn.Visible = false -- спрятать кнопку
end)`}</Code>}
/>
<p> <p>
Что тут происходит: <code>game.gui.find</code> ищет JS: <code>game.gui.find</code> ищет элемент по имени.
элемент по имени и возвращает его id («адрес»). <code> game.gui.onClick</code> вешает действие, <code>game.gui.hide</code> прячет.
<code> game.gui.onClick</code> вешает на этот id действие. </p>
<code> game.gui.hide</code> прячет кнопку, чтобы её нельзя <p>
было нажать второй раз. Lua: <code>gui:FindFirstChild(name, true)</code> ищет рекурсивно
(третий аргумент <code>true</code> = во вложенных).
<code> MouseButton1Click</code> стандартный сигнал клика на TextButton.
<code> btn.Visible = false</code> прячет элемент.
</p> </p>
</> </>
), ),
@ -1053,34 +1073,59 @@ game.gui.onClick(btnId, () => {
<> <>
<p> <p>
<b>Поле ввода</b> позволяет игроку напечатать ответ. <b>Поле ввода</b> позволяет игроку напечатать ответ.
Когда он нажмёт Enter, срабатывает событие Когда он нажмёт Enter, скрипт получает введённый текст.
<code> onSubmit</code> и скрипт получает введённый текст.
</p> </p>
<ScriptKind kind="global" /> <ScriptKind kind="global" />
<Code>{`// Игрок вводит код. Правильный код — 1234. <LangTabs
js={<Code>{`// Игрок вводит код. Правильный код — 1234.
const boxId = game.gui.find('Поле кода'); const boxId = game.gui.find('Поле кода');
game.gui.onSubmit(boxId, (text) => { game.gui.onSubmit(boxId, (text) => {
if (text === '1234') { if (text === '1234') {
game.ui.showText('Верно! Дверь открыта', 2); game.ui.showText('Верно! Дверь открыта', 2);
// двигаем дверь вверх, чтобы освободить проход
const door = game.scene.findOne('Дверь'); const door = game.scene.findOne('Дверь');
game.tween(door, { y: 8 }, { duration: 1 }); game.tween(door, { y: 8 }, { duration: 1 });
} else { } else {
game.ui.showText('Неверный код', 1.5); game.ui.showText('Неверный код', 1.5);
} }
});`}</Code> });`}</Code>}
lua={<Code>{`local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local player = Players.LocalPlayer
local gui = player:WaitForChild("PlayerGui")
-- Находим TextBox по имени
local box = gui:FindFirstChild("Поле кода", true)
-- FocusLost срабатывает когда игрок нажал Enter или ушёл с поля.
-- Первый параметр enterPressed = true только если был Enter.
box.FocusLost:Connect(function(enterPressed)
if not enterPressed then return end
if box.Text == "1234" then
print("Верно! Дверь открыта")
local door = workspace:WaitForChild("Дверь")
local goal = { Position = door.Position + Vector3.new(0, 8, 0) }
TweenService:Create(door, TweenInfo.new(1), goal):Play()
else
print("Неверный код")
end
end)`}</Code>}
/>
<p> <p>
Разберём построчно: <code>onSubmit</code> даёт переменную JS-разбор: <code>onSubmit</code> даёт переменную
<code> text</code> это то, что напечатал игрок. <code> text</code> то, что напечатал игрок.
<code> if (text === '1234')</code> проверяем, совпал ли <code> if (text === '1234')</code> проверяем код.
код. Если да открываем дверь твином (плавно поднимаем). </p>
Если нет пишем «Неверный код». <p>
Lua-разбор: на TextBox сигнал <code>FocusLost</code>
срабатывает когда поле теряет фокус (Enter или клик мимо).
Текст лежит в <code>box.Text</code>.
</p> </p>
<Note> <Note>
Две одинарные кавычки <code>'1234'</code> означают, Кавычки <code>"1234"</code> означают, что это
что это <b>текст</b>, а не число. Игрок печатает в поле <b> текст</b>, а не число. Игрок печатает в поле всегда
всегда текст, поэтому и сравнивать нужно с текстом. текст, поэтому и сравнивать нужно с текстом.
</Note> </Note>
</> </>
), ),