스크립트 기능

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

스크립트 기능 은 스크립트가 DataModel 내에서 수행할 수 있는 작업에 대한 제어를 제공하는 시스템입니다.경험 스크립트에 대한 더 나은 제어를 제공하여 다른 스크립트가 수행할 수 있는 모든 작업을 수행할 수 있는 "전부 또는 아무것도" 시스템이 아닙니다.

  • 이 시스템을 사용하면 도구 상자에서 가져온 모델이 수행할 수 있는 작업을 제한하고 사용자 생성 콘텐츠를 경험에 포함하기가 더 쉬워지며, 스크립트가 포함된 것도 포함됩니다.
  • 플레이어가 자체 코드를 실행할 수 있는 경험의 보안이 향상되도록 도울 수도 있습니다, 이는 종종 제한된 또는 모방된 환경에서 실행됩니다.
  • 또한 자신이 수행할 수 있는 작업을 제한하는 라이브러리를 공유하는 데 사용할 수 있습니다.예를 들어, 추가 수학 메서드를 제공하는 라이브러리는 해당 라이브러리를 사용하는 다른 개발자가 악성 코드가 포함되지 않았는지 확인하기 위해 전체 코드베이스를 검증할 필요가 없도록 가장 작은 세트의 기능으로 제한될 수 있습니다.

스크립트 기능 활성화

이 기능을 활성화하려면 탐색기에서 SandboxedInstanceMode 설정을 Default에서 Experimental로 변경하십시오.

클라이언트 베타 테스트가 완료되면 이 단계는 더 이상 필요하지 않습니다.

샌드박스된 컨테이너

이 시스템은 모래 상자 컨테이너 의 개념을 소개합니다.유형 Model , Folder , Script 또는 그 클래스의 후손에는 Studio Sandboxed 창에서 사용할 수 있는 속성 이 있습니다, 권한 섹션에서.

Sandboxed property of a Folder in the Properties window.

속성을 활성화하면 인스턴스가 트리 내에서 샌드박스 컨테이너로 지정되어 해당 컨테이너 내의 스크립트가 속성의 값 집합에 따라 수행할 수 있는 작업이 제한됩니다.

기능

Capabilities 속성은 실행의 다양한 측면을 제어하는 값 집합으로, 4개의 그룹으로 나뉩니다.

  • 실행 제어 - 스크립트가 클라이언트나 서버에서 실행할 수 있는지 여부를 지정합니다
  • 인스턴스 액세스 제어 - 스크립트가 상호 작용할 수 있는 DataModel 부품을 지정합니다
  • 스크립트 기능 제어 - Luau 함수 스크립트가 호출할 수 있는 함수를 지정
  • 엔진 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 - 또는 값 의 클라이언트에서 실행할 수 있습니다
  • RunServerScript - 값으로 의 서버에서 실행할 수 있습니다

스크립트가 Enabled 이지만 시작하려는 위치에 해당하는 기능이 사용할 수 없으면 출력 에 경고 메시지가 표시됩니다스크립트가 해당 컨텍스트에서 실행되지 않아야 하는 경우 비활성화하거나 삭제합니다.

이러한 실행 기능이 필요하도록 하려면 ModuleScripts가 필요하지 않은 것을 참고하십시오.

실행 제어 기능이 누락되어 스크립트가 시작되지 않으면 출력에서 경고로 보고됩니다(예:


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

인스턴스 액세스 제어

이 집합에는 단일 기능만 포함됩니다:

  • AccessOutsideWrite - 스크립트는 샌드박스된 컨테이너 외부에서 인스턴스를 검색하고 받을 수 있습니다

기능이 사용할 수 없을 때 스크립트는 자체 격리된 컨테이너 내에 있는 인스턴스만 조회할 수 있습니다.예를 들어, 스크립트가 샌드박스 컨테이너에 직접 배치되면 script.Parent.Parentnil 를 반환합니다.

또한, 모든 Roblox API 이벤트가 샌드박스된 컨테이너 외부에서 대신 로 전달됩니다.예를 들어, 샌드박스된 컨테이너 외부의 인스턴스로부터 터치로 표시되는 BasePart.Touched 가 이벤트를 수신하지만, 인수는 nil 입니다.

이 기능을 설정하지 않도록 주의하십시오; 샌드박싱 보장은 스크립트가 경험의 모든 인스턴스와 상호작용할 수 있을 때 약화됩니다.

서비스에 액세스

AccessOutsideWrite 없이도 샌드박스 컨테이너의 스크립트는 여전히 game , workspace 및 서비스에 액세스할 수 있습니다.이 액세스는 스크립트가 여전히 DataModel.GetService와 같은 전역의 유용한 메서드를 호출할 수 있지만, 자식 인스턴스에 대한 액세스는 여전히 유효합니다.

내부적으로 전달된 인스턴스

인스턴스가 Roblox API를 통해 전달되지 않는 함수 호출을 통해 전달되면 참조가 유지됩니다.그러나 이런 방식으로 ModuleScript 가 전달되면 AccessOutsideWrite 없이는 요구할 수 없습니다.이는 반환의 ModuleScript 가 종종 변경 가능하고 샌드박스된 컨테이너의 스크립트에 의해 수정될 수 있기 때문입니다.

스크립트 기능 제어

이 기능 집합은 스크립트의 일반적인 측면을 제어합니다:

기본 함수 제한이 여전히 적용되므로 주의하십시오. LoadString 이 활성화되어 있더라도 경험은 여전히 ServerScriptService하고 서버에만 사용할 수 있습니다.

새 인스턴스를 생성하려면 CreateInstances 외에도 해당 인스턴스에 액세스할 수 있는 추가 엔진 API 기능이 필요합니다.

엔진 API 액세스 제어

마지막 그룹의 기능은 다양한 엔진 API에 대한 스크립트 액세스를 제어합니다:

  • 기본 - 간단한 인스턴스와 필수 빌딩 블록에 대한 액세스
  • 오디오 - 오디오 API와 관련된 인스턴스에 액세스
  • 데이터스토어 - 데이터 저장소 및 메모리 저장소 API에 대한 액세스
  • 네트워크 - HTTP 네트워킹 API에 액세스
  • 물리학 - 물리학과 관련된 인스턴스에 액세스
  • UI - 사용자 인터페이스와 관련된 인스턴스에 액세스
  • CSG : 건설적인 솔리드 기하학(CSG)과 관련된 인스턴스 및 함수에 대한 액세스
  • 채팅 : 경험 내 채팅과 관련된 인스턴스에 액세스
  • 애니메이션 : 애니메이션과 관련된 인스턴스에 액세스
  • 아바타 : 아바타와 관련된 인스턴스에 액세스
  • 입력 : 사용자 입력과 관련된 인스턴스에 대한 액세스
  • 환경 : 환경 표시 방법과 관련된 인스턴스에 대한 액세스
  • 원격 이벤트 : 내부 네트워킹 작업에 대한 인스턴스 액세스

스크립트를 실행할 수 있는 기능 외에도 사용할 수 있는 인스턴스도 있습니다.여기에는 다음 HttpService 메서드가 포함됩니다:

필수 기능이 없이 인스턴스 속성이나 메서드에 액세스하면 누락된 기능을 설명하는 오류가 보고됩니다.

마지막으로, 기능은 오늘날 Roblox 엔진의 모든 인스턴스를 다루지 않습니다.이 섹션이나 다음에 나열되지 않은 인스턴스는 샌드박스된 컨테이너에서 상호 작용할 수 없으며, 현재 스크립트에서 사용할 수 없는 미할당 기능이 있다고 오류를 던집니다.

추가 제한은 getfenvsetfenv 함수가 샌드박스된 컨테이너의 스크립트에서 사용할 수 없다는 것입니다.

인스턴스에 대한 스크립트 액세스만 제한됩니다.인스턴스 자체는 여전히 샌드박스된 컨테이너 내에서 존재하고 스스로 작동할 수 있습니다.조명은 여전히 빛나고, 사용자 인터페이스는 여전히 표시되며, 이미 연결된 오디오 설정은 소리를 재생합니다.

엔진 API 기능 할당

다음은 각 엔진 API 기능에 대한 인스턴스 및 메서드 목록(인스턴스 기능과 다른 경우):

컨테이너 간 상호 작용

중첩된 컨테이너

한 샌드박스 컨테이너가 다른 컨테이너 내에 중첩되면 내부 컨테이너의 인스턴스가 외부 컨테이너에 액세스할 수 있습니다.

내부 컨테이너의 기능은 외부 컨테이너의 기능으로 제한됩니다.예를 들어, 외부 컨테이너에 기본 기능, 오디오CSG 가 있고, 내부 컨테이너에는 기본네트워크 가 있는 경우, 런타임에 내부 컨테이너에 사용 가능한 기능은 기본 기능뿐입니다.

내부 및 외부 컨테이너 간에 공통 기능이 없으면 결과 기능 집합이 비어 있습니다.

바인드 가능한 함수 및 이벤트

BindableEventBindableFunction 는 컨테이너와 통신하거나 직접 사용할 수 없는 기능을 가진 콜백을 실행할 수 있는 최선의 방법을 제공합니다.

이벤트나 함수가 발생하면 연결은 해당 이벤트나 함수를 등록한 함수의 컨텍스트에서 실행됩니다.즉, 이벤트나 함수 콜백이 샌드박스된 컨테이너에 등록되면 해당 컨테이너의 기능으로 호출됩니다.콜백이 외부 코드에 의해 등록되고 샌드박스 컨테이너 스크립트가 호출하면, 함수의 기능을 사용할 수 있는 능력으로 함수를 실행합니다.

AccessOutsideWrite 기능이 있더라도 샌드박스 컨테이너에 있는 스크립트는 컨테이너 자체보다 더 큰 기능 집합을 가지고 있으면 컨테이너 외부에서 이벤트나 함수를 호출할 수 없습니다.

모듈 필요

내부 ModuleScripts 는 평소처럼 샌드박스된 컨테이너에서 요구할 수 있습니다.그러나 대상 인스턴스가 컨테이너 외부에 있는 경우, ModuleScript 는 사용 가능한 기능 세트가 컨테이너에 사용 가능한 기능과 동일하거나 더 작은 경우에만 요구할 수 있습니다.

이 제한은 RunClientScriptRunServerScript 기능에는 적용되지 않습니다.ModuleScript 가 단지 RunClientScript 을 가진 컨테이너에 배치되지만 서버에 RunServerScript 기능이 있는 스크립트에서 필요한 경우, 성공하고 서버에서 이러한 함수를 실행할 수 있습니다.

직접 호출된 함수

샌드박스된 컨테이너에 있는 ModuleScript 가 컨테이너 외부에서 필요한 경우, 일부 보호가 사용할 수 없습니다.특히 대상 함수는 호출자에게 사용 가능한 모든 인스턴스에 액세스할 수 있습니다.호출자가 샌드박스된 컨테이너에 없으면 호출은 AccessOutsideWrite 를 사용할 수 있는 것처럼 작동합니다.

다른 기능 제한이 여전히 적용됩니다.데이터 저장소 액세스 능력이 있지만 대상 모듈에는 없는 경우 데이터 저장소 메서드를 호출할 수 없습니다.If you have a DataStore access capability, but the target module does not, it is unable to call 메서드.그러나 자체 함수가 DataStore로 작동하도록 패스하면 대상이 해당 호출 중에 실행할 수 있습니다.대상이 task과 같은 메서드를 사용하여 스레드를 예약하면 해당 스레드는 해당 함수를 호출할 수 없게 됩니다.

인스턴스는 대상 모듈에 전달되거나 모듈 필드에 할당될 수 있습니다.

필요한 경우 rawset를 사용하여 테이블 멤버를 할당하면 테이블에 설정될 수 있는 __index / __newindex 메타메소드를 실행하는 것을 피할 수 있습니다.

전체 권장 사항은 언제든지 BindableEventBindableFunction 와 통신하는 것입니다.

인스턴스 이동

대부분의 인스턴스에는 컨테이너 간 이동에 제한이 없습니다.그러나 스크립트 인스턴스는 동일한 기능 집합이나 이러한 기능의 하위 집합이 있는 컨테이너로만 이동할 수 있습니다.

즉, AccessOutsideWrite 를 가진 샌드박스된 컨테이너는 외부로 스크립트를 다시 부모로 지정하고 더 많은 기능을 얻을 수 없습니다.