Krótka odpowiedź
Żeby zrobić grę w Roblox Studio, otwórz Studio, wybierz szablon Baseplate, zbuduj poziom z Partów (zaznacz Anchored, żeby się nie ruszały) i dodaj Scripty w ServerScriptService z zasadami, na przykład folder leaderstats na monety. Kliknij Play (F5), żeby przetestować. Potem wybierz File > Publish, żeby zapisać grę na swoim koncie. Pozostaje prywatna, dopóki jej nie udostępnisz (nie zrobisz publiczną) z tego samego menu i nie odpowiesz na pytanie o treści z ograniczeniem wiekowym.
- Trzymaj zasady gry w Scriptach serwera. Zmianę zrobioną przez LocalScript widzi tylko ten gracz, a wszystko na urządzeniu gracza może zmienić oszust.
- Udostępnienie gry wymaga konta w dobrej kondycji, założonego co najmniej 2 dni temu, i weryfikacji wieku. Jeśli odpowiesz Nie na pytanie o treści z ograniczeniem wiekowym, Roblox oznacza grę jako Content May Vary i udostępnia ją użytkownikom ze zweryfikowanym wiekiem 16 lat lub więcej. Dotarcie do wszystkich grup wiekowych ma dodatkowe wymagania.
- Studio działa na Windowsie i Macu. Strona konfiguracji Roblox nie podaje żadnej wersji na telefon ani tablet.
Na tej stronie
Co zbudujesz
Gra to krótki tor. Gracze zaczynają na SpawnLocation, skaczą między platformami nad podłogą z lawy, zbierają monety i dotykają zielonej mety. Meta daje Win tylko graczowi, który zebrał co najmniej 3 monety od ostatniego pojawienia się albo dotarcia do mety, a potem odsyła go na start. Coins i Wins widać na liście graczy, a wszystkie zasady działają na serwerze.
| Element | Gdzie jest | Co robi |
|---|---|---|
SpawnLocation | Bezpośrednio w Workspace (jest w szablonie Baseplate) | Tu gracze pojawiają się po dołączeniu i po odrodzeniu. Meta odsyła graczy właśnie tutaj. |
Folder Course | Workspace | Zawiera cały poziom, żeby skrypt znalazł wszystko w jednym miejscu. |
Folder Lava i jego party | Wewnątrz Course | Każdy part w środku resetuje gracza, który go dotknie. |
Folder Coins i jego party | Wewnątrz Course | Każda moneta płaci 1 Coin pierwszemu graczowi, który jej dotknie, chowa się i wraca po 10 sekundach. |
Part Finish | Wewnątrz Course | Daje Win graczowi, który zebrał 3 monety w tej rundzie, a potem odsyła go na start. |
Script PlayerStats | ServerScriptService | Daje każdemu graczowi statystykę Coins i Wins na liście graczy. |
Script CourseService | ServerScriptService | Obsługuje lawę, monety i metę. To jedyne miejsce, w którym zmieniają się Coins i Wins. |
Workspace
Baseplate Part
SpawnLocation SpawnLocation
Course Folder new
Platform Part new
Lava Folder new
Lava Part new
Coins Folder new
Coin Part new
Finish Part new
ServerScriptService
PlayerStats Script new
CourseService Script new
Wszystko w Workspace budujesz ręcznie w kroku 2. Dwa skrypty trafiają do ServerScriptService. Roblox nigdy nie wysyła graczom skryptów z tego kontenera, więc nikt nie może ich odczytać ani zmienić ze swojego urządzenia.
Krok 1: zainstaluj Studio i otwórz Baseplate
- Pobierz Roblox Studio z Creator Hub Roblox i uruchom instalator (
RobloxStudio.exena Windowsie,RobloxStudio.dmgna Macu). Studio to darmowa aplikacja na Windowsa i Maca. - Gdy się otworzy, zaloguj się na swoje konto Roblox. Jeśli go nie masz, załóż je najpierw na roblox.com.
- W sekcji Open a Template wybierz Baseplate. Zaczyna się tylko z dwoma obiektami: SpawnLocation, na którym postacie pojawiają się i odradzają, i Baseplate, podłoże z teksturą siatki 4 na 4 dopasowaną do studsów, czyli jednostki długości w Roblox.
- Otwórz trzy okna, których będziesz używać cały czas. Explorer pokazuje każdy obiekt w twojej grze, a Properties zmienia zaznaczony obiekt; oba otwierasz z menu Window albo z zakładki Home. Output pokazuje błędy z twoich skryptów i otwierasz go z menu Window albo z zakładki Script.
Krok 2: zbuduj tor
- W Explorerze najedź myszką na Workspace, kliknij przycisk + (albo naciśnij Ctrl+I, Cmd+I na Macu) i wstaw Folder. Nazwij go
Course. - Najedź myszką na Course, kliknij + i wstaw do środka dwa kolejne Foldery. Nazwij je
LavaiCoins. - Zbuduj podłogę z lawy. Kliknij Part w zakładce Home albo Model, żeby wstawić blok, i narzędziem Scale rozciągnij go w dużą, płaską płytę, która leży pod całym torem, z dużym zapasem z każdej strony. W Properties ustaw jego Color na czerwony, a Material na Neon, zaznacz Anchored i przeciągnij go do folderu
Lava. Teraz gracz, który spadnie w dowolnym miejscu, ląduje w lawie, a nie na Baseplate. - Zbuduj platformy. Wstaw kolejne party w ten sam sposób i narzędziami Move i Scale ustaw je nad lawą, każdą kilka studsów wyżej, z przerwami do przeskakiwania. W Properties upewnij się, że Anchored jest zaznaczone na każdej, i przeciągnij je do Course.
- Zbuduj monety. Przytrzymaj małą strzałkę przy przycisku Part i wybierz Cylinder. Zrób go małym i żółtym, zaznacz Anchored i odznacz CanCollide, żeby gracze przez niego przechodzili, zamiast się z nim zderzać. Włóż go do folderu
Coins, naciskaj Ctrl+D (Cmd+D na Macu), żeby go duplikować, aż będziesz mieć co najmniej 3, i rozmieść je nad platformami wzdłuż toru. - Zbuduj metę. Wstaw jeszcze jeden part nad lawą na końcu, na tyle duży, żeby dało się na nim wylądować, pokoloruj go na zielono, zaznacz Anchored, nazwij go dokładnie
Finishi przeciągnij bezpośrednio do Course, a nie do jednego z folderów. - Przesuń SpawnLocation nad lawę na początek toru, obok pierwszej platformy, żeby stał nad płytą. Zostaw go bezpośrednio w Workspace, a nie w Course: CourseService szuka go właśnie tam, żeby odsyłać graczy na start.
Nazwy mają znaczenie
CourseService znajduje tor po nazwie: folder o nazwie Course bezpośrednio w Workspace, foldery Lava i Coins w jego środku i part o nazwie Finish w jego środku. Wpisz je dokładnie tak samo, z tymi samymi wielkimi literami. Nazwy partów lawy i monet nie mają znaczenia: każdy part bezpośrednio w Lava to lawa, a każdy part bezpośrednio w Coins to moneta.
Krok 3: dodaj Coins i Wins do listy graczy
W Explorerze najedź myszką na ServerScriptService, kliknij +, wstaw Script i nazwij go PlayerStats. Zastąp całą jego zawartość tym:
-- Script w ServerScriptService o nazwie PlayerStats.
-- Daje każdemu graczowi statystykę Coins i Wins. Folder o nazwie leaderstats wewnątrz
-- gracza sprawia, że Roblox pokazuje te wartości na liście graczy, w prawym górnym rogu.
local Players = game:GetService("Players")
local function onPlayerAdded(player: Player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats" -- musi być zapisane dokładnie tak
local coins = Instance.new("IntValue")
coins.Name = "Coins"
coins.Value = 0
coins.Parent = leaderstats
local wins = Instance.new("IntValue")
wins.Name = "Wins"
wins.Value = 0
wins.Parent = leaderstats
leaderstats.Parent = player
end
Players.PlayerAdded:Connect(onPlayerAdded)
for _, player in Players:GetPlayers() do -- ci, którzy dołączyli, zanim ta linia się wykonała
onPlayerAdded(player)
end
Folder musi nazywać się leaderstats, małymi literami. Roblox odczytuje każdą wartość w środku i pokazuje ją na liście graczy, z nazwą wartości jako nagłówkiem kolumny.
Każdy gracz dostaje Folder o nazwie leaderstats z dwoma obiektami IntValue w środku. IntValue przechowuje liczbę całkowitą, czyli wszystko, czego potrzebuje licznik monet. Pętla na końcu przygotowuje każdego gracza, który dołączył, zanim wykonała się linia z PlayerAdded, żeby nikt nie został pominięty.
Poradnik o tabeli wyników (po angielsku) buduje ten sam folder dokładniej, a potem dodaje zapis i globalne top 10.
Krok 4: niech działają lawa, monety i meta
Wstaw drugi Script do ServerScriptService, nazwij go CourseService i wklej to. To jedyne miejsce, w którym zmieniają się Coins i Wins. Dwa ustawienia na górze to liczby przeznaczone do zmieniania.
-- Script w ServerScriptService o nazwie CourseService.
-- Obsługuje tor na serwerze, żeby wszyscy widzieli to samo i nikt nie mógł
-- sam sobie dać monet: party lawy resetują graczy, monety płacą 1 Coin i wracają,
-- a meta daje Win graczom, którzy zebrali w tej rundzie dość monet.
local Players = game:GetService("Players")
local COINS_TO_FINISH = 3 -- monety, które gracz musi zebrać w rundzie, zanim meta się liczy
local COIN_RESPAWN_SECONDS = 10
local course = workspace:WaitForChild("Course")
local lavaFolder = course:WaitForChild("Lava")
local coinFolder = course:WaitForChild("Coins")
local finish = course:WaitForChild("Finish") :: BasePart
local spawnLocation = workspace:FindFirstChildOfClass("SpawnLocation")
if not spawnLocation then
warn("CourseService: no SpawnLocation directly in Workspace, so the Finish cannot send players back")
end
-- Monety zebrane w tej rundzie: od ostatniego pojawienia się gracza albo dotarcia do mety
local runCoins: { [Player]: number } = {}
-- Znajduje gracza, którego postać dotknęła partu, albo nil dla czegokolwiek innego
local function playerFromHit(otherPart: BasePart): Player?
local character = otherPart:FindFirstAncestorOfClass("Model")
return if character then Players:GetPlayerFromCharacter(character) else nil
end
local function addStat(player: Player, statName: string, amount: number)
local leaderstats = player:FindFirstChild("leaderstats")
local stat = leaderstats and leaderstats:FindFirstChild(statName)
if stat and stat:IsA("IntValue") then
stat.Value += amount
end
end
-- Lawa: każdy part w folderze Lava resetuje gracza, który go dotknie
for _, lava in lavaFolder:GetChildren() do
if lava:IsA("BasePart") then
lava.Touched:Connect(function(otherPart: BasePart)
local character = otherPart:FindFirstAncestorOfClass("Model")
local humanoid = character and character:FindFirstChildOfClass("Humanoid")
if humanoid and humanoid.Health > 0 then
humanoid.Health = 0
end
end)
end
end
-- Monety: pierwszy gracz, który dotknie monety, zabiera ją, a potem moneta chowa się, aż wróci
for _, coin in coinFolder:GetChildren() do
if coin:IsA("BasePart") then
local shownTransparency = coin.Transparency
local taken = false
coin.Touched:Connect(function(otherPart: BasePart)
local player = playerFromHit(otherPart)
if not player or taken then
return -- to nie gracz albo ktoś już zabrał tę monetę
end
taken = true
coin.Transparency = 1
addStat(player, "Coins", 1)
runCoins[player] = (runCoins[player] or 0) + 1
task.delay(COIN_RESPAWN_SECONDS, function()
coin.Transparency = shownTransparency
taken = false
end)
end)
end
end
-- Meta: Win dla graczy, którzy przeszli tor, i powrót na start
finish.Touched:Connect(function(otherPart: BasePart)
local player = playerFromHit(otherPart)
if not player or (runCoins[player] or 0) < COINS_TO_FINISH then
return
end
runCoins[player] = 0 -- najpierw to, żeby ponowne dotknięcie mety nie liczyło się dwa razy
addStat(player, "Wins", 1)
local character = player.Character
if character and spawnLocation then
character:PivotTo(spawnLocation.CFrame + Vector3.new(0, 4, 0))
player:SetAttribute("MovementCheckSkip", true) -- dla skryptu kontroli prędkości, jeśli go dodasz
end
end)
-- Nowa postać (po resecie albo upadku) zaczyna nową rundę
local function onPlayerAdded(player: Player)
runCoins[player] = 0
player.CharacterAdded:Connect(function()
runCoins[player] = 0
end)
end
Players.PlayerAdded:Connect(onPlayerAdded)
for _, player in Players:GetPlayers() do -- ci, którzy dołączyli, gdy ten skrypt czekał na Course
onPlayerAdded(player)
end
Players.PlayerRemoving:Connect(function(player: Player)
runCoins[player] = nil
end)
CourseService przegląda foldery Lava i Coins raz, gdy gra startuje. Zbuduj każdy part lawy i każdą monetę w Studio przed kliknięciem Play: part, który inny skrypt doda w trakcie gry, nie zostanie podłączony.
| Część skryptu | Kod | Co robi |
|---|---|---|
| Ustawienia | COINS_TO_FINISH, COIN_RESPAWN_SECONDS | Ile monet gracz musi zebrać w rundzie, zanim meta się liczy (3), i jak długo zebrana moneta zostaje ukryta (10 sekund). |
| Znalezienie toru | WaitForChild, FindFirstChildOfClass("SpawnLocation") | Czeka na Course, Lava, Coins i Finish po nazwie i znajduje SpawnLocation bezpośrednio w Workspace, na który meta odsyła graczy. Jeśli go nie ma, wypisuje ostrzeżenie w Output. |
| Kto dotknął | playerFromHit | Dotykający part może być stopą, dłonią albo uchwytem czapki. FindFirstAncestorOfClass("Model") idzie w górę do modelu postaci, a GetPlayerFromCharacter zamienia go w gracza albo w nil dla wszystkiego, co nie jest postacią gracza. |
| Lawa | humanoid.Health = 0 | Resetuje każdą postać, która dotknie partu z folderu Lava. |
| Monety | taken, Transparency = 1, task.delay | Pierwszy gracz, który dotknie monety, dostaje 1 Coin. Moneta staje się niewidoczna i ignoruje dotknięcia, dopóki nie wróci po COIN_RESPAWN_SECONDS. Ponieważ chowa ją serwer, znika dla wszystkich graczy. |
| Ta runda | runCoins | Liczy monety, które każdy gracz zebrał od ostatniego pojawienia się albo dotarcia do mety. Liczba Coins na liście graczy dalej rośnie; ten licznik wraca do 0 przy każdym odrodzeniu i każdym Win. |
| Meta | runCoins[player] < COINS_TO_FINISH | Ignoruje gracza z mniej niż 3 monetami w tej rundzie. W przeciwnym razie najpierw ustawia jego licznik na 0, żeby stanie na mecie nie płaciło dwa razy, dodaje 1 Win i przenosi postać 4 studsy nad SpawnLocation. |
| Nowa runda | CharacterAdded, GetPlayers() | Każda nowa postać zaczyna nową rundę. Pętla obejmuje graczy, którzy dołączyli, gdy skrypt jeszcze czekał na Course. |
| Sprzątanie | PlayerRemoving | Zapomina gracza, który wychodzi. |
Lawa ustawia Health na 0, tak jak własny poradnik Roblox o lawie. Nowa postać ma domyślnie ForceField przez 10 sekund po pojawieniu się na SpawnLocation, a Humanoid:TakeDamage nic nie robi, gdy ForceField ją chroni. Bezpośrednie ustawienie Health ignoruje ForceFieldy, więc lawa działa nawet zaraz po odrodzeniu.
Meta przenosi postać przez character:PivotTo(...), które dokumentacja Roblox nazywa głównym sposobem przesuwania modelu ze skryptu. Zmiana pozycji root partu postaci natomiast odrywa ten part od reszty ciała.
Linia MovementCheckSkip sama z siebie nic nie robi. Jest dla serwerowej kontroli prędkości z poradnika o sprincie (po angielsku): jeśli dodasz tę kontrolę później, teleport z mety nie zostanie oznaczony jako przekroczenie prędkości.
Dlaczego zasady działają na serwerze
Wszystkie zasady tego toru są w CourseService, Scripcie serwera, i to celowo. Gdyby monetę dodawał LocalScript, nowa wartość Coins istniałaby tylko na urządzeniu tego gracza: serwer i inni gracze nigdy by jej nie zobaczyli. A wszystko na urządzeniu gracza da się zmienić. Poradnik Roblox o bezpieczeństwie mówi, że exploiter ma pełną kontrolę nad swoim stanem lokalnym i ruchem sieciowym, więc to serwer musi podejmować wszystkie ważne decyzje.
| Oszust próbuje | Wynik | Dlaczego |
|---|---|---|
| Zmienić swoje Coins albo Wins na własnym urządzeniu | Widzi to tylko on | Prawdziwe wartości są na serwerze i zmienia je tylko CourseService. |
| Teleportować się prosto na metę | Bez Win | Meta wymaga 3 monet zebranych w tej rundzie. Strona Roblox o projektowaniu defensywnym używa dokładnie tego przypadku z obby, exploitera, który teleportuje się na koniec po nagrody, i zaleca checkpointy sprawdzane przez serwer przed nagrodą. |
| Dotykać monet albo mety z daleka | Możliwe | Poradnik Roblox o bezpieczeństwie mówi, że exploiterzy mogą odpalać eventy Touched z dowolnej odległości i z dowolną częstotliwością. Każda moneta nadal płaci raz, temu, kto dotknie jej pierwszy, a potem chowa się na 10 sekund dla wszystkich. |
| Latać albo teleportować się do każdej monety, a potem na metę | Możliwe | Urządzenie każdego gracza kontroluje jego własną postać, a Roblox wymienia teleportowanie i latanie wśród rzeczy, które klient może z nią robić. |
| Ignorować lawę | Możliwe | To samo urządzenie decyduje, czy dotknięcia jego postaci w ogóle odpalają. W pierwszej grze to do przyjęcia. |
Zasada monet powstrzymuje więc najprostsze oszustwo, czyli skok prosto na koniec, i niewiele więcej. W pierwszej grze to normalne. Kolejne warstwy to sprawdzenie na serwerze, czy postać naprawdę jest blisko monety albo mety, zanim zapłaci, tak jak poradnik Roblox o bezpieczeństwie sprawdza odległość gracza od sklepu; checkpointy, do których trzeba dojść po kolei, jak w poradniku o checkpointach w obby; i kontrola ruchu, taka jak w poradniku o sprincie. Co się replikuje, a co nie dokładniej wyjaśnia podział na klienta i serwer. Te poradniki są po angielsku.
Krok 5: przetestuj
- Upewnij się, że w rozwijanej liście trybu testu wybrane jest Test, i kliknij Play (F5). Twoje imię pojawia się na liście graczy z Coins 0 i Wins 0.
- Podejdź do monety. Coins zmienia się na 1, a moneta znika. Poczekaj 10 sekund i wraca. Dotknij jej znowu: Coins rośnie do 2.
- Dotknij lawy. Twoja postać pada i po 5 sekundach, domyślnym czasie odrodzenia w Roblox, pojawia się znowu na SpawnLocation. Coins na liście graczy się nie zmienia, ale twój licznik z tej rundy wraca do 0.
- Dotknij mety z mniej niż 3 monetami w tej rundzie: nic się nie dzieje. Zbierz 3 monety i dotknij jej: Wins zmienia się na 1, a ty wracasz na SpawnLocation.
- Kliknij Stop (Shift+F5). Wybierz Server & Clients z rozwijanej listy, ustaw 2 klientów i kliknij Play (albo F7). Zbierz monetę w jednym oknie klienta i spójrz na drugie: moneta zniknęła też tam, bo serwer schował ją dla wszystkich.
Cały czas trzymaj otwarte okno Output. Te dwa skrypty nic nie wypisują, gdy działają, więc każde ostrzeżenie albo czerwony błąd z PlayerStats lub CourseService to prawdziwy problem. Zajrzyj do częstych błędów.
Krok 6: opublikuj grę
- Otwórz menu File i wybierz Publish. Otwiera się okno Game details.
- Wpisz Name, wybierz Genre (Subgenre jest opcjonalny) i napisz krótki Description tego, co robią gracze. Tutaj możesz też przesłać ikonę i miniaturkę. Najpierw sprawdź ich rozmiary darmowym narzędziem do sprawdzania rozmiaru miniaturek i ikon.
- Kliknij Save. Roblox publikuje grę w chmurze i łączy ją z twoim kontem, więc możesz ją otworzyć z dowolnego komputera.
- Gra jest już opublikowana, ale prywatna. Grać mogą tylko ty, osoby z dostępem Edit i członkowie grupy z odpowiednimi rolami.
- Chcesz opinii przed udostępnieniem? Wybierz File > Invite early testers i wybierz do 10 znajomych w podobnym wieku. Jeśli nie masz jeszcze weryfikacji wieku, Roblox poprosi cię najpierw o jej zrobienie. Testerzy widzą znak wodny, który mówi im, że gra to wersja podglądowa.
Od teraz zapis do Roblox z menu File trzyma wersję twojej gry w chmurze. File > Publish zmienia wersję, którą dostają gracze. Co jakiś czas zagraj w opublikowaną kopię z Roblox, poza Studio, żeby sprawdzić, czy zgadza się z tym, co testowałeś.
Krok 7: udostępnij grę (zrób ją publiczną)
Udostępnienie gry to sposób na zrobienie jej publiczną, żeby mogli w nią grać inni niż ty i twoi współpracownicy. Zanim zaczniesz, sprawdź wymagania: twoje konto musi być w dobrej kondycji i mieć co najmniej 2 dni, a potrzebujesz weryfikacji wieku, zrobionej przez szacowanie wieku z twarzy albo oficjalnym dokumentem tożsamości.
- Otwórz menu File i znowu wybierz Publish. Otwiera się okno Publish.
- Kliknij Continue. (Przycisk Invite obok zaprasza zamiast tego testerów.)
- Odpowiedz na pierwsze pytanie z Maturity & Compliance Questionnaire od Roblox: czy twoja gra zawiera treści z ograniczeniem wiekowym? Odpowiedz zgodnie z tym, co naprawdę jest w twojej grze. Jeśli odpowiesz Yes, wypełniasz cały kwestionariusz.
- Kliknij Publish.
| Co robisz | Etykieta | Kto może grać |
|---|---|---|
| Odpowiadasz Nie | Content May Vary | Użytkownicy ze zweryfikowanym wiekiem 16 lat lub więcej. Później możesz wypełnić cały kwestionariusz w Creator Hub, żeby dotrzeć do szerszej publiczności. |
| Odpowiadasz Yes i wypełniasz kwestionariusz | Zależnie od odpowiedzi | Użytkownicy ze zweryfikowanym wiekiem 16 lat lub więcej albo użytkownicy ze zweryfikowanym wiekiem 18 lat lub więcej, zależnie od tego, co zawiera gra. |
| Spełniasz wymagania dla wszystkich grup wiekowych | Minimal, Mild albo Moderate (9+), z całego kwestionariusza | Wszystkie grupy wiekowe. Oprócz powyższych kroków weryfikujesz konto (szacowanie wieku z twarzy, jeśli masz mniej niż 18 lat, oficjalny dokument, jeśli masz 18 lub więcej), włączasz weryfikację dwuetapową, utrzymujesz subskrypcję Roblox Plus albo Premium przez 2 miesiące z rzędu albo płacisz jednorazową zwrotną opłatę, a gra przechodzi ocenę Roblox do udostępnienia dla wszystkich grup wiekowych. |
Żeby wpuszczać tylko znajomych, otwórz Creator Dashboard, wybierz grę, przejdź do Publish settings > Manage Audience, kliknij Manage access, włącz Friends w zakładce Public i kliknij Save Changes. Z włączonym Friends grać mogą tylko twoi znajomi i osoby z zakładki Playtest.
Te same wymagania dotyczą każdego działania związanego z udostępnieniem: pierwszego udostępnienia, udostępnienia nowej wersji gry, która już jest dostępna, udostępnienia do innej gry przez Publish As i zmiany tego, kto może grać.
Rób to ze znajomymi
Narzędzia do współpracy w Studio pozwalają tobie i znajomemu edytować tę samą grę jednocześnie. Dla twojej gry:
- Z grą otwartą w Studio kliknij Collaborate po prawej stronie górnego paska (mezzanine), tego paska, który po lewej ma przycisk Play.
- Wyszukaj znajomego, zaznacz go, wybierz Edit z rozwijanej listy uprawnień i kliknij Save. W twojej własnej grze dostęp Edit mogą mieć tylko znajomi z Roblox.
- Znajomy otwiera grę z Creator Dashboard i obaj pracujecie nad tą samą grą jednocześnie.
Żeby współpracować z innymi twórcami, najpierw przechodzisz weryfikację wieku, dokumentem albo szacowaniem wieku z twarzy. Potem Studio domyślnie pozwala ci współpracować tylko z twórcami ze zgodnych grup wiekowych. Team Create możesz używać sam bez weryfikacji wieku. Podczas sesji współpracy Studio zapisuje grę w chmurze co cztery minuty.
Zrób z tego prawdziwą grę
Tor to pełna pętla: graj, zbieraj, dojdź do mety, wygraj. Każdy z tych poradników (po angielsku, poza pierwszym) dodaje na tym kolejny system.
- Dopiero zaczynasz ze skryptami? Skryptowanie w Roblox dla początkujących omawia zmienne, funkcje, eventy i pętle, czyli elementy, z których zbudowany jest CourseService.
- Zapisuj Coins i Wins między sesjami dzięki krokowi 3 z poradnika o tabeli wyników. Jego skrypt zapisu zastępuje skrypt Coins i Wins taki jak PlayerStats, więc usuń PlayerStats, gdy go dodasz. Poradnik o DataStore dokładnie wyjaśnia zapisywanie.
- Checkpointy po kolei, ze statystyką Stage i odrodzeniem na ostatnim checkpoincie: poradnik o checkpointach w obby. Jego skrypt tworzy własny folder leaderstats, więc skopiuj linie Coins i Wins z PlayerStats do tego folderu i usuń PlayerStats. Dwa skrypty, z których każdy tworzy leaderstats, dają każdemu graczowi dwa foldery, a Coins i Wins mogą przestać się zmieniać.
- Wydawaj Coins w sklepie z GUI. Używa wartości Coins z leaderstats, więc pomiń jego skrypt Leaderstats: PlayerStats już tworzy Coins.
- Sprzedaj bonus za Robux przez game pass. Zanim ustalisz cenę, darmowy kalkulator podatku od Robux pokaże, ile płaci ci każda sprzedaż po potrąceniu części Roblox, a kalkulator DevEx, ile te Robux są warte w dolarach amerykańskich.
- Ekran tytułowy z przyciskiem Play: poradnik o menu głównym.
- Rundy z przerwą, losowymi mapami i licznikiem czasu: poradnik o systemie rund, który dodaje do tej samej wartości Wins. Pomiń jego skrypt leaderstats, bo PlayerStats już tworzy Wins.
- Przerywnik na początek z ujęciami kamery, napisami i przyciskiem Skip: poradnik o przerywnikach.
- Drzwi do sekretnej strefy, które otwierają się klawiszem E, z opcjonalnym zamkiem na klucz: poradnik o drzwiach.
- Platformy teleportacyjne między strefami mapy albo menu teleportacji: poradnik o teleporterach.
- Sprint pod Shift na klawiaturze, telefonie i padzie, z serwerową kontrolą ruchu: poradnik o sprincie. Jego kontrola ruchu odczytuje atrybut
MovementCheckSkip, który ustawia meta. - Walka albo inna pętla: daj graczom miecz albo broń z raycastem, albo zacznij nową grę, w której gracze klikają, żeby zdobywać monety, kupują ulepszenia i robią rebirth, z poradnikiem o grze typu symulator.
Częste błędy i rozwiązania
Otwórz okno Output (menu Window albo zakładka Script), zanim klikniesz Play. Większość problemów z tym torem wypisuje tam ostrzeżenie albo błąd albo wynika z niezgodnej nazwy.
Infinite yield possible on 'Workspace:WaitForChild("Course")'
CourseService czekał 5 sekund na folder o nazwie Course bezpośrednio w Workspace i go nie znalazł. Sprawdź pisownię i wielkie C. To samo ostrzeżenie z Lava, Coins albo Finish oznacza, że tego obiektu brakuje w Course albo ma inną nazwę. Dopóki się nie pojawi, nic po tej linii się nie wykonuje, więc lawa, monety i meta nic nie robią.
Coins i Wins nie pojawiają się na liście graczy
Sprawdź, czy nazwa folderu w PlayerStats to leaderstats, małymi literami, i czy PlayerStats to Script, a nie LocalScript, bezpośrednio w ServerScriptService. Jeśli obie rzeczy się zgadzają, poszukaj w Output czerwonego błędu z PlayerStats.
Czerwony błąd z CourseService zaraz po kliknięciu Play
Sprawdź CanTouch w Properties na każdym parcie lawy, każdej monecie i mecie. Jeśli jest wyłączone na którymś z nich, gdy klikasz Play, Roblox rzuca błąd, gdy CourseService podłącza Touched do tego partu, i skrypt zatrzymuje się w tym miejscu: nic dalej nie działa, więc kolejne monety, meta albo resety rund mogą nigdy nie zostać podłączone. Zaznacz CanTouch na wszystkich i kliknij Play ponownie.
Dotknięcie monety nic nie robi
Moneta musi być partem bezpośrednio w folderze Coins, a nie w innym folderze lub modelu w jego środku, bo CourseService patrzy tylko na bezpośrednie dzieci folderu. Musi też być tam przed kliknięciem Play, z zaznaczonym CanTouch (zobacz punkt wyżej).
Dotykam mety i nic się nie dzieje
Potrzebujesz 3 monet zebranych w tej rundzie, od ostatniego pojawienia się albo dotarcia do mety. Dotknięcie lawy resetuje ten licznik, Win też, nawet jeśli liczba Coins na liście graczy zostaje. Sprawdź też, czy part nazywa się dokładnie Finish i jest bezpośrednio w Course.
Meta daje Win, ale nie odsyła mnie na start
CourseService szuka SpawnLocation bezpośrednio w Workspace i wypisuje ostrzeżenie w Output, gdy go tam nie znajdzie. Jeśli przeciągnąłeś SpawnLocation do Course albo do jednego z jego folderów, przeciągnij go z powrotem do Workspace w Explorerze i kliknij Play ponownie.
Lawa mnie nie resetuje
Part lawy musi być bezpośrednio w folderze Lava przed kliknięciem Play, z zaznaczonym CanTouch. Part lawy, który postawisz gdzie indziej w Course, to tylko czerwona platforma.
Moje platformy albo monety spadają po kliknięciu Play
Nie są zakotwiczone. Zaznacz je, zaznacz Anchored w Properties i kliknij Play ponownie.
Z RoCode
Jeśli wolisz opisać grę, zamiast budować każdy element ręcznie, RoCode może zbudować ją w grze, którą masz otwartą. RoCode to niezależny agent AI do Roblox Studio, nie robi go Roblox: opisujesz funkcję na jego czacie w przeglądarce, a jego plugin do Studio tworzy party i skrypty w twoim Explorerze, więc nie kopiujesz kodu z okna czatu.
Zrób tor z monetami: folder Course z folderami Lava i Coins i partem Finish, leaderstats z Coins i Wins, lawę, która resetuje graczy, monety warte 1, które wracają po 10 sekundach, i metę, która daje Win dopiero po 3 monetach w tej rundzie.
- Może najpierw poszukać w twojej grze istniejącego kodu leaderstats albo DataStore, żeby rozbudować to, co masz, zamiast dodawać drugą tabelę wyników
- Tworzy folder i party w Workspace oraz Scripty w ServerScriptService
- Sprawdza w Studio przez Check Script, czy każdy napisany skrypt się kompiluje. To sprawdzenie kompilacji, a nie typów ani test gry
- Ustawia punkt cofania przed i po każdej grupie zmian, więc Ctrl+Z cofa grupa po grupie
Z pluginem 3.9 lub nowszym RoCode może zrobić krótki test i przeczytać błędy, a z pluginem 3.9.11 lub nowszym sterować postacią testową, żeby sprawdzić, czy gra działa, ale sprawdza tylko to, co postanowił przetestować, więc grasz ty. Budowanie całej gry z RoCode działa tak samo, jeden system na prompt. Jak RoCode łączy się ze Studio.
Najczęstsze pytania
Czy mogę zrobić grę Roblox za darmo?
Tak. Studio jest darmowe, a budowanie i publikowanie wymagają tylko konta Roblox. Udostępnienie gry graczom wymaga też konta w dobrej kondycji, założonego co najmniej 2 dni temu, i weryfikacji wieku. Niektóre dodatki kosztują Robux, na przykład zwrotna opłata, która jest jednym ze sposobów na dotarcie do wszystkich grup wiekowych.
Czy mogę zrobić grę Roblox na telefonie, iPadzie albo Chromebooku?
Strona konfiguracji Roblox wymienia tylko Studio na Windowsa i Maca, więc do budowania gry potrzebujesz jednego z tych komputerów.
Jak zrobić moją grę Roblox publiczną?
Udostępnij ją. W Studio wybierz File > Publish, kliknij Continue, odpowiedz na pytanie o treści z ograniczeniem wiekowym i kliknij Publish. Potrzebujesz konta w dobrej kondycji, założonego co najmniej 2 dni temu, i weryfikacji wieku. Jeśli odpowiesz Nie, Roblox udostępni grę użytkownikom ze zweryfikowanym wiekiem 16 lat lub więcej. Dotarcie do wszystkich grup wiekowych ma dodatkowe wymagania, opisane w kroku 7.
Dlaczego moi znajomi nie mogą grać w moją grę?
Nowe gry są prywatne: wejść mogą tylko ty, osoby z dostępem Edit i członkowie grupy z odpowiednimi rolami. Udostępnij ją przez File > Publish, co wymaga weryfikacji wieku i odpowiedzi na pytanie o treści z ograniczeniem wiekowym, albo zaproś do 10 znajomych w podobnym wieku jako testerów przez File > Invite early testers.
Dlaczego moja gra jest tylko dla 16+?
Zwykle dlatego, że przy udostępnianiu odpowiedziałeś Nie na pytanie o treści z ograniczeniem wiekowym. Roblox daje jej wtedy etykietę Content May Vary i udostępnia ją użytkownikom ze zweryfikowanym wiekiem 16 lat lub więcej. Odpowiedź Yes z całym kwestionariuszem też daje 16+ albo 18+, zależnie od tego, co zawiera gra. Dotarcie do wszystkich grup wiekowych wymaga weryfikacji konta, weryfikacji dwuetapowej, subskrypcji Roblox Plus albo Premium przez 2 miesiące z rzędu albo jednorazowej zwrotnej opłaty, oceny gry i całego kwestionariusza.
Jak zrobić grę ze znajomymi?
Kliknij Collaborate w Studio i daj znajomemu dostęp Edit. Żeby współpracować z innymi twórcami, najpierw przechodzisz weryfikację wieku, a potem Studio domyślnie pozwala ci współpracować tylko z twórcami ze zgodnych grup wiekowych. Potem obaj możecie pracować nad tą samą grą jednocześnie.
Czy muszę umieć programować?
W tym poradniku nie: wklejasz dwa skrypty, a tabele wyjaśniają, co robi każda część. Żeby pewnie je zmieniać, zacznij od skryptowania w Roblox dla początkujących.
Źródła i dalsza lektura
- Roblox Creator Docs: Roblox Studio setup (po angielsku). Studio to darmowa aplikacja na Windowsa i Maca; instalacja i logowanie
- Roblox Creator Docs: Create and publish games and places (po angielsku). szablony, File > Publish, domyślnie prywatne, testerzy, udostępnianie publiczne, wymagania, dzienny limit i Manage Audience
- Roblox Creator Docs: Templates (po angielsku). co zawiera szablon Baseplate
- Roblox Creator Docs: Explorer window (po angielsku). wstawianie obiektów, foldery i duplikowanie
- Roblox Creator Docs: Parts (po angielsku). wstawianie partów, cylindry, przesuwanie, skalowanie i kolor
- Roblox Creator Docs: Deadly lava tutorial (po angielsku). part lawy, który ustawia Health na 0 po dotknięciu
- Roblox Creator Docs: Create a coin collection mechanic (po angielsku). monety z wyłączonym CanCollide i włączonym Anchored
- Roblox Creator Docs: Score points tutorial (po angielsku). folder leaderstats i jego dokładna nazwa
- Roblox Creator Docs: BasePart.CanTouch (po angielsku). podłączenie Touched do partu z wyłączonym CanTouch rzuca błąd
- Roblox Creator Docs: Studio testing modes (po angielsku). Test, Play (F5), Stop i Server & Clients
- Roblox Creator Docs: Humanoid:TakeDamage (po angielsku). ochrona ForceField i bezpośrednie ustawianie Health
- Roblox Creator Docs: PVInstance:PivotTo (po angielsku). sposób przesuwania modelu ze skryptu
- Roblox Creator Docs: Version History (po angielsku). zapisane wersje i opublikowane wersje, które dostają gracze
- Roblox Creator Docs: Security tactics and cheat mitigation (po angielsku). nigdy nie ufaj klientowi; eventy Touched z dowolnej odległości
- Roblox Creator Docs: Network ownership, movement validation, and physics (po angielsku). klient może teleportować własną postać i sprawić, że lata
- Roblox Creator Docs: Defensive design (po angielsku). przypadek obby z teleportem na koniec
- Roblox Creator Docs: Collaboration (po angielsku). przycisk Collaborate, dostęp Edit, weryfikacja wieku i automatyczny zapis
Jak sprawdziliśmy kod: każdy skrypt na tej stronie przechodzi ścisłe sprawdzanie typów Luau z definicjami API Robloxa (luau-lsp, 26 października 2026). Sprawdzanie typów wyłapuje źle wpisane API i błędne typy, ale nie logikę gry, więc przetestuj go w Studio przed publikacją.