Диалог с NPC: подсказка и награда
NPC разговаривает с игроком и выдаёт одноразовую награду за сеанс.
NPC выдаёт подсказки и награду только один раз за текущий сеанс.
1. Подготовьте объект
Где разместить: Отдельные блоки кода: создайте файлы в указанных местах
Создайте NPC-модель с Head в Workspace и назовите GuideNPC. Можно использовать Rig Builder.
В ServerScriptService создайте Script NPCDialogueServer, а в StarterPlayerScripts — LocalScript NPCDialogueClient.
Не добавляйте отдельный RemoteEvent: сервер создаёт его автоматически. В Play подойдите к NPC и нажмите E. В верхней части экрана появится подсказка.
Для выдачи 5 монет нужен leaderstats.Coins. Если монет ещё нет, награда не сгорает: добавьте систему Coins и поговорите снова.
Это пути для скриптов из блоков кода ниже. Остальные объекты создайте по инструкции.
├── ServerScriptService
│ └── NPCDialogueServer (Script)
└── StarterPlayer
└── StarterPlayerScripts
└── NPCDialogueClient (LocalScript)2. Вставьте код
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local npc = workspace:WaitForChild("GuideNPC")
local head = npc:WaitForChild("Head")
local event = ReplicatedStorage:FindFirstChild("IgroNPCMessage")
if not event then
event = Instance.new("RemoteEvent")
event.Name = "IgroNPCMessage"
event.Parent = ReplicatedStorage
end
local prompt = head:FindFirstChildOfClass("ProximityPrompt") or Instance.new("ProximityPrompt")
prompt.ActionText = "Поговорить"
prompt.ObjectText = "Проводник"
prompt.MaxActivationDistance = 10
prompt.Parent = head
local rewarded = {}
prompt.Triggered:Connect(function(player)
if rewarded[player] then
event:FireClient(player, "Не забывайте искать подсказки на стенах!")
return
end
local stats = player:FindFirstChild("leaderstats")
local coins = stats and stats:FindFirstChild("Coins")
if not coins then
event:FireClient(player, "Привет! Найдите выход. Для награды сначала добавьте систему Coins.")
return -- Награда не потрачена: после установки Coins можно обратиться снова.
end
rewarded[player] = true
coins.Value += 5
event:FireClient(player, "Привет! Найдите выход. Вам начислено 5 монет!")
end)
Players.PlayerRemoving:Connect(function(player) rewarded[player] = nil end)local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local event = ReplicatedStorage:WaitForChild("IgroNPCMessage")
local gui = Instance.new("ScreenGui")
gui.Name = "GuideMessages"
gui.ResetOnSpawn = false
gui.Parent = player:WaitForChild("PlayerGui")
local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(0.7, 0.15)
label.Position = UDim2.fromScale(0.15, 0.08)
label.BackgroundColor3 = Color3.fromRGB(25, 36, 62)
label.TextColor3 = Color3.fromRGB(255, 255, 255)
label.TextScaled = true
label.TextWrapped = true
label.Visible = false
label.Parent = gui
local serial = 0
event.OnClientEvent:Connect(function(message)
serial += 1
local current = serial
label.Text = tostring(message)
label.Visible = true
task.delay(5, function()
if current == serial then label.Visible = false end
end)
end)3. Проверьте в игре
Нажмите Play в Roblox Studio и проверьте действие механики. Если механика не работает, откройте окно Output и проверьте тип скрипта, его расположение и названия объектов.
Когда проверите механику в Roblox Studio, отметьте практику как выполненную. Отметка хранится только в этом браузере, не в личном кабинете.
Добавляйте механики по одной и проверяйте окно Output. Не создавайте несколько одинаковых систем монет или интерфейсов; скрипты, меняющие WalkSpeed, прыжок или освещение, могут влиять друг на друга.
Измените текст подсказки.
Добавьте второго NPC с другим именем и отдельным скриптом.
Создайте небольшой квест с тремя персонажами, которые дают разные подсказки.
4. Проверьте себя
Зачем хранить факт получения награды за диалог?
RemoteEvent создаёт сервер. Убедитесь, что NPC содержит Head; два одинаковых скрипта на одном NPC устанавливать не нужно.