diff --git a/content/common/navigation/engine/guides.yaml b/content/common/navigation/engine/guides.yaml index 0f3d2bd5b..2d06ddde1 100644 --- a/content/common/navigation/engine/guides.yaml +++ b/content/common/navigation/engine/guides.yaml @@ -264,6 +264,8 @@ navigation: path: /luau/type-coercion - title: Type Checking path: /luau/type-checking + - title: Native Code Generation + path: /luau/native-code-gen - title: Environment path: /environment/ section: diff --git a/content/en-us/assets/creator-dashboard/Experience-Context-Menu-Edit.png b/content/en-us/assets/creator-dashboard/Experience-Context-Menu-Edit.png new file mode 100644 index 000000000..8c7265d1b --- /dev/null +++ b/content/en-us/assets/creator-dashboard/Experience-Context-Menu-Edit.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e890f8ee69f4a63b32c1f2486cd6800b201582778cbcb167c4fcfcb071c2f659 +size 88157 diff --git a/content/en-us/assets/publishing/groups/Configure-Group.png b/content/en-us/assets/publishing/groups/Configure-Group.png index 0b55cd591..3362b1090 100644 --- a/content/en-us/assets/publishing/groups/Configure-Group.png +++ b/content/en-us/assets/publishing/groups/Configure-Group.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e5cf039bc728113ccf2b3d3997a8b9132ce484680f2e5b8cc9ace586f0c132de -size 153413 +oid sha256:f83d9bd06da16fca9449fb78de774d756b28eac73be0c343c9c72e4eba174185 +size 135403 diff --git a/content/en-us/assets/publishing/groups/Create-Edit-Group-Experiences.png b/content/en-us/assets/publishing/groups/Create-Edit-Group-Experiences.png index 603a9aacd..88c002ec2 100644 --- a/content/en-us/assets/publishing/groups/Create-Edit-Group-Experiences.png +++ b/content/en-us/assets/publishing/groups/Create-Edit-Group-Experiences.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fd2bfee8cf0b0a5993257441343c02c2e335f1aeb682bbeb002a238253507b4d -size 50568 +oid sha256:a89e9a2e350ff0ed1ced78535109becaf7ed6da9e70f67e27841b464bf1c0e6e +size 36207 diff --git a/content/en-us/assets/publishing/groups/Group-Admin-Revenue-Payouts.png b/content/en-us/assets/publishing/groups/Group-Admin-Revenue-Payouts.png index f58f0c95a..158eea9a9 100644 --- a/content/en-us/assets/publishing/groups/Group-Admin-Revenue-Payouts.png +++ b/content/en-us/assets/publishing/groups/Group-Admin-Revenue-Payouts.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e33db3f5840e002af08d96b6ffedc9126a97abc809792db3394a186235c4d0b8 -size 48134 +oid sha256:367641fd670bf3ba12ea35d77baa49611a22478b6c1975b34aff80d327c49b76 +size 42390 diff --git a/content/en-us/assets/publishing/groups/Group-Admin-Roles.png b/content/en-us/assets/publishing/groups/Group-Admin-Roles.png index 61ca557a0..c67d42669 100644 --- a/content/en-us/assets/publishing/groups/Group-Admin-Roles.png +++ b/content/en-us/assets/publishing/groups/Group-Admin-Roles.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:26fc802003b3c1243d81a56d1efe5a6cda8ea1611790d4fe243ca558421ace3d -size 52501 +oid sha256:a144b2f55db220f3814a4165a4d610420da7766c0f73f60c4c77bac08e1b95ec +size 19680 diff --git a/content/en-us/assets/publishing/groups/Publish-To-Group-Existing.png b/content/en-us/assets/publishing/groups/Publish-To-Group-Existing.png deleted file mode 100644 index 3406b91e1..000000000 --- a/content/en-us/assets/publishing/groups/Publish-To-Group-Existing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aaa6037046050145f2ac959ae66c6f1abf20d8bc03c9f3181327fbe94e93aedb -size 59923 diff --git a/content/en-us/assets/publishing/groups/Publish-To-Group-New.png b/content/en-us/assets/publishing/groups/Publish-To-Group-New.png deleted file mode 100644 index 4921cac9d..000000000 --- a/content/en-us/assets/publishing/groups/Publish-To-Group-New.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5d24a13426031afcb4b4b3a9d4866d05b3467d8c3194d33e9969be4379cf208 -size 28595 diff --git a/content/en-us/assets/studio/collaboration/Access-Session-Group.png b/content/en-us/assets/studio/collaboration/Access-Session-Group.png new file mode 100644 index 000000000..62b7226d8 --- /dev/null +++ b/content/en-us/assets/studio/collaboration/Access-Session-Group.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b0ce0502679c43179a7ebfb4eb7c4d95e8274b9ca07bef4edd5f0d7419ef214 +size 64068 diff --git a/content/en-us/assets/studio/collaboration/Access-Session-Options.png b/content/en-us/assets/studio/collaboration/Access-Session-Options.png deleted file mode 100644 index b5ec07197..000000000 --- a/content/en-us/assets/studio/collaboration/Access-Session-Options.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:15048510ea6f287fe7c060773575a34022681b9dbe2042255e7b0c6cd98874ad -size 119051 diff --git a/content/en-us/assets/studio/collaboration/Access-Session-User.png b/content/en-us/assets/studio/collaboration/Access-Session-User.png new file mode 100644 index 000000000..676e7a3c6 --- /dev/null +++ b/content/en-us/assets/studio/collaboration/Access-Session-User.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:658e45a66280b9e7cdd391ec085cb69cc509f9e3b31da2703797226ad11154e4 +size 59470 diff --git a/content/en-us/assets/studio/collaboration/Drafts-Commit.png b/content/en-us/assets/studio/collaboration/Drafts-Commit.png index 63eee75b5..229985a58 100644 --- a/content/en-us/assets/studio/collaboration/Drafts-Commit.png +++ b/content/en-us/assets/studio/collaboration/Drafts-Commit.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3031adb3d430bf1d8ee6cdc1ce9776694f51717a437d0fbffeaafae6f333f05a -size 30092 +oid sha256:ae4767b2119508b37cb72566099524f553d7f97d5255df288d7b783a7527ccd4 +size 21668 diff --git a/content/en-us/assets/studio/collaboration/Drafts-Compare.png b/content/en-us/assets/studio/collaboration/Drafts-Compare.png index ce3fa60ab..6cb31d7ce 100644 --- a/content/en-us/assets/studio/collaboration/Drafts-Compare.png +++ b/content/en-us/assets/studio/collaboration/Drafts-Compare.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b7b16ba3135dab9e960d0c1fb8013d4af953b5bfaf702d088f0cdd00ba0a58b6 -size 57302 +oid sha256:3911804c4458e368af1bb7fbf4c249a8383fd01e73e3f61ec6bffa1c990387ce +size 39515 diff --git a/content/en-us/assets/studio/collaboration/Drafts-Diff-Result.png b/content/en-us/assets/studio/collaboration/Drafts-Diff-Result.png new file mode 100644 index 000000000..9a2d6a4de --- /dev/null +++ b/content/en-us/assets/studio/collaboration/Drafts-Diff-Result.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d61d3b661fbbf89b83bdf808e4c836e28ea90e2a98593c7d92e125a8a615a1f +size 82657 diff --git a/content/en-us/assets/studio/collaboration/Drafts-Merge.png b/content/en-us/assets/studio/collaboration/Drafts-Merge.png new file mode 100644 index 000000000..08ca56cc0 --- /dev/null +++ b/content/en-us/assets/studio/collaboration/Drafts-Merge.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:913fe8f1b159d00981346d80d50fabe15019d838bd922637cf3a5421714d9e27 +size 38909 diff --git a/content/en-us/assets/studio/collaboration/Drafts-Restore.png b/content/en-us/assets/studio/collaboration/Drafts-Restore.png new file mode 100644 index 000000000..6edb2e9fb --- /dev/null +++ b/content/en-us/assets/studio/collaboration/Drafts-Restore.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59ab834d21d280a00e076ce0d3401747aae30ef70fbf2b6d7a887f95d89649b5 +size 40741 diff --git a/content/en-us/assets/studio/collaboration/Drafts-Window.png b/content/en-us/assets/studio/collaboration/Drafts-Window.png index a2cd0a8ef..d28e0d1c7 100644 --- a/content/en-us/assets/studio/collaboration/Drafts-Window.png +++ b/content/en-us/assets/studio/collaboration/Drafts-Window.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4be78ac28f7462c3f3f6eba80dac9d24435739b7d7393fe7cd715b807ec0d499 -size 14623 +oid sha256:7eaaef3a609f5ac8ab8a386e7c225015fdcf6aa75c5a7501363b5c6f577eac21 +size 14596 diff --git a/content/en-us/assets/studio/collaboration/Live-Scripting-Cursors.png b/content/en-us/assets/studio/collaboration/Live-Scripting-Cursors.png new file mode 100644 index 000000000..4def885d8 --- /dev/null +++ b/content/en-us/assets/studio/collaboration/Live-Scripting-Cursors.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a0803294dcd0d5531a6455bbba250dcf5b56705b010f50b236edf7815cc4067f +size 61534 diff --git a/content/en-us/assets/studio/collaboration/Script-Deleted.png b/content/en-us/assets/studio/collaboration/Script-Deleted.png deleted file mode 100644 index e9ca52c26..000000000 --- a/content/en-us/assets/studio/collaboration/Script-Deleted.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:04af48643cf714f7840271ad6d8dbd0cbbda4813ae030112fd52be1a5a7002d7 -size 33847 diff --git a/content/en-us/assets/studio/collaboration/Script-Diff-Result.png b/content/en-us/assets/studio/collaboration/Script-Diff-Result.png deleted file mode 100644 index 1070fbe0d..000000000 --- a/content/en-us/assets/studio/collaboration/Script-Diff-Result.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a41e0bdb0e576f23ae2e1710915ba0f47e93dd8ae609082ab26f46b9456a32d -size 58503 diff --git a/content/en-us/assets/studio/collaboration/Script-Merge-Preview.png b/content/en-us/assets/studio/collaboration/Script-Merge-Preview.png deleted file mode 100644 index f53be3c2f..000000000 --- a/content/en-us/assets/studio/collaboration/Script-Merge-Preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38fdfd5c9249c66dcf70683e85c1d1518b09116e1c4c7477984cda06ec70fb47 -size 31881 diff --git a/content/en-us/assets/studio/collaboration/Script-Updated.png b/content/en-us/assets/studio/collaboration/Script-Updated.png deleted file mode 100644 index f5d31f922..000000000 --- a/content/en-us/assets/studio/collaboration/Script-Updated.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d77b4eca8996d28b1b38e18673a3ecb9f5211a3b9c35501a82caacd691bf0420 -size 33880 diff --git a/content/en-us/assets/studio/console/LuauHeap-Native-Annotation.png b/content/en-us/assets/studio/console/LuauHeap-Native-Annotation.png new file mode 100644 index 000000000..9a81d5d8a --- /dev/null +++ b/content/en-us/assets/studio/console/LuauHeap-Native-Annotation.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c00f5d3a463714d002fdf670885e2d97b32a938ad51969e9bb64de163fc0f36 +size 21536 diff --git a/content/en-us/assets/studio/console/ScriptProfiler-Native-Annotation.png b/content/en-us/assets/studio/console/ScriptProfiler-Native-Annotation.png new file mode 100644 index 000000000..3c3d261f4 --- /dev/null +++ b/content/en-us/assets/studio/console/ScriptProfiler-Native-Annotation.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:197c6b52ab511e345ec9c236d8ad0a698d697b67568679d00ada35d80d0fb7b3 +size 23544 diff --git a/content/en-us/cloud-services/datastores.md b/content/en-us/cloud-services/datastores.md index 04135653a..a66fe4aba 100644 --- a/content/en-us/cloud-services/datastores.md +++ b/content/en-us/cloud-services/datastores.md @@ -315,6 +315,10 @@ When iterating through `Class.DataStoreService:GetOrderedDataStore()` using `Cla ## Metadata + +Ordered data stores do not support versioning and metadata, so `Class.DataStoreKeyInfo` is always `nil` for keys in an `Class.OrderedDataStore`. If you need versioning and metadata support, use a `Class.DataStore`. + + There are two types of metadata associated with keys: - **Service-defined** - Every object has default read-only metadata such as the most recent update time and creation time. diff --git a/content/en-us/cloud-services/memory-stores/index.md b/content/en-us/cloud-services/memory-stores/index.md index 82e2ce813..2aaa5920c 100644 --- a/content/en-us/cloud-services/memory-stores/index.md +++ b/content/en-us/cloud-services/memory-stores/index.md @@ -34,7 +34,7 @@ With the [observability](../../cloud-services/memory-stores/observability.md) da For API request limits, there's a **Request Unit** quota applies for all `Class.MemoryStoreService` API calls, which is **1000 + 100 \* [number of concurrent users]** request units per minute. Additionally, the rate of requests to any single queue or sorted map is limited to **100,000** request units per minute. -Most API calls only consume one request unit, with the exceptions of `Class.MemoryStoreService:GetRangeAsync()` for sorted maps and `Class.MemoryStoreService:ReadAsync()` for queues. These two methods consume units based on the number of returned items with at least one request unit. For example, if `Class.MemoryStoreService:GetRangeAsync()` returns 10 items, the total quota counts based on 10 request units. If it returns an empty response without items, the quota counts based on a single request unit. In addition, `Class.MemoryStoreService:ReadAsync()` consumes an additional unit every two seconds while reading. The maximum read time is specified using the `waitTimeout` parameter. +Most API calls only consume one request unit, with the exceptions of `Class.MemoryStoreSortedMap:GetRangeAsync()` for sorted maps and `Class.MemoryStoreQueue:ReadAsync()` for queues. These two methods consume units based on the number of returned items with at least one request unit. For example, if `Class.MemoryStoreSortedMap:GetRangeAsync()` returns 10 items, the total quota counts based on 10 request units. If it returns an empty response without items, the quota counts based on a single request unit. In addition, `Class.MemoryStoreQueue:ReadAsync()` consumes an additional unit every two seconds while reading. The maximum read time is specified using the `waitTimeout` parameter. The requests quota is also applied on the experience level instead of the server level. This provides flexibility to allocate the requests among servers as long as the total request rate does not exceed the quota. If you exceed the quota, you receive an error response when the service throttles your requests. @@ -53,7 +53,7 @@ For a single sorted map or queue, the following size and item count limits apply To keep your memory usage pattern optimal and avoid hitting the [limits](#limits-and-quotas), follow these best practices: - **Remove processed items.** Consistently cleaning up read items using `Class.MemoryStoreQueue:RemoveAsync()` method for queues and `Class.MemoryStoreSortedMap:RemoveAsync()` for sorted maps can free up memory and keep the data structure up-to-date. -- **Set the expiration time to the smallest time frame possible when adding data.** Though the default expiration time is 45 days for both `Class.MemoryStoreService:GetQueue()` and `Class.MemoryStoreSortedMap:SetAsync()`, setting the shortest possible time can automatically clean up old data to prevent them from filling up your memory usage quota. +- **Set the expiration time to the smallest time frame possible when adding data.** Though the default expiration time is 45 days for both `Class.MemoryStoreQueue:AddAsync()` and `Class.MemoryStoreSortedMap:SetAsync()`, setting the shortest possible time can automatically clean up old data to prevent them from filling up your memory usage quota. - Don't store a large amount of data with a long expiration, as it risks exceeding your memory quota and potentially causing issues that can break your entire experience. - Always either explicitly delete unneeded items or set a short item expiration. - Generally, it's recommended to use explicit deletion for releasing memory as it takes effect immediately, and use item expiration as a safety mechanism to prevent unused items from occupying memory indefinitely. @@ -109,7 +109,7 @@ The following table lists and describes all status codes of API responses availa NoItemFound - No item found in `Class.MemoryStoreQueue:ReadAsync()` or `Class.MemoryStoreSortedMap:UpdateAsync()`. + No item found in `Class.MemoryStoreQueue:ReadAsync()` or `Class.MemoryStoreSortedMap:UpdateAsync()`. `ReadAsync()` polls every 2 seconds and returns this status code until it finds items in the queue. DataStructureRequestsOverLimit diff --git a/content/en-us/luau/native-code-gen.md b/content/en-us/luau/native-code-gen.md new file mode 100644 index 000000000..776e5dfcf --- /dev/null +++ b/content/en-us/luau/native-code-gen.md @@ -0,0 +1,131 @@ +--- +title: Native Code Generation +description: Luau Native Code Generation allows Luau code to be translated directly to CPU machine code. +--- + + +This feature is currently in beta. To use it, go to **File** → **Beta Features** and enable **Luau Native Code**. + + +With Luau support for native code generation, server-side scripts in your experience can be compiled directly into the machine code instructions that CPUs execute, rather than regular bytecode that the Luau VM operates on. This feature can be used to improve execution speed for some scripts on the server, in particular those that have a lot of numerical computation without using too many heavy Luau library or Roblox API calls. + +## Enabling Native + +To enable native code generation for a `Class.Script`, add the `--!native` comment at the top:¹ + +```lua highlight="1" +--!native + +print("Hello from native code!") +``` + +No additional changes are required; behavior of the natively executing scripts is exactly the same as before and only the performance is different. All features of the Luau language and all Roblox APIs remain supported. + +
1 In the future, some scripts might automatically start running natively if it is determined to be profitable, but manually placed `--!native` comments are currently required.
+ +## Best Practices + +The following tips will help you benefit most from native code generation: + +- It's best to enable this feature inside scripts that perform a lot of computation directly inside Luau. If you have a lot of mathematical operations on tables and especially `Library.buffer` types, the script may be a good candidate. + +- Only the script's [functions](../luau/functions.md) are compiled natively. The code in the top outer [scope](../luau/scope.md) is often executed only once and doesn't benefit as much as functions that are called many times, especially those that are called every frame. + +- It's recommended that you measure the time a script or an operation takes with and without the `--!native` comment to judge when it's best to use it. The [Script Profiler](#script-profiler) tool can measure the performance of scripts in order to make informed decisions. + +- It may be tempting to place the `--!native` comment in **every** script just in case some of them will execute faster, but native code generation has some drawbacks: + + - Code compilation time is required which can increase the startup time of servers. + - Extra memory is occupied to store natively compiled code. + - There's a limit on the total allowed amount of natively compiled code in an experience. + +## Code to Avoid + +While all features will behave the same with or without native code generation enabled, some of them will not run natively and might cause de‑optimization or a fallback to interpreted execution. These include: + +- Use of deprecated `Global.LuaGlobals.getfenv()`/`Global.LuaGlobals.setfenv()` calls. +- Use of various Luau built‑in functions like `Library.math.asin()` with non‑numeric arguments. +- Passing improperly typed parameters to typed functions, for example calling `foo(true)` when `foo` is declared as `function foo(arg: string)`. Remember to always use correct [type annotations](#using-type-annotations). + +When using the [Script Profiler](#script-profiler), you can compare time taken by a regular version of the function versus the one compiled natively. If a function marked with `--!native` doesn't appear to be natively executing, one or more factors from the list above may be triggering de‑optimization. + +## Using Type Annotations + +Native code generation attempts to infer the most likely type for a given variable in order to optimize code paths. For example, it's assumed that `a + b` is performed on numbers, or that a table is accessed in `t.X`. Given operator overloading, however, `a` and `b` may be tables or `Datatype.Vector3` types, or `t` may be a Roblox datatype. + +While native code generation will support any type, mispredictions may trigger unnecessary checks, resulting in slower code execution. + +To solve some common issues, Luau type annotations on function arguments are checked, but it's especially recommended to annotate `Datatype.Vector3` arguments: + +```lua +--!native + +-- "v" is assumed to be a table; function performs slower due to table checks +local function sumComponentsSlow(v) + return v.X + v.Y + v.Z +end + +-- "v" is declared to be a Vector3; code specialized for vectors is generated +local function sumComponentsFast(v: Vector3) + return v.X + v.Y + v.Z +end +``` + +## Studio Tooling + +The following Studio tooling is supported for scripts with `--!native`. + +### Debugging + +General [debugging](../studio/debugging.md) of scripts is supported, but the views for locals/upvalues may be incomplete and missing variables from [call stack](../studio/debugging.md#call-stack-window) frames that are executing natively. + +Also note that when debugging a script with `--!native`, placing [breakpoints](../studio/debugging.md#inserting-breakpoints) will disable native execution for those functions. + +### Script Profiler + +In the [Script Profiler](../studio/optimization/scriptprofiler.md), functions executing natively display `` next to them: + +Example of native functions flagged in the Script Profiler + +If the script is using `--!native` but a function doesn't show the `` annotation, that function may not be executing natively due to [breakpoint](../studio/debugging.md#inserting-breakpoints) placement, use of [discouraged code](#code-to-avoid), or mismatched [type annotations](#using-type-annotations). + +### Luau Heap + +In the [Luau Heap](../studio/optimization/memory-usage.md#luau-heap) profiler, memory taken by native functions displays as `[native]` elements in the graph. + +Example of native memory usage flagged in the Luau Heap profiler + +## Limits and Troubleshooting + +Compiling code into instructions for a particular CPU requires additional storage memory. Additionally, optimizations for complex functions may take too much time to perform. Hitting an internal limit will report an error in Studio's [Output](../studio/output.md) window, including: + +
+_Function 'f' at line 20 exceeded single code block instruction limit_ + +This error means that a single block of code inside a function used more than 64K instructions. This can be avoided by simplifying the function or by splitting it into individual smaller functions. +
+ +
+_Function 'f' at line 20 exceeded function code block limit_ + +This error means that a single function contains more than 32K internal blocks of code. Internal blocks of code do not exactly map to the control‑flow blocks in your script, but this error can be avoided by simplifying the control‑flow in the function or by splitting it into individual smaller functions. +
+ +
+_Function 'f' at line 200 exceeded total module instruction limit_ + +This error means that, in total, the function has reached a limit of 1 million instructions for the entire script. In some cases, the reported function itself may have a lot of instructions, or the limit may have been reached by functions earlier in the script. To avoid this issue, it's recommended to move particularly large functions into a separate non‑native script. You can also try marking that separate script with `--!native`, but 1 million instructions takes up a lot of memory and you may exceed the memory limit. +
+ +
+_Function 'f' at line 20 encountered an internal lowering failure_ **(or)**
+_Internal error: Native code generation failed (assembly lowering)_ + +Sometimes a function contains complex bits of code that the native code compiler cannot currently handle. To avoid this error, inspect complex expressions in the code and split them up or simplify them, but also consider opening a bug report with an example of the code that failed for this reason. +
+ +
+_Memory allocation limit reached for native code generation_ + +This error means that the overall memory limit for native code data has been reached. To avoid this, try removing `--!native` from the more memory‑intensive scripts, allowing more smaller scripts to fit under the limit. Alternatively, move large or infrequently called functions to a separate non‑native module. +
diff --git a/content/en-us/production/analytics/analytics-dashboard.md b/content/en-us/production/analytics/analytics-dashboard.md index b0c100d34..7c2c9b7fd 100644 --- a/content/en-us/production/analytics/analytics-dashboard.md +++ b/content/en-us/production/analytics/analytics-dashboard.md @@ -32,18 +32,18 @@ If you don't want to activate the dashboard immediately, or you accidentally dec ### Granting Group Permission -By default, for a [group experience](../../projects/groups.md), only the group owner with the "Create and edit group experiences" permission can view the analytics dashboard because some KPIs are sensitive information, such as your revenue. You can grant permission for your group members to access the analytics dashboard with the following steps: +By default in a [group experience](../../projects/groups.md), only the group **owner** can view the analytics dashboard, as some KPIs such as revenue are sensitive information. The owner can grant permission for group members to access the analytics dashboard as follows: 1. Select the group you want to grant permission on the [Groups](https://www.roblox.com/groups) page. - 2. Click the **⋯** button and select **Configure Group** in the dropdown menu. -3. Navigate to the **Roles** tab. Select an existing role that you want to grant access to the analytics dashboard or create a new role. + A group's landing page with the ellipis button and Configure Group menu item highlighted. +3. Navigate to the **Roles** tab. Select an existing role that you want to grant access to the analytics dashboard, or create a new role. 4. In the **Assets** section, toggle on **View group experience analytics**. -The "View group experience analytics" and "Create and edit group experiences" permissions are independent. Turning on one of them doesn't affect the other, so you can let group members view the analytics dashboard for group experiences even if they can't edit those experiences. +The **View group experience analytics** and **Create and edit group experiences** permissions are independent. Turning on one of them doesn't affect the other, so you can let group members view the analytics dashboard for group experiences even if they can't edit those experiences. ## Dashboard Functionalities @@ -136,23 +136,26 @@ Sales data download is one of the Roblox analytics offerings that can help you v Roblox automatically generates a `.csv` (comma-separated values) file for your sales data and updates it every 48 hours. You can download and customize it to fit your analytics tactics. To access the file: 1. In your [Account Info Settings](https://www.roblox.com/my/account#!/info), add and verify your email address for receiving the data download link. - -1. In your [Security Settings](https://www.roblox.com/my/account#!/security), set up an **Authenticator App** as the 2-Step Verification method for your account. -1. Navigate to your or your group's transactions page. +2. In your [Security Settings](https://www.roblox.com/my/account#!/security), set up an **Authenticator App** as the 2-Step Verification method for your account. +3. Navigate to your or your group's transactions page. 1. For your personal sales data, navigate to the [My Transactions](https://www.roblox.com/transactions) page. - 1. For your group's sales data: + 2. For your group's sales data: 1. Navigate to the [Groups](https://www.roblox.com/groups) page and select the target group. - 1. Click the **…** button on the group banner and select **Configure Group**. - - 1. In the navigation menu, hover over **Revenue** to show the dropdown and then select **Sales**. + 2. Click the **⋯** button on the group banner and select **Configure Group**. + 3. In the navigation menu, hover over **Revenue** to show the dropdown and then select **Sales**. + +4. From the **Type of Transaction** dropdown, select **Sales of Goods**. Then click the **Download Data** button. -1. From the **Type of Transaction** dropdown, select **Sales of Goods**. Then click the **Download Data** button. -1. On the prompted calendar, select a calendar month of sales data to download. You can choose any month from the current date to up to two years ago. If you choose the current month, the file will include all available data of the partial month. + +5. On the prompted calendar, select a calendar month of sales data to download. You can choose any month from the current date to up to two years ago. If you choose the current month, the file will include all available data of the partial month. + -1. In your inbox of your verified email address, you receive an email with a link to download a `.zip` file that contains your sales data in `.csv` format. The link will expire after 48 hours. -1. You can use the `.csv` sales data sheet to analyze the data in your desired way to meet your specific business needs. For example, you can filter to display only sale records with pending Robux to release to you, so you can calculate the timeline and amount of your sales payout to make decisions on when to [exchange earned Robux for real-world currency (DevEx)](../../production/earning-on-roblox.md#the-developer-exchange-program) or pay your collaborators. + +6. In your inbox of your verified email address, you receive an email with a link to download a `.zip` file that contains your sales data in `.csv` format. The link will expire after 48 hours. + +7. You can use the `.csv` sales data sheet to analyze the data in your desired way to meet your specific business needs. For example, you can filter to display only sale records with pending Robux to release to you, so you can calculate the timeline and amount of your sales payout to make decisions on when to [exchange earned Robux for real-world currency (DevEx)](../../production/earning-on-roblox.md#the-developer-exchange-program) or pay your collaborators. ### Sales Data Attributes diff --git a/content/en-us/production/publishing/publishing-experiences-and-places.md b/content/en-us/production/publishing/publishing-experiences-and-places.md index e8bf3f3c2..946ae883a 100644 --- a/content/en-us/production/publishing/publishing-experiences-and-places.md +++ b/content/en-us/production/publishing/publishing-experiences-and-places.md @@ -177,26 +177,26 @@ Roblox strongly recommends that you fill out the guidelines questionnaire for ea ### Allowing Copying -By default, all private and public experiences are locked so that you or your group are the only creators who have access to edit its place files. However, if you want to allow other creators to be able to download an editable copy of your experience for their own creator process, you can **uncopylock** the experience. This is particularly helpful when you create templates or reference files for open use. +By default, all private and public experiences are locked so that you or your [group](../../projects/groups.md) are the only creators who have permission to edit its place files. However, if you want to allow other creators to be able to access an editable copy of your experience for their own creation process, you can **uncopylock** the experience. This is particularly helpful when you create templates or reference files for open use. -To allow users to download an editable copy of your experience: +To allow the community to access an editable copy of your experience: 1. Navigate to the [Creator Dashboard][creatordashboard]. -1. Click on the thumbnail of the experience you want to allow users to copy. The experience's **Overview** page displays. -1. In the left-hand navigation, under **Configure**, select **Places**. +2. Click on the thumbnail of the experience you want to allow users to copy. The experience's **Overview** page displays. +3. In the left-hand navigation, under **Configure**, select **Places**. Places button indicated for an experience on the Creator Dashboard -1. Click the **start place** marked with a star icon. The place's **Basic Settings** page displays. +4. Click the **start place** marked with a star icon. The place's **Basic Settings** page displays. Start place tile indicated in Places display on the Creator Dashboard -1. In the place's left-hand navigation menu, select **Permissions**. +5. In the place's left-hand navigation menu, select **Permissions**. Permissions button indicated for a place on the Creator Dashboard -1. Enable **Allow users to download a copy of this Place**. -1. Click the **Save Changes** button. Your experience is now uncopylocked and creators can download an editable copy of it from the experience's main page. +6. Enable **Allow users to download a copy of this Place**. +7. Click the **Save Changes** button. Your experience is now uncopylocked and creators can access an editable copy of it from the experience's main page. diff --git a/content/en-us/projects/collaboration.md b/content/en-us/projects/collaboration.md index ca7c15f28..543e86a9e 100644 --- a/content/en-us/projects/collaboration.md +++ b/content/en-us/projects/collaboration.md @@ -14,53 +14,33 @@ With Studio's **built-in** **collaboration tools**, creators can contribute to e Collaborators you add to an experience have permission settings that correspond to their level of access to the experience. As follows are the different user permission settings: - - - - - - - - - - - + + + + + + + + + + + - - - + + + - - - + + + - - - + + +
**Permission****Description**
**Owner**User is the owner of the experience and has permission to configure other users' permissions.
PermissionDescription
**Owner**User is the owner of the experience and has permission to configure other users' permissions.
**Edit**User has permission to edit the experience. This also grants the user **Play** permission.
**Edit**User has permission to edit the experience. This also grants the user **Play** permission.
**Play**User has permission to play the experience privately.
**Play**User has permission to play the experience privately.
**No Access**User does not have either **Edit** or **Play** permissions.
**No Access**User does not have either **Edit** or **Play** permissions.
-There are some small differences when managing collaborators in [user-owned experiences](#user-owned-experiences) vs. [group-owned experiences](#group-owned-experiences). - -### User-Owned Experiences - -For user-owned experiences, you can grant **Play** access to any user or [group](../projects/groups.md), but you can only grant **Edit** permission to Roblox friends. - -To give **Edit** permission to a friend for an experience that you own: - -1. With the experience open in Studio, click the **Collaborate** button in the upper-right corner. - - Studio's menu bar with the Collaborate button highlighted. - -1. Type into the search bar at the top to search for a collaborator to add. A dropdown appears listing matching collaborators, with friends indicated by the **Friend** label below their name. Select the collaborator to add. - - - -1. Select **Edit** from the permissions dropdown for the friend. - - A close up view of a collaborator's tile with the permission dropdown menu highlighted. - -1. Click **Save** for your collaboration settings to take effect. +There are some small differences when managing collaborators in [group‑owned experiences](#group-owned-experiences) vs. [user‑owned experiences](#user-owned-experiences). ### Group-Owned Experiences @@ -73,18 +53,21 @@ If you're the group's owner, you can set permissions across **all** group experi 1. Navigate to the [Groups](https://www.roblox.com/groups) page and select the group. 1. Click the **⋯** button in the upper-right corner and select **Configure Group**. - A close up view of an experience tile with both the ellipis button and Configure Group menu item highlighted. + A group's landing page with the ellipis button and Configure Group menu item highlighted. 1. In the left column of the group configuration page, select the **Roles** tab. + + A close up view of the left column with the Roles navigation item highlighted. + 1. Select each group role that you want to give editing permission to and enable **Create and edit group experiences**. - A close up view of an group role settings. The Create and edit group experiences setting are highlighted. + A close up view of an group role settings. The Create and edit group experiences setting is enabled. In Studio's **Manage Collaborators** window for any group-owned experience, these roles display **Edit** permission but are muted to indicate that you can't change the permission level from Studio. Studio's menu bar with the Collaborate button highlighted. - + Manage Collaborators window showing permission level selection for each group role. @@ -96,36 +79,68 @@ If you're the group's owner, you can grant **Edit** permission on a per-experien 1. Select **Edit** from the permissions dropdown for the desired roles. Remember that you can only modify roles that do **not** already have edit permission across all group experiences. - + Manage Collaborators window showing permission level selection for each group role. 1. Click **Save** for your collaboration settings to take effect. All group members within the modified roles should now have **Edit** permission for this experience only; this action won't grant them equal permission to other group experiences. +### User-Owned Experiences + +For user-owned experiences, you can grant **Play** access to any user or [group](../projects/groups.md), but you can only grant **Edit** permission to Roblox friends. + +To give **Edit** permission to a friend for an experience that you own: + +1. With the experience open in Studio, click the **Collaborate** button in the upper-right corner. + + Studio's menu bar with the Collaborate button highlighted. + +1. Type into the search bar at the top to search for a collaborator to add. A dropdown appears listing matching collaborators, with friends indicated by the **Friend** label below their name. Select the collaborator to add. + + Manage Collaborators window showing search query for a Roblox friend. + +1. Select **Edit** from the permissions dropdown for the friend. + + A close up view of a collaborator's tile with the permission dropdown menu highlighted. + +1. Click **Save** for your collaboration settings to take effect. + ## Accessing a Session Those who have permission to edit an experience can join a collaborative session as follows: -1. Close all currently open places in Studio, or restart Studio. -1. Select the **Group Games** tab if it's a [group-owned](../projects/groups.md) experience, or the **Shared With Me** tab for a user-owned experience. +1. Navigate to the [Creator Dashboard](https://create.roblox.com/dashboard/creations). +1. Locate the experience depending on whether it's [group-owned](#group-owned-experiences) or [user-owned](#user-owned-experiences). + + + + Select the group from the upper‑left selector menu. Then, make sure **Creations** is selected on the left and **My Experiences** in the main panel. + + A close up view of the Creator Dashboard with the group selected, as well as Creations and My Experiences. + + + + Select your personal account from the upper‑left selector menu. Then, make sure **Creations** is selected on the left and **Shared With Me** in the main panel. - A close up view of Studio's landing page with the Shared With Me tab highlighted. + A close up view of the Creator Dashboard with the group selected, as well as Creations and My Experiences. -1. Click the desired tile to begin editing. + + + +1. Hover over the experience to collaborate on and click the **Edit in Studio** button. + + A close up view of an experience icon with the Edit in Studio button highlighted. ### Viewing Collaborators While working in a collaborative session, you can see the current collaborators in the upper-right corner of Studio, each with a unique assigned color that's consistent across all collaborators' devices. - +Studio's menu bar with icons of the current collaborators highlighted. -To view more details on the current collaborators, click on any of the icons to open the **Live Collaborators** window. In this window, you can see: +To view more details on the current collaborators, click on any of the icons to open the **Live Collaborators** window. In this window, you can see whether a user is active or inactive inside Studio, as well as an indication of where the user is working. Users become inactive if they do not use Studio for more than 5 minutes. -- **Collaborator Status** — Whether a collaborator is active or inactive inside Studio. Users become inactive if they do not use Studio for more than 5 minutes. -- **Collaborator Location** — Short description of where the user is working, such as in the 3D workspace or inside a specific script file. - - +Live Collaborators window with icons of current collaborators, as well as their activity status. ### Selection Visualization @@ -162,82 +177,99 @@ To chat with collaborators during a session: ## Collaborative Scripting -If a collaborative session, Roblox stores scripts in a central cloud-based repository that all collaborators can access. This allows them to: +In a collaborative session, you can code together in real-time through [live scripting](#live-scripting), or you can [draft](#drafts-mode) scripts in a more focused environment before committing them to a collaborator‑shared repository. -- Work on the same script that others are editing using drafts. -- Test changes locally before committing them to the cloud. -- Compare and commit script changes to the cloud when ready. +### Live Scripting -Drafts mode is **enabled** by default. If you want to **disable** it but continue to collaborate with others, open the [Game Settings](../studio/game-settings.md) window, select the **Other** tab, and turn off **Enable Drafts Mode**. - -Note that all collaborators will need to exit the session for the change to take effect. Alternatively, you can [disable collaboration](#disabling-collaboration) and then reenable it to restart the session. +Live Scripting is **enabled** by default. If you and your team prefer to collaborate on scripts in an environment similar to source control, explore [Drafts](#drafts-mode) mode. -### Drafting Scripts +**Live Scripting** lets collaborators code together in real time. In the [Script Editor](../studio/script-editor.md), each collaborator's cursor color matches their assigned color in the [Live Collaborators](#viewing-collaborators) window. -You can edit scripts while collaborators edit them and playtest scripts locally without affecting the experience for others. After you finish drafting a script, you can [commit](#committing-scripts-to-the-cloud) it to the cloud and [Team Test](../studio/home-tab.md#team-test) the cloud version with collaborators. + + +Script Editor window showing cursors for two collaborators, colored according to their assigned color in the Live Collaborators window. + + +Live Collaborators window with icons of current collaborators, as well as their activity status. + + -When editing a script, it appears in the **Drafts** window, accessible from the [View](../studio/view-tab.md) tab. Drafts are saved to your local file system and persist between Studio sessions on the same machine. +While live scripting, edits are auto‑saved every 5 minutes just like place edits, and a collaborator can manually save a script at any time with CtrlS (S). Saved or auto‑saved versions are logged in the [Script History](#viewing-script-history) window. -Studio's View tab with the Drafts button highlighted. +### Drafts Mode -The Drafts window with two draft script instances. +Through **Drafts** mode, you can independently edit and test scripts without affecting the experience for others. After you finish drafting a script, you can [commit](#committing-drafts) it to the shared repository and [Team Test](../studio/home-tab.md#team-test) the committed version with collaborators. -### Comparing Local and Cloud Scripts + +Drafts Mode is **disabled** by default. To enable it, open the [Game Settings](../studio/game-settings.md) window, select the **Other** tab, and turn on **Enable Drafts Mode**. -To compare a local draft of a script with the version saved to the cloud: +Note that all collaborators will need to exit the session for the change to take effect. Alternatively, you can [disable collaboration](#disabling-collaboration) and then reenable it to restart the session. + -1. Right-click the local draft. -1. Select **Compare with server** to open the **Diff Result** window. +#### Committing Drafts - The Drafts window displays a pop-up window when you right-click a local draft. The Compare with server menu item is highlighted. +Once you've edited a script, it appears in the **Drafts** window, accessible from the [View](../studio/view-tab.md) tab. Drafts are saved to your local file system and persist between Studio sessions on the same machine. -1. Compare the line numbers to help determine which to keep. Code that collaborators changed or deleted appears in red. Code that you updated appears in green. +Studio's View tab with the Drafts button highlighted. - A close up view of a couple of lines that were edited by different collaborators. +The Drafts window with two drafted script instances. -### Committing Scripts to the Cloud +To commit your local edits to the repository, left-click a script, or hold Shift and left-click to select multiple scripts. Then click **Commit** to commit all selected scripts. -To commit your local edits to the cloud: +The Drafts window with the Commit button highlighted. -1. Left-click a script, or hold Shift and left-click to select multiple scripts. -1. Click **Commit** to commit all selected scripts to the cloud. +#### Comparing and Merging Changes - The Drafts window with the Commit button highlighted. +If another collaborator commits changes to the same script that you're editing, an icon with a green **⊕** symbol appears in the **Drafts** window. To view their changes, right‑click the script and select **Compare With Server**. -### Merging Changes +The Drafts window with the green plus icon highlighted to the left of a changed script, and the right-click popup window showing with the Compare With Server option highlighted. -If a collaborator commits to the same script that you're editing, an icon with a green ⊕ symbol appears in the **Drafts** window. +In the **(Diff)** tab that opens in the [Script Editor](../studio/script-editor.md), code that other collaborators changed or deleted appears in red, while code that you updated appears in green. -The Drafts window with the green plus icon highlighted to the left of a draft script. +A close up view of lines that were edited by different collaborators. To merge their changes into your script: -1. Identify which scripts you need to merge. -1. Left-click a script, or hold Shift and left-click to select multiple scripts. -1. Right-click any selected script. -1. Click **Merge from server** to open the **Merge Tools** window. This window shows you how the latest edits relate to your own. If there are conflicting changes, you can pick which code to keep, or make manual edits. +1. In the **Drafts** window, right‑click the script and select **Merge From Server**. + + The Drafts window right-click popup window showing with the Merge From Server option highlighted. + +1. In the merge window, you can pick which code to keep, or make manual edits. + + - Check **Draft** to keep your changes, or leave it unchecked to discard them. + - Check **Server** to merge the committed changes into your draft, or leave it unchecked to ignore them. + - Check **Other** to manually edit the script and save the changes to your draft. + +1. Once you've previewed the merge resolution, click **Merge All** to update your local script. - - Select **Draft** to keep your changes or leave it unchecked to discard them. - - Select **Server** to merge the changes into your draft or leave it unchecked to ignore them. - - Select **Other** to manually edit the script and save the changes to your draft. +#### Restoring Deleted Scripts -1. Once you check the desired options, toggle the **Preview Resolution** switch to preview how the script will look. +If a collaborator deletes a script that you're editing, an icon with a red **⊘** symbol appears in the **Drafts** window. To restore the script, right‑click it and select **Restore Script**. Scripts are restored to the place's **Workspace** tree, so you may need to manually re‑parent them back to their original location. - The Merge Tools window with the Preview Resolution toggle highlighted. +The Drafts window with the red cross icon highlighted to the left of a deleted script, and the right-click popup window showing with the Restore Script option highlighted. -### Restoring Deleted Scripts +### Viewing Script History -If a collaborator deletes a script that you're editing, an icon with a red ⊘ symbol appears in the **Drafts** window: +All script changes, whether saved by a collaborator, auto-saved, or committed by a collaborator through [Drafts](#drafts-mode) mode, are logged in the **Version History** window. To access it: -The Drafts window with the red plus icon highlighted to the left of a draft script. +1. Right-click the script in the [Explorer](../studio/explorer.md) window and select **View Script History**. +2. In the **Version History** window that opens, you'll see all committed versions of the script, the commit date, which collaborator committed, and more. From this window, the following actions are possible: -To restore deleted scripts: + + + To compare any version (except the oldest) with its previous version, select it and click **Compare With Previous Version**. In the **(Diff)** tab that opens in the [Script Editor](../studio/script-editor.md), code from the newer version appears in green while code from the older version appears in red. + + + To compare any **two** versions, hold Ctrl or and select both, then click **Compare Selected Versions**. In the **(Diff)** tab that opens in the [Script Editor](../studio/script-editor.md), code from the newer version appears in green while code from the older version appears in red. + + + If the version **Comment** indicates just one script was committed, select it and click **Open Script** to open it in the [Script Editor](../studio/script-editor.md). -1. Left-click a script, or hold Shift and left-click to select multiple scripts. -1. Right-click any selected script. -1. Click **Restore Script**. Scripts restore to the place's **Workspace** and you may need to manually re-parent them back to their original location. + If the version **Comment** indicates more than one script was committed — commonly the result of an auto‑save on multiple unsaved scripts — you can click **Show** within the version's row to open a popup displaying the script(s) and their respective version. Then, from the version history window, click **Open All Scripts From Batch** to open them in the [Script Editor](../studio/script-editor.md). + + ## Saving and Publishing @@ -247,7 +279,7 @@ During a collaborative session, Studio automatically saves the project to the cl ## Reverting to Previous Versions -The owners of an experience can revert changes made by other editors. See [here](../production/publishing/publishing-experiences-and-places.md#reverting-to-previous-versions) for instructions. +The owner of an experience can revert changes made by other editors. See [here](../production/publishing/publishing-experiences-and-places.md#reverting-to-previous-versions) for instructions. Be careful when reverting changes. If anyone is currently editing the experience in a collaborative session, their changes may still auto‑save and overwrite the revert action. To ensure that nobody else is editing the place when you revert, [disable collaboration](#disabling-collaboration). diff --git a/content/en-us/projects/groups.md b/content/en-us/projects/groups.md index dfd52a8c2..a3bfb2cb7 100644 --- a/content/en-us/projects/groups.md +++ b/content/en-us/projects/groups.md @@ -25,129 +25,60 @@ Group owners can configure the **roles** for other members in the group. The def To configure roles: 1. Navigate to the [Groups](https://www.roblox.com/groups) page and select your group. -1. Click the **…** button in the upper-right corner and select **Configure Group**. +1. Click the **⋯** button in the upper-right corner and select **Configure Group**. - A close up view of an experience tile with both the ellipis button and Configure Group menu item highlighted. + A group's landing page with the ellipis button and Configure Group menu item highlighted. 1. In the left column, select the **Roles** tab. - A close up view of the left column with the Roles navigation item highlighted. - -1. To secure your group and its creations, inspect and adjust the permissions for each role. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Posts
View group wallView discussions on the group's wall.
Post on group wallParticipate in conversations on the group's wall.
Delete group wall postsDelete posts that other members have made on the group's wall.
View group shoutSee the group status.
Post group shoutUpdate the group status.
Members
Manage lower-ranked member ranksChange the role of other members currently assigned to a lower-ranked role.
Accept join requestsAccept or deny any pending requests to join the group, assuming the group is currently set to require manual approval.
Kick lower-ranked membersKick out members assigned to lower-ranked roles.
Miscellaneous
Manage allies and enemiesDeclare or remove 'ally' and 'enemy' groups that display on the group's profile.
View audit logMonitor changes regarding the group.
Assets
Spend group fundsUse the group's funds for certain group-related actions.
Advertise the groupCreate ads for the group via the Advertise Group menu option.
Create group itemsCreate group items via the Store tab on the group's main page.
Configure group itemsManage existing items via the Store tab on the group's main page.
Create and edit group experiencesCreate and edit experiences and assets that are specifically owned by the group.
View group experience analyticsView analytics for group experiences.
Open Cloud
Create group API keysCreate and view API keys for this role, but not manage keys for other roles.
Administer all group API keysGain all of the permissions that a group owner has for API keys, including the ability to create, view, edit, revoke, and audit all of the group's keys.
- - -By default, only the group owner has the **Create and edit group experiences** permission, a requirement for being a [collaborator](../projects/collaboration.md) in a team session. This permission should be granted with care because members who have it may threaten the [safety](#safety-in-group-experiences) of the group's experiences. - + A close up view of the left column with the Roles navigation item highlighted. + +1. To secure your group and its creations, inspect and adjust the permissions for each role. Commonly managed options include: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Members
**Manage lower‑ranked member ranks**Change the role of other members currently assigned to a lower‑ranked role.
**Accept join requests**Accept or deny any pending requests to join the group, assuming the group is currently set to require manual approval.
**Kick lower‑ranked members**Kick out members assigned to lower‑ranked roles.
Assets
**Spend group funds**Use the group's funds for certain group‑related actions.
**Create and edit group experiences**Create and edit experiences and assets that are specifically owned by the group. See [here](../projects/collaboration.md#group-owned-experiences) for how this setting relates to collaborative sessions.
**View group experience analytics**View analytics for group experiences. See [here](../production/analytics/analytics-dashboard.md#granting-group-permission) for details.
+ + + By default, only the group owner has the **Create and edit group experiences** permission, a requirement for being a [collaborator](../projects/collaboration.md) in a team session. This permission should be granted with care because members who have it may threaten the [safety](#safety-in-group-experiences) of the group's experiences. + ### Assigning Roles @@ -160,29 +91,6 @@ To assign roles: A close up view of a member of a group. The dropdown menu is extended, and the Member role is highlighted. -## Publishing Group Places - -If you're the group owner or a member with the **Create and edit group experiences** permission, you can publish a group place as follows. - -### New Experience - -1. In Studio, select **File** → **Publish to Roblox**. -1. Near the bottom of the window, click **Create new game**. -1. Enter a place name and an optional description. -1. For the **Creator** field, select the group for which you'd like to publish the place. -1. When ready, click the **Create** button. - -### To Existing Experience - -1. Select **File** → **Publish to Roblox**. -1. Select a group from the drop-down menu. -1. Click an existing group experience. On the next screen you can: - - - Add the place you're publishing as a **new** place within the same experience. - - Overwrite an existing place within the experience. - -1. Click the **Create** or **Overwrite** button. - ## Managing Payouts You can use groups to share Robux revenue. Group owners can pay contributors by either transferring group funds as a one-time payout or by scheduling recurring payouts. Roblox monitors payouts to prevent fraud and abuse. @@ -190,51 +98,52 @@ You can use groups to share Robux revenue. Group owners can pay contributors by To manage payouts: 1. Navigate to the [Groups](https://www.roblox.com/groups) page and select your group. -1. Click the **…** button in the upper-right corner and select **Configure Group**. +1. Click the **⋯** button in the upper-right corner and select **Configure Group**. - A close up view of an experience tile with both the ellipis button and Configure Group menu item highlighted. + A group's landing page with the ellipis button and Configure Group menu item highlighted. 1. In the left column, hover over **Revenue** and then click **Payouts**. - A close up view of the left column with the Revenue navigation item highlighted, as well as the Payouts submenu item. - -### One-Time Payouts - -Group owners can perform one-time payouts of Robux to a single group member or multiple members. This payout can be a lump sum or a percentage of the group's total funds, but you can only distribute Robux in whole numbers. If you choose to distribute by percentage, the amount rounds down to the nearest whole number of Robux, and the remainder remains in the group's funds. - -To transfer a one-time payout: - -1. Select the **One-time Payout** tab. + A close up view of the left column with the Revenue navigation item highlighted, as well as the Payouts submenu item. - A close up view of both the Recurring Payout and One-Time Payout tabs. The One-time Payout tab is highlighted. + From the payouts screen, initiate a **recurring payout** or **one‑time payout**. -1. Use the drop-down menu to choose whether the payout is a set amount or a percentage of the group's total Robux balance. + + + Group owners can configure recurring payouts to automatically share profits when the group earns them. There's a short delay from when the group earns the funds and when they distribute to members. When you change a member's recurring payout, Roblox sends a message notification to that member to inform them of the change. -1. Add one or more payout recipients by clicking the **Add Payout Recipient** button. + To configure recurring payouts: -1. Next to each member, enter the amount or percentage you want to give to them. To remove them from the payout, click the "trash" button. + 1. Select the **Recurring Payout** tab. -1. After everything looks correct, click **Distribute**. + A close up view of both the Recurring Payout and One-Time Payout tabs. The Recurring Payout tab is highlighted. -### Recurring Payouts + 2. Add one or more payout recipients by clicking the **Add Payout Recipient** button. + 3. Next to each member, enter the percentage of the group's Robux that you would like them to receive every month. To remove them from the payout, click the "trash" button. + 4. After everything looks correct, click **Save**. -Group owners can configure recurring payouts to automatically share profits when the group earns them. There's a short delay from when the group earns the funds and when they distribute to members. When you change a member's recurring payout, Roblox sends a message notification to that member to inform them of the change. + + + Group owners can perform one-time payouts of Robux to a single group member or multiple members. This payout can be a lump sum or a percentage of the group's total funds, but you can only distribute Robux in whole numbers. If you choose to distribute by percentage, the amount rounds down to the nearest whole number of Robux, and the remainder remains in the group's funds. -To configure recurring payouts: + To make a one-time payout: -1. Select the **Recurring Payout** tab. + 1. Select the **One-time Payout** tab. - A close up view of both the Recurring Payout and One-Time Payout tabs. The Recurring Payout tab is highlighted. + A close up view of both the Recurring Payout and One-Time Payout tabs. The One-time Payout tab is highlighted. -1. Add one or more payout recipients by clicking the **Add Payout Recipient** button. -1. Next to each member, enter the percentage of the group's Robux that you would like them to receive every month. To remove them from the payout, click the "trash" button. + 2. Use the drop-down menu to choose whether the payout is a set amount or a percentage of the group's total Robux balance. + 3. Add one or more payout recipients by clicking the **Add Payout Recipient** button. + 4. Next to each member, enter the amount or percentage you want to give to them. To remove them from the payout, click the "trash" button. + 5. After everything looks correct, click **Distribute**. -1. After everything looks correct, click **Save**. + + ## Safety in Group Experiences -Group members with the **Create and edit group experiences** permission can enable the **Allow Copying** setting for a creation, potentially allowing the entire Roblox community to copy and use it. The following tips can help you improve the safety and intellectual property protections in group experiences. +Group members with the **Create and edit group experiences** permission can enable the **Place Copying** setting for a creation, potentially allowing the entire Roblox community to copy it and use assets within it. The following tips can help you improve the safety and intellectual property protections in group experiences. - Check that each group role has the correct [permissions](#roles-and-permissions). If you don't want members with a role to have the editing permissions, disable **Create and edit group experiences** for that role. - Confirm that each member is [assigned](#assigning-roles) the appropriate role. -- Confirm that **Allow Copying** is disabled for a place before you add assets that you don't want others to copy. +- Confirm that [Place Copying](../production/publishing/publishing-experiences-and-places.md#allowing-copying) is **disabled** before you add assets that you don't want others to copy. diff --git a/content/en-us/reference/engine/classes/EditableImage.yaml b/content/en-us/reference/engine/classes/EditableImage.yaml index 3495e4bf3..00310b883 100644 --- a/content/en-us/reference/engine/classes/EditableImage.yaml +++ b/content/en-us/reference/engine/classes/EditableImage.yaml @@ -36,6 +36,14 @@ description: | Class.Decal Class.Decal.Texture + + Class.Texture + Class.Texture.Texture + + + Class.SurfaceAppearance + Class.SurfaceAppearance.ColorMap + diff --git a/content/en-us/reference/engine/classes/GlobalDataStore.yaml b/content/en-us/reference/engine/classes/GlobalDataStore.yaml index 9f439eb0c..4d5d18ada 100644 --- a/content/en-us/reference/engine/classes/GlobalDataStore.yaml +++ b/content/en-us/reference/engine/classes/GlobalDataStore.yaml @@ -10,6 +10,11 @@ description: | See [Data Stores](../../../cloud-services/datastores.md) for an in-depth guide on data structure, management, error handling, etc. + + Ordered data stores do not support versioning and metadata, so + `Class.DataStoreKeyInfo` is always `nil` for keys in an + `Class.OrderedDataStore`. If you need versioning and metadata support, use a + `Class.DataStore`. code_samples: inherits: - Instance @@ -72,10 +77,6 @@ methods: latest version has been marked as deleted, both return values will be `nil`. - `Class.OrderedDataStore` does not support versioning and metadata, so - `Class.DataStoreKeyInfo` will always be `nil` for keys in an - `Class.OrderedDataStore`. - Keys are cached locally for 4 seconds after the first read. A `Class.GlobalDataStore:GetAsync()` call within these 4 seconds returns a value from the cache. Modifications to the key by diff --git a/content/en-us/reference/engine/globals/LuaGlobals.yaml b/content/en-us/reference/engine/globals/LuaGlobals.yaml index 865557bf4..ca4db207e 100644 --- a/content/en-us/reference/engine/globals/LuaGlobals.yaml +++ b/content/en-us/reference/engine/globals/LuaGlobals.yaml @@ -117,49 +117,14 @@ functions: Returns the current environment in use by the caller, as a dictionary. - If provided with a function, the environment of the function will be - returned. - - If provided with an integer, `getfenv()` will provide the environment of - the function at the provided stack level: Level 1 is the function - calling `getfenv()`. If `stack` is `0`, `getfenv()` returns the global - environment of the current script. When using `getfenv()` to get the - current environment of a script, it will return the same table every - time within the specific thread. - - ```lua - -- Get the current environment - - myVariable = "Hello, environments" -- A global variable (non-local) - local env = getfenv() - print(env["myVariable"]) --> Hello, environments - ``` - - ```lua - -- Get the environment of a function - - local function printMessage() - print(message) - end - local env = getfenv(printMessage) - env.message = "Hello, function environments" - printMessage() --> Hello, function environments - ``` - - ```lua - -- Get the environment based on stack - - local function whatIsThePassword(password) - local env = getfenv(1) -- Get the environment 1 level up, or whatever called this function - print(env.password) -- Get the password from the environment one level up - print(password) --> nil - end - - local function openSesame() - local password = "secret" -- A variable local to openSesame() - whatIsThePassword(password) - end - - openSesame() - ``` + returned. + - If provided with an integer, `Global.LuaGlobals.getfenv()` will provide + the environment of the function at the provided stack level: Level 1 is + the function calling `Global.LuaGlobals.getfenv()`. If `stack` is `0`, + `Global.LuaGlobals.getfenv()` returns the global environment of the + current script. When using `Global.LuaGlobals.getfenv()` to get the + current environment of a script, it will return the same table every time + within the specific thread. parameters: - name: stack type: Variant @@ -171,6 +136,13 @@ functions: - type: table summary: '' tags: + - Deprecated + deprecation_message: | + This function allows uncontrolled change of the global/function + environment and disables script optimizations. Changes to the environment + are not tracked by the script analysis tooling and may result in missing + or incorrect warnings. As a replacement, consider using + `Library.debug.info()` instead. code_samples: - name: getmetatable summary: | @@ -543,6 +515,12 @@ functions: - type: Variant summary: '' tags: + - Deprecated + deprecation_message: | + This function allows uncontrolled change of the global/function + environment and disables script optimizations. Changes to the environment + are not tracked by the script analysis tooling and may result in missing + or incorrect warnings. code_samples: - name: setmetatable summary: | diff --git a/content/en-us/studio/script-editor.md b/content/en-us/studio/script-editor.md index aefc1ee8f..2acf02f8d 100644 --- a/content/en-us/studio/script-editor.md +++ b/content/en-us/studio/script-editor.md @@ -90,18 +90,14 @@ The **Output** window, accessible from the [View](./view-tab.md) tab, displays e ## Code Assist - -This feature is currently in beta. To use it, go to **File** → **Beta Features** and enable **AI-Powered** **Code Completion**. You can also contribute your Luau scripts for AI training to help enhance Luau-focused AI tools in Studio. For more information, see [Empower Luau creation](https://create.roblox.com/data-collection). - - -**Code Assist** is an AI assistant that suggests lines or functions of code as you type, helping you code more efficiently and stay focused. Based on contexts from your comment and code, suggestions will be triggered in two ways: +**Code Assist** is a feature that suggests lines or functions of code as you type, helping you code more efficiently and stay focused. Based on contexts from your comment and code, suggestions will be triggered in two ways: - **Automatically** when you pause on a line for a few seconds and the AI model has enough context for a suggestion. - **Manually** with shortcut Alt on Windows or on Mac (you can [customize](../studio/shortcuts.md) this shortcut). Press Tab to accept a suggestion, or ignore it by continuing to type. Currently, your script needs to contain at least a few lines of code to trigger a suggestion. - + **Code Assist** helps automate basic coding tasks so you can focus on creative work, but it does not always suggest perfect code (see [Limitations](#limitations)). It's still your responsibility to review, test, and determine if the code suggestion is contextually appropriate. @@ -109,7 +105,7 @@ Press Tab to accept a suggestion, or ignore it by continuing to type. ### Improving Suggestions -To get more accurate and relevant suggestions, it's recommended that you follow clean coding practices, regardless of AI assistance, and: +To get more accurate and relevant suggestions, it's recommended that you follow clean coding practices, regardless of assistance, and: - Break down your code into smaller functions. - Use descriptive script names that capture the overall intent of what each script does. For example, name a script **SyncCustomSounds** instead of just **Sounds**.