Khả năng kịch bản

*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.

Khả năng kịch bản là một hệ thống cung cấp kiểm soát các hành động mà các kịch bản có thể thực hiện bên trong DataModel.Nó cung cấp kiểm soát tốt hơn về các kịch bản trải nghiệm thay vì là một hệ thống "tất cả hoặc không có gì" nơi bất kỳ kịch bản nào cũng có thể làm bất cứ điều gì mà các kịch bản khác có thể làm.

  • Hệ thống này cho phép bạn giới hạn những gì các mô hình được lấy từ hộp công cụ có thể làm và làm cho việc bao gồm nội dung được tạo bởi người dùng vào trải nghiệm dễ dàng hơn, ngay cả những cái chứa các kịch bản.
  • Nó cũng có thể giúp đảm bảo an ninh tốt hơn cho các trải nghiệm cho phép người chơi chạy mã của riêng họ, thường được thực hiện trong một môi trường giới hạn hoặc giả lập.
  • Nó cũng có thể được sử dụng để chia sẻ thư viện hạn chế những gì chúng có thể tự làm.Ví dụ, một thư viện cung cấp thêm các phương pháp toán học có thể bị giới hạn ở bộ năng lực nhỏ nhất mà nó cần để các nhà phát triển khác sử dụng thư viện đó không phải xác minh toàn bộ bộ mã nguồn để đảm bảo nó không bao gồm mã độc hại.

Bật khả năng kịch bản

Để bật tính năngnày, thay đổi cài đặt SandboxedInstanceMode từ Default thành Experimental trong Explorer.

Khi cuộc thử nghiệm beta của khách hàng hoàn thành, bước này sẽ không còn được yêu cầu nữa.

Thùng chứa cát

Hệ thống này giới thiệu một khái niệm về một hộp chứa cát bị hạn chế .Một ví dụ về loại Model , Folder , Script , hoặc con cháu của bất kỳ lớp nào trong số đó có một tính năng Sandboxed có sẵn trong cửa sổ Tính năng Studio , dưới phần Quyền truy cập .

Sandboxed property of a Folder in the Properties window.

Bật kích hoạt thiết kế tính năng Sandboxed đánh dấu instance là một thùng chứa cát bên trong cây DataModel , giới hạn các hành động mà các kịch bản bên trong thùng chứa có thể thực hiện dựa trên bộ giá trị trong tính năng Capabilities .

Năng lực

Thuộc tính Capabilities là một bộ các giá trị kiểm soát các khía cạnh khác nhau của thực thi, chia thành bốn nhóm:

  • Kiểm soát thực thi - Xác định xem một kịch bản có thể chạy trên máy khách hoặc máy chủ
  • Kiểm soát truy cập instance - Xác định các phần nào DataModel một kịch bản có thể tương tác
  • Kiểm soát chức năng của kịch bản - Xác định các kịch bản Luau nào có thể gọi
  • Kiểm soát truy cập API động cơ - Xác định các phần nào của API động cơ Roblox có thể được sử dụng

Khi một kịch bản cố gắng thực hiện một hành động không nằm trong bộ năng lực cho trạng thái thực thi hiện tại, một lỗi được báo cáo.Các lỗi thường bao gồm hành động đang được thử, mục tiêu của một hành động, và khả năng đầu tiên bị thiếu, ví dụ:


The current thread cannot modify 'Workspace' (lacking capability AccessOutsideWrite)
The current thread cannot call 'Clone' (lacking capability CreateInstances)
The current thread cannot call 'GetSecret' (lacking capability Network)

Kiểm soát thực thi

Bộ này bao gồm hai khả năng:

Nếu kịch bản là Enabled , nhưng khả năng tương ứng với vị trí nó cố gắng khởi động không có sẵn, một thông báo cảnh báo được hiển thị trong cửa sổ Thành phẩm .Nếu một kịch bản không nên chạy trong bối cảnh đó, vô hiệu hóa hoặc xóa nó.

Lưu ý rằng ModuleScripts không cần phải có các khả năng thực thi này để được yêu cầu.

Khi một kịch bản không thể bắt đầu vì khả năng kiểm soát thực thi bị thiếu, nó được báo cáo là một cảnh báo trong đầu ra, ví dụ:


Cannot start server script 'Script' (lacking capability RunServerScript)

Kiểm soát truy cập của instance

Bộ này chỉ bao gồm một khả năng duy nhất:

  • Truy cập bên ngoài Viết - Tập lệnh được phép lấy và nhận các thực thể từ bên ngoài thùng chứa bị giới hạn

Khi khả năng không có sẵn, kịch bản chỉ có thể tìm kiếm các ví dụ nằm bên trong chứa cát riêng của nó.Ví dụ, nếu kịch bản được đặt trực tiếp vào thùng chứa cát, script.Parent.Parent trả về nil .

Ngoài ra, bất kỳ sự kiện API Roblox nào đi qua trong một Instance thay vì đi qua trong nil cho bất kỳ Instance bên ngoài thùng chứa sandbox.Ví dụ, nếu BasePart.Touched được dấu hiệu bởi một cú chạm từ một thùng chứa bên ngoài sandbox, sự kiện vẫn được nhận, nhưng argument là nil .

Tránh cài đặt khả năng này; bảo đảm cát nhân bản yếu hơn khi các kịch bản có thể tương tác với bất kỳ thực thể nào trong một trải nghiệm.

Truy cập vào các dịch vụ

Ngay cả khi không có AccessOutsideWrite , các kịch bản trong thùng chứa cát vẫn có thể truy cập vào game , workspace và các dịch vụ.Truy cập này được cung cấp để các tập lệnh vẫn có thể gọi các phương pháp hữu ích của các globals, như DataModel.GetService , nhưng truy cập vào các ví dụ con của chúng vẫn được xác minh.

Các ví dụ được chuyển trong nội bộ

Nếu một ví dụ được truyền qua một cuộc gọi chức năng không đi qua API Roblox, tham chiếu được giữ lại.Tuy nhiên, nếu một ModuleScript được truyền theo cách này, nó không thể được yêu cầu mà không có AccessOutsideWrite .Điều này là do việc trả về của ModuleScript thường có thể thay đổi và có thể được chỉnh sửa bởi một kịch bản trong một thùng chứa cát.

Kiểm soát chức năng kịch bản

Bộ năng lực này kiểm soát một số khía cạnh chung của các kịch bản:

Hãy nhớ rằng các hạn chế chức năng mặc định vẫn áp dụng.Ngay cả khi LoadString được bật, trải nghiệm vẫn phải bật nó trong ServerScriptService , và nó vẫn chỉ có sẵn trên máy chủ.

Để tạo các ví dụ mới, ngoài Tạo các ví dụ , cần có thêm khả năng API Động cơ cung cấp quyền truy cập vào ví dụ đó.

Kiểm soát truy cập API động cơ

Nhóm cuối cùng các khả năng kiểm soát quyền truy cập vào các API Động cơ khác nhau:

  • Cơ bản - Truy cập vào các ví dụ đơn giản và khối xây dựng cốt lõi
  • Âm thanh - Truy cập vào các thực thể liên quan đến API âm thanh
  • Kho lưu trữ dữ liệu - Truy cập vào API kho lưu trữ dữ liệu và kho bộ nhớ
  • Mạng - Truy cập vào API mạng HTTP
  • Vật lý - Truy cập vào các instanz liên quan đến vật lý
  • Giao diện người dùng - Truy cập vào các thực thể liên quan đến giao diện người dùng
  • CSG : truy cập vào các thực thể và chức năng liên quan đến hình học rắn ráo xây dựng (CSG)
  • Trò chuyện : truy cập vào các thực thể liên quan đến trò chuyện trong kinh nghiệm
  • Hoạt hình : truy cập vào các thực thể liên quan đến hoạt hình
  • Avatar : truy cập vào các thực thể liên quan đến avatar
  • Nhập : truy cập vào các thực thể liên quan đến nhập của người dùng
  • Môi trường : truy cập vào các instanz liên quan đến việc kiểm soát cách môi trường được hiển thị
  • Sự kiện từ xa : truy cập vào các thực thể cho các hoạt động mạng nội bộ

Cũng có những trường hợp có sẵn mà không có bất kỳ khả năng nào ngoài việc thực hiện các tập lệnh.Chúng bao gồm các phương pháp sau HttpService :

Nếu một thuộc tính hoặc phương thức của một ví dụ không được truy cập mà không có khả năng cần thiết, một lỗi được báo cáo mô tả khả năng bị thiếu.

Cuối cùng, các khả năng không bao gồm tất cả các ví dụ trong Roblox Engine ngày hôm nay.Các thực thể không được liệt kê trong phần này hoặc phần tiếp theo không có sẵn để tương tác từ một thùng chứa sandbox và ném lỗi nói rằng một khả năng chưa được gán không có sẵn cho kịch bản hiện tại.

Một hạn chế bổ sung là các chức năng getfenvsetfenv không có sẵn cho các kịch bản trong một thùng chứa cát.

Chỉ truy cập vào các instance bằng kịch bản bị giới hạn.Các ví trường vẫn có thể tồn tại và hoạt động bởi chính mình bên trong một thùng chứa cát.Ánh sáng vẫn chiếu sáng, giao diện người dùng vẫn còn nhìn thấy, và các cài đặt âm thanh đã được kết nối vẫn phát ra âm thanh.

Phân bổ khả năng của API động cơ

Dưới đây là danh sách các ví dụ và phương thức (nếu khác với khả năng của instance) cho mỗi khả năng API động cơ:

Tương tác giữa các container

Hộp chứa lồng nhau

Khi một thùng chứa sandbox được lồng vào một thùng chứa khác, các instânce của thùng chứa bên trong có thể truy cập vào thùng chứa bên ngoài.

Khả năng của thùng chứa bên trong bị giới hạn bởi khả năng của thùng chứa bên ngoài.Ví dụ, nếu thùng chứa bên ngoài có các khả năng của Cơ bản , AudioCSG , trong khi thùng chứa bên trong có Cơ bảnMạng , chỉ có Cơ bản khả năng có sẵn cho thùng chứa bên trong khi chạy.

Nếu không có khả năng chung giữa các thùng nội và ngoại, bộ khả năng kết quả là trống.

Chức năng và sự kiện có thể gắn kết

BindableEventBindableFunction cung cấp cách tốt nhất để giao tiếp với container hoặc cho phép nó thực hiện cuộc gọi trả lại với các khả năng nó không được phép sử dụng trực tiếp.

Khi một sự kiện hoặc chức năng bị kích hoạt, các kết nối được thực hiện trong bối cảnh của chức năng đã đăng ký chúng.Điều này có nghĩa là nếu sự kiện hoặc cuộc gọi lại chức năng được đăng ký bởi thùng chứa cát, nó được gọi với các khả năng của thùng chứa đó.Nếu callback được đăng ký bởi mã bên ngoài, khi kịch bản thùng cát gọi chúng, chúng thực hiện chức năng của bạn với các chức năng có sẵn cho chức năng của bạn.

Thật quan trọng để lưu ý rằng ngay cả với khả năng AccessOutsideWrite , các kịch bản trong các thùng chứa cát không thể gọi sự kiện hoặc chức năng bên ngoài thùng chứa của họ nếu chúng có bộ khả năng lớn hơn thùng chứa chính.

Yêu cầu yêu cầu

Bên trong ModuleScripts có thể được yêu cầu bởi thùng chứa bị giới hạn như thường.Tuy nhiên, nếu ví dụ mục tiêu là bên ngoài thùng chứa, ModuleScript chỉ có thể được yêu cầu nếu bộ khả năng có sẵn cho nó nhỏ hơn hoặc bằng khả năng có sẵn cho thùng chứa.

Giới hạn này không áp dụng cho RunClientScriptRunServerScript khả năng.Nếu ModuleScript được đặt trong một thùng chứa chỉ có RunClientScript nhưng cần thiết từ một kịch bản có khả năng RunServerScript , nó được phép thành công và chạy các chức năng trên máy chủ.

Gọi trực tiếp chức năng

Nếu một ModuleScript trong một thùng chứa cát phải được yêu cầu từ bên ngoài thùng chứa, một số bảo vệ không có sẵn.Cụ thể, chức năng mục tiêu có thể truy cập tất cả các instanz có sẵn cho người gọi.Nếu người gọi không ở trong một thùng chứa cát, cuộc gọi hành động như thể AccessOutsideWrite có sẵn cho nó.

Các hạn chế khả năng khác vẫn áp dụng.Nếu bạn có khả năng truy cập Kho lưu trữ dữ liệu , nhưng mô-đun mục tiêu không có, nó không thể gọi các phương pháp DataStore.Tuy nhiên, nếu bạn truyền chức năng của riêng mình hoạt động với DataStore, mục tiêu có thể chạy nó trong cuộc gọi đó.Nếu mục tiêu lên lịch một tiến trình sử dụng các phương pháp như những phương pháp từ task, các tiến trình này mất khả năng gọi chức năng đó.

Các thực thể có thể được chuyển đến mô-đun mục tiêu hoặc được gán cho các trường mô-đun.

Nếu cần thiết, nó được khuyến nghị để gán thành viên bảng bằng cách sử dụng rawset để tránh chạy __index / __newindex metamethods có thể được thiết lập trên bảng.

Tổng khuyến nghị là giao tiếp với BindableEventBindableFunction bất cứ khi nào có thể.

Di chuyển các ví dụ

Hầu hết các trường hợp không có hạn chế về di chuyển giữa các container.Tuy nhiên, các ví dụ kịch bản chỉ có thể được di chuyển vào một container có cùng bộ chức năng hoặc một phần của các chức năng đó.

Điều này có nghĩa là thùng chứa sandbox với AccessOutsideWrite không thể chỉ tái sinh một kịch bản bên trong ra bên ngoài và nhận thêm các khả năng.