Senaryo yetenekleri

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

Kod yetenekleri bir sistemdir, kodların DataModel alt ağacı içinde yapabileceği eylemler üzerinde kontrol sağlar.Deneyim kodları üzerinde daha iyi kontrol sağlar, böylece herhangi bir kod diğer kodların yapabileceği her şeyi yapabilir. "Hepsi veya hiçbir şey" sistemi yerine.

  • Bu sistem, alet çantasından alınan modellerin ne yapabileceğini sınırlandırmanıza ve deneyime kullanıcı tarafından üretilen içeriği dahil etmenizi kolaylaştırır, hatta senaryo içerenler bile.
  • Ayrıca oyuncuların kendi kodlarını çalıştırmasına izin veren deneyimlerin daha iyi güvenliğini sağlamaya yardımcı olabilir, ki bu genellikle sınırlı veya emüle edilmiş bir çevrede yürütülür.
  • Ayrıca kendileri yapabileceklerini sınırlayan kütüphaneleri paylaşmak için de kullanılabilir.Örneğin, ek matematik yöntemleri sağlayan bir kütüphane, diğer geliştiricilerin bu kütüphane kullanmasında gerekli en küçük yetenek setine sınırlandırılabilir, böylece kötü kod içermediğinden emin olmak için tüm kod tabanını doğrulamak zorunda kalmazlar.

Senaryo yeteneklerini etkinleştir

Bu özelliketkinleştirmek için, Gezginde SandboxedInstanceMode ayarını Default 'dan Experimental 'a değiştirin.

Müşteri beta testi tamamlandığında, bu adım artık gerekli olmayacak.

Kumlanmış konteyner

Bu sistem bir kum kutusu konteyneri konseptini tanıtır.Tip Model , Folder , Script veya bu sınıfların herhangi birinin soyundakilerinin Studio Sandboxed penceresinde mevcut bir **** özelliği vardır, İzinler bölümünün altında.

Sandboxed property of a Folder in the Properties window.

özellik etkinleştirilmesi, örneği ağacının içinde bir kumlanmış kutu olarak tanımlar ve bu ağacın içindeki kodların yapabileceği eylemleri sınırlar, çünkü bu özellikteki değerlerin seti üzerine yapılan eylemler sınırlıdır.

Yetenekler

The Capabilities özelliği, çalışmanın farklı yönlerini kontrol eden bir dizi değerden oluşan bir grup:

  • İnfaz kontrolü - Bir senaryonun istemci veya sunucuda çalışabileceğini belirtir
  • İstemci erişim kontrolü - Bir senaryonun hangi DataModel parçalarıyla etkileşime girebileceğini belirtir
  • Kod işlev kontrolü - Hangi Luau işlevlerinin çağrılabileceğini belirtir
  • Motor API erişim kontrolü - Roblox Motor API'nin hangi parçalarının kullanılabileceğini belirler

Bir senaryo, mevcut yürütme durumu için yeteneklerin setinde olmayan bir eylem gerçekleştirmeye çalıştığında, bir hata bildirilir.Hatalar genellikle denenen eylemi, bir aksiyonhedefini ve kayıp olan ilk yeteneği içerir, örneğin:


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)

İnfaz kontrolü

Bu set iki yetenek içerir:

Eğer senaryo Enabled ise, başlamaya çalıştığı konuma karşılık gelen yetenek mevcut değilse, Çıktı penceresinde bir uyarı mesajı görünür.Bir senaryo o kontekste çalışmıyor olması gerekiyorsa, devre dışı bırakın veya silin.

Bu yürütme yeteneklerinin gerekli olması için ModuleScripts 'nin gerekli olması gerektiğini unutmayın.

Bir senaryo başlatılamadığında çalıştırma kontrol yeteneği yok olduğundan, çıktıda bir uyarı olarak bildirilir, örneğin:


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

İstisna erişim kontrolü

Bu set sadece tek bir yetenek içerir:

  • AksesDışarıYaz - Skript, kumlanmış kutunun dışından alınan ve alınan örnekleri almaya izin verir

Yetenek mevcut değilse, senaryo sadece kendi kumar kutusuna yerleştirilmiş kutunun içindeki örnekleri sorgulayabilir.Örneğin, eğer senaryo doğrudan sandığa yerleştirilirse, script.Parent.Parent``nil.

Ayrıca, bir Instance içinde geçen herhangi bir Roblox API etkinliği, sandboxlanmış kutunun dışındaki herhangi bir Instance için nil geçer.Örneğin, eğer BasePart.Touched sandık içindeki bir kutunun dışındaki bir örnek tarafından işaretlenirse, olay hala alınır, ancak argüman nil dir.

Bu yeteneği ayarlamaktan kaçının; denetim kutusu garantileri, senaryoların bir deneyimdeki herhangi bir instansla etkileşime girebildiğinde zayıflar.

Hizmetlere erişim

Hatta AccessOutsideWrite olmadan bile, kumlanmış kutudaki kodlar hala game , workspace ve hizmetlere erişebilir.Bu erişim, senaryoların hala yararlı yöntemlerini çağırabileceği bu globalların, örneğin DataModel.GetService , erişimine izin verilir, ancak çocuk örneklerine erişim hala doğrulanır.

İçeri geçirilen durumlar internally passed instances

Bir örnek Roblox API'lerden geçmeyen bir işlev çağrısıyla geçerse, referans korunur.Ancak, böyle bir ModuleScript bu şekilde geçerse, AccessOutsideWrite olmadan gerekli olmaz.Bunun nedeni, ModuleScript dönüşünün genellikle değiştirilebilir olması ve bir kumanda kutusunda bulunan bir senaryo tarafından değiştirilebilmesidir.

Senaryo işlev kontrolü

Bu yetenek seti, senaryoların genel yönlerini kontrol eder:

Varsayılan işlev sınırlarının hala geçerli olduğunu unutmayın. Yükleme Dizesi etkinleştirilmiş olsa bile, deneyim hala ServerScriptService ve yalnızca sunucuda mevcuttur.

Yeni örnekler oluşturmak için, CreateInstances dışında, bu örneğe erişim sağlayan ek bir Motor API yeteneği gereklidir.

Motor API erişim kontrolü

Bu son grup yetenek, çeşitli Motor API'lere yönelik senaryo erişimini kontrol eder:

  • Temel - Basit durumlara ve esas inşaat bloklarına erişim
  • Ses - Ses API'leri ile ilgili instanslara erişim
  • Veri Deposu - Veri depolama ve bellek depolama API'lerine erişim
  • - HTTP ağı API'lerine erişim
  • Fizik - Fiziğe ilişkin instanslara erişim
  • Kullanıcı arayüzleriyle ilgili instanslara erişim - Kullanıcı arayüzleriyle ilgili instanslara erişim
  • CSG : yapısal katı geometri ile ilgili durumlara ve işlevlere erişim (CSG)
  • Sohbet : deneyimsel sohbete ilişkin instanslara erişim
  • Animasyon : animasyonla ilgili instanslara erişim
  • Avatar : avatarlarla ilgili instanslara erişim
  • Giriş : kullanıcı girişiyle ilgili instanslara erişim
  • Çevre : çevrenin görüntülenmesiyle ilgili kontrolle ilgili instanslara erişim
  • Uzak Etkinlik : iç ağ operasyonları için instanslara erişim

Ayrıca, senaryoların çalıştırılmasının yanı sıra herhangi bir yeteneğe sahip olmadan kullanılabilen durumlar da vardır.Bunlar aşağıdaki HttpService yöntemlerini içerir:

Gerekli yetenek olmadan bir örnek özelliği veya yöntemi erişilirse, kayıp yeteneği tanımlayan bir hata bildirilir.

Son olarak, yetenekler bugün Roblox Motorunda her istisnayı kapsamıyor.Bu bölümde veya sonraki bölümde listelenmeyen örnekler, bir kumanda kutusundan etkileşim için mevcut değil ve şu andaki koda bir Atanmamış yeteneğinin mevcut olmadığını söyleyen bir hata atar.

Ek bir sınırlama, getfenv ve setfenv fonksiyonlarının bir kumanda kutusuna yerleştirilmiş kodlar için kullanılabilir olmadığıdır.

Sadece senaryoların instanslara erişimi sınırlıdır.Instansların kendileri hala bir kumlanmış kutu içinde kendi başlarına var olabilir ve çalışabilir.Işıklar hala parıldıyor, kullanıcı arayüzleri hala görünür ve zaten kablolanmış olan ses ayarları ses çıkarıyor.

Motor API yetenek atamaları

İşte her bir Motor API yeteneği için durum ve yöntem listesi (istisna durumlar dışında): Here is the list of instances and methods (if different from the instance capability) for each Engine API capability:

Konteynerler arasındaki etkileşimler

İç içe geçmiş kutular

Bir kumlanmış kutu içine başka bir kutunun içine yerleştirildiğinde, içerik konteynerinin instansları dışarıya erişilebilir.

İç konteynerin yetenekleri dış konteynerin yetenekleriyle sınırlıdır.Örneğin, dış kutunun Temel , Ses ve CSG yetenekleri varsa, iç kutunun Temel ve özelliklerine sahip olmasına rağmen, yalnızca Temel yetenekleri iç kutuya çalışma sırasında mevcuttur.

İç ve dış konteynerler arasında ortak bir yetenek yoksa, sonuçlanan yetenek seti boştur.

Bağlanabilir işlevler ve olaylar

BindableEvent ve BindableFunction konteynerle iletişim kurmanın en iyi yolunu sağlar veya kendisinin doğrudan kullanımına izin verilmeyen yeteneklerle geri çağrılar yürütmesine izin verir.

Bir olay veya işlev ateşlendiğinde, bağlantılar onları kaydeden işlevin bağlamında çalıştırılır.Bu, etkinlik veya işlev geri çağrısının sandıklandırılmış bir kapsayıcı tarafından kaydedilmesi durumunda, o kapsayıcının yetenekleriyle çağrılacağı anlamına gelir.Geri çağrı başka bir kod tarafından kaydedilirse, sandboxlanmış kutu içeriği senaryoları onları çağırdığında, işlevleriniz işlevleriniz için mevcut yeteneklerle yürütülür.

Kontrol dışına yazma yeteneği ile bile, sandık içindeki kutulardaki kodlar, kendi kutularından daha büyük bir yetenek setine sahipse, kutularının dışında olayları veya işlevleri çağıramazlar, çünkü kendi kutularından daha geniş bir yetenek setine sahipler.

Modül gerektirir

İç ModuleScripts normalde olduğu gibi kumlanmış konteyner tarafından gerekli olabilir.Ancak, hedef örneği konteynerin dışındaysa, ModuleScript sadece kullanılabilir kapasite seti ona mevcut kapasitelerden daha küçük veya eşitse gerekli olabilir.

Bu sınır, RunClientScript ve RunServerScript yeteneklerine uygulanmaz.Eğer ModuleScript ı sadece RunClientScript ile bir konteynere yerleştirirseniz, ancak RunServerScript yeteneğine sahip bir kriptte gerekliyse, bu işlevleri sunucuda başarılı bir şekilde yürütmek ve çalıştırmak izin verilir.

Doğrudan çağrılan işlevler

Bir sandık içindeki bir ModuleScript bir kumlanmış kutudan dışarıdan gerekliyse, bazı korumalar mevcut değildir.Özellikle, hedef işlevi çağrıcıya mevcut olan tüm örneklere erişebilir.Arayan bir sandık içindeki bir konteynerde değilse, çağrı sanki AccessOutsideWrite ona mevcut olsaydı gibi davranır.

Diğer yetenek sınırları hala geçerlidir.Bir Veri Depolama erişim yeteneğiniz varsa, ancak hedef modül buna sahip değilse, DataStore yöntemlerini çağıramaz.Ancak, kendi işlevinizi DataStore ile çalışırken geçerseniz, hedef o çağrı sırasında onu çalabilir.Hedef, task gibi yöntemler kullanarak bir işletme planı yaparsa, bu işletme planları bu işlevi çağırma yeteneğini kaybeder.

Instanslar hedef modula veya modül alanlarına atanabilir veya atanabilir.

Gerekirse, tablo üyelerini rawset kullanarak atamak önerilir, böylece tabloda belirlenebilecek __index / __newindex metodların çalışmasını engeller.

Genel öneri, mümkün olduğunda BindableEvent ve BindableFunction ile iletişim kurmaktır.

Instansların hareketi

Çoğu durumda, konteynerler arasındaki hareket sınırları yoktur.Ancak, senaryo örnekleri yalnızca aynı yetenek setine veya bu yeteneklerin bir kısmına sahip bir konteynere taşınabilir.

Bu, AccessOutsideWrite ile kısıtlanmış bir konteynerin sadece dışarıya bir kripti yeniden ebeveyn yapması ve daha fazla yetenek kazanması imkansız olduğu anlamına gelir.