Ta strona zawiera informacje, które pomogą doświadczonym deweloperom Unity rozpocząć pracę z Roblox, w tym podstawową orientację, porównanie koncepcyjne i kluczowe różnice między tymi dwiema platformami.
Zorientuj się


Okno Hierarchia w Unity i Explorer w Roblox Studio są głównymi oknami do organizowania elementów w scenach 3D:
- Obydwa pozwalają zarządzać i organizować obiekty (na przykład postacie i zasoby środowiskowe).
- Obydwa używają struktury drzewa do zdefiniowania relacji rodzic-dziecko między obiektami.
Jednak okno Hierarchia nie ma zdefiniowanej struktury, podczas gdy okno Explorer ma ścisłą strukturę. Może być pomocne myślenie o oknie Explorer jako o połączeniu okien Hierarchia i Projekt w Unity, z folderem Workspace jako najbardziej rozpoznawalnym elementem.
Podobnie, Menadżer zasobów w Roblox Studio i Narzędzie pokrywają się z oknem Projekt w Unity. Menadżer zasobów pozwala zarządzać wszystkimi zasobami w grze, podczas gdy Narzędzie umożliwia dostęp do wszystkich zasobów, które opublikowałeś. Narzędzie umożliwia również przeszukiwanie Sklepu Kreatora pod kątem zasobów z Roblox lub społeczności, podobnie jak Unity Sklep z zasobami.
Różnice filozoficzne
Roblox jest „silnikiem symulacyjnym”, a nie tradycyjnym silnikiem gier. GameObjects w Unity oraz Parts w Roblox są podstawowymi elementami do tworzenia obiektów w środowisku 3D, ale w praktyce są dość różne:
- Reprezentacja: GameObjects w Unity to wyższy poziom koncepcji dla dowolnego obiektu w scenie, podczas gdy Parts w Roblox są zaprojektowane w celu reprezentowania obiektów fizycznych, takich jak drewniane klocki i plastikowe kule, a nie abstrakcyjnej geometrii, jak obiekty prymitywne w Unity.
- Fizyka: Aby przeprowadzać symulacje fizyczne w Unity, podłączasz komponenty, takie jak Rigidbody i Collider, do GameObject. W Roblox fizyka jest wbudowana w typ danych Parts; silnik automatycznie obsługuje interakcje.
Różnicę widać od razu, jeśli stworzysz GameObject i Part. GameObject ma jedynie pozycję, rotację i skalę. Part ma te same informacje - plus materiał i kolor, wartości dla współczynnika odbicia i przezroczystości, masę i kształt, i wiele więcej. Przekształcenie Part w coś bardziej przypominającego pusty GameObject oznacza usunięcie wielu wbudowanych właściwości. Z drugiej strony, możesz stworzyć GameObject, który wygląda bardzo podobnie do Part, dodając komponenty MeshFilter, MeshRenderer, Collider i Rigidbody.
Z perspektywy skryptowej GameObject jest najbliższy Instance w Roblox, podstawowej klasie dla wszystkich innych klas Roblox, ale ponieważ nie możesz (i nie powinieneś) tworzyć obiektów typu Instance, to porównanie nie jest zbyt praktyczne.
Inne porównanie to GameObject w Unity vs Model w Roblox. Modele działają jak kontener dla zbioru powiązanych ze sobą części w taki sam sposób, jak możesz ustalić relację rodzic-dziecko między wieloma GameObjects w Unity. Określasz jedną z części modelu jako jego główną część, aby zdefiniować punkt obrotu. Modele przechowują również skrypty, animacje, efekty dźwiękowe, podpowiedzi, ograniczenia, emitery cząsteczek i więcej.
Na przykład GameObject w Unity może mieć komponenty dla ParticleSystem, Physics3D, SpringConstraint i skrypt. W oknie Hierarchii widzisz jeden GameObject o nazwie SpringyFireball. Okno Inspektora pokazuje zbiór komponentów i właściwości.
W Roblox porównywalny model SpringyFireball w oknie Explorer może wyglądać mniej więcej tak:
Model|- ParticleEmitter|- MeshPart|- SpringConstraint|- ClickDetector| |- Script
Filosofia fizyki domyślnej w Roblox rozszerza się na proces budowania modeli 3D. W Roblox łączenie wielu części w zespoły to doskonały sposób na szybkie tworzenie rzeczy, ponieważ Roblox traktuje połączone części jako jeden sztywny obiekt. To podejście nie jest dostępne w Unity.
Zamiast używać standardowych jednostek metrycznych do długości i masy, Roblox używa jednostek nominalnych zwanych studami i Jednostkami Masy Roblox (RMU). Aby uzyskać przybliżone przeliczenia metryczne i zalecenia dotyczące użycia, zobacz Jednostki.
Lokalizacja ma znaczenie
Gry Roblox są domyślnie wieloosobowe, więc Roblox Studio zawiera wiele różnych lokalizacji przechowywania z konkretnym zachowaniem. Aby uzyskać więcej informacji, zobacz czasy działania klient-serwer i organizację obiektów.
| Location | Description |
|---|---|
| Workspace | Reprezentuje 3D świat doświadczenia. Ta lokalizacja dobrze sprawdza się w skryptach serwera, które są bezpośrednio przypisane do obiektów i kontrolują ich zachowanie. |
| ReplicatedFirst | Zawiera obiekty, które replikują się do klienta przed wszystkim innym. Ta lokalizacja jest idealna do absolutnego minimum zestawu obiektów i skryptów klienta potrzebnych do wyświetlenia ekranu ładowania. |
| ReplicatedStorage | Zawiera obiekty, które są replikowane zarówno do klienta, jak i do serwera. Ta lokalizacja jest idealna dla ModuleScripts, które chcesz używać zarówno na serwerze, jak i kliencie. LocalScripts nie są uruchamiane z tej lokalizacji, ale Scripts z RunContext ustawionym na Client będą. |
| ServerScriptService | Zawiera skrypty serwera. Ta lokalizacja jest idealna dla skryptów, które muszą uzyskać dostęp do funkcji lub obiektów po stronie serwera, takich jak logika gry i przechowywanie w chmurze. |
| ServerStorage | Zawiera obiekty po stronie serwera. Ta lokalizacja jest idealna dla dużych obiektów, które nie muszą być natychmiast replikowane do klientów, gdy dołączają do doświadczenia. Skrypty nie są uruchamiane z tej lokalizacji, ale możesz przechowywać obiekty ModuleScripts po stronie serwera tutaj. |
| StarterPlayer ⟩ StarterCharacterScripts | Zawiera LocalScripts, które uruchamiają się, gdy postać się pojawia. |
| StarterPlayer ⟩ StarterPlayerScripts | Zawiera ogólnego przeznaczenia LocalScripts, które uruchamiają się, gdy gracz dołącza do doświadczenia. |
| StarterGui | Zawiera elementy GUI, które klient wyświetla podczas ładowania doświadczenia. LocalScripts mogą być uruchamiane z tej lokalizacji. Ta lokalizacja jest idealna dla skryptów, które modyfikują interfejs użytkownika doświadczenia, takich jak dodawanie przycisków, menu i okienek dialogowych. |
| StarterPack | Zwykle zawiera tylko Tools, ale może również zawierać LocalScripts do ustawiania plecaków graczy. |
Skrypty
Roblox experiences support three different types of Luau scripts:
Skrypty klienckie
Te skrypty działają na kliencie, a serwer nie ma wglądu w ich zachowanie. Z powodów związanych z kompatybilnością, skrypty te mogą przybierać formę LocalScripts lub Scripts z wartością RunContext równą Client. Skrypty klienckie zazwyczaj znajdują się w ReplicatedStorage, StarterPlayerScripts lub StarterCharacterScripts.
Skrypty serwerowe
Te skrypty działają na serwerze, a klient nie ma wglądu w ich zachowanie. Skrypty serwerowe mają wartość RunContext równą Server i zazwyczaj znajdują się w ServerScriptService, której zawartość nie jest replikowana do klienta.
Skrypty modułowe
Te skrypty to wielokrotnego użytku fragmenty kodu, które zwracają dokładnie jedną wartość, zazwyczaj funkcję lub tabelę (lub tabelę funkcji). Zamiast duplikować kod w skryptach klienckich i serwerowych, użyj skryptów modułowych do dzielenia się kodem i danymi między oboma. Skrypty modułowe często znajdują się w ReplicatedStorage, ale mogą znajdować się gdzie indziej, jeśli chcesz dzielić się kodem między skryptami po tej samej stronie granicy klient-serwer.
Unity nie ma pojęcia różnych typów skryptów. Jeśli zdecydujesz się stworzyć grę wieloosobową, Unity korzysta ze swoich bibliotek sieciowych, aby wskazać, kiedy GameObject (i jego skrypty) powinny być wyłącznie dla serwera.
W Unity wiele funkcji silnika jest dostępnych poprzez metody MonoBehaviour. Na przykład, aby uruchomić kod przed pętlą renderowania, dodajesz kod do metody Update(). Aby obsługiwać zdarzenia kolizji fizycznych, dodajesz kod do metody OnCollideEnter().
Skrypty Roblox są bardziej oparte na zdarzeniach. Uzyskujesz podobną funkcjonalność, subskrybując usługi i słuchając aktualizacji.
C# i Luau
Do skryptów Unity używa C#. Roblox używa Luau, języka skryptowego wywodzącego się z Lua 5.1.
W porównaniu do C#, Luau jest typowany stopniowo i generalnie ma mniej zawiłą składnię. W większych projektach jednak stopniowe typowanie może wprowadzać kategorie błędów, których unikałyby języki silnie typowane, takie jak C#, więc rozważ włączenie ścisłego sprawdzania typów w skryptach Roblox.
Aby zobaczyć podstawowe różnice w składni między językami skryptowymi, zobacz Porównanie Luau i C#.
Przykład kodu Luau
The following Luau code sample demonstrates how to, after a player equips a fishing pole, listen for user input (in this case, the E key) and call additional functions:
local ContextActionService = game:GetService("ContextActionService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Get a module script from ReplicatedStorage that returns a single function
local performSomeAction = require(ReplicatedStorage.performSomeAction)
-- Assumes that this script is a child of the fishing pole
local fishingPole = script.Parent
local ACTION_CAST = "Cast"
-- Check that the key is down, then call another function
local function castLine(_actionName, inputState, _inputObject)
if inputState == Enum.UserInputState.Begin then
performSomeAction()
end
end
-- Only enable the action when the player equips the fishing pole
fishingPole.Equipped:Connect(function()
ContextActionService:BindAction(ACTION_CAST, castLine, true, Enum.KeyCode.E)
end)
-- Disable the action when the player unequips the fishing pole
fishingPole.Unequipped:Connect(function()
ContextActionService:UnbindAction(ACTION_CAST)
end)
Skrypt Roblox może być stosunkowo zwięzły, ponieważ Roblox ma wiele wbudowanych założeń: Player z postacią Humanoid połączoną z serwerem i możliwością wyposażenia Tools. Te założenia nie istnieją w Unity, więc implementacja byłaby bardzo inna.
Zasoby
Unity i Roblox obie wspierają importowanie niestandardowych siatek i modeli w formacie .fbx. Niektóre typy zasobów mogą wymagać specyficznych konfiguracji i ustawień eksportu z zewnętrznego oprogramowania do modelowania. Aby uzyskać więcej informacji, zobacz poniższe strony:
W Unity obiekty importują do katalogu Assets, widocznego w oknie Projekt. W Roblox zasoby importują do Workspace i do Narzędzia lub Menadżera zasobów.
Roblox oferuje również otwarte źródło wtyczka do Blendera, aby uprościć proces importu.
Transformaty
Transformatory Unity i CFrames Robloxa służą podobnym celom w reprezentowaniu 3D transformacji obiektów:
- Zarówno transformatory, jak i CFrames reprezentują pozycję i obrót obiektu w przestrzeni 3D. Transformatory obejmują skalę, podczas gdy Roblox używa właściwości BasePart.Size, która nie jest częścią CFrame.
- Oba wspierają mnożenie dla złożonych transformacji i mają wbudowane metody do innych manipulacji.
Współpraca
W Unity współpracujesz z standardowymi systemami kontroli wersji lub płatnymi usługami, takimi jak Unity Version Control.
Pliki Roblox znajdują się w chmurze (choć możesz eksportować kopie), więc Roblox Studio zapewnia wbudowane przepływy pracy współpracy w zakresie jednoczesnej edycji, zarządzania grupami, uprawnień, szkicowania skryptów i więcej. Zobacz Współpraca.
Wtyczki
Podobnie jak narzędzia Unity, Roblox Studio wspiera wtyczki, które mogą uprościć lub dać dodatkową kontrolę nad różnymi aspektami procesu deweloperskiego. Wtyczki są dostępne w Sklepie Kreatora, podobnie jak zasoby, wiele z nich darmowych.
Słownik
| Unity | Roblox | Uwagi |
|---|---|---|
| Scena | Miejsce | |
| GameObject | Part lub Model | Zobacz Różnice filozoficzne. |
| Prefab | Pakiet | |
| Transform | CFrame | CFrame nie zawiera informacji o skali. Zobacz Transformaty. |
| Hierarchia | Explorer | |
| Inspektor | Właściwości | |
| Widok sceny | Widok 3D | |
| Widok gry | Widok 3D | Widok przechodzi w widok gry, gdy testujesz swoją grę. |
| Okno projektu | Menadżer zasobów lub Narzędzie | |
| Inspektor terenu | Edytor terenu | |
| Punkt odrodzenia | SpawnLocation | |
| Konsola | Wyjście | |
| Sklep z zasobami | Sklep Kreatora | |
| Nakładki | Pasek narzędzi | |
| Narzędzie | Wtyczka |