Đối với nhiều nhà phát triển, thách thức cơ bản trong việc thích ứng với lập trình Roblox là tầm quan trọng của vị trí tệp và thuộc tính Script.RunContext. Tùy thuộc vào loại script, vị trí trong Explorer, và ngữ cảnh chạy, các script có thể hoạt động rất khác nhau. Một số lời gọi phương thức có thể thất bại, các đối tượng trong trò chơi của bạn có thể không thể truy cập, hoặc các script có thể không chạy chút nào.
Nguyên nhân của sự phức tạp này là các trò chơi Roblox mặc định là trò chơi nhiều người chơi. Các script cần có khả năng chỉ chạy trên máy chủ, chỉ chạy trên khách, hoặc được chia sẻ giữa cả hai. Sự phát triển của nền tảng Roblox theo thời gian đã làm tình hình càng phức tạp hơn.
Các loại script
Roblox có ba loại script:
- Script - Mã chạy trên máy chủ hoặc trên khách, tùy thuộc vào vị trí của nó và thuộc tính Script.RunContext.
- LocalScript - Mã chạy chỉ trên khách. Không có ngữ cảnh chạy.
- ModuleScript - Mã mà bạn có thể tái sử dụng trong các script khác. Không có ngữ cảnh chạy.
Khi bạn tạo một Script, ngữ cảnh chạy mặc định của nó là Legacy, có nghĩa là nó a) là một script phía máy chủ và b) chỉ chạy nếu nó ở trong một container máy chủ, chẳng hạn như Workspace hoặc ServerScriptService.
- Nếu bạn thay đổi ngữ cảnh chạy của script thành Server, nó giờ đây cũng có thể chạy trong ReplicatedStorage, nhưng điều đó không được khuyến nghị. Nội dung của vị trí đó được sao chép tới khách, vì vậy đó là một vị trí không tốt cho các script phía máy chủ.
- Nếu bạn thay đổi ngữ cảnh chạy của script thành Client, nó có thể chạy trong ReplicatedStorage. Nó cũng có thể chạy trong StarterCharacterScripts và StarterPlayerScripts. Các container khởi động được sao chép tới khách, do đó, cả script gốc và bản sao đều chạy, điều này không mong muốn.
Để thay đổi ngữ cảnh chạy của một script, hãy chọn nó trong Explorer và thay đổi giá trị trong cửa sổ Properties.

Các khuyến nghị
Đặt các script khách vào ReplicatedStorage với RunContext là Client bên cạnh các ModuleScripts chỉ dành cho khách.
Khi gỡ lỗi trong Studio, bạn có thể nhấp vào các dòng trong cửa sổ Output và đi đến ReplicatedStorage.YourScript (vị trí ổn định của script) thay vì Players.YourName.PlayerScripts.YourScript (vị trí tạm thời mà script đã được sao chép vào lúc chạy).
Đặt các script máy chủ vào ServerScriptService với RunContext là Server bên cạnh các ModuleScripts chỉ dành cho máy chủ.
Để chia sẻ mã giữa các script máy chủ và khách, hãy sử dụng ModuleScripts trong ReplicatedStorage.
Đặt số lượng tối thiểu các script khách (chẳng hạn như một script tải) vào ReplicatedFirst với RunContext là Client. Để tìm hiểu thêm, xem Thứ tự sao chép.
Sử dụng LocalScripts trong StarterCharacterScripts, StarterPlayerScripts, StarterGui, và StarterPack.
Vị trí script
| 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. |
Hình ảnh này cho thấy các vị trí trong cửa sổ Explorer có thể chứa các script khách. Hãy nhớ rằng, ReplicatedFirst và ReplicatedStorage có thể chứa Scripts với RunContext là Client, trong khi các container Starter[] nên sử dụng LocalScripts.

Cấu trúc dự án mẫu
Dự án tham khảo Plant cho thấy cách bạn có thể tổ chức mã của mình trong một trò chơi lớn, phức tạp.
Điều đáng chú ý là cách nó lưu trữ phần lớn mã của mình dưới dạng các ModuleScripts có thể tái sử dụng trong ReplicatedStorage và ServerStorage.