Script Capabilities là một hệ thống cung cấp kiểm soát trên những hành động mà các script có thể thực hiện trong DataModel subtree. Nó cung cấp kiểm soát tốt hơn trên các trang web kinh nghiệm hơn là một hệ thống "tất cả hoặc không có gì" nơi bất kỳ script nào có thể làm bất cứ điều gì khác mà các
- Hệ thống này cho phép bạn hạn chế 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 dễ dàng hơn để bao gồm nội dung tạo bởi người dùng trong trải nghiệm, ngay cả những người chứa các kịch bản.
- Nó cũng có thể giúp đảm bảo an toàn 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 thi hành trong một môi trường giả hạn hoặc theo nghĩa đen.
- Nó cũng có thể được sử dụng để chia sẻ các thư viện hạn chế những gì họ có thể làm. Ví dụ, một thư viện cung cấp các phương pháp toán học bổ sung có thể bị hạn chế cho tới bộ nhỏ nhất các khả năng nó cần để đảm bảo rằng không có mã độc ác.
Mở Năng Lực Script
Để bật tính năng này, thay đổi cài đặt SandboxedInstanceMode từ Default đến Experimental trong Explorer.
Khi bản chí đoán của khách hàng đã được hoàn thành, bước này sẽ không còn được yêu cầu.
Thùng Sandbox
Hệ thống này giới thiệu một khái niệm về một Container sandboxed . Một instanti của loại Model , Folder , 1> Class.Script1> hoặc con chá
Kích hoạt thuộc tính Sandboxed tại đây, DataModel tree, giới hạn các hành động mà các script ở trong thuộc tính Capabilities có thể thực hiện dựa trên set giá trị trong thuộc tính
Khả năng
Thuộc tính Capabilities là một bộ 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 thi hành - Định kiểm soát nếu một script có thể chạy trên client hoặc máy chủ
- Kiểm soát truy cập trên máy chủ - Định nghĩa các bộ phận DataModel mà một script có thể tương tác
- Kiểm soát chức năng script - Xác định các tập lệnh Luau có thể gọi
- Quản định truy cập API của động cơ - Xác định các bộ phận của Roblox Engine API có thể được sử dụng
Khi một script thử thi hành một hành động nằm ngoài bộ sưu tập các kĩ năng cho trạng thái thi hành hiện tại, một lỗi được báo cáo. Lỗi thường bao gồm hành động đang được thử thi, 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 tra thực hiện
Bộ này bao gồm hai khả năng:
- RunClientScript - LocalScript hoặc Script với giá trị 0> Class.BaseScript.RunContext|RunContext0> của 3> Class.BaseScript 3> để thực hiện trên client
- ChạyServerScript - Script với giá trị RunContext của 0> Enum.RunContext.Server|Server0> để thực hiện trên máy chủ
Nếu script là Enabled , nhưng không có khả năng tương ứng với vị trí nó thử khởi động là không có sẵn, một thông báo cảnh báo được hiển thị trong cửa sổ Thoát . Nếu một script không nên khởi động trong bối cảnh đó, bị vô hiệ
Ghi chú rằng ModuleScripts không cần thiết phải có các khả năng thực thi này để được yêu cầu.
Khi một script không thể khởi động vì không có khả năng điều khiển thực thi, nó được báo cáo là cảnh báo trong kết quả, ví dụ:
Cannot start server script 'Script' (lacking capability RunServerScript)
Kiểm soát truy cập Instace
Bộ này chỉ bao gồm một khả năng duy nhất:
- AccessOutsideWrite - Skript được phép lấy và nhận instances từ ngoài thùng đã cấm
Khi không có khả năng sẵn sàng, script chỉ có thể tìm kiếm các instância nằm trong cùng một contêiner cát. Ví dụ, nếu script được đặt trực tiếp trong contêiner cát, script.Parent.Parent được trả lại nil .
Ngoài ra, bất kỳ sự kiện API Roblox nào đi qua một Class.Instance bên trong một Class.Instance bên ngoài khu vực cảnh nhìn xuống biển cũng được đưa qua một nil bên ngoài khu vự
Tránh cài đặt khả năng này; sandboxing đảm bảo yếu hơn khi các script có thể tương tác với bất kỳ mô hình nào trong một trải nghiệm.
Quyền truy cập Dịch Vụ
Mặc dù không có AccessOutsideWrite , các script trong thùng đã được chứng nhận quyền truy cập vào game , workspace và các dịch vụ. Đây là quyền truy cập để cho phép các script vẫn có thể gọi các ph
Các Instances Đã Qua Nội Bộ
Nếu một instância được gọi thông qua một hàm chức năng không đi qua Roblox APIs, thì tham chiếu được giữ. Tuy nhiên, nếu một ModuleScript được gọi theo cách này, nó không thể được yêu c
Kiểm soát chức năng script
Bộ sưu tập này các khả năng kiểm soát một số khía cạnh chung của các tập tin:
- Yêu cầu tài sản - Script được phép gọi require với một ID tài sản
- LoadString - Người lập trình có thể gọi loadstring
- Tạo mới Instances - Skript có thể tạo mới các instances bằng cách sử dụng Instance.new , Instance.fromExisting hoặc 0> Class.Instance:Clone0>
Hãy lưu ý rằng 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ó trên ServerScriptService , và nó vẫn chỉ có sẵn trên máy chủ.
Để tạo mới các instância, ngoài Tạo instância , một khả năng Engine API bổ sung cung cấp quyền truy cập vào instância đó là cần thiết.
Kiểm soát quyền truy cập API Engine
Nhóm cuối cùng các khả năng kiểm soát truy cập vào các API Engine:
- Cơ bản - Truy cập vào các instância đơn giản và các khối xây dựng cần thiết
- âm thanh - Quyền truy cập vào các tài nguyên liên quan đến API âm thanh
- Kho dữ liệu - Truy cập vào kho dữ liệu và API lưu trữ
- Mạng - Quyền truy cập vào các API mạng HTTP
- Vật lý học - Truy cập vào các tập hợp liên quan đến vật lý
- UI - Truy cập vào các tập hợp của người dùng
- CSG : truy cập vào các tập hợp hành tây liên quan đến geometria hợp lý (CSG)
- Chat : truy cập vào các instace liên quan đến trò chuyện trong kinh nghiệm
- Hoạt họa : truy cập vào các tập hợp liên quan đến hoạt họa
- Avatar : truy cập vào các instância liên quan đến avatars
- Input : truy cập vào các biến cố liên quan đến người dùng
- Môi trường : quyền truy cập các tài nguyên liên quan đến việc kiểm soát cách môi trường được hiển thị
- Sự kiệnRemote : truy cập vào các instância cho các hoạt động mạng nội bộ
Cũng có một số trường hợp khác không có khả năng thực hiện các脚本. Các trường hợp này bao gồm các phương thức HttpService sau đây:
Nếu một thuộc tính hoặc phương pháp của một instância được truy cập mà không có khả năng yêu cầu, 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 mọi instância trong động cơ Roblox hôm nay. Các instância không được liệt kê trong phần này hoặc phần tiếp theo không có sẵn cho interaction từ một contêiner được cấp phép và ném một lỗi nói rằng một khả năng không được giao k
Một giới hạn bổ sung là getfenv và setfenv các chức năng không khả dụng cho các tập lệnh trong một container cát.
Chỉ các kịch bản truy cập vào các instância là hạn chế. Các instância chính thức vẫn có thể tồn tại và hoạt động bởi chính chúng trong một contêiner được cách mạng. Ánh sáng vẫn bật, giao diệng người dùng vẫn hiển thị và cài đặt âm thanh đã được kết nối.
Giao dịch API động cơ
Đây là danh sách các instância và phương pháp (nếu khác với khả năng của instância) cho mỗi khả năng API Engine:
Cơ bản * Attachment
- Class.Part , MeshPart , CornerWedgePart , 0> Class.TriangleMeshPart0> , 3> Class.WedgePart3> , Part6>
âm thanh * AudioAnalyzer
Kho dữ liệu * DataStore , OrderedDataStore , GlobalDataStore
- Class.DataStoreGetOptions , DataStoreIncrementOptions , DataStoreInfo , 0> Class.DataStoreKey0> , 3> Class.DataStoreKeyInfo3> , DataStoreGetOptions6> , <
Mạng * Class.HttpService:GetAsync , HttpService:RequestAsync() , HttpService:PostAsync() , 0> Class.HttpService:UrlEncode0> , HttpService:GetAsync()3>
Vật lý học * AlignOrientation , AlignPosition , DynamicRotate
Giao diện người dùng * BasePlayerGui , PlayerGui , BillboardGui , 0> Class.GuiBase0>
- Class.Toolbar , TextButton , TextFilterResult , 0> Class.TextFilterTranslatedResult0> , 3> Class.TextLabel3> , 6> Class.TextService6> , TextBox9>
- Class.UIComponent , UICorner , UIDragDetector , 0> Class.UIGradient0> , 3> Class.UIG
CSG * GeometryService
- BasePart phương pháp: BasePart:IntersectAsync() , BasePart:SubtractAsync() , 0> Class.BasePart:UnionAsync0>
- Class.IntersectOperation (cũng yêu cầu Cơ bản ), NegateOperation (cũng yêu cầu 0> Cơ bản 0>), 3> Class.PartOperation3> (cũng yêu cầu IntersectOperation6>),
Trò chuyện * BubbleChatConfiguration , BubbleChatMessageProperties
- Class.TextChannel , TextChatCommand , TextChatConfigurations , 0> Class.TextChatMessage0> , 3> Class.TextChatMessageProperties3> , 6> Class.TextChatService6> , TextChannel9>
Hoạt họa * Bone (yêu cầu thêm Cơ bản )
- Class.Animation , AnimationClip , AnimationClipProvider , 0> Class.AnimationContainer0> , 3> Class.AnimationRigData3> , 6> Class.AnimationTrack6> , Animation9>
Avatar * Accessory , AccessoryDescription
Môi trường * Atmosphere , Clouds , Lighting , 0> Class.Sky0>
- Class.BloomEffect , BlurEffect , ColorCorrectionEffect , 0> Class.ColorGradingEffect0> , 3> Class.DepthOfFieldEffect3> , 6> Class.PostEffect6> , BloomEffect9>
Sự kiệnRemote * BaseRemoteEvent , RemoteEvent , UnreliableRemoteEvent
Tương tác giữa các contender
Các Cont器 Đã Ghim
Khi một container sandbox được ghép chồng vào một container khác, các instância của container bên trong có thể được truy cập từ bên ngoài.
Các khả năng của thùng nội tại được giới hạn bởi các khả năng của thùng ngoài. Ví dụ, nếu thùng ngoài có các khả năng của Cơ bản , Âm thanh và CSG, thì chỉ có nh
Nếu không có khả năng chung giữa các cont器 bên trong và bên ngoài, kết quả bộ khả năng được lập trình sẵn sàng là trống rỗng.
Hàm và sự kiện có thể liên kết
BindableEvent và BindableFunction cung cấp cách tốt nhất để giao tiếp với container hoặc cho phép nó chạy các hàm để khả dụng nó không thể sử dụng trực tiếp.
Khi một sự kiện hoặc chức năng được gọi, kết nối được thi hành trong ngữ cảnh của chức năng đã đăng nó. Điều này có nghĩa là nếu sự kiện hoặc chức năng callback được đăng bởi các tài nguyên bên ngoài, khi tài nguyên bên ngoài gọ
Điều quan trọng là lưu ý rằng ngay cả với khả năng AccessOutsideWrite , các script trong các container được thiết lập không thể gọi sự kiện hoặc hàm nào ngoài các container của họ nếu họ có một bộ năng lượng lớn hơn bộ năng lượng của chính họ.
Yêu cầu modul
Inner ModuleScripts có thể được yêu cầu bởi các container được cấp phép thử nghiệm như thường lệ. Tuy nhiên, nếu instância mục tiêu nằm ngoài container, thì ModuleScript chỉ có thể được yêu cầu nếu khả năng được cấp phép cho n
Hạn chế này không áp dụng đối với RunClientScript và RunServerScript khả năng. Nếu ModuleScript được đặt trong một container chỉ với 1> RunClientScript1> nhưng yêu cầu từ một script có khả năng 4> Run
Gọi trực tiếp các chức năng
Nếu một ModuleScript trong một container được yêu cầu từ ngoài container, một số bảo vệ không có sẵn. Ví dụ, chức năng mục tiêu có thể truy cập tất cả các instanti có sẵn cho người gọi. Nếu người gọi không ở trong một container, cuộc
Các hạn chế khác vẫn áp dụng. Nếu bạn có khả năng truy cập DataStore , nhưng mà không có khả năng truy cập mục tiêu, thì nó không thể gọi DataStore phươ
Các mô-đun có thể được truyền cho mục tiêu module hoặc được giao cho các trường module.
Nếu cần thiết, nên giao các thành viên trên bảng dữ liệu bằng cách sử dụng rawset để tránh thực hiện các mét phụ __index / __newindex métamethông dụng được đặt trên bảng.
Lời khuyên chung là giao tiếp với BindableEvent và BindableFunction mọi lúc mọi nơi mà có thể.
Di chuyển các Instances
Hầu hết các trường hợp không có hạn chế về chuyển động giữa các container. Tuy nhiên, các trường hợp script chỉ có thể được di chuyển vào một container có cùng một bộ hành tây hoặc một thân các hành tây.
Điều này có nghĩa làContainer được cát nhân AccessOutsideWrite không thể chỉ đơn giản là để một script bên trong mình ra ngoài và nhận thêm khả năng.