Trang này chứa thông tin để giúp các nhà phát triển Unity có 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.
Định hướng


Cửa sổ Hierarchy của Unity và Explorer của Roblox Studio là hai cửa sổ chính để tổ chức các yếu tố trong các cảnh 3D:
- Cả hai đều cho phép bạn quản lý và tổ chức các đối tượng (ví dụ, nhân vật và tài nguyên môi trường).
- Cả hai đều sử dụng cấu trúc cây cho các mối quan hệ cha-con giữa các đối tượng.
Tuy nhiên, cửa sổ Hierarchy không có cấu trúc định sẵn, trong khi cửa sổ Explorer có một cấu trúc nghiêm ngặt. Có thể giúp bạn nghĩ về cửa sổ Explorer như một sự kết hợp của cửa sổ Hierarchy và Project của Unity, với thư mục Workspace là phần tử dễ nhận biết nhất.
Tương tự, Asset Manager và Toolbox của Roblox chồng chéo với cửa sổ Project của Unity. Asset Manager cho phép bạn quản lý tất cả cá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ư Asset Store của Unity.
Sự khác biệt triết lý
Roblox là một "công cụ mô phỏng" thay vì một công cụ trò chơi truyền thống. GameObjects trong Unity và Parts trong Roblox đều là những khối xây dựng cơ bản cho việc tạo ra các đối tượng trong một môi trường 3D, nhưng thực tế, hai thứ này rất khác nhau:
- Đại diện: GameObjects trong Unity là một khái niệm cấp cao hơn cho bất kỳ đối tượng nào trong một cảnh, 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, thay vì hình học trừu tượng như các đối tượng nguyên thủy trong Unity.
- Vật lý: Để thực hiện các mô phỏng vật lý trong Unity, bạn gán các thành phần như Rigidbody và Collider vào một GameObject. Trong Roblox, vật lý được tích hợp 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 sự khác biệt ngay lập tức nếu bạn tạo một GameObject và một Part. GameObject không có gì hơn ngoài vị trí, độ quay và tỷ lệ. Part có thông tin đó—cộng thêm một vật liệu và màu sắc, các giá trị cho độ phản chiếu và độ trong suốt, khối lượng và hình dạng, và nhiều thứ khác. Biến một Part thành thứ giống như một GameObject trống nghĩa là loại bỏ rất nhiều thuộc tính tích hợp sẵn. Ngược lại, bạn có thể tạo một GameObject trông giống như một Part bằng cách thêm các thành phần MeshFilter, MeshRenderer, Collider và Rigidbody vào nó.
Từ góc độ lập trình, GameObject tương tự nhất với Instance của Roblox, lớp cơ sở cho tất cả các lớp khác của Roblox, nhưng vì bạn không (và không thể) tạo các đối tượng của kiểu Instance, sự so sánh không thực sự thực tiễn.
Một sự so sánh khác là GameObject của Unity với Model của 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 mà bạn có thể thiết lập mối quan hệ cha-con giữa nhiều GameObjects trong Unity. Bạn chỉ định một trong các phần của mô hình là phần chính của nó để định nghĩa đ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 hạt và nhiều thứ khác.
Ví dụ, một GameObject trong Unity có thể có các thành phần cho ParticleSystem, Physics3D, SpringConstraint, và một kịch bản. Trong cửa sổ Hierarchy, bạn thấy một GameObject duy nhất có tên là SpringyFireball. Cửa sổ Inspector hiển thị tập hợp các thành phần và thuộc tính.
Trong Roblox, một mô hình SpringyFireball tương đương trong cửa sổ Explorer có thể trông giống như thế này:
Model|- ParticleEmitter|- MeshPart|- SpringConstraint|- ClickDetector| |- Script
Triết lý vật lý theo mặc định của Roblox kéo dài đến quy trình xây dựng các mô hình 3D. Trong Roblox, hàn nhiều phần lại với nhau thành một cụm là một cách tuyệt vời để nhanh chóng xây dựng mọi thứ, vì Roblox coi các phần đã hàn như một cơ thể cứng chỉ. Cách tiếp cận này không có sẵn trong Unity.
Thay vì sử dụng các đơn vị mét tiêu chuẩn cho chiều dài và khối lượng, Roblox sử dụng các đơn vị giả định gọi là studs và Đơn vị Khối lượng Roblox (RMUs). Để xem các chuyển đổi và khuyến nghị mét tương tự, hãy xem Units.
Vị trí quan trọng
Các trò chơi Roblox mặc định là đa người chơi, vì vậy Roblox Studio bao gồm nhiều vị trí lưu trữ khác nhau với các hành vi cụ thể. Để biết thêm thông tin, xem runtime 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.
Unity 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 làm một trò chơi đa người chơi, Unity sử dụng các thư viện mạng của mình để chỉ ra khi nào một GameObject (và các kịch bản của nó) nên được độc quyền trên máy chủ.
Trong Unity, nhiều chức năng của động cơ có sẵn thông qua các phương thức của MonoBehaviour. Ví dụ, để chạy mã trước vòng lặp render, bạn thêm mã vào phương thức Update(). Để xử lý các sự kiện va chạm vật lý, bạn thêm mã vào phương thức OnCollideEnter().
Các kịch bản Roblox có tính sự kiện hơn. Bạn truy cập chức năng tương tự bằng cách đăng ký với các dịch vụ và lắng nghe thông tin cập nhật.
C# và Luau
Đối với lập trình, Unity sử dụng C#. Roblox sử dụng Luau, một ngôn ngữ lập trình được lấy cảm hứng từ Lua 5.1.
So với C#, Luau được kiểu từ từ và thường có cú pháp ít chi tiết hơn. Tuy nhiên, trong những dự án lớn hơn, kiểu từ từ có thể tạo ra 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 xem xét việc kích hoạt kiểm tra kiểu nghiêm ngặt trong các kịch bản Roblox.
Để biết về các sự khác biệt cơ bản về cú pháp giữa các ngôn ngữ lập trình, xem Luau và C# so sánh.
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ể tương đối ngắn gọn vì Roblox có nhiều giả định tích hợp sẵn: 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 Unity, do đó cách thực hiện sẽ rất khác.
Tài sản
Unity và Roblox đều hỗ trợ việc nhập các lưới và mô hình tùy chỉnh ở định dạng .fbx. Một số loại tài sản 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, xem các trang sau:
Trong Unity, các đối tượng nhập vào thư mục Assets của bạn, hiển thị trong cửa sổ Project. Trong Roblox, các tài sản nhập vào Workspace và vào Toolbox hoặc Asset Manager.
Roblox cũng cung cấp một plugin Blender mã nguồn mở để làm cho quy trình nhập khẩu trở nên đơn giản hơn.
Biến đổi
Các phép biến đổi của Unity 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 Unity, bạn hợp tác với các hệ thống kiểm soát phiên bản tiêu chuẩn hoặc các dịch vụ trả phí như Unity Version Control.
Các tệp Roblox sống trên đám mây (mặc dù bạn có thể xuất 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 truy cập, soạn thảo kịch bản và nhiều hơn nữa. Xem Hợp tác.
Tiện ích mở rộng
Tương tự như các công cụ của Unity, Roblox Studio hỗ trợ tiện ích mở rộng, 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 các khía cạnh khác nhau của quy trình phát triển. Các tiện ích mở rộng có sẵn trong Creator Store, giống như tài sản, nhiều cái miễn phí.
Từ điển
| Unity | Roblox | Ghi chú |
|---|---|---|
| Cảnh | Place | |
| GameObject | Part hoặc Model | Xem Sự khác biệt triết lý. |
| Prefab | Package | |
| Biến đổi | CFrame | CFrame không bao gồm thông tin tỷ lệ. Xem Biến đổi. |
| Hierarchy | Explorer | |
| Inspector | Properties | |
| Cảnh nhìn | 3D viewport | |
| Game view | 3D viewport | Cảnh nhìn chuyển thành một chế độ chơi khi bạn thử nghiệm trò chơi của mình. |
| Cửa sổ dự án | Asset Manager hoặc Toolbox | |
| Terrain Inspector | Terrain Editor | |
| Điểm spawn | SpawnLocation | |
| Console | Output | |
| Asset Store | Creator Store | |
| Overlays | Toolbar | |
| Tool | Plugin |