스크립트 기능은 DataModel 하위 트리에서 실행할 수 있는 스크립트의 컨트롤을 제공하는 시스템입니다. 경험 스크립트를 제공하는 대신 "모든 것 또는 아무것도"가 아닌 시스템으로 모든 스크립트가 할 수 있는 것을 제공합니다.
- 이 시스템을 사용하면 도구 상자에서 사용할 수 있는 모델의 범위를 제한하고 스크립트가 포함된 사용자 생성 콘텐츠를 경험 내에 쉽게 포함할 수 있습니다.
- 또한 제한된 또는 시뮬레이션 환경에서 플레이어가 자신의 코드를 실행할 수 있는 경험의 더 나은 보안을 확인하는 데 도움이 될 수 있습니다.
- 또한 제한된 작업을 수행할 수 있는 라이브러리를 공유하여 다른 라이브러리에서 사용할 수 있도록 하는 라이브러리를 제한할 수도 있습니다. 예를 들어, 특정 수학 메서드를 제공하는 라이브러리는 다른 개발자가 해당 라이브러리를 검증하기 위해 전체 코드베이스를 확인할 필요 없도록 제한될 수 있습니다
스크립트 기능 활성화
이 기능을 활성화하려면 탐색기에서 SandboxedInstanceMode를 Default에서 Experimental로 변경하십시오.
클라이언트 베타 테스트가 완료된 후에는 이 단계가 더 이상 필요하지 않습니다.
샌드박스 컨테이너
이 시스템은 샌드박스 컨테이너 개념을 소개합니다. 형식의 인스턴스인 Model, Folder, 2>Class.Script2> 또는 그 클래스의 후손인 5>Class
Class.Instance.Sandboxed|Sandboxed 속성을 활성화하면 스크립트 내에 있는 컨테이너가 DataModel 트리의 모든 샌드박스 컨테이너로 지정되므로 해당 컨테이너 내에서 수행할 수 있는 작업이 제한됩니다.
능력
Capilities 속성은 실행의 다양한 측면을 제어하는 세 가지 그룹으로 구분된 값 집합입니다.
- 실행 제어 - 스크립트가 클라이언트나 서버에서 실행할 수 있는지 지정합니다.
- 인스턴스 액세스 제어 - 스크립트가 상호 작용할 수 있는 DataModel 부품을 지정합니다.
- 스크립트 기능 제어 - 루아 함수 스크립트를 호출할 수 있는 스크립트 기능을 지정합니다.
- 엔진 API 액세스 제어 - Roblox 엔진 API의 특정 부분에 대한 액세스 권한을 지정합니다.
스크립트가 현재 실행 상태의 컬렉션 범위 내에 있지 않은 작업을 수행하려고 시도하면 오류가 보고됩니다. 오류는 일반적으로 시도되는 액션, 대상 작업 및 누락된 첫 번째 기능을 포함하여 작업이 시도되는 것입니다. 예를 들어, 다음과 같은 오류가 보고됩니다.
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)
실행 제어
이 세트에는 두 가지 기능이 포함됩니다.
- RunClientScript - LocalScript 또는 Script 와 함께 값 Class.BaseScript.RunContext|RunContext 의 크기가 0> Class.BaseScript0> 클라이언트에서 실행할 수 있습니다.
스크립트가 Enabled 인 경우, 해당 위치에서 시작하려는 기능에 대한 캡슐화된 경고 메시지가 출력 창에 표시됩니다. 스크립트가 해당 컨텍스트에서 실행되지 않도록 비활성화하거나 삭제하십시오.
이 실행 기능을 필요로 하지 않는 ModuleScripts가 있어야 합니다.
실행 제어 기능이 없기 때문에 스크립트가 시작되지 못하면 출력에 경고로 보고됩니다. 예를 들어:
Cannot start server script 'Script' (lacking capability RunServerScript)
인스턴스 액세스 제어
이 집합에는 단일 기능만 포함됩니다.
- 액세스 외부 작성 - 스크립트는 샌드박스 컨테이너 외부에서 인스턴스를 가져오고 받을 수 있습니다.
기능이 사용 가능하지 않을 경우, 스크립트는 자체 샌드박스 컨테이너 내에 있는 인스턴스만 검색할 수 있습니다. 예를 들어, 스크립트가 샌드박스 컨테이너 내에 직접 배치되면 script.Parent.Parent 는 nil 을 반환합니다.
또한, 모든 Roblox API 이벤트가 샌드박스 컨테이너 외부의 모든 Instance 에 대해 패스하는 경우, 이 이벤트는 여전히 nil 로 패스됩니다. 예를 들어, 샌드박스 컨테이
이 기능을 설정하지 마십시오. 샌드박스 보장은 스크립트가 경험에서 모든 인스턴스와 상호 작용할 수 있기 때문에 약간 더 약합니다.
서비스에 액세스
AccessOutsideWrite 없이도 샌드박스 컨테이너의 스크립트는 여전히 game , workspace 및 서비스에 액세스할 수 있습니다. 이 액세스는 스크립트가 여전히 글로벌 메서드를 호출하는 경우 자식 인스턴스를 액세스할 수 있
내부적으로 패스된 인스턴스
Roblox API를 통과하지 않는 함수 호출을 통해 인스턴스가 참조되면 참조가 유지됩니다. 그러나 ModuleScript 가 이 방식으로 패스되면 AccessOutsideWrite 가 필요하지 않습니다. 이는 ModuleScript 의 반환이 일반적으로
스크립트 기능 제어
이 세트의 기능 제어는 스크립트의 일반적인 측면을 제어합니다.
- 자산 필요성 검사 - 스크립트는 require 를 호출할 수 있습니다.
- LoadString - 스크립트는 loadstring을 호출할 수 있습니다.
- CreateInstances - 스크립트는 Instance.new , Instance.fromExisting 또는 0> Class.Instance:Clone0>를 사용하여 새로운 인스턴스를 생성할 수 있습니다.
기본 함수 제한이 여전히 적용됩니다. LoadString 이 활성화되어 있더라도 경험은 여전히 ServerScriptService에서 활성화해야 하며 서버에서만 사용할 수 있습니다.
새 인스턴스를 생성하려면 생성 인스턴스 외에 엔진 엔터티 API 기능을 사용하여 해당 인스턴스에 액세스해야 합니다.
엔진 API 액세스 제어
이 마지막 그룹의 기능 제어는 다양한 엔진 API에 스크립트 액세스를 제어합니다.This last group of capabilities controls script access to various Engine APIs:
- 기본 - 간단한 인스턴스 및 필수 건축 블록에 액세스
- 오디오 - 오디오 API와 관련된 인스턴스에 액세스
- 데이터 저장소 - 데이터 저장소 및 메모리 저장소 API에 액세스
- 네트워크 - HTTP 네트워크 API에 액세스
- 물리학 - 물리학과 관련된 인스턴스에 액세스
- UI - 사용자 인터페이스와 관련된 인스턴스에 액세스
- CSG : 건설 솔리드 기하구조와 관련된 인스턴스 및 함수에 대한 액세스
- 채팅 : 경험 내 채팅 관련 인스턴스에 액세스
- 애니메이션 : 애니메이션과 관련된 인스턴스에 액세스
- 아바타 : 아바타와 관련된 인스턴스에 액세스
- 입력 : 사용자 입력과 관련된 인스턴스에 대한 액세스
- 환경 : 환경이 표시되는 방식에 대한 컨트롤에 관련된 인스턴스에 액세스
- 원격 이벤트 : 내부 네트워킹 작업에 대한 인스턴스 액세스
또한 스크립트를 실행할 수 없는 경우에도 사용할 수 있는 인스턴스가 있습니다. 이에는 HttpService 메서드가 포함됩니다.
필요한 기능이 없는 인스턴스 속성이나 메서드에 액세스하면 오류가 발생하여 해당 기능을 설명합니다.
마지막으로, Roblox 엔진의 모든 인스턴스를 덮는 기능은 오늘날 Roblox 엔진에서 사용할 수 없습니다. 이 섹션 또는 다음 섹션에 나열되지 않은 인스턴스는 샌드박스 컨테이너에서 상호 작용하거나 오류가 발생하면 현재 스크립트에 사용할 수 없는 할당되지 않은 기능을 사용하지 않
추가 제한 사항은 getfenv 및 setfenv 함수가 샌드박스 컨테이너의 스크립트에는 사용할 수 없다는 것입니다.
스크립트 액세스는 인스턴스에 대해 제한됩니다. 인스턴스 자체는 여전히 존재하고 샌드박스 컨테이너 내에서 작동할 수 있습니다. 조명은 여전히 작동하며 사용자 인터페이스는 여전히 표시되고 오디오 설정은 여전히 작동합니다.
엔진 API 능력 할당
각 엔진 API 기능에 대한 각 인스턴스 및 메서드 목록(즉, 인스턴스 기능과 다른 경우)입니다.Here is the list of instances and methods (if different from the instance capability) for each Engine API capability:
기본 * Attachment
- Class.Part , MeshPart , CornerWedgePart , 0> Class.TriangleMeshPart0> , 3> Class.TrussPart3> , Part6>
오디오 * AudioAnalyzer, <
데이터 저장소 * DataStore , OrderedDataStore , GlobalDataStore
- Class.DataStoreGetOptions , DataStoreIncrementOptions , DataStoreInfo , 0> Class.DataStoreKey0> , 3> Class.DataStoreKeyInfo3> , DataStoreGetOptions6>
네트워크 * Class.HttpService:GetAsync , HttpService:RequestAsync() , HttpService:PostAsync() , 0> Class.HttpService:UrlEncode0> , HttpService:GetAsync()3>
물리학 * AlignOrientation , AlignPosition , DynamicRotate
- Class.Constructor, BallSocketConstraint, CylindricalConstraint, 0> Class.PrismaticFetchCapacity0>, 3>
UI * Class.BasePlayerGui, PlayerGui, BillboardGui, 0> Class.GuiBase0>, 3> Class.Gui
- Class.Executor, TextButton, TextFilterResult, 0> Class.TextFilterTranslatedResult0>, 3> Class.TextLabel3>, 6> Class.TextService6>, TextBox9>
CSG * GeometryService
- Class.IntersectOperation ( 기본 필요), NegateOperation (0> 기본0> 필요), 3> Class.PartOperation3> (6> 기본6> 필요), IntersectOperation9> (IntersectOperation2> 필요)
채팅 * BubbleChatConfiguration , BubbleChatMessageProperties
- Class.TextChannel , TextChatCommand , TextChatConfigurations , 0> Class.TextChatMessage0> , 3> Class.TextChatMessageProperties3> , 6> Class.TextChatService6> , TextChannel9>
애니메이션 * Bone (또한 기본 필요)
- Class.Animation , AnimationClip , AnimationClipProvider , 0> Class.AnimationContainer0> , 3> Class.AnimationRigData3> , 6> Class.AnimationTrack6> , Animation9>
아바타 * Accessory , AccessoryDescription
환경 * Atmosphere , Clouds , Lighting , 0> Class.Sky0>
- Class.BloomEffect , BlurEffect , ColorCorrectionEffect , 0> Class.ColorGradingEffect0> , 3> Class.DepthOfFieldEffect3> , 6> Class.PostEffect6> , BloomEffect9>
원격 이벤트 * BaseRemoteEvent , RemoteEvent , UnreliableRemoteEvent
컨테이너 간의 상호 작용
중첩된 컨테이너
하나의 샌드박스 컨테이너가 다른 하나에 중첩되면 내부 컨테이너의 인스턴스는 외부 컨테이너에 액세스할 수 있습니다.
내부 컨테이너의 기능은 외부 컨테이너의 기능에 제한됩니다. 예를 들어, 외부 컨테이너에 기능이 있으면 기본, 오디오 및 CSG 이며, 내부 컨테이너에 기능이 있으면 2>기본2>, 5>네트워크
내부 및 외부 컨테이너 간에 공통된 기능이 없으면 결과 기능 집합이 비어 있습니다.
결속 가능한 함수 및 이벤트
BindableEvent 및 BindableFunction 는 컨테이너와 통신하는 가장 좋은 방법을 제공하며, 직접 사용할 수 없는 기능을 사용하는 콜백을 실행할 수 있습니다.
이벤트 또는 함수가 발생하면 연결은 해당 함수를 등록한 컨텍스트의 함수에서 실행됩니다. 즉, 이벤트 또는 함수 콜백이 사이드 컨테이너에 의해 등록되면 해당 컨테이너의 기능을 사용할 수 있습니다. 코드 외부에서 이벤트 또는 함수 콜백을 호출하면 해당 콜
샌드박스 컨테이너에 있는 스크립트에는 대부분 AccessOutsideWrite 기능이 있지만 컨테이너 자체보다 큰 기능 집합을 가진 경우 샌드박스 컨테이너에서 스크립트를 호출할 수 없습니다.
모듈 필요
Inner ModuleScripts 는 평소처럼 샌드박스 컨테이너에 의해 필요로 할 수 있습니다. 그러나 대상 인스턴스가 컨테이너 밖에 있는 경우, ModuleScript 는 컨테이너에 사용 가능한 능력 집합이 작거나 같은 경우에만 필요로 할 수 있습니다
이 제한은 RunClientScript 및 RunServerScript 기능에는 적용되지 않습니다. ModuleScript 가 서버배치되어 있지만 1>RunServerScript1> 기능이 있는 스크립트에서만 실행되도록 하는 경우에는 이 제한을 성공하고 4>RunServerScript
직접 호출 함수
샌드박스 컨테이너에 있는 ModuleScript 이 외부에서 필요한 경우 일부 보호 기능이 사용 불가능합니다. 특히 대상 함수는 호출자에게 사용 가능한 모든 인스턴스에 액세스할 수 있습니다. 샌드박스 컨테이너에 있지 않은 경우 AccessOutsideWrite 가
기타 제한 사항이 여전히 적용됩니다. 대상 모듈이 아닌 경우 데이터 저장소 액세스 권한이 있지만 DataStore 메서드를 호출할 수 없습니다. 그러나 자체 함수를 사용하는
인스턴스는 대상 모듈로 전달되거나 모듈 필드에 할당될 수 있습니다.
필요한 경우, rawset 을 사용하여 테이블 멤버를 할당하여 __index</__> / __newindex</__> 메타메서드를 설정하지 않도록 하십시오.
전체 권장 사항은 BindableEvent 및 BindableFunction 과 가능할 때마다 커뮤니케이션하는 것입니다.
인스턴스 이동
대부분의 인스턴스에는 컨테이너 간의 이동에 제한이 없습니다. 스크립트 인스턴스는 컨테이너에 동일한 기능 집합이나 해당 기능의 하위 집합만 있을 수 있습니다.
이것은 AccessOutsideWrite 가 있는 샌드박스 컨테이너에서 스크립트를 외부로 다시 부모가 될 수 없으므로 더 많은 기능을 사용할 수 없음을 의미합니다.