Các loại và vị trí script

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.


Đố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ố phương thức có thể không thành công, 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.

Lý do cho sự phức tạp này là vì các trò chơi Roblox mặc định là đa người chơi. Các script cần khả năng chỉ chạy trên máy chủ, chỉ chạy trên máy 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 phức tạp thêm tình hình.

Các loại script

Roblox có ba loại script:

  • Script - Mã chạy trên máy chủ hoặc máy khách, tùy thuộc vào vị trí của nó và thuộc tính Script.RunContext.
  • LocalScript - Mã chỉ chạy trên máy 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à a) nó là một script phía máy chủ và b) chỉ chạy nếu nó nằm trong một container máy chủ, chẳng hạn như ServerScriptService hoặc Workspace.

  • Nếu bạn thay đổi ngữ cảnh chạy của script thành Server, nó cũng có thể chạy trong ReplicatedStorage, nhưng chúng tôi không khuyến nghị điều đó. Nội dung của vị trí đó được sao chép đến các máy khách, vì vậy đó là một vị trí kém 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 đến các máy khách, vì vậy 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.

Thuộc tính RunContext được chỉ ra cho một Script.

Khuyến nghị

  • Đặt một Script duy nhất với RunContext là Client vào ReplicatedStorage.

  • Đặt một Script duy nhất với RunContext là Server vào ServerScriptService.

  • Sử dụng ModuleScripts cho càng nhiều mã phía máy khách và máy chủ càng tốt. Yêu cầu các module này từ script máy khách và script máy chủ của bạn.

    Cách tiếp cận này cung cấp cho mã của bạn một điểm vào duy nhất ở cả hai phía máy khách và máy chủ, điều này đơn giản hóa tổ chức và dễ dàng cách ly hoặc vô hiệu hóa các module có vấn đề. Thêm một hàm start() vào mỗi ModuleScript để tất cả các module có thể tải trước khi bạn bắt đầu thực thi mã của chúng:

    Mẫu script máy chủ
    --!strict
    local ServerScriptService = game:GetService("ServerScriptService")
    local SampleModule = require(ServerScriptService.SampleModule)
    local AnotherSampleModule = require(ServerScriptService.AnotherSampleModule)
    SampleModule.start()
    AnotherSampleModule.start()
    Mẫu module
    --!strict
    local CollectionService = game:GetService("CollectionService")
    local NPC_TAG = "npc"
    local SampleModule = {}
    local function setUpNpc(npc: Instance)
    -- khởi tạo mỗi NPC
    end
    local function cleanUpNpc(npc: Instance)
    -- chạy khi sự kiện xảy ra
    end
    function SampleModule.start() -- thêm hàm vào bảng
    -- vòng lặp ví dụ cho thiết lập dựa trên thẻ
    for _, npc in CollectionService:GetTagged(NPC_TAG) do
    setUpNpc(npc)
    end
    -- chạy các hàm khi sự kiện xảy ra
    CollectionService:GetInstanceAddedSignal(NPC_TAG):Connect(setUpNpc)
    CollectionService:GetInstanceRemovedSignal(NPC_TAG):Connect(cleanUpNpc)
    end
    return SampleModule
  • Để chia sẻ mã, sử dụng ModuleScripts trong ReplicatedStorage và yêu cầu chúng trong cả script máy khách và script máy chủ của bạn.

  • Nếu cần thiết cho trò chơi của bạn, lặp lại cùng một mẫu trong ReplicatedFirst với một script máy khách duy nhất và một số lượng tối thiểu ModuleScripts để thực hiện một màn hình tải. Để tìm hiểu thêm về ReplicatedFirst, xem Thứ tự sao chép.

  • Sử dụng LocalScripts một cách tiết kiệm. Nếu bạn phải sử dụng chúng, hãy đặt chúng trong StarterCharacterScripts, StarterPlayerScripts, StarterGui, hoặc StarterPack.

    Các script trong những container này được sao chép vào các container của người chơi thay vì chạy từ một vị trí, điều này có thể làm phức tạp việc gỡ lỗi. Sử dụng ReplicatedStorage cho mã máy khách cho phép bạn 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.YourLocalScript (vị trí tạm thời mà script đã được sao chép đến trong thời gian chạy).

  • Tránh gắn các script trực tiếp vào các đối tượng trong Workspace. Thay vào đó, gán thẻ cho các đối tượng và sử dụng CollectionService để làm việc với chúng từ một ModuleScript duy nhất.

    Ngoại lệ chính là nếu bạn phân phối các mô hình hoặc gói trên Creator Store. Trong trường hợp đó, bạn có thể cần bao gồm các script trong cấu trúc đối tượng; chỉ định một RunContext cho mỗi script để loại bỏ sự mơ hồ về cách nó chạy. Việc thiết lập rõ ràng thuộc tính này làm cho các mô hình và gói có khả năng hoạt động đúng từ nhiều vị trí khác nhau.

Cấu trúc dự án ví dụ

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. Nó lưu trữ phần lớn mã của mình dưới dạng ModuleScripts có thể tái sử dụng.

Vị trí script

LocationDescription
WorkspaceĐại diện cho thế giới 3D của trò chơi. Có thể chạy các script 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.
ReplicatedFirstChứa các đối tượng được sao chép đến client trước 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.
ReplicatedStorageChứa các đối tượng được sao chép đến cả client và server. Vị trí này lý tưởng cho Scripts với RunContext là Client, ModuleScripts client, và 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.
ServerScriptServiceChứa các script máy chủ. Vị trí này lý tưởng cho các script cần truy cập vào chức năng hoặc đối tượng phía máy chủ, chẳng hạn như logic trò chơi và lưu trữ đám mây.
ServerStorageChứa các đối tượng phía máy chủ. Vị trí này lý tưởng cho các đối tượng lớn không cần được sao chép ngay lập tức đến 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 phía máy chủ ở đây.
StarterPlayer ⟩ StarterCharacterScriptsChứa các LocalScripts chạy khi nhân vật xuất hiện.
StarterPlayer ⟩ StarterPlayerScriptsChứa các LocalScripts chạy khi người chơi tham gia trò chơi.
StarterGuiChứ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.
StarterPackThông 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 máy 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.

Sơ đồ cho thấy các vị trí script nào chạy trên máy khách.
©2026 Roblox Corporation. Roblox, logo Roblox và Powering Imagination là các nhãn hiệu đã đăng ký và chưa đăng ký của chúng tôi tại Hoa Kỳ và các quốc gia khác.