Модуль розробника ScavengerHunt (Полювання на сміття)

Полювання на сміття (ScavengerHunt)

Модуль розробника ScavengerHunt дає гравцям імовірний гейміфікований спосіб досліджувати ваш досвід, органічно знайомлячи їх із усім місцем. Прогрес гравця постійний, тому полювання за сміттям може тривати протягом сеансів.
Цей модуль використовує сховища даних . Щоб перевірити його в Studio, переконайтеся, що в розділі «Безпека» вікна «Параметри гри» ввімкнено параметр «Увімкнути доступ Studio до служб API» .

Використання модуля

Щоб використовувати модуль ScavengerHunt у досвіді:

На вкладці «Перегляд» відкрийте панель інструментів і виберіть вкладку «Магазин творців» .
Переконайтеся, що вибрано сортування моделей , а потім натисніть кнопку «Показати все» для категорій .
Знайдіть і клацніть плитку Dev Modules .
Знайдіть модуль Scavenger Hunt і клацніть його або перетягніть у 3D-перегляд.


У вікні Explorer перемістіть всю модель ScavengerHunt у ServerScriptService . Після запуску досвіду модуль поширюється на різні служби та починає працювати.

Використання токенів

Модуль полювання на сміття використовує жетони як предмети, які гравці шукають і збирають. Модуль поставляється з однією моделлю токена, яку ви можете позиціонувати в 3D-світі.

Знайдіть сітку Token1 у папці Workspace головної папки модуля.
Перемістіть Token1 в ієрархію робочої області верхнього рівня та розташуйте його там, де потрібно.

Дайте маркеру унікальне ім'я ; за цією назвою модуль відстежує, які жетони зібрав кожен гравець.

Щоб додати більше маркерів, скопіюйте існуючий маркер і дайте йому унікальне ім’я.

Якщо ви не хочете використовувати об’єднані mesh tokens, будь-яка Model або BasePart працюватиме, якщо вона відповідає таким критеріям:

Об’єкт має тег CollectionService ScavengerHuntPart . Якщо потрібно, ім’я тегу CollectionService , яке використовує модуль, можна змінити, установивши інше значення для tokenTag у виклику configureServer .

Об’єкт містить дочірній екземпляр StringValue , налаштований на «текст смаку», який відображатиметься під час збирання маркера.
Модель
MeshPart

Пам’ятайте, що кожен жетон повинен мати унікальне ім’я, щоб відстежувати прогрес гравця.

Модуль автоматично вимикає властивість CanCollide токенів під час виконання, щоб гравці не стикалися з ними фізично. Таким чином, усі жетони мають бути закріплені , щоб вони не провалилися через геометрію світу.

Регіони дещо відрізняються від жетонів, оскільки вони є великими областями, які позначаються як «зібрані», коли гравець увійшов у них. Крім того, коли гравець залишає область, текстовий модаль автоматично відхиляється, а сама область видаляється з робочої області.

Створіть прив’язану частину навколо області, наприклад блок або сферу. Модуль автоматично вимкне властивість CanCollide під час виконання, щоб гравці фізично не стикалися з регіоном.

Дайте йому унікальну назву . За цією назвою модуль відстежує, до яких регіонів увійшов кожен гравець.

Використовуючи розділ «Теги» у властивостях частини або редактор тегів Studio , застосуйте тег ScavengerHuntPart до частини, щоб CollectionService виявив його. Якщо потрібно, ім’я тегу, яке використовує модуль, можна змінити, встановивши інше значення для tokenTag у виклику configureServer .

Включіть дочірній екземпляр StringValue , налаштований на «текст смаку», який відображатиметься під час введення області.

Пам’ятайте, що кожен регіон повинен мати унікальну назву для відстеження прогресу гравця.

Конфігурація

Модуль попередньо налаштований для роботи в більшості випадків використання, але його можна легко налаштувати. Наприклад, щоб змінити швидкість обертання маркера та налаштувати модальне інформаційне повідомлення:

У StarterPlayerScripts створіть новий LocalScript і перейменуйте його на ConfigureScavengerHunt .


Вставте наступний код у новий сценарій:

local ReplicatedStorage = game:GetService("ReplicatedStorage")

local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))

ScavengerHunt.configureClient({
infoModalText = "Welcome to my Scavenger Hunt!",
completeModalText = "Thanks for playing my Scavenger Hunt!",
tokenRotationSpeed = 60,
})

Колекція подій

Щоразу, коли гравець збирає жетон або входить у регіон, запускається зібрана подія. Ви можете прослухати цю подію зі сценарію на сервері та відповідним чином відповісти. Підключена функція отримує гравця , який зіткнувся з маркером або увійшов у регіон, і назву цього маркера або регіону.

Так само, коли гравець збирає всі жетони або входить у всі позначені регіони, запускається подія allCollected і підключена функція отримує пов’язаний Player . Ця функція запускається лише один раз на гравця, і її можна використовувати, щоб нагородити цього гравця значком , доступом до нової області, валютою досвіду тощо.

local ReplicatedStorage = game:GetService("ReplicatedStorage")

local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))

ScavengerHunt.collected:Connect(function(player, itemName)
print(player.DisplayName, itemName)
end)

ScavengerHunt.allCollected:Connect(function(player)
print(player.DisplayName .. " completed the hunt!")
end)

Спеціальний графічний інтерфейс

Цей модуль надає кілька варіантів налаштування графічного інтерфейсу користувача за замовчуванням, але замість цього ви можете вибрати відображення власних елементів графічного інтерфейсу.

Якщо useCustomModals має значення true у функції configureClient , подія showInfoModal запускається кожного разу, коли гравець активує засіб відстеження токенів. Так само подія showCompleteModal спрацьовує, коли гравець зібрав усе під час полювання на сміття. Обидві ці події можна прослухати в LocalScript .

local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))

ScavengerHunt.showInfoModal:Connect(function()
-- Show a custom info modal
local infoModal = Players.LocalPlayer.PlayerGui.ScavengerInfoModal
infoModal.Enabled = true
end)

ScavengerHunt.showCompleteModal:Connect(function()
-- Show a custom complete modal
local completeModal = Players.LocalPlayer.PlayerGui.ScavengerCompleteModal
completeModal.Enabled = true
end)

Використовуючи користувацькі режими, обов’язково надайте можливість гравцям закривати/приховувати їх або автоматичне видалення після затримки.

Видимість GUI

За замовчуванням полювання на сміття приховує всі ScreenGuis і CoreGuis (окрім списку гравців), коли з’являється модаль інформації або модаль завершення. Якщо ви хочете перевизначити цю поведінку автоматичного приховування та програмно вирішити, які графічні інтерфейси мають залишатися видимими, увімкніть зворотні виклики hideOtherGuis і showOtherGuis і відповідайте своєю власною логікою (LocalScript):

local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local StarterGui = game:GetService("StarterGui")

local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))

local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
local hiddenInstances = {}

-- Create a screen GUI that will not be hidden
local specialGuiInstance = Instance.new("ScreenGui")
-- Draw the screen GUI above the scavenger hunt GUI
specialGuiInstance.DisplayOrder = 1
specialGuiInstance.Parent = playerGui
-- Add text label to the GUI
local specialLabel = Instance.new("TextLabel")
specialLabel.Size = UDim2.fromScale(1, 0.1)
specialLabel.Text = "Remains visible when displaying modals"
specialLabel.Font = Enum.Font.GothamMedium
specialLabel.TextSize = 24
specialLabel.Parent = specialGuiInstance

ScavengerHunt.hideOtherGuis(function()
-- Hide all developer-defined screen GUIs
local instances = playerGui:GetChildren()
for _, instance in instances do
if instance:IsA("ScreenGui") and not instance.Name == "ScavengerHunt" and instance.Enabled then
instance.Enabled = false
table.insert(hiddenInstances, instance)
end
end
-- Hide specific core GUIs
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.PlayerList, false)
end)

ScavengerHunt.showOtherGuis(function()
-- Show all developer-defined screen GUIs that were hidden
for _, instance in hiddenInstances do
instance.Enabled = true
end
hiddenInstances = {}
-- Show specific core GUIs that were hidden
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.PlayerList, true)
end)






Повний текст скрипта ConfigureScavengerHunt:

local Players = game:GetService("Players")

local ReplicatedStorage = game:GetService("ReplicatedStorage")

local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))

local StarterGui = game:GetService("StarterGui")

local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
local hiddenInstances = {}

-- Create a screen GUI that will not be hidden
local specialGuiInstance = Instance.new("ScreenGui")
-- Draw the screen GUI above the scavenger hunt GUI
specialGuiInstance.DisplayOrder = 1
specialGuiInstance.Parent = playerGui
-- Add text label to the GUI
local specialLabel = Instance.new("TextLabel")
specialLabel.Size = UDim2.fromScale(1, 0.1)
specialLabel.Text = "Remains visible when displaying modals"
specialLabel.Font = Enum.Font.GothamMedium
specialLabel.TextSize = 24
specialLabel.Parent = specialGuiInstance

ScavengerHunt.hideOtherGuis(function()
-- Hide all developer-defined screen GUIs
local instances = playerGui:GetChildren()
for _, instance in instances do
if instance:IsA("ScreenGui") and not instance.Name == "ScavengerHunt" and instance.Enabled then
instance.Enabled = false
table.insert(hiddenInstances, instance)
end
end
-- Hide specific core GUIs
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.PlayerList, false)
end)

ScavengerHunt.showOtherGuis(function()
-- Show all developer-defined screen GUIs that were hidden
for _, instance in hiddenInstances do
instance.Enabled = true
end
hiddenInstances = {}
-- Show specific core GUIs that were hidden
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.PlayerList, true)
end)


ScavengerHunt.collected:Connect(function(player, itemName)
print(player.DisplayName, itemName)
end)

ScavengerHunt.allCollected:Connect(function(player)
print(player.DisplayName .. " completed the hunt!")
end)

ScavengerHunt.showInfoModal:Connect(function()
-- Show a custom info modal
local infoModal = Players.LocalPlayer.PlayerGui.ScavengerInfoModal
infoModal.Enabled = true
end)

ScavengerHunt.showCompleteModal:Connect(function()
-- Show a custom complete modal
local completeModal = Players.LocalPlayer.PlayerGui.ScavengerCompleteModal
completeModal.Enabled = true
end)


ScavengerHunt.configureClient({
infoModalText = "Welcome to my Scavenger Hunt!",
completeModalText = "Thanks for playing my Scavenger Hunt!",
tokenRotationSpeed = 560,
navigationBeam = {
lightEmission = 1
},
modal = {
textSize = 14
},
})

ScavengerHunt.configureServer({
tokenTag = "ScavengerHuntPart",
})