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


Outliner w Unreal oraz Eksplorator w Roblox Studio są podstawowymi oknami do organizowania elementów w przestrzeniach 3D. Oba przedstawiają hierarchię obiektów i folderów. Jednak Outliner ma płaską, mniej zdefiniowaną strukturę i pokazuje tylko Actors. Okno Eksploratora ma głęboko zagnieżdżoną, ścisłą strukturę i pokazuje wszystkie obiekty jako część hierarchii, nawet obiekty, które w Unreal byłyby uważane za komponenty.
Menadżer zasobów w Roblox Studio i Toolbox pokrywają się z Content Browser w Unreal. Menadżer zasobów umożliwia zarządzanie wszystkimi zasobami w grze, podczas gdy Toolbox pozwala na dostęp do wszelkich zasobów, które opublikowałeś. Toolbox umożliwia również wyszukiwanie w Sklepie Twórców zasobów z Roblox lub społeczności, podobnie jak Marketplace w Unreal, ale dostępne bezpośrednio z interfejsu użytkownika Studio.
Różnice filozoficzne
Roblox jest "silnikiem symulacyjnym", a nie tradycyjnym silnikiem gier. Actors w Unreal oraz Parts w Roblox służą jako fundamentalne bloki budowlane, ale w praktyce są dość różne:
- Reprezentacja: Actors w Unreal to pojęcie wyższego poziomu dla dowolnego obiektu w poziomie, podczas gdy Parts w Roblox są zaprojektowane do reprezentowania fizycznych obiektów, takich jak drewniane klocki i plastikowe kule.
- Fizyka: Aby przeprowadzić symulacje fizyki w Unreal, włączasz fizykę w określonych komponentach (takich jak StaticMeshComponent) lub dodając komponenty do Actors, takie jak ograniczenia fizyczne. W Roblox fizyka jest wbudowana w typ danych Parts; silnik automatycznie obsługuje interakcje.
Różnicę widać od razu, jeśli stworzysz Actor i Part. Actor ma niewiele więcej niż lokalizację, rotację i skalę. Part ma te same informacje, plus materiał i kolor, wartości dla odbicia i przezroczystości, masę i kształt oraz wiele więcej. Oba zaczynają dzielić podobne właściwości dopiero wtedy, gdy porównujesz StaticMeshActor w Unreal z MeshPart w Roblox.


Innym użytecznym porównaniem jest Actor w Unreal do Model w Roblox. Modele działają jako kontener dla zestawu połączonych części w ten sam sposób, w jaki Actors w Unreal są kontenerami dla komponentów. Wskazujesz jedna z części modelu jako jego główną część, aby zdefiniować punkt obrotu. Modele przechowują również skrypty, animacje, efekty dźwiękowe, monity, ograniczenia, emitery cząstek i więcej.
Na przykład Actor w Unreal może mieć NiagaraComponent, który używa kilku emiterów do uzyskania pożądanego efektu wizualnego, meshu dla kształtu, ograniczenia fizycznego, aby dodać sprężystość, i skryptu dla interakcji z graczem. W Outliner widzisz pojedynczego Actor o nazwie SpringyFireball.
W Roblox porównywalny model SpringyFireball w oknie Eksploratora może wyglądać mniej więcej tak:
Model|- ParticleEmitter|- MeshPart|- SpringConstraint|- ClickDetector| |- Script
Filozofia fizyki domyślnej w Roblox rozciąga się na proces budowania modeli 3D. W Roblox spawanie wielu części razem w zespoły jest doskonałym sposobem na szybkie budowanie rzeczy, ponieważ Roblox traktuje spawane części jako jeden sztywny obiekt. To podejście nie jest praktyczne w Unreal.
Zamiast używać standardowych jednostek metrycznych dla długości i masy, Roblox używa jednostek nominalnych zwanych studami i Jednostkami Masy Roblox (RMU). Aby poznać przybliżone konwersje 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 określonymi zachowaniami. Aby uzyskać więcej informacji, zobacz runtime klient-serwer oraz organizacja 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. |
Skryptowanie
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.
Unreal nie ma pojęcia różnych typów skryptów. Jeśli zdecydujesz się na stworzenie gry wieloosobowej, musisz napisać dodatkowy kod, aby synchronizować stan gry między serwerem a klientami.
W Unreal wiele funkcjonalności silnika jest dostępnych poprzez rozszerzanie wbudowanych klas, takich jak UObject, ACharacters, ULevel i UWorld w C++ lub Blueprint. Unreal wspiera niestandardowe zdarzenia, ale wiele klas zawiera zdarzenia, które silnik automatycznie wywołuje w ramach naturalnego cyklu życia poziomu.
W porównaniu do systemu "tikowania" Unreal, skrypty Roblox są dużo bardziej zorientowane na zdarzenia. Uzyskujesz dostęp do podobnej funkcjonalności silnika, subskrybując usługi i nasłuchując aktualizacji.
C++ i Luau
Do skryptów Unreal używa C++. Roblox używa Luau, języka skryptowego pochodzącego od Lua 5.1.
W porównaniu do Luau, C++ ma ogólną przewagę wydajności, co może, ale nie musi mieć znaczenia dla rodzajów gier, które chcesz zbudować. Luau ma typowanie stopniowe i mniej rozbudowaną składnię. W większych projektach jednak stopniowe typowanie może wprowadzać kategorie błędów, które silnie typowane języki, takie jak C++, unikają, dlatego rozważ włączenie ścisłej kontroli typów w skryptach Roblox.
Unreal zawiera również system wizualnego skryptowania zwany Blueprints. Roblox ma wtyczki firm trzecich, które oferują podobną funkcjonalność, ale nie ma porównywalnego systemu wbudowanego.
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, która jest połączona z serwerem i może wyposażać Tools. Te założenia nie istnieją w Unreal, więc implementacja byłaby bardzo różna.
Zasoby
Zarówno Unreal, jak i Roblox wspierają importowanie niestandardowych siatek i modeli w formacie .fbx. Niektóre typy zasobów mogą wymagać określonych konfiguracji i ustawień eksportu z twojego oprogramowania modelującego. Aby uzyskać więcej informacji, zobacz następujące strony:
W Unreal zasoby importowane są do twojego katalogu Content, widocznego w Content Browser. W Roblox zasoby importowane są do twojego Workspace oraz do Toolbox lub Menadżera Zasobów.
Roblox oferuje również open-source wtyczkę Blendera, aby ułatwić proces importu, podobną do funkcji Wyślij do Unreal w Blender Tools.
Transformatory
Transformatory Unreal Engine 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 Unreal współpracujesz z systemami kontroli wersji, takimi jak Perforce lub SVN, zazwyczaj przez wbudowany interfejs użytkownika Unreal. Te systemy kontroli wersji używają scentralizowanego modelu "checkout", który blokuje pliki, gdy jedna osoba nad nimi pracuje.
Pliki Roblox są przechowywane w chmurze (chociaż możesz eksportować ich kopie), więc Roblox Studio zapewnia wbudowane przepływy pracy współpracy dla równoczesnego edytowania, zarządzania grupami, uprawnień, szkicowania skryptów i więcej. Zobacz Współpraca.
Wtyczki
Podobnie jak w Unreal, Roblox Studio wspiera wtyczki, które mogą uprościć lub dać ci dodatkową kontrolę nad różnymi aspektami procesu deweloperskiego. Wtyczki są dostępne w Sklepie Twórców, tak jak zasoby, wiele z nich za darmo.
Glosariusz
| Unreal | Roblox | Uwagi |
|---|---|---|
| Level | Place | |
| Actor | Part lub Model | Zobacz Różnice filozoficzne. |
| Blueprint Class | Package | |
| Transform | CFrame | CFrame nie zawiera informacji o skali. Zobacz Transformatory. |
| Outliner | Eksplorator | |
| Panel Detali | Właściwości | |
| Widok poziomu | 3D viewport | |
| Content Browser | Menadżer zasobów lub Toolbox | |
| Landscape Mode | Terrain Editor | |
| PlayerStart | SpawnLocation | |
| Output Log | Output | |
| Marketplace | Sklep Twórców | |
| Menu bar | Toolbar | |
| Plugin | Plugin |