Pakiet funkcji Nagrody za zaangażowanie to konfigurowalna struktura do oferowania nagród w grze za określone działania graczy, w tym za codzienne logowanie i czas spędzony w grze. Oprócz logiki klienta i serwera, pakiet zawiera domyślny interfejs użytkownika do przeglądania postępów w nagrodach, statusu nagród i ich odbierania.

Pobierz pakiet
Dodaj pakiety Core i Nagrody za zaangażowanie do swojego ekwipunku w Studio, klikając linki Dodaj do ekwipunku tutaj:
Z menu Okno w Studio lub z paska narzędzi na karcie Strona główna, otwórz Skrzynkę narzędziową.
W oknie Skrzynki narzędziowej kliknij kartę Ekwipunek. Wyświetli się sortowanie Moje modele.

Kliknij kafelek Pakiet funkcji Core, a następnie kafelek Pakiet funkcji Nagrody za zaangażowanie. Oba foldery pakietów wyświetlą się w oknie Eksploratora.
Przeciągnij foldery do ReplicatedStorage.
Zainicjuj pakiet
Przeniesienie pakietów do ReplicatedStorage i przetestowanie gry uruchamia skrypt EngagementRewardsExample w ReplicatedStorage.EngagementRewards.Server.Examples.
Ten skrypt pokazuje, jak zainicjować pakiet do użycia w grze, co obejmuje wymaganie kilku skryptów modułowych i zdefiniowanie funkcji rewardClaimedHandlerFunction(), która ostatecznie przyznaje nagrodę(-y) graczowi.
Funkcja ta musi zwracać wartość boolean. W przykładowym skrypcie możesz zobaczyć, że nie przyznaje ona żadnych nagród graczowi; po prostu drukuje gracza, nagrodę i ilość, która jest odbierana.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EngagementRewardsConfig = require(ReplicatedStorage.EngagementRewards.Configs.EngagementRewardsConfig)
local EngagementRewards = require(ReplicatedStorage.EngagementRewards.Server.EngagementRewards)
local EngagementRewardsUtils = require(ReplicatedStorage.EngagementRewards.Utils.EngagementRewardsUtils)
local Types = require(ReplicatedStorage.EngagementRewards.Configs.Types)
-- Zastąp tę funkcję obsługi nagrody własną funkcją obsługi nagrody
-- Ta funkcja powinna obsługiwać zdarzenie odebrania nagrody dla przekazanego rewardId
local function rewardClaimedHandlerFunction(player: Player, rewardId: RewardId, quantity: number): (boolean, string?)
print(`Nagroda {rewardId} odebrana przez {player} z ilością {quantity}`)
return true
end
-- więcejMożesz albo bezpośrednio zmodyfikować ten skrypt, albo przenieść go do ServerScriptService, jeśli to jest twoje preferowane miejsce na kod serwera. W obecnej formie skrypt jest użyteczny tylko do celów testowych.
Przyznawanie nagrody graczowi różni się w zależności od gry. W niektórych grach możesz przyznać bonus do gry lub po prostu zwiększyć liczbę złota gracza. W innych grach możesz mieć własny system ekwipunku, podczas gdy inne mogą umieszczać przedmiot w plecakach graczy. W każdym przypadku jednak musisz zastąpić rewardClaimedHandlerFunction() swoją własną funkcją.
Dodaj nagrody i kryteria
Większość dostosowań nagród odbywa się w ReplicatedStorage.EngagementRewards.Configs.EngagementRewardsConfig. Ten skrypt modułowy definiuje nagrodę i wymagania do jej odblokowania.
Pełne deklaracje typów (lub dodanie nowych) możesz zobaczyć w ReplicatedStorage.EngagementRewards.Configs.Types, ale prawdopodobnie będziesz musiał pracować tylko z EngagementRewardsConfig. Pakiet funkcji zawiera dwa typy nagród: Czas i Codziennie.
local engagementRewardsConfig: Types.EngagementRewardsConfig = {
[Types.RewardType.Time] = {
tabDisplayName = "Czas",
tabOrder = 1,
description = "Graj dalej, aby odblokować nagrody!",
rewards = {
MinutesPlayed1 = {
icon = 116913478160966,
displayName = "Lodowy Włócznia",
requiredSecondsInGame = 1 * 5,
},
-- więcej
[Types.RewardType.Daily] = {
tabDisplayName = "Codziennie",
tabOrder = 2,
description = "Graj codziennie, aby odblokować nagrody!",
rewards = {
DailyStreak1 = {
icon = 116913478160966,
displayName = "Lodowy Włócznia",
requiredDaysVisitedStreak = 1,
effect = Types.RewardEffect.Valuable,
},
-- więcejOba typy nagród wymagają ikony, która jest identyfikatorem zasobu Roblox dla obrazu (nie dla dekalu). Prawdopodobnie chcesz również mieć nazwę wyświetlaną do użycia w interfejsie użytkownika. Określ quantity dla wartości innych niż 1. Możesz również opcjonalnie oznaczyć nagrodę jako cenną (effect = Types.RewardEffect.Valuable), aby nadać jej inny kolor tła w interfejsie użytkownika.
| Variable | Type | Description | Default | Required |
|---|---|---|---|---|
| icon | Number | Identyfikator zasobu Roblox dla ikony UI. | N/A | Tak |
| displayName | String | Nazwa nagród do użycia w UI. | Identyfikator RewardId | Nie |
| quantity | Number | Liczba przedmiotów do nagrody. | 1 | Nie |
| effect | RewardEffect | Efekt wizualny do użycia w UI. Zobacz Dostosuj UI. | Types.RewardEffect.Default | Nie |
Nagrody czasowe
Nagrody Czas odblokowują się po określonej liczbie sekund spędzonych w grze. Dostosuj te liczby do swoich potrzeb. Możesz użyć małych liczb do łatwego testowania, a w opublikowanej grze przyznać nagrodę po 10 minutach, kolejną po 30 minutach, kolejną po godzinie i tak dalej.
Mnożenie ułatwia ludziom pracę z liczbami w sekundach, więc dla dwóch godzin możesz woleć określić 2 * 60 * 60 zamiast 7200.
| Variable | Type | Description | Default | Required |
|---|---|---|---|---|
| requiredSecondsInGame | Number | Liczba sekund (liczba całkowita dodatnia), które gracz musi spędzić w grze, aby zdobyć nagrodę. | N/A | Tak |
Nagrody codzienne
Nagrody Codziennie odblokowują się po określonej liczbie kolejnych codziennych logowań. Na przykład, pierwszego dnia, gdy gracz się loguje, możesz dać mu trzy mikstury lub bułkę cynamonową. W kolejnych dniach możesz nagradzać bardziej wartościowymi przedmiotami konsumpcyjnymi, a po siedmiu dniach z rzędu, trwałym przedmiotem, takim jak nowa wędka.
| Variable | Type | Description | Default | Required |
|---|---|---|---|---|
| requiredDaysVisitedStreak | Number | Liczba kolejnych dni, w których gracz musi połączyć się z grą, aby zdobyć nagrodę. | N/A | Tak |
Dwie dodatkowe opcje konfiguracyjne nagród codziennych są dostępne w DailyRewardTabConfig.
[Types.RewardType.Daily] = {
tabDisplayName = "Codziennie",
tabOrder = 2,
description = "Graj codziennie, aby odblokować nagrody!",
isHiddenOnJoin = true,
isAlignedToStreakResetTime = true,
rewards = {
DailyStreak1 = {
icon = 116913478160966,
displayName = "Lodowy Włócznia",
requiredDaysVisitedStreak = 1,
},
-- więcej| Variable | Type | Description | Default | Required |
|---|---|---|---|---|
| isHiddenOnJoin | Boolean | Gdy prawda, nagrody nie pojawiają się automatycznie po dołączeniu do gry. Gdy fałsz, nagrody automatycznie pojawiają się po dołączeniu do gry, jeśli gracz ma nową nagrodę codzienną do odebrania. | Fałsz | Nie |
| isAlignedToStreakResetTime | Boolean | Gdy prawda, nagrody za dzień 2 można odebrać 24 godziny po początkowym czasie odbioru dnia 1. Gdy fałsz, nagrody za dzień 2 można odebrać o pierwszej północy po czasie odbioru dnia 1. Na przykład, jeśli gracz loguje się o 23:00 i odbiera swoją nagrodę za dzień 1, prawda oznacza, że nie może odebrać nagrody za dzień 2 aż do 23:00 następnego dnia. Fałsz oznacza, że mogą odebrać nagrodę za dzień 2 o 00:00, godzinę później. Nagrody za dzień 3 i kolejne są zawsze dostępne 24 godziny po czasie odbioru poprzedniego dnia. | Fałsz | Nie |
Dostosuj UI
W poprzedniej sekcji mogłeś zauważyć pola tabDisplayName, tabOrder i description, które pozwalają na podstawowe dostosowanie interfejsu użytkownika. Możesz również znaleźć niektóre ciągi UI w ReplicatedStorage.FeaturePackagesCore.Configs.TranslationStrings.

Aby określić nowe tło nagrody za pomocą zmiennej effect, dodaj ramkę do ReplicatedStorage.EngagementRewards.Objects.RewardItemFrames. Następnie dodaj nazwę ramki do tabeli Types.RewardEffect w ReplicatedStorage.EngagementRewards.Configs.Types.
Aby uzyskać bardziej kompleksowe dostosowanie, zmodyfikuj obiekty w ReplicatedStorage.EngagementRewards.Objects. Na przykład, możesz zmodyfikować BackgroundColor3 ramki RewardsHudButton.Background lub Color ramki FooterContentFrame.ClaimableUIGradient.
Punktem wejścia dla interfejsu użytkownika jest skrypt ReplicatedStorage.EngagementRewards.Client.UIController, który pobiera niezbędne obiekty i inicjalizuje UI. Jeśli dodasz lub zmienisz nazwy obiektów na najwyższym poziomie (w przeciwieństwie do dodawania tylko dzieci lub modyfikowania właściwości), prawdopodobnie będziesz musiał zaktualizować kod w tym folderze, aby je obsłużyć.