Trang này chứa thông tin để giúp các nhà phát triển Unreal Engine dày dạn kinh nghiệm bắt đầu với Roblox, bao gồm định hướng cơ bản, so sánh khái niệm và những điểm khác biệt chính giữa hai nền tảng.
Làm quen


Outliner của Unreal và Explorer của Roblox Studio là các cửa sổ chính để tổ chức các yếu tố trong không gian 3D. Cả hai đều hiển thị một cấu trúc phân cấp của các đối tượng và thư mục. Tuy nhiên, Outliner có cấu trúc phẳng hơn, kém xác định hơn và chỉ hiển thị Actors. Cửa sổ Explorer có cấu trúc sâu và nghiêm ngặt, hiển thị tất cả các đối tượng như một phần của cấu trúc phân cấp, ngay cả những đối tượng có thể được coi là các thành phần trong Unreal.
Quản lý Tài sản và Toolbox của Roblox tương tự như Content Browser của Unreal. Quản lý Tài sản cho phép bạn quản lý tất cả tài sản trong trò chơi của bạn, trong khi Toolbox cho phép bạn truy cập bất kỳ tài sản nào bạn đã xuất bản. Toolbox cũng cho phép bạn tìm kiếm Creator Store để tìm tài sản từ Roblox hoặc cộng đồng, tương tự như Marketplace của Unreal Engine nhưng có thể truy cập trực tiếp từ giao diện người dùng Studio.
Những khác biệt triết lý
Roblox là một "công cụ mô phỏng" hơn là một công cụ game truyền thống. Actors trong Unreal và Parts trong Roblox đều đóng vai trò là các khối xây dựng cơ bản, nhưng trên thực tế, hai thứ này khá khác nhau:
- Đại diện: Actors trong Unreal là khái niệm cấp cao hơn cho bất kỳ đối tượng nào trong một cấp độ, trong khi Parts trong Roblox được thiết kế để đại diện cho các đối tượng vật lý như khối gỗ và hình cầu nhựa.
- Vật lý: Để thực hiện các mô phỏng vật lý trong Unreal, bạn kích hoạt vật lý trong một số thành phần nhất định (chẳng hạn như StaticMeshComponent) hoặc bằng cách thêm thành phần vào Actors, chẳng hạn như các ràng buộc vật lý. Trong Roblox, vật lý được xây dựng vào kiểu dữ liệu Parts; động cơ tự động xử lý các tương tác.
Bạn có thể thấy ngay sự khác biệt nếu bạn tạo một Actor và một Part. Actor chỉ có một chút thông tin như vị trí, quay và tỷ lệ. Part có thông tin tương tự, cộng với một vật liệu và màu sắc, giá trị cho độ phản chiếu và độ trong suốt, khối lượng và hình dạng, và nhiều hơn thế nữa. Hai thứ này chỉ bắt đầu chia sẻ các thuộc tính tương tự khi bạn so sánh một StaticMeshActor trong Unreal với một MeshPart trong Roblox.


Một so sánh hữu ích khác là Actor trong Unreal với Model trong Roblox. Các mô hình hoạt động như một container cho một tập hợp các phần liên kết với nhau theo cách tương tự như Actors trong Unreal là các container cho các thành phần. Bạn chỉ định một trong các phần của mô hình là phần chính của nó để xác định điểm pivot. Các mô hình cũng chứa các kịch bản, hoạt ảnh, hiệu ứng âm thanh, lời nhắc, ràng buộc, phát particle, và nhiều hơn nữa.
Ví dụ, một Actor trong Unreal có thể có một NiagaraComponent sử dụng một số phát để đạt được hiệu ứng hình ảnh mong muốn, một mesh cho hình dạng, một ràng buộc vật lý để thêm độ bật, và một kịch bản cho sự tương tác của người chơi. Trong Outliner, bạn sẽ thấy có một Actor duy nhất tên là SpringyFireball.
Trong Roblox, một mô hình tương đương SpringyFireball trong cửa sổ Explorer có thể trông như thế này:
Model|- ParticleEmitter|- MeshPart|- SpringConstraint|- ClickDetector| |- Script
Triết lý vật lý theo mặc định của Roblox mở rộng đến quy trình xây dựng mô hình 3D. Trong Roblox, việc hàn nhiều phần lại với nhau thành một nhà máy là một cách tuyệt vời để xây dựng mọi thứ nhanh chóng, vì Roblox coi các phần hàn là một cơ thể cứng duy nhất. Cách tiếp cận này không thực tế trong Unreal.
Thay vì sử dụng các đơn vị tiêu chuẩn để đo chiều dài và khối lượng, Roblox sử dụng các đơn vị giả định gọi là studs và Roblox Mass Units (RMUs). Để chuyển đổi gần đúng giữa các đơn vị và khuyến nghị về cách sử dụng, hãy xem Units.
Vị trí quan trọng
Các trò chơi Roblox mặc định là nhiều người chơi, vì vậy Roblox Studio bao gồm nhiều vị trí lưu trữ khác nhau với hành vi cụ thể. Để biết thêm thông tin, hãy xem thời gian chạy client-server và tổ chức đối tượng.
| Location | Description |
|---|---|
| Workspace | Đại diện cho thế giới 3D của trò chơi. Vị trí này hoạt động tốt cho các script trên máy chủ gắn trực tiếp vào các đối tượng và điều khiển hành vi của chúng. |
| ReplicatedFirst | Chứa các đối tượng được sao chép đến client trước khi bất kỳ thứ gì khác. Vị trí này lý tưởng cho tập hợp tối thiểu các đối tượng và script client cần thiết để hiển thị màn hình tải. |
| ReplicatedStorage | Chứa các đối tượng được sao chép đến cả client và server. Vị trí này lý tưởng cho ModuleScripts mà bạn muốn sử dụng trên cả server và client. LocalScripts không chạy từ vị trí này, nhưng Scripts với RunContext là Client thì có. |
| ServerScriptService | Chứa các script trên máy chủ. Vị trí này lý tưởng cho các script cần truy cập các chức năng hoặc đối tượng bên server, chẳng hạn như logic trò chơi và lưu trữ đám mây. |
| ServerStorage | Chứa các đối tượng bên máy chủ. Vị trí này lý tưởng cho các đối tượng lớn không cần phải được sao chép ngay cho client khi họ tham gia trò chơi. Các script không chạy từ vị trí này, nhưng bạn có thể lưu trữ các ModuleScripts bên máy chủ ở đây. |
| StarterPlayer ⟩ StarterCharacterScripts | Chứa các LocalScripts chạy khi nhân vật xuất hiện. |
| StarterPlayer ⟩ StarterPlayerScripts | Chứa các LocalScripts đa năng chạy khi người chơi tham gia trò chơi. |
| StarterGui | Chứa các phần tử GUI mà client hiển thị khi tải trò chơi. LocalScripts có thể chạy từ vị trí này. Vị trí này lý tưởng cho các script sửa đổi giao diện người dùng của trò chơi, chẳng hạn như thêm nút, menu và thông báo. |
| StarterPack | Thường chỉ chứa Tools, nhưng cũng có thể bao gồm LocalScripts để thiết lập ba lô cho người chơi. |
Lập trình
Roblox games support three different types of Luau scripts:
Client scripts
Những script này chạy trên client, và server không có khả năng nhìn thấy hành vi của chúng. Vì lý do tương thích, những script này có thể dưới dạng LocalScripts hoặc Scripts với giá trị RunContext là Client. Client scripts thường nằm trong ReplicatedStorage, StarterPlayerScripts, hoặc StarterCharacterScripts.
Server scripts
Những script này chạy trên server, và client không có khả năng nhìn thấy hành vi của chúng. Server scripts có giá trị RunContext là Server và thường nằm trong ServerScriptService, nội dung của nó không được sao chép đến client.
Module scripts
Những script này là các đoạn mã có thể tái sử dụng và trả về chính xác một giá trị, thường là một hàm hoặc bảng dữ liệu (hoặc một bảng các hàm). Thay vì sao chép mã trong client và server scripts, hãy sử dụng module scripts để chia sẻ mã và dữ liệu giữa hai bên. Module scripts thường nằm trong ReplicatedStorage, nhưng có thể ở nơi khác nếu bạn muốn chia sẻ mã giữa các scripts ở cùng một bên biên giới client-server.
Unreal không có khái niệm về các loại kịch bản khác nhau. Nếu bạn chọn tạo một trò chơi nhiều người chơi, bạn viết thêm mã để đồng bộ hóa trạng thái trò chơi giữa máy chủ và các khách hàng.
Trong Unreal, nhiều chức năng của động cơ có sẵn bằng cách mở rộng các lớp tích hợp sẵn như UObject, ACharacters, ULevel, và UWorld trong C++ hoặc Blueprint. Unreal hỗ trợ các sự kiện tùy chỉnh, nhưng nhiều lớp bao gồm các sự kiện mà động cơ tự động gọi là một phần của chu kỳ sống tự nhiên của cấp độ.
So với hệ thống "ticking" của Unreal, các kịch bản Roblox chú trọng hơn vào sự kiện. Bạn truy cập các chức năng tương tự của động cơ bằng cách đăng ký với các dịch vụ và lắng nghe các bản cập nhật.
C++ và Luau
Đối với lập trình, Unreal sử dụng C++. Roblox sử dụng Luau, một ngôn ngữ lập trình phát triển từ Lua 5.1.
So với Luau, C++ có lợi thế về hiệu suất tổng thể, điều này có thể hoặc không phù hợp với các loại trò chơi bạn muốn xây dựng. Luau là ngôn ngữ có kiểu dần dần và có cú pháp ít tường thuật hơn. Tuy nhiên, trong các dự án lớn hơn, việc kiểu dần dần có thể dẫn đến các loại lỗi mà các ngôn ngữ kiểu chặt chẽ như C++ tránh được, vì vậy hãy cân nhắc việc bật kiểm tra kiểu nghiêm ngặt trong các kịch bản Roblox.
Unreal cũng bao gồm một hệ thống lập trình hình ảnh gọi là Blueprints. Roblox có các plugin bên thứ ba cung cấp chức năng tương tự, nhưng không có hệ thống tương đương tích hợp sẵn.
Mẫu mã Luau
Mẫu mã Luau sau đây minh họa cách lắng nghe đầu vào của người dùng (trong trường hợp này là phím E) và gọi các hàm bổ sung sau khi một người chơi trang bị cần câu:
local ContextActionService = game:GetService("ContextActionService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Lấy một script mô-đun từ ReplicatedStorage trả về một hàm duy nhất
local performSomeAction = require(ReplicatedStorage.performSomeAction)
-- Giả định rằng script này là con của cần câu
local fishingPole = script.Parent
local ACTION_CAST = "Cast"
-- Kiểm tra xem phím có đang nhấn xuống không, sau đó gọi một hàm khác
local function castLine(_actionName, inputState, _inputObject)
if inputState == Enum.UserInputState.Begin then
performSomeAction()
end
end
-- Chỉ kích hoạt hành động khi người chơi trang bị cần câu
fishingPole.Equipped:Connect(function()
ContextActionService:BindAction(ACTION_CAST, castLine, true, Enum.KeyCode.E)
end)
-- Vô hiệu hóa hành động khi người chơi bỏ trang bị cần câu
fishingPole.Unequipped:Connect(function()
ContextActionService:UnbindAction(ACTION_CAST)
end)
Kịch bản Roblox có thể khá ngắn gọn vì Roblox có nhiều giả định tích hợp: một Player với một nhân vật Humanoid kết nối với máy chủ và có thể trang bị Tools. Những giả định này không tồn tại trong Unreal, vì vậy việc thực hiện sẽ rất khác.
Tài sản
Unreal và Roblox đều hỗ trợ nhập khẩu các hình khối và mô hình tùy chỉnh ở định dạng .fbx. Một số loại tài sản nhất định có thể yêu cầu các cấu hình và cài đặt xuất cụ thể từ phần mềm mô hình hóa bên thứ ba của bạn. Để biết thêm thông tin, hãy xem các trang sau:
Trong Unreal, tài sản nhập vào thư mục Content của bạn, hiển thị trong Content Browser. Trong Roblox, tài sản nhập vào Workspace của bạn và vào Toolbox hoặc Quản lý Tài sản.
Roblox cũng cung cấp một plugin Blender mã nguồn mở để đơn giản hóa quy trình nhập, tương tự như tính năng Gửi đến Unreal của Blender Tools.
Biến đổi
Các phép biến đổi của Unreal Engine và CFrames của Roblox phục vụ các mục đích tương tự trong việc đại diện cho các phép biến đổi 3D của các đối tượng:
- Cả phép biến đổi và CFrames đều đại diện cho vị trí và độ xoay của một đối tượng trong không gian 3D. Các phép biến đổi bao gồm tỷ lệ, trong khi Roblox sử dụng thuộc tính BasePart.Size không nằm trong CFrame.
- Cả hai đều hỗ trợ phép nhân cho các phép biến đổi phức tạp và có các phương thức tích hợp cho các thao tác khác.
Hợp tác
Trong Unreal, bạn hợp tác với các hệ thống kiểm soát phiên bản như Perforce hoặc SVN, thông thường thông qua giao diện người dùng tích hợp của Unreal. Các hệ thống kiểm soát phiên bản này sử dụng mô hình "checkout" tập trung, khóa tệp khi một người làm việc trên chúng.
Các tệp Roblox sống trên đám mây (mặc dù bạn có thể xuất khẩu các bản sao), vì vậy Roblox Studio cung cấp các quy trình làm việc hợp tác tích hợp để chỉnh sửa đồng thời, quản lý nhóm, quyền hạn, soạn thảo kịch bản và nhiều hơn nữa. Xem Hợp tác.
Plugin
Tương tự như Unreal, Roblox Studio hỗ trợ plugin, có thể đơn giản hóa hoặc cung cấp cho bạn thêm quyền kiểm soát đối với nhiều khía cạnh của quy trình phát triển. Các plugin có sẵn trong Creator Store, giống như tài sản, nhiều trong số đó miễn phí.
Từ điển
| Unreal | Roblox | Ghi chú |
|---|---|---|
| Level | Place | |
| Actor | Part hoặc Model | Xem Những khác biệt triết lý. |
| Blueprint Class | Package | |
| Transform | CFrame | CFrame không bao gồm thông tin tỷ lệ. Xem Biến đổi. |
| Outliner | Explorer | |
| Details panel | Properties | |
| Level Viewport | 3D viewport | |
| Content Browser | Asset Manager hoặc Toolbox | |
| Landscape Mode | Terrain Editor | |
| PlayerStart | SpawnLocation | |
| Output Log | Output | |
| Marketplace | Creator Store | |
| Menu bar | Toolbar | |
| Plugin | Plugin |