diff --git a/content/common/navigation/avatar/guides.yaml b/content/common/navigation/avatar/guides.yaml
index 42d1492d2..8eef470b4 100644
--- a/content/common/navigation/avatar/guides.yaml
+++ b/content/common/navigation/avatar/guides.yaml
@@ -1,5 +1,5 @@
navigation:
- - title: Get started
+ - title: Getting Started
path: /avatar/
- heading: Accessories
@@ -8,11 +8,11 @@ navigation:
path: /art/accessories/
- title: Specifications
path: /art/accessories/specifications
- - title: Body scale
+ - title: Body Scale
path: /art/accessories/body-scale
- - title: Export settings
+ - title: Export Settings
path: /art/accessories/export-settings
- - title: Import into Studio
+ - title: Importing into Studio
path: /art/accessories/importing
- heading: Clothing
@@ -21,15 +21,15 @@ navigation:
path: /art/accessories/layered-clothing
- title: Specifications
path: /art/accessories/clothing-specifications
- - title: Reference files
+ - title: Reference Files
path: /art/accessories/project-files
- - title: Caging best practices
+ - title: Caging Best Practices
path: /art/accessories/caging-best-practices
- - title: Export settings
+ - title: Export Settings
path: /art/accessories/clothing-export-settings
- - title: Import into Studio
- path: /art/accessories/import-clothing
- - title: Classic clothing
+ - title: Importing into Studio
+ path: /art/accessories/importing-clothing
+ - title: Classic Clothing
path: /art/accessories/classic-clothing
- heading: Characters
@@ -37,63 +37,63 @@ navigation:
path: /art/characters/
- title: Specifications
path: /art/characters/specifications
- - title: Reference files
+ - title: Reference Files
path: /art/characters/project-files
- - title: Export settings
+ - title: Export Settings
path: /art/characters/export-settings
- - title: Import into Studio
- path: /art/characters/import
+ - title: Importing into Studio
+ path: /art/characters/importing
- title: Heads
path: /art/characters/facial-animation/
section:
- title: Overview
path: /art/characters/facial-animation/
- - title: Use heads in Studio
- path: /art/characters/facial-animation/use-heads-in-studio
- - title: Animate heads
- path: /art/characters/facial-animation/animate-heads
+ - title: Using Heads in Studio
+ path: /art/characters/facial-animation/using-heads-in-studio
+ - title: Animating Heads
+ path: /art/characters/facial-animation/animating-heads
- title: Moods
path: /art/characters/facial-animation/moods
- - title: FACS poses reference
+ - title: FACS Poses Reference
path: /art/characters/facial-animation/facs-poses-reference
- - heading: Publish and sell
- - title: Marketplace overview
+ - heading: Publishing and Selling
+ - title: Marketplace Overview
path: /marketplace/
- - title: Policies and guidelines
+ - title: Policies and Guidelines
path: /marketplace/marketplace-policy
section:
- - title: Marketplace policy
+ - title: Marketplace Policy
path: /marketplace/marketplace-policy
- - title: Intellectual property
+ - title: Intellectual Property
path: /marketplace/intellectual-property
- title: Moderation
path: /marketplace/moderation
- - title: Upload and publish
- path: /marketplace/publish-to-marketplace
- - title: Marketplace fees and commissions
+ - title: Uploading and Publishing
+ path: /marketplace/publishing-to-marketplace
+ - title: Marketplace Fees and Commissions
path: /marketplace/marketplace-fees-and-commissions
- title: UGC Homestore
path: /marketplace/homestore
- - title: Frequently asked questions
+ - title: Frequently Asked Questions
path: /marketplace/frequently-asked-questions
- - heading: Studio tools
+ - heading: Studio Tools
- title: 3D Importer
path: /art/modeling/3d-importer
- - title: Accessory Fitting tool
+ - title: Accessory Fitting Tool
path: /art/accessories/accessory-fitting-tool
- title: Avatar Setup
path: /art/modeling/avatar-setup
- - title: Automatic Skinning Transfer
+ - title: Automatic Skinning
path: /art/accessories/automatic-skinning-transfer
- - title: Custom thumbnails
+ - title: Custom Thumbnails
path: /marketplace/custom-thumbnails
- - heading: Third party add-ons
- - title: Roblox Blender plugin
+ - heading: Third Party Add-ons
+ - title: Roblox Blender Plugin
path: /art/modeling/roblox-blender-plugin
- title: Calisthenics Tool
path: /art/modeling/calisthenics-tool
- - title: Clothing Validation Tool
+ - title: Validation Tool
path: /art/accessories/validation-tool
diff --git a/content/common/navigation/avatar/tutorials-accessories.yaml b/content/common/navigation/avatar/tutorials-accessories.yaml
index 7137b4e7d..d94a5079a 100644
--- a/content/common/navigation/avatar/tutorials-accessories.yaml
+++ b/content/common/navigation/avatar/tutorials-accessories.yaml
@@ -1,23 +1,23 @@
backTo:
- title: Back to avatar tutorials
+ title: Back to Avatar Tutorials
path: /avatar/tutorials/
navigation:
- title: Overview
path: /art/accessories/creating-rigid/
- - heading: Model
- - title: Box modeling
+ - heading: Modeling
+ - title: Box Modeling
path: /art/accessories/creating-rigid/modeling-setup
- - heading: Texture
- - title: Texture painting
+ - heading: Texturing
+ - title: Texture Painting
path: /art/accessories/creating-rigid/texturing
- - heading: Export
- - title: Export from Blender
+ - heading: Exporting
+ - title: Exporting from Blender
path: /art/accessories/creating-rigid/exporting
- - heading: Import into Studio
- - title: Use Studio's 3D importer
+ - heading: Importing into Studio
+ - title: Using Studio's 3D Importer
path: /art/accessories/creating-rigid/importing
- - title: Convert to accessory
+ - title: Converting to Accessory
path: /art/accessories/creating-rigid/converting
- - heading: Publish to Marketplace
- - title: Upload and publish
+ - heading: Publishing to Marketplace
+ - title: Upload and Publishing
path: /art/accessories/creating-rigid/publishing
diff --git a/content/common/navigation/avatar/tutorials-bodies.yaml b/content/common/navigation/avatar/tutorials-bodies.yaml
index 3ce524ec9..0e566df99 100644
--- a/content/common/navigation/avatar/tutorials-bodies.yaml
+++ b/content/common/navigation/avatar/tutorials-bodies.yaml
@@ -1,52 +1,52 @@
backTo:
- title: Back to avatar tutorials
+ title: Back to Avatar Tutorials
path: /avatar/tutorials/
navigation:
- heading: Overview
- - title: Avatar creation
+ - title: Avatar Creation
path: /art/characters/creating/
- - heading: Project setup
- - title: Template files
+ - heading: Project Setup
+ - title: Template Files
path: /art/characters/creating/template-files
- - title: Extra head objects
+ - title: Extra Head Objects
path: /art/characters/creating/head-objects
- - title: Blender configurations
+ - title: Blender Configurations
path: /art/characters/creating/blender-configurations
- heading: Modeling
- - title: Best practices
+ - title: Best Practices
path: /art/characters/creating/modeling-best-practices
- - title: Tips and settings
+ - title: Tips and Settings
path: /art/characters/creating/modeling-tips
- - title: Sculpt
+ - title: Sculpting
path: /art/characters/creating/sculpting
- heading: Texturing
- - title: Texture painting setup
+ - title: Texture Painting Setup
path: /art/characters/creating/texturing-setup
- - title: Texturing eyes
+ - title: Texturing Eyes
path: /art/characters/creating/texturing-eyes
- - title: Texturing face
+ - title: Texturing Face
path: /art/characters/creating/texturing-face
- - title: PBR textures (optional)
+ - title: PBR Textures (Optional)
path: /art/characters/creating/texturing-pbr
- heading: Caging
- - title: Caging character head
+ - title: Caging Character Head
path: /art/characters/creating/caging
- heading: Cleanup
- - title: Combine head geometry
- path: /art/characters/creating/combine-head-geometry
- - title: Remove extra bones
- path: /art/characters/creating/remove-extra-bones
- - title: Verify attachments
- path: /art/characters/creating/verify-attachments
- - title: Final checks
+ - title: Combining Head Geometry
+ path: /art/characters/creating/combining-head-geometry
+ - title: Removing Extra Bones
+ path: /art/characters/creating/removing-extra-bones
+ - title: Verifying Attachments
+ path: /art/characters/creating/verifying-attachments
+ - title: Final Checks
path: /art/characters/creating/final-checks
- - heading: Export
- - title: Embed and export textures
- path: /art/characters/creating/export-textures
- - title: Export character model
- path: /art/characters/creating/export-character
+ - heading: Exporting
+ - title: Embedding and Exporting Textures
+ path: /art/characters/creating/exporting-textures
+ - title: Exporting Character Model
+ path: /art/characters/creating/exporting-character
diff --git a/content/common/navigation/avatar/tutorials-clothing.yaml b/content/common/navigation/avatar/tutorials-clothing.yaml
index 8d47877d3..8e045dbbf 100644
--- a/content/common/navigation/avatar/tutorials-clothing.yaml
+++ b/content/common/navigation/avatar/tutorials-clothing.yaml
@@ -1,45 +1,45 @@
backTo:
- title: Back to avatar tutorials
+ title: Back to Avatar Tutorials
path: /avatar/tutorials/
navigation:
- title: Overview
path: /art/accessories/creating/
- - heading: Model
- - title: Set up mesh
+ - heading: Modeling
+ - title: Setting Up Mesh
path: /art/accessories/creating/modeling-setup
- - title: Trim clothing shape
+ - title: Trimming Clothing Shape
path: /art/accessories/creating/trimming
- - title: Sculpt detail
+ - title: Sculpting Detail
path: /art/accessories/creating/sculpting
- - title: Make mesh watertight
+ - title: Making Mesh Watertight
path: /art/accessories/creating/watertight
- - heading: Texture
- - title: Create seams and unwrap
+ - heading: Texturing
+ - title: Creating Seams and Unwrapping
path: /art/accessories/creating/unwrapping
- - title: Create a texture map
+ - title: Creating a Texture Map
path: /art/accessories/creating/texture-map
- - title: Texture painting
+ - title: Texture Painting
path: /art/accessories/creating/texture-painting
- - heading: Rig
- - title: Armature setup
+ - heading: Rigging
+ - title: Armature Setup
path: /art/accessories/creating/armature-setup
- - title: Test poses
- path: /art/accessories/creating/test-poses
+ - title: Testing Poses
+ path: /art/accessories/creating/testing-poses
- heading: Caging
- - title: Caging setup
+ - title: Caging Setup
path: /art/accessories/creating/caging-setup
- - title: Modify outer cage
- path: /art/accessories/creating/modify-cage
+ - title: Modifying Outer Cage
+ path: /art/accessories/creating/modifying-cage
- - heading: Export
- - title: Export FBX
+ - heading: Exporting
+ - title: Exporting FBX
path: /art/accessories/creating/exporting
- - heading: Import and convert
- - title: Use Studio's 3D importer
+ - heading: Importing and Converting
+ - title: Using Studio's 3D Importer
path: /art/accessories/creating/importing
- - title: Use the accessory fitting tool
+ - title: Using the Accessory Fitting Tool
path: /art/accessories/creating/converting
diff --git a/content/common/navigation/avatar/tutorials.yaml b/content/common/navigation/avatar/tutorials.yaml
index 2c3b860cf..670cd0331 100644
--- a/content/common/navigation/avatar/tutorials.yaml
+++ b/content/common/navigation/avatar/tutorials.yaml
@@ -1,28 +1,28 @@
navigation:
- - heading: Curriculum paths
+ - heading: Curriculum Paths
- title: Overview
path: /avatar/tutorials
- - title: Rigid accessories
+ - title: Rigid Accessories
path: /art/accessories/creating-rigid/
navigation: /avatar/tutorials-accessories.yaml
- title: Clothing
path: /art/accessories/creating
navigation: /avatar/tutorials-clothing.yaml
- - title: Bodies - from templates
+ - title: Bodies - From Templates
path: /art/characters/creating
navigation: /avatar/tutorials-bodies.yaml
- - heading: Use cases
- - title: Create accessories from an existing model
+ - heading: Use Cases
+ - title: Creating Accessories from an Existing Model
path: /art/accessories/from-existing
- - title: Rig and cage an existing model
- path: /art/accessories/rig-and-cage-existing-models
- - title: Create basic heads
- path: /art/characters/facial-animation/create-basic-heads
- - title: Create face accessories
- path: /art/characters/facial-animation/create-face-accessories
- - title: Publish eyebrows and eyelashes
- path: /art/accessories/publish-eyebrows-eyelashes
- - title: Test characters
+ - title: Rigging and Caging an Existing Model
+ path: /art/accessories/rigging-and-caging-existing-models
+ - title: Creating Basic Heads
+ path: /art/characters/facial-animation/creating-basic-heads
+ - title: Creating Face Accessories
+ path: /art/characters/facial-animation/creating-face-accessories
+ - title: Publishing Eyebrows and Eyelashes
+ path: /art/accessories/publishing-eyebrows-eyelashes
+ - title: Testing Characters
path: /art/characters/testing/
section:
- title: Overview
diff --git a/content/common/navigation/cloud/guides.yaml b/content/common/navigation/cloud/guides.yaml
index a13e0af04..92214c137 100644
--- a/content/common/navigation/cloud/guides.yaml
+++ b/content/common/navigation/cloud/guides.yaml
@@ -12,33 +12,33 @@ navigation:
path: /cloud/open-cloud/oauth2-registration
- title: Implementation
path: /cloud/open-cloud/oauth2-develop
- - title: Sample app
+ - title: Sample App
path: /cloud/open-cloud/oauth2-sample
- - title: API keys
+ - title: API Keys
path: /cloud/open-cloud/api-keys
- - heading: V2 resource guides
- - title: User inventories
+ - heading: V2 Resource Guides
+ - title: User Inventories
path: /cloud/open-cloud/inventory
- - title: Engine instances
+ - title: Engine Instances
path: /cloud/open-cloud/instance
- - title: Experience notifications
+ - title: Experience Notifications
path: /cloud/open-cloud/experience-notifications
- - heading: V1 resource guides
+ - heading: V1 Resource Guides
- title: Assets
path: /cloud/open-cloud/usage-assets
- - title: Data stores
+ - title: Data Stores
path: /cloud/open-cloud/usage-data-stores
section:
- title: Overview
path: /cloud/open-cloud/usage-data-stores
- - title: Handle requests
+ - title: Handling Requests
path: /cloud/open-cloud/data-store-api-handling
- title: Messaging
path: /cloud/open-cloud/usage-messaging
- - title: Place publishing
+ - title: Place Publishing
path: /cloud/open-cloud/usage-place-publishing
- heading: Webhooks
- - title: Webhook notifications
+ - title: Webhook Notifications
path: /cloud/webhooks/webhook-notifications
- - title: Right to erasure requests
+ - title: Right to Erasure Requests
path: /cloud/webhooks/automate-right-to-erasure
diff --git a/content/common/navigation/cloud/legacy.yaml b/content/common/navigation/cloud/legacy.yaml
index 6471f3b2e..05a06ff8c 100644
--- a/content/common/navigation/cloud/legacy.yaml
+++ b/content/common/navigation/cloud/legacy.yaml
@@ -2,31 +2,31 @@ navigation:
- heading: Legacy APIs
- title: Overview
path: /cloud/legacy
- - title: Account information
+ - title: Account Information
type: cloudapi
ignoreTranslation: true
versions:
- name: v1
path: /cloud/legacy/accountinformation/v1
- - title: Account settings
+ - title: Account Settings
type: cloudapi
ignoreTranslation: true
versions:
- name: v1
path: /cloud/legacy/accountsettings/v1
- - title: Ad configuration
+ - title: Ad Configuration
type: cloudapi
ignoreTranslation: true
versions:
- name: v2
path: /cloud/legacy/adconfiguration/v2
- - title: Asset delivery v2
+ - title: Asset Delivery v2
type: cloudapi
ignoreTranslation: true
versions:
- name: v2
path: /cloud/legacy/assetdelivery/v2
- - title: Asset delivery v1
+ - title: Asset Delivery v1
type: cloudapi
ignoreTranslation: true
versions:
@@ -92,13 +92,13 @@ navigation:
versions:
- name: v2
path: /cloud/legacy/chat/v2
- - title: Client settings v2
+ - title: Client Settings v2
type: cloudapi
ignoreTranslation: true
versions:
- name: v2
path: /cloud/legacy/clientsettings/v2
- - title: Client settings v1
+ - title: Client Settings v1
type: cloudapi
ignoreTranslation: true
versions:
@@ -128,13 +128,13 @@ navigation:
versions:
- name: v1
path: /cloud/legacy/economy/v1
- - title: Economy creator stats
+ - title: Economy Creator Stats
type: cloudapi
ignoreTranslation: true
versions:
- name: v1
path: /cloud/legacy/economycreatorstats/v1
- - title: Engagement payouts
+ - title: Engagement Payouts
type: cloudapi
ignoreTranslation: true
versions:
@@ -158,19 +158,19 @@ navigation:
versions:
- name: v1
path: /cloud/legacy/friends/v1
- - title: Game internationalization v2
+ - title: Game Internationalization v2
type: cloudapi
ignoreTranslation: true
versions:
- name: v2
path: /cloud/legacy/gameinternationalization/v2
- - title: Game internationalization v1
+ - title: Game Internationalization v1
type: cloudapi
ignoreTranslation: true
versions:
- name: v1
path: /cloud/legacy/gameinternationalization/v1
- - title: Game join
+ - title: Game Join
type: cloudapi
ignoreTranslation: true
versions:
@@ -212,7 +212,7 @@ navigation:
versions:
- name: v1
path: /cloud/legacy/inventory/v1
- - title: Item configuration
+ - title: Item Configuration
type: cloudapi
ignoreTranslation: true
versions:
@@ -224,7 +224,7 @@ navigation:
versions:
- name: v1
path: /cloud/legacy/locale/v1
- - title: Localization tables
+ - title: Localization Tables
type: cloudapi
ignoreTranslation: true
versions:
@@ -242,7 +242,7 @@ navigation:
versions:
- name: v2
path: /cloud/legacy/notifications/v2
- - title: Premium features
+ - title: Premium Features
type: cloudapi
ignoreTranslation: true
versions:
@@ -254,7 +254,7 @@ navigation:
versions:
- name: v1
path: /cloud/legacy/presence/v1
- - title: Private messages
+ - title: Private Messages
type: cloudapi
ignoreTranslation: true
versions:
@@ -272,7 +272,7 @@ navigation:
versions:
- name: v1
path: /cloud/legacy/thumbnails/v1
- - title: Thumbnails resizer
+ - title: Thumbnails Resizer
type: cloudapi
ignoreTranslation: true
versions:
@@ -284,13 +284,13 @@ navigation:
versions:
- name: v1
path: /cloud/legacy/trades/v1
- - title: Translation roles
+ - title: Translation Roles
type: cloudapi
ignoreTranslation: true
versions:
- name: v1
path: /cloud/legacy/translationroles/v1
- - title: Two step verification
+ - title: Two Step Verification
type: cloudapi
ignoreTranslation: true
versions:
diff --git a/content/common/navigation/cloud/reference.yaml b/content/common/navigation/cloud/reference.yaml
index 1ddde5a14..966d33cd6 100644
--- a/content/common/navigation/cloud/reference.yaml
+++ b/content/common/navigation/cloud/reference.yaml
@@ -1,5 +1,5 @@
navigation:
- - heading: Common components
+ - heading: Common Components
- title: Overview
path: /cloud/reference/
- title: Patterns
@@ -10,27 +10,27 @@ navigation:
path: /cloud/reference/errors
- title: OAuth 2.0
path: /cloud/reference/oauth2
- - title: OpenAPI descriptions
+ - title: OpenAPI Descriptions
path: /cloud/reference/openapi
- - heading: v2 resources
+ - heading: v2 Resources
- title: All Cloud API
path: /cloud/reference
type: cloudapi2
source: /reference/cloud/cloud.docs.json
- - heading: v1 resources
+ - heading: v1 Resources
- title: Assets
type: cloudapi
versions:
- name: v1
path: /reference/cloud/assets/v1
- - title: Data stores
+ - title: Data Stores
section:
- - title: Standard data stores
+ - title: Standard Data Stores
type: cloudapi
versions:
- name: v1
path: /reference/cloud/datastores-api/v1
- - title: Ordered data stores
+ - title: Ordered Data Stores
type: cloudapi
versions:
- name: v1
@@ -40,7 +40,7 @@ navigation:
versions:
- name: v1
path: /reference/cloud/messaging-service/v1
- - title: Place publishing
+ - title: Place Publishing
type: cloudapi
versions:
- name: v1
diff --git a/content/common/navigation/education.yaml b/content/common/navigation/education.yaml
index 5ae103edf..c2ba1b0a8 100644
--- a/content/common/navigation/education.yaml
+++ b/content/common/navigation/education.yaml
@@ -1,339 +1,339 @@
backTo:
- title: Back to guides
+ title: Back to Guides
path: /platform
navigation:
- - heading: Educator training
- - title: Educator onboarding
+ - heading: Educator Training
+ - title: Educator Onboarding
path: /education/educator-onboarding/landing
section:
- title: Intro to Roblox
path: /education/educator-onboarding/1-intro-to-roblox
- - title: Play on Roblox
+ - title: Playing on Roblox
path: /education/educator-onboarding/2-playing-on-roblox
- - title: Set up a Roblox classroom
+ - title: Setting Up a Roblox Classroom
path: /education/educator-onboarding/3-setting-up-a-roblox-classroom
- - title: Run classrooms
+ - title: Running Classrooms
path: /education/educator-onboarding/4-running-classrooms
- - title: Next steps
+ - title: Next Steps
path: /education/educator-onboarding/5-next-steps
- - title: Classroom facilitation
+ - title: Classroom Facilitation
section:
- - title: Intro to digital civility
+ - title: Intro to Digital Civility
path: /education/resources/intro-to-digital-civility
- - title: Intro to digital safety
+ - title: Intro to Digital Safety
path: /education/resources/intro-to-digital-safety
- - title: Teach remotely
+ - title: Teaching Remotely
path: /education/resources/teaching-remotely
- - title: Create private servers
+ - title: Creating Private Servers
path: /education/support/private-servers-for-classroom-use
- - title: Collaboration best practices
+ - title: Collaboration Best Practices
path: /education/resources/collaboration-best-practices
- - title: Classroom best practices
+ - title: Classroom Best Practices
path: /education/resources/classroom-best-practices
- title: Resources
path: /education/resources/resources-landing
section:
- - title: List of Roblox educators
+ - title: List of Roblox Educators
path: /education/resources/roblox-educators
- - title: Marketing materials
+ - title: Marketing Materials
path: /education/resources/marketing-materials
- title: Roblox for AP CSP
path: /education/resources/roblox-for-the-ap-csp-create-performance-task
- - title: Create bundled installers
+ - title: Creating Bundled Installers
path: /education/support/creating-bundled-installers
- - title: Frequently asked questions
+ - title: Frequently Asked Questions
path: /education/resources/frequently-asked-questions-education
- - heading: Lesson plans
- - title: Unit lessons
+ - heading: Lesson Plans
+ - title: Unit Lessons
section:
- - title: Intro to game design and coding
+ - title: Intro to Game Design and Coding
path: /education/lesson-plans/intro-to-game-and-coding
- - title: Roblox developer 101
+ - title: Roblox Developer 101
path: /education/lesson-plans/roblox-developer/landing
section:
- - title: Roblox Studio basics
+ - title: Roblox Studio Basics
path: /education/lesson-plans/roblox-developer/roblox-developer-1
- - title: Coding fundamentals
+ - title: Coding Fundamentals
path: /education/lesson-plans/roblox-developer/roblox-developer-2
- - title: Adventure game Pt. 1
+ - title: Adventure Game Pt. 1
path: /education/lesson-plans/roblox-developer/roblox-developer-3
- - title: Adventure game Pt. 2
+ - title: Adventure Game Pt. 2
path: /education/lesson-plans/roblox-developer/roblox-developer-4
- - title: Adventure game Pt. 3
+ - title: Adventure Game Pt. 3
path: /education/lesson-plans/roblox-developer/roblox-developer-5
- - title: Digital citizenship
+ - title: Digital Citizenship
path: /education/lesson-plans/digital-citizenship/landing
section:
- title: Intro to Roblox
path: /education/lesson-plans/digital-citizenship/intro-to-roblox
- - title: Be a digital citizen
+ - title: Being a Digital Citizen
path: /education/lesson-plans/digital-citizenship/being-a-digital-citizen
- - title: Lights and polish
+ - title: Lights and Polish
path: /education/lesson-plans/digital-citizenship/lights-and-polish
- - title: Coding fundamentals
+ - title: Coding Fundamentals
path: /education/lesson-plans/digital-citizenship/coding-fundamentals
- - title: Animate characters
+ - title: Animating Characters
path: /education/lesson-plans/digital-citizenship/animating-characters
- - title: Finish projects
+ - title: Finishing Projects
path: /education/lesson-plans/digital-citizenship/finishing-projects
- - title: Activity lessons
+ - title: Activity Lessons
section:
- title: Galactic Speedway
path: /education/lesson-plans/galactic-speedway-lesson
- title: Animate in Roblox
path: /education/lesson-plans/animate-in-roblox-lesson
- - title: Story games
+ - title: Story Games
path: /education/lesson-plans/story-games-lesson
- - title: Create and destroy
+ - title: Create and Destroy
path: /education/lesson-plans/create-and-destroy-lesson
- - heading: Tutorial series
- - title: Featured content
+ - heading: Tutorial Series
+ - title: Featured Content
path: /education/support/education-content
- - title: Coding fundamentals
+ - title: Coding Fundamentals
path: /tutorials/fundamentals/coding-1/coding-fundamentals
navigation: /engine/tutorials-fundamentals.yaml
- - title: Build It, Play It series
+ - title: Build It, Play It Series
path: /education/landing-pages/build-it-play-it
section:
- title: Mansion of Wonder
path: /education/build-it-play-it-mansion-of-wonder/landing-page
section:
- - title: Beginner content
+ - title: Beginner Content
path: /education/build-it-play-it-mansion-of-wonder/beginner-landing-page
section:
- - title: Become an artist
+ - title: Become an Artist
path: /education/build-it-play-it-mansion-of-wonder/become-an-artist
- - title: Test and play
+ - title: Test and Play
path: /education/build-it-play-it-mansion-of-wonder/test-and-play
- - title: Particle emitters
+ - title: Particle Emitters
path: /education/build-it-play-it-mansion-of-wonder/particle-emitters
- - title: Save by publishing
+ - title: Save by Publishing
path: /education/build-it-play-it-mansion-of-wonder/save-by-publishing
- - title: Challenge checkpoint 1
+ - title: Challenge Checkpoint 1
path: /education/build-it-play-it-mansion-of-wonder/challenge-checkpoint
- - title: Use textures
+ - title: Using Textures
path: /education/build-it-play-it-mansion-of-wonder/using-textures
- - title: Finish the blast
+ - title: Finish the Blast
path: /education/build-it-play-it-mansion-of-wonder/using-textures
- - title: Make an explosion
+ - title: Making an Explosion
path: /education/build-it-play-it-mansion-of-wonder/making-an-explosion
- - title: Challenge checkpoint 2
+ - title: Challenge Checkpoint 2
path: /education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-2
- - title: Make final touches
+ - title: Make Final Touches
path: /education/build-it-play-it-mansion-of-wonder/make-final-touches
- - title: Invite friends
+ - title: Invite Friends
path: /education/build-it-play-it-mansion-of-wonder/invite-friends
- - title: Challenge checkpoint 3
+ - title: Challenge Checkpoint 3
path: /education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-3
- - title: Next steps
+ - title: Next Steps
path: /education/build-it-play-it-mansion-of-wonder/next-steps
- - title: Create a sparkler
+ - title: Creating a Sparkler
path: /education/build-it-play-it-mansion-of-wonder/creating-a-sparkler
- - title: Experienced content
+ - title: Experienced Content
path: /education/build-it-play-it-mansion-of-wonder/experienced-landing-page
section:
- - title: Create engaging experiences
+ - title: Creating Engaging Experiences
path: /education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences
- - title: Connect the beam
+ - title: Connect the Beam
path: /education/build-it-play-it-mansion-of-wonder/connect-the-beam
- - title: Use particles for actions
+ - title: Using Particles for Actions
path: /education/build-it-play-it-mansion-of-wonder/using-particles-for-actions
- - title: Add scripts
+ - title: Adding Scripts
path: /education/build-it-play-it-mansion-of-wonder/adding-scripts
- - title: Next steps
+ - title: Next Steps
path: /education/build-it-play-it-mansion-of-wonder/next-steps-advanced
- title: Island of Move
path: /education/build-it-play-it-island-of-move/landing
section:
- - title: Beginner content
+ - title: Beginner Content
path: /education/build-it-play-it-island-of-move/beginner-landing-page
section:
- - title: Open the template
+ - title: Opening the Template
path: /education/build-it-play-it-island-of-move/opening-the-template
- - title: Test the game
+ - title: Test the Game
path: /education/build-it-play-it-island-of-move/test-the-game
- - title: Create animations
+ - title: Creating Animations
path: /education/build-it-play-it-island-of-move/creating-animations
- - title: Create the first pose
+ - title: Create the First Pose
path: /education/build-it-play-it-island-of-move/create-the-first-pose
- - title: Save and publish
+ - title: Save and Publish
path: /education/build-it-play-it-island-of-move/save-and-publish
- - title: Challenge checkpoint 1
+ - title: Challenge Checkpoint 1
path: /education/build-it-play-it-island-of-move/challenge-checkpoint
- - title: Loop animations
+ - title: Looping Animations
path: /education/build-it-play-it-island-of-move/looping-animations
- - title: Add the second pose
+ - title: Adding the Second Pose
path: /education/build-it-play-it-island-of-move/adding-the-second-pose
- - title: Challenge checkpoint 2
+ - title: Challenge Checkpoint 2
path: /education/build-it-play-it-island-of-move/challenge-checkpoint-2
- - title: Export animations
+ - title: Exporting Animations
path: /education/build-it-play-it-island-of-move/exporting-animations
- - title: Change the animation
+ - title: Change the Animation
path: /education/build-it-play-it-island-of-move/change-the-animation
- - title: Invite friends to play
+ - title: Invite Friends to Play
path: /education/build-it-play-it-island-of-move/invite-friends-to-play
- - title: Challenge checkpoint 3
+ - title: Challenge Checkpoint 3
path: /education/build-it-play-it-island-of-move/challenge-checkpoint-3
- - title: Go beyond the challenge
+ - title: Go Beyond the Challenge
path: /education/build-it-play-it-island-of-move/go-beyond-the-challenge
- - title: Experienced content
+ - title: Experienced Content
path: /education/build-it-play-it-island-of-move/animations-and-feedback
section:
- - title: Animations and feedback
+ - title: Animations and Feedback
path: /education/build-it-play-it-island-of-move/animations-and-feedback
- - title: Design poses
+ - title: Designing Poses
path: /education/build-it-play-it-island-of-move/designing-poses
- - title: Add animations
+ - title: Adding Animations
path: /education/build-it-play-it-island-of-move/adding-animations
source: /education/build-it-play-it-island-of-move/adding-animations
- - title: Animate parts
+ - title: Animating Parts
path: /education/build-it-play-it-island-of-move/animating-parts
source: /education/build-it-play-it-island-of-move/animating-parts
- title: Galactic Speedway
path: /education/build-it-play-it-galactic-speedway/main-page
section:
- - title: Get off the ground
+ - title: Get Off the Ground
path: /education/build-it-play-it-galactic-speedway/get-off-the-ground
- - title: Take flight
+ - title: Take Flight
path: /education/build-it-play-it-galactic-speedway/take-flight
- - title: Design your speeder
+ - title: Designing Your Speeder
path: /education/build-it-play-it-galactic-speedway/designing-your-speeder
- - title: Move the body
+ - title: Moving the Body
path: /education/build-it-play-it-galactic-speedway/moving-the-body
- - title: Save and publish
+ - title: Save and Publish
path: /education/build-it-play-it-galactic-speedway/save-and-publish
- - title: Challenge checkpoint 1
+ - title: Challenge Checkpoint 1
path: /education/build-it-play-it-galactic-speedway/take-the-challenge
- - title: Add wings
+ - title: Adding Wings
path: /education/build-it-play-it-galactic-speedway/adding-wings
- - title: Duplicate and design
+ - title: Duplicate and Design
path: /education/build-it-play-it-galactic-speedway/duplicate-and-design
- - title: Group the parts
+ - title: Grouping the Parts
path: /education/build-it-play-it-galactic-speedway/grouping-the-parts
- - title: Add to the gorage
+ - title: Add to the Garage
path: /education/build-it-play-it-galactic-speedway/add-to-the-garage
- - title: Test the speeder
+ - title: Test the Speeder
path: /education/build-it-play-it-galactic-speedway/test-the-speeder
- - title: Challenge checkpoint 2
+ - title: Challenge Checkpoint 2
path: /education/build-it-play-it-galactic-speedway/take-the-challenge-2
- - title: Customize and share
+ - title: Customize and Share
path: /education/build-it-play-it-galactic-speedway/customize-and-share
- - title: Go for a race
+ - title: Going for a Race
path: /education/build-it-play-it-galactic-speedway/going-for-a-race
- - title: Challenge checkpoint 3
+ - title: Challenge Checkpoint 3
path: /education/build-it-play-it-galactic-speedway/take-the-challenge-3
- - title: Go beyond the challenge
+ - title: Go Beyond the Challenge
path: /education/build-it-play-it-galactic-speedway/go-beyond-the-challenge
- - title: Share your speeders
+ - title: Sharing Your Speeders
path: /education/build-it-play-it-galactic-speedway/sharing-your-speeders
- - title: Add new models
+ - title: Add New Models
path: /education/build-it-play-it-galactic-speedway/add-new-models
- - title: Colors and textures
+ - title: Colors and Textures
path: /education/build-it-play-it-galactic-speedway/colors-and-textures
- - title: Design the world
+ - title: Design the World
path: /education/build-it-play-it-galactic-speedway/design-the-world
- - title: Create and destroy
+ - title: Create and Destroy
path: /education/build-it-play-it-create-and-destroy/landing
section:
- - title: Design a map
+ - title: Designing a Map
path: /education/build-it-play-it-create-and-destroy/designing-a-map
- - title: Snap to grid
+ - title: Snap to Grid
path: /education/build-it-play-it-create-and-destroy/snap-to-grid
- - title: Save and publish
+ - title: Save and Publish
path: /education/build-it-play-it-create-and-destroy/save-and-publish
- - title: Challenge checkpoint 1
+ - title: Challenge Checkpoint 1
path: /education/build-it-play-it-create-and-destroy/challenge-1
- - title: Build one half
+ - title: Build One Half
path: /education/build-it-play-it-create-and-destroy/build-one-half
- - title: Playtest the map
+ - title: Playtest the Map
path: /education/build-it-play-it-create-and-destroy/playtest-the-map
- - title: Build the roads
+ - title: Build the Roads
path: /education/build-it-play-it-create-and-destroy/build-the-roads
- - title: Buildings and props
+ - title: Buildings and Props
path: /education/build-it-play-it-create-and-destroy/buildings-and-props
- - title: Complete the city
+ - title: Complete the City
path: /education/build-it-play-it-create-and-destroy/complete-the-city
- - title: Island terrain
+ - title: Island Terrain
path: /education/build-it-play-it-create-and-destroy/island-terrain
- - title: Terrain tools
+ - title: Terrain Tools
path: /education/build-it-play-it-create-and-destroy/terrain-tools
- - title: Challenge checkpoint 2
+ - title: Challenge Checkpoint 2
path: /education/build-it-play-it-create-and-destroy/challenge-2
- - title: Change the script
+ - title: Change the Script
path: /education/build-it-play-it-create-and-destroy/change-the-script
- - title: Icons and thumbnails
+ - title: Icons and Thumbnails
path: /education/build-it-play-it-create-and-destroy/icons-and-thumbnails
- - title: Challenge checkpoint 3
+ - title: Challenge Checkpoint 3
path: /education/build-it-play-it-create-and-destroy/challenge-3
- - title: Finish the challenge
+ - title: Finish the Challenge
path: /education/build-it-play-it-create-and-destroy/finish-the-challenge
- - title: Story games
+ - title: Story Games
path: /education/build-it-play-it-story-games/landing
section:
- - title: Write the story
+ - title: Writing the Story
path: /education/build-it-play-it-story-games/writing-the-story
- - title: Open the template
+ - title: Opening the Template
path: /education/build-it-play-it-story-games/opening-the-template
- title: Challenge Checkpoint 1
path: /education/build-it-play-it-story-games/first-challenge
- - title: Start coding
+ - title: Start Coding
path: /education/build-it-play-it-story-games/start-coding
- - title: Code a question
+ - title: Coding a Question
path: /education/build-it-play-it-story-games/coding-a-question
- - title: Test and save
+ - title: Test and Save
path: /education/build-it-play-it-story-games/test-and-save
- - title: Challenge checkpoint 2
+ - title: Challenge Checkpoint 2
path: /education/build-it-play-it-story-games/second-challenge
- - title: Code the story
+ - title: Coding the Story
path: /education/build-it-play-it-story-games/code-the-story
- - title: Finish and add more
+ - title: Finishing and Add More
path: /education/build-it-play-it-story-games/finish-and-add
- - title: Challenge checkpoint 3
+ - title: Challenge Checkpoint 3
path: /education/build-it-play-it-story-games/third-challenge
- - title: Complete the challenge
+ - title: Completing the Challenge
path: /education/build-it-play-it-story-games/complete-the-challenge
- - title: Adventure game project
+ - title: Adventure Game Project
path: /education/adventure-game-series/landing
section:
- - title: Create the map
+ - title: Creating the Map
path: /education/adventure-game-series/create-the-map
- - title: Code the leaderboard
+ - title: Coding the Leaderboard
path: /education/adventure-game-series/code-the-leaderboard
- - title: Collect items
+ - title: Collecting Items
path: /education/adventure-game-series/collect-items
- - title: Sell items
+ - title: Selling Items
path: /education/adventure-game-series/selling-items
- - title: Buy upgrades
+ - title: Buying Upgrades
path: /education/adventure-game-series/buying-upgrades
- - title: Finish the project
+ - title: Finishing the Project
path: /education/adventure-game-series/finishing-the-project
- - title: Battle Royale project
+ - title: Battle Royale Project
path: /education/battle-royale-series/landing
section:
- - title: Project setup
+ - title: Project Setup
path: /education/battle-royale-series/project-setup
- - title: Code the game loop
+ - title: Coding the Game Loop
path: /education/battle-royale-series/coding-the-game-loop
- - title: Manage players
+ - title: Managing Players
path: /education/battle-royale-series/managing-players
- - title: Timers and events
+ - title: Timers and Events
path: /education/battle-royale-series/timers-and-events
- - title: Create a GUI
+ - title: Creating a GUI
path: /education/battle-royale-series/creating-a-gui
- - title: End matches
+ - title: Ending Matches
path: /education/battle-royale-series/ending-matches
- - title: Cleanup and reset
+ - title: Cleanup and Reset
path: /education/battle-royale-series/cleanup-and-reset
- - title: Finish the project
+ - title: Finishing the Project
path: /education/battle-royale-series/finishing-the-project
- - heading: Education developers
- - title: Get started for developers
+ - heading: Education Developers
+ - title: Getting Started for Developers
path: /education/resources/getting-started-for-developers-education
- - title: Design educational experiences
+ - title: Designing Educational Experiences
path: /education/developer/designing-educational-experiences
- - title: Plan for educational settings
+ - title: Planning for Educational Settings
path: /education/developer/planning-for-educational-settings
- - title: Beta test experiences
+ - title: Beta Testing Experiences
path: /education/developer/beta-testing-experiences
diff --git a/content/common/navigation/engine/art.yaml b/content/common/navigation/engine/art.yaml
index 7a9d113e6..4113c6124 100644
--- a/content/common/navigation/engine/art.yaml
+++ b/content/common/navigation/engine/art.yaml
@@ -1,75 +1,75 @@
navigation:
- - title: 3D art overview
+ - title: 3D Art Overview
path: /art/
- - heading: Get started
+ - heading: Getting Started
- title: Studio
path: /art/overview-studio
- - title: Third-party software
+ - title: Third-Party Software
path: /art/overview-dcc
- heading: Modeling
- title: Overview
path: /art/modeling/
- - title: Modeling specifications
+ - title: Modeling Specifications
path: /art/modeling/specifications
- - title: Reference assets
+ - title: Reference Assets
path: /art/modeling/project-files
- - title: Rigging and skinning
+ - title: Rigging and Skinning
path: /art/modeling/rigging
- - title: Blender and Maya export settings
+ - title: Blender and Maya Export Settings
path: /art/modeling/export-requirements
- title: 3D Importer
path: /art/modeling/3d-importer
- - title: Roblox Blender plugin
+ - title: Roblox Blender Plugin
path: /art/modeling/roblox-blender-plugin
- heading: Texturing
- - title: Texture specifications
+ - title: Texture Specifications
path: /art/modeling/texture-specifications
- - title: Physically-based rendering (PBR)
+ - title: Physically-based Rendering (PBR)
path: /art/modeling/surface-appearance
- - title: PBR material references
+ - title: PBR Material References
path: /art/modeling/material-reference
- heading: Animation
section:
- - title: Export animations from Maya
- path: /art/characters/export-avatar-animations-from-maya
- - title: Animate heads
- path: /art/characters/facial-animation/animate-heads
+ - title: Exporting Animations from Maya
+ path: /art/characters/exporting-avatar-animations-from-maya
+ - title: Animating Heads
+ path: /art/characters/facial-animation/animating-heads
- - heading: Example projects
+ - heading: Example Projects
path:
- title: The Mystery of Duvall Drive
path: /resources/the-mystery-of-duvall-drive/
section:
- title: Overview
path: /resources/the-mystery-of-duvall-drive/
- - title: Construct the house
- path: /resources/the-mystery-of-duvall-drive/construct-the-house
- - title: Materialize the world
- path: /resources/the-mystery-of-duvall-drive/materialize-the-world
- - title: Immersive narrative
+ - title: Constructing the House
+ path: /resources/the-mystery-of-duvall-drive/constructing-the-house
+ - title: Materializing the World
+ path: /resources/the-mystery-of-duvall-drive/materializing-the-world
+ - title: Immersive Narrative
path: /resources/the-mystery-of-duvall-drive/immersive-narrative
- - title: Stream in immersion
- path: /resources/the-mystery-of-duvall-drive/stream-in-immersion
- - title: Develop a moving world
- path: /resources/the-mystery-of-duvall-drive/develop-a-moving-world
- - title: Design dark soundscapes
- path: /resources/the-mystery-of-duvall-drive/design-dark-soundscapes
- - title: Technical overview
+ - title: Streaming in Immersion
+ path: /resources/the-mystery-of-duvall-drive/streaming-in-immersion
+ - title: Developing a Moving World
+ path: /resources/the-mystery-of-duvall-drive/developing-a-moving-world
+ - title: Designing Dark Soundscapes
+ path: /resources/the-mystery-of-duvall-drive/designing-dark-soundscapes
+ - title: Technical Overview
path: /resources/the-mystery-of-duvall-drive/technical-overview
section:
- title: Overview
path: /resources/the-mystery-of-duvall-drive/technical-overview
- - title: Main design requirements
+ - title: Main Design Requirements
path: /resources/the-mystery-of-duvall-drive/main-design-requirements
- - title: Foundational gameplay systems
+ - title: Foundational Gameplay Systems
path: /resources/the-mystery-of-duvall-drive/foundational-gameplay-systems
- - title: Supporting systems
+ - title: Supporting Systems
path: /resources/the-mystery-of-duvall-drive/supporting-systems
- - title: Beyond the Dark
+ - title: Beyond The Dark
path: /resources/beyond-the-dark/
section:
- title: Overview
@@ -78,9 +78,9 @@ navigation:
path: /resources/beyond-the-dark/building-architecture
- title: Characters
path: /resources/beyond-the-dark/custom-characters
- - title: Layered clothing
+ - title: Layered Clothing
path: /resources/beyond-the-dark/layered-clothing
- - title: Sound design
+ - title: Sound Design
path: /resources/beyond-the-dark/sound-design
- - title: User interface
+ - title: User Interface
path: /resources/beyond-the-dark/user-interface
diff --git a/content/common/navigation/engine/design.yaml b/content/common/navigation/engine/design.yaml
index 63f0ee6b9..ed27ce9e1 100644
--- a/content/common/navigation/engine/design.yaml
+++ b/content/common/navigation/engine/design.yaml
@@ -2,41 +2,41 @@ navigation:
- heading: Design
- title: Overview
path: /production/game-design/
- - heading: Design your experience
- - title: Design for Roblox
- path: /production/game-design/design-for-roblox
- - title: Core loops
+ - heading: Design Your Experience
+ - title: Designing For Roblox
+ path: /production/game-design/designing-for-roblox
+ - title: Core Loops
path: /production/game-design/core-loops
- title: Prototyping
path: /production/game-design/prototyping
- - heading: Build your experience
+ - heading: Build Your Experience
- title: Onboarding
path: /production/game-design/onboarding
- - title: Onboarding techniques
+ - title: Onboarding Techniques
path: /production/game-design/onboarding-techniques
- - title: Quest design
+ - title: Quest Design
path: /production/game-design/introduction-to-quest-design
- title: UI and UX
path: /production/game-design/ui-ux-design
- - heading: Monetize your experience
- - title: Monetization foundations
+ - heading: Monetize Your Experience
+ - title: Monetization Foundations
path: /production/game-design/monetization-foundations
- - title: Season pass design
+ - title: Season Pass Design
path: /production/game-design/season-pass-design
- - title: Starter pack design
+ - title: Starter Pack Design
path: /production/game-design/starter-pack-design
- - title: Subscription design
+ - title: Subscription Design
path: /production/game-design/subscription-design
- - title: Contextual purchases
+ - title: Contextual Purchases
path: /production/game-design/contextual-purchases
- - title: Balancing virtual economies
- path: /production/game-design/balance-virtual-economies
- - heading: Support your experience
- - title: LiveOps essentials
+ - title: Balancing Virtual Economies
+ path: /production/game-design/balancing-virtual-economies
+ - heading: Support Your Experience
+ - title: LiveOps Essentials
path: /production/game-design/liveops-essentials
- - title: LiveOps planning
+ - title: LiveOps Planning
path: /production/game-design/liveops-planning
- - title: Analytics essentials
+ - title: Analytics Essentials
path: /production/game-design/analytics-essentials
- - title: Content updates
+ - title: Content Updates
path: /production/game-design/content-updates
diff --git a/content/common/navigation/engine/guides.yaml b/content/common/navigation/engine/guides.yaml
index d8a1b0b70..1aec1e0bd 100644
--- a/content/common/navigation/engine/guides.yaml
+++ b/content/common/navigation/engine/guides.yaml
@@ -1,18 +1,18 @@
defaultType: markdown
navigation:
- heading: Learn the basics
- - title: Get started
+ - title: Get Started
path: /get-started
- - title: Platform overview
+ - title: Platform Overview
path: /platform
- - title: Creation overview
+ - title: Creation Overview
path: /creation
- title: Assistant
path: /assistant/guide
section:
- title: Overview
path: /assistant/guide
- - title: Prompt guide and examples
+ - title: Prompt Guide and Examples
path: /assistant/prompt-engineering
- heading: Create
- title: Roblox Studio
@@ -26,51 +26,51 @@ navigation:
- title: Architecture
path: /projects/data-model
section:
- - title: Data model
+ - title: Data Model
path: /projects/data-model
- - title: Client-server runtime
+ - title: Client-Server Runtime
path: /projects/client-server
- - title: Instance streaming
+ - title: Instance Streaming
path: /workspace/streaming
- - title: Work in teams
+ - title: Working in Teams
path: /projects/groups
section:
- title: Groups
path: /projects/groups
- title: Collaboration
path: /projects/collaboration
- - title: Experience ownership transfer
+ - title: Experience Ownership Transfer
path: /projects/experience-ownership-transfer
section:
- - title: Transfer animations
- path: /projects/transfer-animations
- - title: Activity history
+ - title: Transferring Roblox Animations
+ path: /projects/transferring-animations
+ - title: Activity History
path: /projects/activity-history
- - title: External tools
+ - title: External Tools
path: /projects/external-tools
- - title: Place files
+ - title: Place Files
path: /projects/place-files
- title: Assets
path: /projects/assets/
section:
- title: Overview
path: /projects/assets/
- - title: Manage
+ - title: Managing
path: /projects/assets/manager
section:
- - title: Asset manager
+ - title: Asset Manager
path: /projects/assets/manager
- title: Toolbox
path: /projects/assets/toolbox
- - title: External catalog queries
+ - title: External Catalog Queries
path: /projects/assets/api
- title: Packages
path: /projects/assets/packages
- - title: Asset privacy
+ - title: Asset Privacy
path: /projects/assets/privacy
- - title: In-experience asset creation
+ - title: In-Experience Asset Creation
path: /projects/assets/in-experience-asset-creation
- - title: 3D workspace
+ - title: 3D Workspace
path: /workspace/
section:
- title: Overview
@@ -80,9 +80,9 @@ navigation:
section:
- title: Overview
path: /parts/
- - title: Solid modeling
+ - title: Solid Modeling
path: /parts/solid-modeling
- - title: Textures and decals
+ - title: Textures and Decals
path: /parts/textures-decals
- title: Meshes
path: /parts/meshes
@@ -99,16 +99,16 @@ navigation:
path: /physics/
- title: Assemblies
path: /physics/assemblies
- - title: Network ownership
+ - title: Network Ownership
path: /physics/network-ownership
#- title: Joints
# path: /physics/joints
- - title: Mechanical constraints
+ - title: Mechanical Constraints
path: /physics/mechanical-constraints
section:
- title: Overview
path: /physics/mechanical-constraints
- - title: BallSocket
+ - title: Ball Socket
path: /physics/constraints/ball-socket
- title: Hinge
path: /physics/constraints/hinge
@@ -118,7 +118,7 @@ navigation:
path: /physics/constraints/cylindrical
- title: Spring
path: /physics/constraints/spring
- - title: TorsionSpring
+ - title: Torsion Spring
path: /physics/constraints/torsion-spring
- title: Universal
path: /physics/constraints/universal
@@ -132,43 +132,43 @@ navigation:
path: /physics/constraints/weld
- title: Rigid
path: /physics/constraints/rigid
- - title: NoCollision
+ - title: No Collision
path: /physics/constraints/no-collision
- - title: Mover constraints
+ - title: Mover Constraints
path: /physics/mover-constraints
section:
- title: Overview
path: /physics/mover-constraints
- - title: LinearVelocity
+ - title: Linear Velocity
path: /physics/constraints/linear-velocity
- - title: AngularVelocity
+ - title: Angular Velocity
path: /physics/constraints/angular-velocity
- - title: AlignPosition
+ - title: Align Position
path: /physics/constraints/align-position
- - title: AlignOrientation
+ - title: Align Orientation
path: /physics/constraints/align-orientation
- - title: VectorForce
+ - title: Vector Force
path: /physics/constraints/vector-force
- title: Torque
path: /physics/constraints/torque
- - title: LineForce
+ - title: Line Force
path: /physics/constraints/line-force
- - title: Sleep system
+ - title: Sleep System
path: /physics/sleep-system
- - title: Adaptive timestepping
+ - title: Adaptive Timestepping
path: /physics/adaptive-timestepping
- - title: Character controllers
+ - title: Character Controllers
path: /physics/character-controllers
- - title: Roblox units
+ - title: Roblox Units
path: /physics/units
- title: Effects
path: /effects/
section:
- title: Overview
path: /effects/
- - title: Light sources
+ - title: Light Sources
path: /effects/light-sources
- - title: Particle emitters
+ - title: Particle Emitters
path: /effects/particle-emitters
- title: Beams
path: /effects/beams
@@ -178,7 +178,7 @@ navigation:
path: /effects/highlighting
- title: Camera
path: /workspace/camera
- - title: Spatial data
+ - title: Spatial Data
section:
#- title: Object World Space
# path: /workspace/object-world-space
@@ -195,13 +195,13 @@ navigation:
section:
- title: Overview
path: /scripting/
- - title: Types and locations
+ - title: Types and Locations
path: /scripting/locations
- - title: Reuse code
+ - title: Reusing Code
path: /scripting/module
- title: Services
path: /scripting/services
- - title: Properties and attributes
+ - title: Properties and Attributes
path: /scripting/attributes
- title: Events
path: /scripting/events/
@@ -218,15 +218,15 @@ navigation:
section:
- title: Scheduler
path: /scripting/scheduler
- - title: Multi-threading
+ - title: Multi-Threading
path: /scripting/multithreading
- - title: Native code generation
+ - title: Native Code Generation
path: /luau/native-code-gen
- - title: Script capabilities
+ - title: Script Capabilities
path: /scripting/capabilities
- - title: Security tactics and cheat mitigation
+ - title: Security Tactics and Cheat Mitigation
path: /scripting/security/security-tactics
- - title: Luau reference
+ - title: Luau Reference
path: /luau/
section:
- title: Overview
@@ -249,7 +249,7 @@ navigation:
path: /luau/tuples
- title: Userdata
path: /luau/userdata
- - title: Data structures
+ - title: Data Structures
section:
- title: Queues
path: /luau/queues
@@ -267,28 +267,28 @@ navigation:
path: /luau/scope
- title: Operators
path: /luau/operators
- - title: Control structures
+ - title: Control Structures
path: /luau/control-structures
- title: Functions
path: /luau/functions
- - title: Type coercion
+ - title: Type Coercion
path: /luau/type-coercion
- - title: Type checking
+ - title: Type Checking
path: /luau/type-checking
- title: Environment
path: /environment/
section:
- title: Overview
path: /environment/
- - title: Global lighting
+ - title: Global Lighting
path: /environment/lighting
- title: Atmosphere
path: /environment/atmosphere
- title: Clouds
path: /environment/clouds
- - title: Global wind
+ - title: Global Wind
path: /environment/global-wind
- - title: Post-processing effects
+ - title: Post-Processing Effects
path: /environment/post-processing-effects
- title: Skyboxes
path: /environment/skybox
@@ -303,9 +303,9 @@ navigation:
path: /characters/emotes
- title: Pathfinding
path: /characters/pathfinding
- - title: Name and health display
+ - title: Name and Health Display
path: /characters/name-health-display
- - title: R6 to R15 adapter
+ - title: R6 to R15 Adapter
path: /characters/r6-to-r15-adapter
- title: Players
path: /players/
@@ -313,31 +313,31 @@ navigation:
- title: Overview
path: /players/
- title: Teleporting
- path: /projects/teleport
+ path: /projects/teleporting
- title: Teams
path: /players/teams
- - title: In-experience tools
+ - title: In-Experience Tools
path: /players/tools
- title: Leaderboards
path: /players/leaderboards
- - title: Loading screens
- path: /players/load-screens
+ - title: Loading Screens
+ path: /players/loading-screens
- title: Player UI
section:
- - title: Avatar editor
+ - title: Avatar Editor
path: /players/avatar-editor
- - title: Avatar inspect menu
+ - title: Avatar Inspect Menu
path: /players/avatar-inspect-menu
- - title: Avatar context menu
+ - title: Avatar Context Menu
path: /players/avatar-context-menu
- - title: Disable default UI
- path: /players/disable-ui
+ - title: Disabling Default UI
+ path: /players/disabling-ui
- title: Input
path: /input/
section:
- title: Overview
path: /input/
- - title: Mouse and keyboard
+ - title: Mouse and Keyboard
path: /input/mouse-and-keyboard
- title: Mobile
path: /input/mobile
@@ -348,100 +348,100 @@ navigation:
section:
- title: Overview
path: /sound/
- - title: Audio assets
+ - title: Audio Assets
path: /sound/assets
- - title: Sound objects
+ - title: Objects
path: /sound/objects
- - title: Sound groups
+ - title: Groups
path: /sound/groups
- - title: Dynamic effects
+ - title: Dynamic Effects
path: /sound/dynamic-effects
- - title: User interface
+ - title: User Interface
path: /ui/
section:
- title: Overview
path: /ui/
- - title: On-screen UI
+ - title: On-Screen UI
path: /ui/on-screen-containers
- - title: In-experience UI
+ - title: In-Experience UI
path: /ui/in-experience-containers
- - title: UI objects
+ - title: UI Objects
section:
- title: Labels
path: /ui/labels
- title: Frames
path: /ui/frames
- - title: Video frames
+ - title: Video Frames
path: /ui/video-frames
- - title: 2D paths
+ - title: 2D Paths
path: /ui/2D-paths
- title: Interactive
section:
- title: Buttons
path: /ui/buttons
- - title: Text input fields
+ - title: Text Input Fields
path: /ui/text-input
- - title: Proximity prompts
+ - title: Proximity Prompts
path: /ui/proximity-prompts
- - title: UI drag detectors
+ - title: UI Drag Detectors
path: /ui/ui-drag-detectors
- - title: 3D drag detectors
+ - title: 3D Drag Detectors
path: /ui/3D-drag-detectors
- - title: Position and size
- path: /ui/position-and-size
- - title: Layout structures
+ - title: Positioning and Sizing
+ path: /ui/positioning-and-sizing
+ - title: Layout Structures
section:
- - title: List and flex layouts
+ - title: List and Flex Layouts
path: /ui/list-flex-layouts
- - title: Grids and tables
+ - title: Grids and Tables
path: /ui/grid-table-layouts
- - title: Page layouts
+ - title: Page Layouts
path: /ui/page-layouts
- - title: Appearance modifiers
+ - title: Appearance Modifiers
path: /ui/appearance-modifiers
- - title: Size modifiers and constraints
+ - title: Size Modifiers and Constraints
path: /ui/size-modifiers
- - title: UI animation/tweens
+ - title: UI Animation/Tweens
path: /ui/animation
- - title: 9-slice design
+ - title: 9-Slice Design
path: /ui/9-slice
- - title: Rich text markup
+ - title: Rich Text Markup
path: /ui/rich-text
- - title: Text filtering
+ - title: Text Filtering
path: /ui/text-filtering
- title: Animation
path: /animation/
section:
- title: Overview
path: /animation/
- - title: Create animations
+ - title: Creating Animations
section:
- - title: Animation editor
+ - title: Animation Editor
path: /animation/editor
- - title: Animation events
+ - title: Animation Events
path: /animation/events
- - title: Animation capture
+ - title: Animation Capture
path: /animation/capture
- - title: Curve editor
+ - title: Curve Editor
path: /animation/curve-editor
- - title: Inverse kinematics
+ - title: Inverse Kinematics
path: /animation/inverse-kinematics
- - title: Use animations
+ - title: Using Animations
path: /animation/using
- title: Chat
section:
- - title: Voice chat
+ - title: Voice Chat
path: /chat/voice-chat
- - title: Text chat
+ - title: Text Chat
path: /chat/in-experience-text-chat
section:
- title: Overview
path: /chat/in-experience-text-chat
- title: Guidelines
path: /chat/guidelines
- - title: Chat window
+ - title: Chat Window
path: /chat/chat-window
- - title: Bubble chat
+ - title: Bubble Chat
path: /chat/bubble-chat
- title: Examples
path: /chat/examples/simple-custom-frontend-ui
@@ -450,90 +450,90 @@ navigation:
path: /chat/examples/simple-custom-frontend-ui
#- title: Custom System Messages
# path: /chat/examples/custom-system-messages
- - title: Chat tags
+ - title: Chat Tags
path: /chat/examples/group-chat-tags
- - title: Proximity chat
+ - title: Proximity Chat
path: /chat/examples/proximity-chat
- - title: Custom chat commands
+ - title: Custom Chat Commands
path: /chat/examples/custom-text-chat-commands
- - title: Legacy chat system
+ - title: Legacy Chat System
path: /chat/legacy/legacy-chat-system
- - title: Performance optimization
+ - title: Performance Optimization
path: /performance-optimization/
section:
- title: Overview
path: /performance-optimization/
- - title: Design for performance
- path: /performance-optimization/design
- - title: Identify issues
- path: /performance-optimization/identify
- - title: Improve performance
- path: /performance-optimization/improve
- - title: Monitor performance
- path: /performance-optimization/monitor
- - title: Cloud services
+ - title: Designing for Performance
+ path: /performance-optimization/designing
+ - title: Identifying Issues
+ path: /performance-optimization/identifying
+ - title: Improving Performance
+ path: /performance-optimization/improving
+ - title: Monitoring Performance
+ path: /performance-optimization/monitoring
+ - title: Cloud Services
path: /cloud-services/data-stores-vs-memory-stores
section:
- - title: Data stores vs memory stores
+ - title: Data Stores vs Memory Stores
path: /cloud-services/data-stores-vs-memory-stores
- - title: Data stores
+ - title: Data Stores
path: /cloud-services/data-stores/
section:
- title: Overview
path: /cloud-services/data-stores/
- - title: Manage data stores
- path: /cloud-services/data-stores/manage-data-stores
- - title: Best practices
+ - title: Managing Data Stores
+ path: /cloud-services/data-stores/managing-data-stores
+ - title: Best Practices
path: /cloud-services/data-stores/best-practices
- - title: Error codes and limits
+ - title: Error Codes and Limits
path: /cloud-services/data-stores/error-codes-and-limits
- title: Observability
path: /cloud-services/data-stores/observability
- - title: Implement player data and purchase systems
+ - title: Implementing Player Data and Purchasing Systems
path: /cloud-services/data-stores/player-data-purchasing
- - title: Memory stores
+ - title: Memory Stores
path: /cloud-services/memory-stores/
section:
- title: Overview
path: /cloud-services/memory-stores/
- - title: Sorted map
+ - title: Sorted Map
path: /cloud-services/memory-stores/sorted-map
- title: Queue
path: /cloud-services/memory-stores/queue
- - title: Hash map
+ - title: Hash Map
path: /cloud-services/memory-stores/hash-map
- title: Observability
path: /cloud-services/memory-stores/observability
- - title: Per-partition limits
+ - title: Per-Partition Limits
path: /cloud-services/memory-stores/per-partition-limits
- - title: Best practices
+ - title: Best Practices
path: /cloud-services/memory-stores/best-practices
- - title: Cross-server communication
+ - title: Cross-Server Messaging
path: /cloud-services/cross-server-messaging
- - title: Roblox for Unity developers
+ - title: Roblox for Unity Developers
path: /unity
- - title: Roblox for Unreal developers
+ - title: Roblox for Unreal Developers
path: /unreal
- heading: Distribute
- title: Overview
path: /production/
- - title: Roblox user base
+ - title: Roblox User Base
path: /production/roblox-user-base
- title: Discovery
path: /discovery
- - title: Publish
+ - title: Publishing
section:
- title: Experiences
- path: /production/publishing/publish-experiences-and-places
+ path: /production/publishing/publishing-experiences-and-places
section:
- title: Overview
- path: /production/publishing/publish-experiences-and-places
- - title: Genres
+ path: /production/publishing/publishing-experiences-and-places
+ - title: Experience Genres
path: /production/publishing/experience-genres
- - title: Icons
+ - title: Experience Icons
path: /production/publishing/experience-icons
- - title: Thumbnails
+ - title: Experience Thumbnails
path: /production/publishing/thumbnails
- title: Badges
path: /production/publishing/badges
@@ -548,28 +548,28 @@ navigation:
section:
- title: Creator Store
path: /production/creator-store
- - title: Sell on the Creator Store
- path: /production/sell-on-creator-store
+ - title: Selling on the Creator Store
+ path: /production/selling-on-creator-store
- title: Guidelines
path: /production/promotion/content-maturity
section:
- - title: Content maturity
+ - title: Content Maturity
path: /production/promotion/content-maturity
- title: About GDPR and CCPA
path: /production/publishing/about-GDPR-and-CCPA
- - title: DMCA guidelines
+ - title: DMCA Guidelines
path: /production/publishing/dmca-guidelines
- - title: Accessibility guidelines
+ - title: Accessibility Guidelines
path: /production/publishing/accessibility
- - title: Console guidelines
+ - title: Console Guidelines
path: /production/publishing/console-guidelines
- - title: VR guidelines
+ - title: VR Guidelines
path: /production/publishing/vr-guidelines
- - title: Account verification
+ - title: Account Verification
path: /production/publishing/account-verification
- title: Rights Manager
path: /production/publishing/rights-manager
- - title: AI data sharing
+ - title: AI Data Sharing
path: /ai-data-sharing
- title: Promotion
path: /production/promotion/
@@ -577,103 +577,103 @@ navigation:
- title: Overview
path: /production/promotion/
- title: Advertising
- path: /production/promotion/advertise-on-roblox
+ path: /production/promotion/advertising-on-roblox
section:
- title: Overview
- path: /production/promotion/advertise-on-roblox
+ path: /production/promotion/advertising-on-roblox
- title: Ads Manager
path: /production/promotion/ads-manager
- - title: Search ads
+ - title: Search Ads
path: /production/promotion/search-ads
- - title: Sponsor items
- path: /production/promotion/sponsor-items
- - title: Comply with advertising standards
- path: /production/promotion/comply-with-advertising-standards
- - title: Events and updates
+ - title: Sponsoring Items
+ path: /production/promotion/sponsoring-items
+ - title: Complying with Advertising Standards
+ path: /production/promotion/complying-with-advertising-standards
+ - title: Events and Updates
path: /production/promotion/experience-events
- - title: Experience notifications
+ - title: Experience Notifications
path: /production/promotion/experience-notifications
- - title: Social media links
+ - title: Social Media Links
path: /production/promotion/social-media-links
- - title: Player invite prompts
+ - title: Player Invite Prompts
path: /production/promotion/invite-prompts
- - title: Friend invite reward system
+ - title: Friend Invite Reward System
path: /production/promotion/referral-system
- - title: Nominate for the Discover page
- path: /production/promotion/nominate-for-the-discover-page
- - title: Get featured on Roblox‑owned channels
- path: /production/promotion/get-featured-on-roblox-owned-channels
- - title: Deep links
- path: /production/promotion/deeplinks
+ - title: Nominating for the Discover Page
+ path: /production/promotion/nominating-for-the-discover-page
+ - title: Getting Featured on Roblox‑Owned Channels
+ path: /production/promotion/getting-featured-on-roblox-owned-channels
+ - title: Deep Linking
+ path: /production/promotion/deeplinking
- title: Monetization
path: /production/monetization/
section:
- title: Overview
path: /production/monetization/
- title: Earning on Roblox
- path: /production/earn-on-roblox
+ path: /production/earning-on-roblox
- title: Products
section:
- - title: Immersive ads
+ - title: Immersive Ads
path: /production/monetization/immersive-ads
- title: Subscriptions
path: /production/monetization/subscriptions
- title: Passes
path: /production/monetization/game-passes
- - title: Developer products
+ - title: Developer Products
path: /production/monetization/developer-products
- - title: Price optimization
+ - title: Price Optimization
path: /production/monetization/price-optimization
- - title: Avatar items
+ - title: Avatar Items
path: /production/monetization/avatar-items
- - title: Avatar creation tokens
+ - title: Avatar Creation Tokens
path: /production/monetization/avatar-creation-token
- - title: Engagement-based payouts
+ - title: Engagement-Based Payouts
path: /production/monetization/engagement-based-payouts
- - title: Paid access in Robux
+ - title: Paid Access in Robux
path: /production/monetization/paid-access-robux
- - title: Paid access in local currency
+ - title: Paid Access in Local Currency
path: /production/monetization/paid-access-local-currency
- - title: Private servers
+ - title: Private Servers
path: /production/monetization/private-servers
- title: Resources
section:
- - title: Build your business
+ - title: Building Your Business
path: /production/monetization/business-resources
- - title: Randomized virtual items policy
+ - title: Randomized Virtual Items Policy
path: /production/monetization/randomized-virtual-items-policy
- title: Localization
path: /production/localization/
section:
- title: Overview
path: /production/localization/
- - title: Automatic translations
+ - title: Automatic Translations
path: /production/localization/automatic-translations
- - title: Custom translations
+ - title: Custom Translations
path: /production/localization/custom-translations
section:
- title: Overview
path: /production/localization/custom-translations
- - title: Manually edit localization table
+ - title: Manually Editing Localization Table
path: /production/localization/manual-translations
- - title: Translate dynamic content
- path: /production/localization/translate-dynamic-content
- - title: Localize with scripting
- path: /production/localization/localize-with-scripting
- - title: Work with translators
- path: /production/localization/work-with-translators
- - title: Language codes
+ - title: Translating Dynamic Content
+ path: /production/localization/translating-dynamic-content
+ - title: Localizing with Scripting
+ path: /production/localization/localizing-with-scripting
+ - title: Working With Translators
+ path: /production/localization/working-with-translators
+ - title: Language Codes
path: /production/localization/language-codes
- title: Analytics
path: /production/analytics/
section:
- title: Overview
path: /production/analytics/
- - title: Monitor
+ - title: Monitoring
section:
- title: Performance
path: /production/analytics/performance
- - title: Error report
+ - title: Error Report
path: /production/analytics/error-report
- title: Dashboards
path: /production/analytics/analytics-dashboard
@@ -690,20 +690,20 @@ navigation:
path: /production/analytics/audience
- title: Monetization
path: /production/analytics/monetization
- - title: Event types
+ - title: Event Types
path: /production/analytics/event-types
section:
- title: Overview
path: /production/analytics/event-types
- - title: Economy events
+ - title: Economy Events
path: /production/analytics/economy-events
- - title: Funnel events
+ - title: Funnel Events
path: /production/analytics/funnel-events
- - title: Custom events
+ - title: Custom Events
path: /production/analytics/custom-events
- - title: Custom fields
+ - title: Custom Fields
path: /production/analytics/custom-fields
- - heading: For educators
- - title: Go to educator onboarding
+ - heading: For Educators
+ - title: Go to Educator Onboarding
path: /education/educator-onboarding/landing
navigation: /education.yaml
diff --git a/content/common/navigation/engine/resources.yaml b/content/common/navigation/engine/resources.yaml
index 39ff4c65c..f7c6c1cd4 100644
--- a/content/common/navigation/engine/resources.yaml
+++ b/content/common/navigation/engine/resources.yaml
@@ -1,15 +1,15 @@
navigation:
- - heading: Code samples
+ - heading: Code Samples
- title: Overview
path: /samples/
- - heading: Feature packages
+ - heading: Feature Packages
- title: Overview
path: /resources/feature-packages/
- title: Bundles
path: /resources/feature-packages/bundles
- title: Missions
path: /resources/feature-packages/missions
- - heading: Developer modules
+ - heading: Developer Modules
- title: Overview
path: /resources/modules/
- title: Selfie Mode
@@ -34,73 +34,73 @@ navigation:
path: /resources/modules/social-interactions
- title: Event Sequencer
path: /resources/modules/event-sequencer
- - heading: Scripting libraries
+ - heading: Scripting Libraries
- title: Overview
path: /resources/scripting-libraries
- - heading: Projects and kits
+ - heading: Projects and Kits
- title: Templates
path: /resources/templates
- - title: Roblox Connect project
+ - title: Roblox Connect Project
path: /resources/roblox-connect
- - title: Plant reference project
+ - title: Plant Reference Project
path: /resources/plant-reference-project
- title: Battle Royale
path: /resources/battle-royale/
section:
- title: Overview
path: /resources/battle-royale/
- - title: Installation and setup
+ - title: Installation and Setup
path: /resources/battle-royale/installation-and-setup
- - title: Run the game
- path: /resources/battle-royale/run-the-game
- - title: Core scripts
+ - title: Running the Game
+ path: /resources/battle-royale/running-the-game
+ - title: Core Scripts
path: /resources/battle-royale/core-scripts
- - title: Pickup system
+ - title: Pickup System
path: /resources/battle-royale/pickup-system
- - title: Building system
+ - title: Building System
path: /resources/battle-royale/building-system
- - title: Minimap system
+ - title: Minimap System
path: /resources/battle-royale/minimap-system
- - title: The storm
+ - title: The Storm
path: /resources/battle-royale/the-storm
- - title: Weapons kit
+ - title: Weapons Kit
path: /resources/weapons-kit
- - title: NPC kit
+ - title: NPC Kit
path: /resources/npc-kit
- - heading: Creator programs
+ - heading: Creator Programs
- title: Overview
path: /creator-programs/
- - title: All programs
+ - title: All Programs
section:
- - title: Brand Developer Directory
- path: /creator-programs/brand-developer-directory
- - title: Community Feedback
- path: /creator-programs/feedback
- - title: Creator Affiliate Pilot
- path: /creator-programs/creator-affiliate
- - title: Creator Events
- path: /creator-programs/creator-events
- - title: Creator Fund
- path: /creator-fund
- - title: Creator Spotlights
- path: /creator-programs/spotlights
- - title: Developer Awards
- path: /creator-programs/developer-awards
- - title: Inspire
- path: /creator-programs/inspire
- - title: Learn & Explore Sort
- path: /creator-programs/learn-explore-sort
- - title: Managed Brand Integrations
- path: /creator-programs/managed-brand-integrations
- - title: Notable Translators
- path: /creator-programs/notable-translators
- - title: Roblox Developers Conference (RDC)
- path: /creator-programs/rdc
- - title: Roblox Innovation Awards
- path: /creator-programs/innovation-awards
- - title: Roblox Research Panel
- path: /creator-programs/research-panel
- - title: Today's Picks on Home
- path: /creator-programs/todays-picks-home
- - title: Today's Picks on Marketplace
- path: /creator-programs/todays-picks-marketplace
+ - title: Brand Developer Directory
+ path: /creator-programs/brand-developer-directory
+ - title: Community Feedback Program
+ path: /creator-programs/feedback
+ - title: Creator Affiliate Pilot Program
+ path: /creator-programs/creator-affiliate
+ - title: Creator Events
+ path: /creator-programs/creator-events
+ - title: Creator Fund
+ path: /creator-fund
+ - title: Creator Spotlights
+ path: /creator-programs/spotlights
+ - title: Developer Awards
+ path: /creator-programs/developer-awards
+ - title: Inspire
+ path: /creator-programs/inspire
+ - title: Learn & Explore Sort
+ path: /creator-programs/learn-explore-sort
+ - title: Managed Brand Integrations
+ path: /creator-programs/managed-brand-integrations
+ - title: Notable Translators Program
+ path: /creator-programs/notable-translators
+ - title: Roblox Developers Conference (RDC)
+ path: /creator-programs/rdc
+ - title: Roblox Innovation Awards
+ path: /creator-programs/innovation-awards
+ - title: Roblox Research Panel
+ path: /creator-programs/research-panel
+ - title: Today's Picks on Home
+ path: /creator-programs/todays-picks-home
+ - title: Today's Picks on Marketplace
+ path: /creator-programs/todays-picks-marketplace
diff --git a/content/common/navigation/engine/studio.yaml b/content/common/navigation/engine/studio.yaml
index 21089bf01..d454772e5 100644
--- a/content/common/navigation/engine/studio.yaml
+++ b/content/common/navigation/engine/studio.yaml
@@ -1,19 +1,19 @@
defaultType: markdown
backTo:
- title: Back to guides
+ title: Back to Guides
path: /platform
navigation:
- heading: Roblox Studio
- - title: Overview
+ - title: Overview # merge working in studio content into here
path: /studio/
- - title: Setup
+ - title: Studio Setup
path: /studio/setup
- - title: Interface
+ - title: Studio Interface
path: /studio/ui-overview
- - heading: Building tools
+ - heading: Building Tools
- title: Align Tool
path: /studio/align-tool
- - title: Pivot tools
+ - title: Pivot Tools
path: /studio/pivot-tools
- title: Terrain Editor
path: /studio/terrain-editor
@@ -23,15 +23,15 @@ navigation:
path: /studio/texture-generator
- title: Rig Builder
path: /studio/rig-builder
- - heading: Scripting tools
+ - heading: Scripting Tools
- title: Script Editor
path: /studio/script-editor
- title: Debugging
path: /studio/debugging
- - heading: Testing tools
- - title: Studio testing modes
+ - heading: Testing Tools
+ - title: Studio Testing Modes
path: /studio/testing-modes
- - title: Output
+ - title: Output Window
path: /studio/output
- title: MicroProfiler
path: /studio/microprofiler/
@@ -40,12 +40,12 @@ navigation:
path: /studio/microprofiler/
- title: Modes
path: /studio/microprofiler/modes
- - title: Task scheduler
+ - title: Task Scheduler
path: /studio/microprofiler/task-scheduler
- - title: Tag reference
+ - title: Tag Reference
path: /studio/microprofiler/tag-table
- title: Walkthrough
- path: /studio/microprofiler/use-microprofiler
+ path: /studio/microprofiler/using-microprofiler
- title: Developer Console
path: /studio/developer-console
section:
@@ -53,35 +53,35 @@ navigation:
path: /studio/developer-console
- title: Script Profiler
path: /studio/optimization/scriptprofiler
- - title: Memory usage
+ - title: Memory Usage
path: /studio/optimization/memory-usage
- - heading: UI reference
- - title: Quick access tools
+ - heading: UI Reference
+ - title: Quick Access Tools
path: /studio/quick-access
- - title: Home tab
+ - title: Home Tab
path: /studio/home-tab
- - title: Model tab
+ - title: Model Tab
path: /studio/model-tab
- - title: Avatar tab
+ - title: Avatar Tab
path: /studio/avatar-tab
- - title: Test tab
+ - title: Test Tab
path: /studio/test-tab
- - title: View tab
+ - title: View Tab
path: /studio/view-tab
- - title: Plugins tab
+ - title: Plugins Tab
path: /studio/plugins-tab
- - title: Script tab
+ - title: Script Tab
path: /studio/script-tab
- - title: Explorer window
+ - title: Explorer Window
path: /studio/explorer
- - title: Properties window
+ - title: Properties Window
path: /studio/properties
- title: Game Settings
path: /studio/game-settings
- - title: Studio shortcuts
+ - title: Studio Shortcuts
path: /studio/shortcuts
- heading: Plugins
- - title: Overview
+ - title: Creating and Publishing
path: /studio/plugins
- - title: Build Studio widgets
- path: /studio/build-studio-widgets
+ - title: Building Studio Widgets
+ path: /studio/building-studio-widgets
diff --git a/content/common/navigation/engine/tutorials-core.yaml b/content/common/navigation/engine/tutorials-core.yaml
index eee93c0ab..777d7a4d7 100644
--- a/content/common/navigation/engine/tutorials-core.yaml
+++ b/content/common/navigation/engine/tutorials-core.yaml
@@ -1,30 +1,30 @@
backTo:
- title: Back to tutorials
+ title: Back to Tutorials
path: /tutorials/
navigation:
- heading: Overview
- - title: Core curriculum
+ - title: Core Curriculum
path: /tutorials/curriculums/core/
- - heading: Build
- - title: Create a project
+ - heading: Building
+ - title: Create a Project
path: /tutorials/curriculums/core/building/create-a-project
- - title: Create an environment with terrain
+ - title: Create an Environment with Terrain
path: /tutorials/curriculums/core/building/create-an-environment-with-terrain
- - title: Greybox a playable area
+ - title: Greybox a Playable Area
path: /tutorials/curriculums/core/building/greybox-a-playable-area
- - heading: Script
- - title: Create a coin collection mechanic
+ - heading: Scripting
+ - title: Create a Coin Collection Mechanic
path: /tutorials/curriculums/core/scripting/script-game-behavior
- - title: Record and display player data
+ - title: Record and Display Player Data
path: /tutorials/curriculums/core/scripting/record-and-display-player-data
- - title: Create player hazards
+ - title: Create Player Hazards
path: /tutorials/curriculums/core/scripting/create-player-hazards
- - title: Script an upgrade button
+ - title: Script an Upgrade Button
path: /tutorials/curriculums/core/scripting/script-an-upgrade-button
- heading: Polish
- - title: Create basic visual effects
+ - title: Create Basic Visual Effects
path: /tutorials/curriculums/core/building/create-basic-visual-effects
- - title: Customize global lighting
+ - title: Customize Global Lighting
path: /tutorials/curriculums/core/building/customize-global-lighting
- - title: Apply polished assets
+ - title: Apply Polished Assets
path: /tutorials/curriculums/core/building/apply-polished-assets
diff --git a/content/common/navigation/engine/tutorials-ea.yaml b/content/common/navigation/engine/tutorials-ea.yaml
index 57ee5a3a4..877d1feec 100644
--- a/content/common/navigation/engine/tutorials-ea.yaml
+++ b/content/common/navigation/engine/tutorials-ea.yaml
@@ -1,17 +1,17 @@
backTo:
- title: Back to tutorials
+ title: Back to Tutorials
path: /tutorials/
navigation:
- - heading: Environmental art curriculum
+ - heading: Environmental Art Curriculum
- title: Overview
path: /tutorials/curriculums/environmental-art/
- - title: Greybox your environment
+ - title: Greybox Your Environment
path: /tutorials/curriculums/environmental-art/greybox-your-environment
- - title: Develop polished assets
+ - title: Develop Polished Assets
path: /tutorials/curriculums/environmental-art/develop-polished-assets
- - title: Assemble an asset library
+ - title: Assemble an Asset Library
path: /tutorials/curriculums/environmental-art/assemble-an-asset-library
- - title: Construct your world
+ - title: Construct Your World
path: /tutorials/curriculums/environmental-art/construct-your-world
- - title: Optimize your experience
+ - title: Optimize Your Experience
path: /tutorials/curriculums/environmental-art/optimize-your-experience
diff --git a/content/common/navigation/engine/tutorials-fundamentals.yaml b/content/common/navigation/engine/tutorials-fundamentals.yaml
index c08196f83..0779a2abc 100644
--- a/content/common/navigation/engine/tutorials-fundamentals.yaml
+++ b/content/common/navigation/engine/tutorials-fundamentals.yaml
@@ -1,79 +1,79 @@
backTo:
- title: Back to guides
+ title: Back to Guides
path: /platform/
navigation:
- - heading: Coding fundamentals
+ - heading: Coding Fundamentals
- title: Overview
path: /tutorials/fundamentals/coding-1/coding-fundamentals
- - title: Variables & objects
+ - title: Variables & Objects
path: /tutorials/fundamentals/coding-1/landing
section:
- - title: Create a script
- path: /tutorials/fundamentals/coding-1/create-a-script
- - title: Object properties
+ - title: Creating a Script
+ path: /tutorials/fundamentals/coding-1/creating-a-script
+ - title: Object Properties
path: /tutorials/fundamentals/coding-1/object-properties
- - title: Parents and children
+ - title: Parents and Children
path: /tutorials/fundamentals/coding-1/parents-and-children
- - title: Functions and events
+ - title: Functions and Events
path: /tutorials/fundamentals/coding-2/functions-and-events
section:
- - title: Code a function
- path: /tutorials/fundamentals/coding-2/code-a-function
- - title: Use information with parameters
- path: /tutorials/fundamentals/coding-2/use-parameters-and-events
- - title: Parameters practice - buttons
+ - title: Coding a Function
+ path: /tutorials/fundamentals/coding-2/coding-a-function
+ - title: Using Information with Parameters
+ path: /tutorials/fundamentals/coding-2/using-parameters-and-events
+ - title: Parameters Practice - Buttons
path: /tutorials/fundamentals/coding-2/parameters-practice-buttons
- - title: Multiple parameters and arguments
+ - title: Multiple Parameters and Arguments
path: /tutorials/fundamentals/coding-2/multiple-parameters-and-arguments
- title: Conditionals
path: /tutorials/fundamentals/coding-3/landing
section:
- - title: Intro to if statements
+ - title: Intro to If Statements
path: /tutorials/fundamentals/coding-3/intro-to-if-statements
- - title: If/then practice - traps
+ - title: If/then Practice - Traps
path: /tutorials/fundamentals/coding-3/traps-with-if-statements
- - title: If/then practice - power ups
+ - title: If/then Practice - Power ups
path: /tutorials/fundamentals/coding-3/powerups-with-if-statements
- - title: Multiple conditions with else/if
+ - title: Multiple Conditions with Else/If
path: /tutorials/fundamentals/coding-3/multiple-conditions
- - title: Else/if practice - giving points
- path: /tutorials/fundamentals/coding-3/give-points
+ - title: Else/If Practice - Giving Points
+ path: /tutorials/fundamentals/coding-3/giving-points
- title: Loops
path: /tutorials/fundamentals/coding-4/landing
section:
- - title: Repeat code with while loops
- path: /tutorials/fundamentals/coding-4/repeat-code-with-while-loops
- - title: Intro to for loops
+ - title: Repeating Code with while Loops
+ path: /tutorials/fundamentals/coding-4/repeating-code-with-while-loops
+ - title: Intro to For Loops
path: /tutorials/fundamentals/coding-4/intro-to-for-loops
- - title: Glow lights with for loops
+ - title: Glowing Lights with For Loops
path: /tutorials/fundamentals/coding-4/glow-lights-with-for-loops
- - title: Timed bridge for loops
- path: /tutorials/fundamentals/coding-4/create-a-timed-bridge
- - title: Nest loops
+ - title: Timed Bridge For Loops
+ path: /tutorials/fundamentals/coding-4/creating-a-timed-bridge
+ - title: Nesting Loops
path: /tutorials/fundamentals/coding-4/nested-loops
- - title: Dictionaries and arrays
+ - title: Dictionaries and Arrays
path: /tutorials/fundamentals/coding-5/landing
section:
- - title: Intro to arrays
+ - title: Intro to Arrays
path: /tutorials/fundamentals/coding-5/intro-to-arrays
- - title: Loop through arrays
+ - title: Looping through Arrays
path: /tutorials/fundamentals/coding-5/loops-and-arrays
- - title: Make changes to arrays
- path: /tutorials/fundamentals/coding-5/make-changes-to-arrays
- - title: Intro to dictionaries
+ - title: Making Changes to Arrays
+ path: /tutorials/fundamentals/coding-5/making-changes-to-arrays
+ - title: Intro to Dictionaries
path: /tutorials/fundamentals/coding-5/intro-to-dictionaries
- title: Pairs and iPairs
path: /tutorials/fundamentals/coding-5/pairs-and-ipairs
- - title: Return values from tables
- path: /tutorials/fundamentals/coding-5/return-values-from-tables
- - title: Organize code
+ - title: Returning Values From Tables
+ path: /tutorials/fundamentals/coding-5/returning-values-from-tables
+ - title: Organizing Code
path: /tutorials/fundamentals/coding-6/landing
section:
- - title: Intro to module scripts
+ - title: Intro to Module Scripts
path: /tutorials/fundamentals/coding-6/intro-to-module-scripts
- - title: Create with module scripts
- path: /tutorials/fundamentals/coding-6/create-with-module-scripts
- - title: Code abstraction
+ - title: Creating with Module Scripts
+ path: /tutorials/fundamentals/coding-6/creating-with-module-scripts
+ - title: Coding Abstraction
path: /tutorials/fundamentals/coding-6/coding-concept-abstraction
- - title: Code algorithms
+ - title: Coding Algorithms
path: /tutorials/fundamentals/coding-6/coding-concept-algorithms
diff --git a/content/common/navigation/engine/tutorials-gs.yaml b/content/common/navigation/engine/tutorials-gs.yaml
index 6d5815999..64d06d3a2 100644
--- a/content/common/navigation/engine/tutorials-gs.yaml
+++ b/content/common/navigation/engine/tutorials-gs.yaml
@@ -1,17 +1,17 @@
backTo:
- title: Back to tutorials
+ title: Back to Tutorials
path: /tutorials/
navigation:
- - heading: Gameplay scripting curriculum
+ - heading: Gameplay Scripting Curriculum
- title: Overview
path: /tutorials/curriculums/gameplay-scripting/
- - title: Create teams
- path: /tutorials/curriculums/gameplay-scripting/create-teams
- - title: Spawn and respawn
+ - title: Creating Teams
+ path: /tutorials/curriculums/gameplay-scripting/creating-teams
+ - title: Spawning and Respawning
path: /tutorials/curriculums/gameplay-scripting/spawn-respawn
- - title: Add rounds
- path: /tutorials/curriculums/gameplay-scripting/add-rounds
- - title: Implement blaster behavior
- path: /tutorials/curriculums/gameplay-scripting/implement-blasters
- - title: Detect hits
- path: /tutorials/curriculums/gameplay-scripting/detect-hits
+ - title: Adding Rounds
+ path: /tutorials/curriculums/gameplay-scripting/adding-rounds
+ - title: Implementing Blaster Behavior
+ path: /tutorials/curriculums/gameplay-scripting/implementing-blasters
+ - title: Detecting Hits
+ path: /tutorials/curriculums/gameplay-scripting/detecting-hits
diff --git a/content/common/navigation/engine/tutorials-ui.yaml b/content/common/navigation/engine/tutorials-ui.yaml
index 6097af869..71e6d61b9 100644
--- a/content/common/navigation/engine/tutorials-ui.yaml
+++ b/content/common/navigation/engine/tutorials-ui.yaml
@@ -1,13 +1,13 @@
backTo:
- title: Back to tutorials
+ title: Back to Tutorials
path: /tutorials/
navigation:
- - heading: UI design curriculum
+ - heading: UI Design Curriculum
- title: Overview
path: /tutorials/curriculums/user-interface-design/
- - title: Choose an art style
+ - title: Choose an Art Style
path: /tutorials/curriculums/user-interface-design/choose-an-art-style
- - title: Wireframe your layouts
+ - title: Wireframe Your Layouts
path: /tutorials/curriculums/user-interface-design/wireframe-your-layouts
- - title: Implement designs in Studio
+ - title: Implement Designs in Studio
path: /tutorials/curriculums/user-interface-design/implement-designs-in-studio
diff --git a/content/common/navigation/engine/tutorials.yaml b/content/common/navigation/engine/tutorials.yaml
index b2bde1ef6..4b19ba025 100644
--- a/content/common/navigation/engine/tutorials.yaml
+++ b/content/common/navigation/engine/tutorials.yaml
@@ -1,114 +1,120 @@
navigation:
- - heading: Get started
+ - heading: Get Started
- title: Overview
path: /tutorials/
- - title: Create your first experience
+ - title: Create Your First Experience
path: /tutorials/first-experience/
- - heading: Curriculum paths
+ - heading: Curriculum Paths
- title: Overview
path: /tutorials/curriculums/curriculum-overview
- title: Core
path: /tutorials/curriculums/core/
navigation: /engine/tutorials-core.yaml
- - title: Environmental art
+ - title: Environmental Art
path: /tutorials/curriculums/environmental-art/
navigation: /engine/tutorials-ea.yaml
- - title: Gameplay scripting
+ - title: Gameplay Scripting
path: /tutorials/curriculums/gameplay-scripting/
navigation: /engine/tutorials-gs.yaml
- - title: User interface design
+ - title: User Interface Design
path: /tutorials/curriculums/user-interface-design/
navigation: /engine/tutorials-ui.yaml
- - heading: Use case tutorials
+ - heading: Use Case Tutorials
- title: Overview
path: /tutorials/use-case-tutorials/use-case-tutorial-overview
- title: Modeling
section:
- - title: Neon signs
- path: /tutorials/use-case-tutorials/modeling/create-neon-signs
- - title: Modular environments
- path: /tutorials/use-case-tutorials/modeling/assemble-modular-environments
- - title: User interfaces
+ - title: Creating Neon Signs
+ path: /tutorials/use-case-tutorials/modeling/creating-neon-signs
+ - title: Assembling Modular Environments
+ path: /tutorials/use-case-tutorials/modeling/assembling-modular-environments
+ - title: User Interfaces
section:
- - title: HUD meters
- path: /tutorials/use-case-tutorials/ui/create-hud-meters
- - title: Interactive UI
+ - title: Creating HUD Meters
+ path: /tutorials/use-case-tutorials/ui/creating-hud-meters
+ - title: Making UI Interactive
path: /tutorials/use-case-tutorials/ui/interactive-ui
- - title: Proximity prompts
+ - title: Creating Proximity Prompts
path: /tutorials/use-case-tutorials/ui/proximity-prompts
- - title: Score bars
- path: /tutorials/use-case-tutorials/ui/create-a-score-bar
+ - title: Creating Score Bars
+ path: /tutorials/use-case-tutorials/ui/creating-a-score-bar
- title: Audio
section:
- - title: Background music
- path: /tutorials/use-case-tutorials/audio/play-background-music
- - title: Positional sounds
+ - title: Playing Background Music
+ path: /tutorials/use-case-tutorials/audio/playing-background-music
+ - title: Playing Positional Sounds
path: /tutorials/use-case-tutorials/audio/in-game-sounds
- title: Lighting
section:
- - title: Indoor environments
- path: /tutorials/use-case-tutorials/lighting/enhance-indoor-environments
- - title: Outdoor environments
- path: /tutorials/use-case-tutorials/lighting/enhance-outdoor-environments-with-future-lighting
+ - title: Enhancing Indoor Environments
+ path: /tutorials/use-case-tutorials/lighting/enhancing-indoor-environments
+ - title: Enhancing Outdoor Environments
+ path: /tutorials/use-case-tutorials/lighting/enhancing-outdoor-environments-with-future-lighting
- title: VFX
section:
- - title: Laser beams
+ - title: Creating Laser Beams
path: /tutorials/use-case-tutorials/vfx/laser-traps-with-beams
- - title: Waterfalls
- path: /tutorials/use-case-tutorials/vfx/create-waterfalls
- - title: Volcanoes
- path: /tutorials/use-case-tutorials/vfx/create-volcanoes
- - title: Explosions
- path: /tutorials/use-case-tutorials/vfx/use-particles-for-explosions
+ - title: Creating Waterfalls
+ path: /tutorials/use-case-tutorials/vfx/creating-waterfalls
+ - title: Creating Volcanoes
+ path: /tutorials/use-case-tutorials/vfx/creating-volcanoes
+ - title: Creating Explosions
+ path: /tutorials/use-case-tutorials/vfx/using-particles-for-explosions
- title: Physics
section:
- - title: Moving objects
- path: /tutorials/use-case-tutorials/physics/create-moving-objects
- - title: Spinning objects
- path: /tutorials/use-case-tutorials/physics/create-spinning-objects
+ - title: Creating Moving Objects
+ path: /tutorials/use-case-tutorials/physics/creating-moving-objects
+ - title: Creating Spinning Objects
+ path: /tutorials/use-case-tutorials/physics/creating-spinning-objects
+ - title: Creating Elevators
+ path: /tutorials/use-case-tutorials/physics/creating-elevators
+ - title: Building Hinged Doors
+ path: /tutorials/use-case-tutorials/physics/building-a-hinged-door
+ - title: Building Ferris Wheels
+ path: /tutorials/use-case-tutorials/physics/building-a-ferris-wheel
- title: Animation
section:
- title: In Studio
section:
- - title: Create character animations
- path: /tutorials/use-case-tutorials/animation/create-an-animation
- - title: Play character animations
- path: /tutorials/use-case-tutorials/animation/play-character-animations
+ - title: Creating Character Animations
+ path: /tutorials/use-case-tutorials/animation/creating-an-animation
+ - title: Playing Character Animations
+ path: /tutorials/use-case-tutorials/animation/playing-character-animations
- title: In Blender
section:
- - title: Rig simple meshes
- path: /art/modeling/rig-a-simple-mesh
- - title: Skin simple meshes
- path: /art/modeling/skin-a-simple-mesh
- - title: Rig humanoid models
- path: /art/modeling/rig-a-humanoid-model
- - title: Skin humanoid models
- path: /art/modeling/skin-a-humanoid-model
+ - title: Rigging Simple Meshes
+ path: /art/modeling/rigging-a-simple-mesh
+ - title: Skinning Simple Meshes
+ path: /art/modeling/skinning-a-simple-mesh
+ - title: Rigging Humanoid Models
+ path: /art/modeling/rigging-a-humanoid-model
+ - title: Skinning Humanoid Models
+ path: /art/modeling/skinning-a-humanoid-model
- title: Scripting
section:
- - title: Basic gameplay
+ - title: Basic Gameplay
section:
- - title: Introduction to scripting
+ - title: Introduction to Scripting
path: /tutorials/use-case-tutorials/scripting/basic-scripting/intro-to-scripting
- - title: Deadly lava
+ - title: Deadly Lava
path: /tutorials/use-case-tutorials/scripting/basic-scripting/deadly-lava
- - title: Fading trap
+ - title: Fading Trap
path: /tutorials/use-case-tutorials/scripting/basic-scripting/fading-trap
- - title: Score points
- path: /tutorials/use-case-tutorials/scripting/basic-scripting/score-points
- - title: Intermediate gameplay
+ - title: Scoring Points
+ path: /tutorials/use-case-tutorials/scripting/basic-scripting/scoring-points
+ - title: Intermediate Gameplay
section:
- - title: Health pickups
- path: /tutorials/use-case-tutorials/scripting/intermediate-scripting/create-a-health-pickup
- - title: Save data
- path: /tutorials/use-case-tutorials/scripting/intermediate-scripting/save-data
- - title: Player tools
- path: /tutorials/use-case-tutorials/scripting/intermediate-scripting/create-player-tools
- - title: Hit detection with lasers
+ - title: Creating Health Pickups
+ path: /tutorials/use-case-tutorials/scripting/intermediate-scripting/creating-a-health-pickup
+ - title: Saving Data
+ path: /tutorials/use-case-tutorials/scripting/intermediate-scripting/saving-data
+ - title: Creating Player Tools
+ path: /tutorials/use-case-tutorials/scripting/intermediate-scripting/creating-player-tools
+ - title: Hit Detection with Lasers
path: /tutorials/use-case-tutorials/scripting/intermediate-scripting/hit-detection-with-lasers
- - title: Input and camera
+ - title: Input and Camera
section:
- - title: Control the user's camera
- path: /tutorials/use-case-tutorials/input-and-camera/control-the-users-camera
- - title: Detect user input
- path: /tutorials/use-case-tutorials/input-and-camera/detect-user-input
+ - title: Controlling the User's Camera
+ path: /tutorials/use-case-tutorials/input-and-camera/controlling-the-users-camera
+ - title: Detecting User Input
+ path: /tutorials/use-case-tutorials/input-and-camera/detecting-user-input
diff --git a/content/en-us/ai-data-sharing.md b/content/en-us/ai-data-sharing.md
index 1273782ba..f247b8b54 100644
--- a/content/en-us/ai-data-sharing.md
+++ b/content/en-us/ai-data-sharing.md
@@ -1,5 +1,5 @@
---
-title: AI data sharing
+title: AI Data Sharing
description: Understand AI data sharing policies and how to update your preferences.
---
@@ -20,7 +20,7 @@ You can change your default choice at any time and override it as desired whenev
Because they're distributed with the intent of others using them, **free** [Creator Store](production/creator-store.md) assets are shared by default, with no ability to disable sharing.
-## Manage data sharing preferences
+## Managing Data Sharing Preferences
To set your global data sharing preferences:
@@ -29,7 +29,7 @@ To set your global data sharing preferences:
1. Enable or disable **Make sharing data the default option when publishing experiences**.
1. (Optional) Choose individual experiences, avatar items, and paid Creator Store assets to share or not share.
-## How Roblox uses data
+## How Roblox Uses Data
All data shared with Roblox is for AI-enhancement purposes only and is not shared with third parties. Data is processed and stored in accordance with strict security protocols, contains no personal information, is split into tokens (small snippets) for further anonymization, and is retained for only as long as it is beneficial for model improvement. Roblox regularly reviews and purges shared data.
@@ -39,4 +39,4 @@ If you share something and then later stop sharing it, Roblox will remove it fro
Previously, Roblox launched a program that allowed you to share your scripts with Roblox, a public Luau dataset, or both. Roblox no longer uses the script data that was shared only with Roblox. Instead, you now decide if you want to share entire experiences, including their scripts.
-The Luau public dataset is not affected by this change. You can set your sharing preferences on the Creator Hub in the **Public Luau** tab. For more details on the public dataset, see [Empower Luau creation](https://create.roblox.com/data-collection).
+The Luau public dataset is not affected by this change. You can set your sharing preferences on the Creator Hub in the **Public Luau** tab. For more details on the public dataset, see [Empower Luau Creation](https://create.roblox.com/data-collection).
diff --git a/content/en-us/animation/capture.md b/content/en-us/animation/capture.md
index d0216826c..e61b3ed18 100644
--- a/content/en-us/animation/capture.md
+++ b/content/en-us/animation/capture.md
@@ -1,5 +1,5 @@
---
-title: Animation capture
+title: Animation Capture
description: Animation Capture in the Animation Editor allows you to generate high-quality, realistic animations for faces and bodies.
---
@@ -22,7 +22,7 @@ With the ability to record up to 60-second animations, you can quickly provide b
-### Record face animations
+### Recording Face Animations
Before you begin to record your face, ensure that you're in a well lit room close enough to your camera so that your face is in the center of your camera's recording frame. This increases your camera's ability to distinguish you from your surroundings so that you can accurately puppeteer your avatar and create high-quality animations.
@@ -70,7 +70,7 @@ To record your face and create an animation:
-After you finish your recording, you can [fine-tune](../animation/editor.md#keyframes) the keyframes, [save](../animation/editor.md#save-an-animation) your animation, then [export](../animation/editor.md#export-an-animation) it to use across all of your experiences.
+After you finish your recording, you can [fine-tune](../animation/editor.md#keyframes) the keyframes, [save](../animation/editor.md#saving-an-animation) your animation, then [export](../animation/editor.md#exporting-an-animation) it to use across all of your experiences.
## Body
@@ -80,7 +80,7 @@ The **Animation Capture - Body** allows you to quickly generate high-quality, re
-### Import videos for animation
+### Importing Videos for Animation
Before you import a video to the Animation Editor, ensure the **.mp4** or **.mov** file meets the following requirements:
@@ -115,4 +115,4 @@ To import a video to create an animation:
6. Click the **Choose Video** button.
7. Select the video you want to import from your local machine, then click the **Open** button. After about a minute, keyframes that correspond to movement in your video display within the timeline.
-After your import is successful, you can [save](../animation/editor.md#save-an-animation) and [export](../animation/editor.md#export-an-animation) your animation to use across all of your experiences.
+After your import is successful, you can [save](../animation/editor.md#saving-an-animation) and [export](../animation/editor.md#exporting-an-animation) your animation to use across all of your experiences.
diff --git a/content/en-us/animation/curve-editor.md b/content/en-us/animation/curve-editor.md
index 5cdfd7202..8cb199ace 100644
--- a/content/en-us/animation/curve-editor.md
+++ b/content/en-us/animation/curve-editor.md
@@ -28,13 +28,13 @@ While the Animation Editor displays a rig's orientation as three separate X, Y,
However, the Curve Editor allows you to work with Euler angles either globally or on a per-part basis, which allows you to define independent tracks for the X, Y and Z angles. This provides additional levels of control to make your animations more fluid and realistic.
-## Set rotation type
+## Setting Rotation Type
It's important to verify your rotation type **before you open the Curve Editor** because once you convert quaternions to Euler angle tracks, it's impossible to convert them back into quaternions.
-The Animation Editor automatically converts quaternions to Euler angles when you [open the Curve Editor](#open-the-curve-editor), but you can keep quaternion values by setting the Animation Editor's rotation type to quaternions.
+The Animation Editor automatically converts quaternions to Euler angles when you [open the Curve Editor](#opening-the-curve-editor), but you can keep quaternion values by setting the Animation Editor's rotation type to quaternions.
To set rotation type:
@@ -47,14 +47,14 @@ To set rotation type:
2. Hover over **Default Rotation Type**, then select either **Euler Angles** or **Quaternions**. Your rotation type sets to your choice and becomes the default rotation type for future projects.
-## Open the Curve Editor
+## Opening the Curve Editor
You can switch the Animation Editor's timeline between the Dope Sheet Editor and the Curve Editor at any time.
To open the Curve Editor:
-1. [Open the Animation Editor](../animation/editor.md#open-the-animation-editor).
-2. (Optional) If you want to keep your orientation keyframe quaternion values, [set the rotation type](#set-rotation-type) to **quaternions**.
+1. [Open the Animation Editor](../animation/editor.md#opening-the-animation-editor).
+2. (Optional) If you want to keep your orientation keyframe quaternion values, [set the rotation type](#setting-rotation-type) to **quaternions**.
3. In the top-left corner of the **timeline**, click the **Curve Animation** icon. A pop-up window displays to confirm that your `Class.KeyframeSequence` clip will convert to a new CurveAnimation clip.
- 2. If you [set the rotation](#set-rotation-type) type to quaternions, the conversion to curves preserves the quaternions and the animation remains the same.
+ 2. If you [set the rotation](#setting-rotation-type) type to quaternions, the conversion to curves preserves the quaternions and the animation remains the same.
@@ -98,9 +98,9 @@ Interpolation is Studio's process of "filling in" position and orientation value
For **Euler angle curves**, the height of each keyframe represents its orientation value over time. For example, the highest keyframe represents a rotation of about 120 degrees around the X axis, and the lowest keyframe represents a rotation of about -10 degrees. For **quaternion curves**, each segment represents orientation changing between keyframes, and the line displays the interpolation between them. In the previous example, the animation starts from orientation A, then interpolates linearly to orientation B. Once it is at B, the interpolation starts again from orientation B to orientation C, then continues with this pattern until the rig reaches its final orientation.
-You can modify how the Curve Editor handles interpolation for both Euler angle curves and quaternion curves by [setting tangents](#set-tangents), [changing the interpolation mode](#change-interpolation-mode), or by [generating interpolation curves](#generate-interpolation-curves) between two or more keyframes.
+You can modify how the Curve Editor handles interpolation for both Euler angle curves and quaternion curves by [setting tangents](#setting-tangents), [changing the interpolation mode](#changing-interpolation-mode), or by [generating interpolation curves](#generating-interpolation-curves) between two or more keyframes.
-### Set tangents
+### Setting Tangents
The Curve Editor provides **tangents**, or handles, that let you quickly adjust the interpolation either before or after a keyframe. Euler angle curves have a tangent both before and after the keyframe while quaternion curves have one tangent at the beginning and another at the end of a segment. The initial tangent controls the interpolation after the keyframe and the secondary tangent controls the interpolation before the keyframe. For example:
@@ -136,7 +136,7 @@ To set a tangent:
2. Release the tangent. The interpolation between keyframes adjusts accordingly.
3. (Optional) If you set one tangent and want to align the unset tangent horizontally, right-click the unset tangent, then select **Set Tangent to Zero** from the contextual menu.
-#### Reset tangents
+#### Resetting Tangents
If you ever set a tangent to a new position and the resulting interpolation is undesirable, you can always use Auto-Tangent Mode to clear a tangent's value and reset it back to its default interpolation behavior.
@@ -150,7 +150,7 @@ To reset a tangent:
2. Select **Set Tangent To Zero**. The tangent resets to its default interpolation behavior.
-### Change interpolation mode
+### Changing Interpolation Mode
Interpolation mode is the rate at which an animation moves between different keyframe positions within the animation. There are three interpolation modes available for curve animations:
@@ -168,7 +168,7 @@ To change interpolation mode:
src="../assets/animation/curve-editor/Interpolation-Mode.png"
width="600" />
-### Generate interpolation curves
+### Generating Interpolation Curves
For curve animations, bounce and elastic easing styles are not available as standard interpolations like they are for `Class.KeyframeSequence|KeyframeSequences`. However, when you convert a `Class.KeyframeSequence` to a curve animation, the Animation Editor automatically adds additional keyframes to your animation to keep the animation intact, and you can select two or more keyframes and generate an **interpolation curve** that removes and replaces any of their intermediate keyframes to mimic bounce and elastic easing behavior.
@@ -190,7 +190,7 @@ To generate interpolation curves:
src="../assets/animation/curve-editor/Generate-Curve-Editor.png"
width="400" />
-## Set Euler angles order
+## Setting Euler Angles Order
When you're working with Euler angles, Studio represents the X, Y, and Z axis through three channel values that follow a specific order to move your rig from its starting orientation to its next orientation. Each order is named after the [matrix multiplications](https://en.wikipedia.org/wiki/Matrix_multiplication) to get to the final orientation. For example, an XYZ order (X × Y × Z) means that the rig moves starting on the Z axis, then the Y axis, then the X axis. The Animation Editor defaults to this **XYZ order**, but you can change the order at any time.
diff --git a/content/en-us/animation/editor.md b/content/en-us/animation/editor.md
index 394897d01..e12ee1699 100644
--- a/content/en-us/animation/editor.md
+++ b/content/en-us/animation/editor.md
@@ -7,7 +7,7 @@ The **Animation Editor** plugin allows you to design and publish custom
animations on rigs.
A rig is an object with individual sections connected by joints. You can
-move these joints to [create poses](#create-poses), and
+move these joints to [create poses](#creating-poses), and
the Animation Editor then smoothly animates the rig from pose-to-pose. As
long as all moving parts are connected with
`Class.Motor6D`
@@ -19,7 +19,7 @@ rigs.
-### Media and playback controls
+### Media and Playback Controls
@@ -128,7 +128,7 @@ rigs.
-### Track list
+### Track List
@@ -165,7 +165,7 @@ rigs.
-## Create an animation
+## Creating an Animation
You can only create animations using rigs. If you don't have a rig available, insert a pre-built rig using the [Rig Builder](../studio/rig-builder.md) plugin. The pre-built rigs have all of the basic parts and mechanisms to
build a character animation.
@@ -187,12 +187,12 @@ If you have a rig, you can create a new animation for it using the following ste
click the **Create** button. The Animation Editor window displays
the [media and playback controls](#media-and-playback-controls), [timeline](#timeline), and [track list](#track-list).
-From here, you can begin [creating poses](#create-poses)
+From here, you can begin [creating poses](#creating-poses)
for your rig and modifying the animation settings, such as [looping
-the animation](#loop-an-animation) or [setting its
-priority](#set-a-priority).
+the animation](#looping-an-animation) or [setting its
+priority](#setting-a-priority).
-### Create poses
+### Creating Poses
An animation consists of different **poses**, or specific positions and orientations of `Class.Bone` or `Class.MeshPart` objects within a rig. You can create poses by moving or rotating bones or meshes, such as the rig's hands, feet, or torso. After you create multiple poses on different positions of the timeline, the Animation Editor runs between them with your [easing settings](#easing) to smoothly animate the rig from pose-to-pose.
@@ -249,11 +249,11 @@ To create a pose:
## Keyframes
-Once you [create basic poses](#create-poses) for a rig,
+Once you [create basic poses](#creating-poses) for a rig,
fine-tuning individual keyframes can significantly improve the final
animation.
-### Add keyframes
+### Adding Keyframes
Whenever you change a part's position or orientation, a new keyframe
displays on the timeline. You can also add keyframes to a timeline
@@ -286,7 +286,7 @@ To add a keyframe for multiple parts of the rig:
Note that the keyframes insert at the frame position closest to where you click,
not at the position of the scrubber.
-### Move keyframes
+### Moving Keyframes
You can increase or decrease the amount of time between keyframes by moving
either individual keyframes or every keyframe in a frame position.
@@ -315,7 +315,7 @@ To move every keyframe in a frame position:
2. Click-and-drag it to a new frame position.
-### Duplicate keyframes
+### Duplicating Keyframes
You can duplicate either a specific keyframe or multiple keyframes for
multiple parts into a new position in the timeline. This is particularly
@@ -328,24 +328,24 @@ To duplicate one or more keyframes:
1. Move the **scrubber** to a new frame position.
1. Press CtrlV (⌘V). The keyframe(s) paste into the new frame position.
-### Delete keyframes
+### Deleting Keyframes
To delete one or more keyframes, select the keyframe(s), then press
**Delete** or **Backspace**.
-### Optimize keyframes
+### Optimizing Keyframes
Animators can often generate many keyframes during the course of animation, especially when using various animation tools and features. To help reduce the number of unnecessary keyframes and make it easier to animate on the timeline, the Animation Editor provides tools for [automatic](#automatic-optimization) and [on-demand](#on-demand-optimization) keyframe optimization.
-#### Automatic optimization
+#### Automatic Optimization
-The Animation Editor automatically detects and removes unnecessary keyframes when creating [facial animations](../art/characters/facial-animation/animate-heads.md) and when [promoting a keyframe animation to a curve animation](../animation/curve-editor.md#open-the-curve-editor).
+The Animation Editor automatically detects and removes unnecessary keyframes when creating [facial animations](../art/characters/facial-animation/animating-heads.md) and when [promoting a keyframe animation to a curve animation](../animation/curve-editor.md#opening-the-curve-editor).
-If 3 or more consecutive keyframes have the same value in a track, the Animation Editor removes the intermediary keyframes and keeps only the first and last keyframes.
+If 3 or more consecutive keyframes have the same value in a track, the animation editor removes the intermediary keyframes and keeps only the first and last keyframes.
If the track only contains keyframes with default values, such as an `Datatype.CFrame.identity|Identity Cframe`, or a `0` value for a curve animation, the entire track is removed from the animation.
-#### On-demand optimization
+#### On-Demand Optimization
-## Set a priority
+## Setting a Priority
An animation's **priority** (`Enum.AnimationPriority`) dictates when it will play in an
experience. For example, if you play an animation with a higher priority
@@ -512,10 +512,10 @@ To set an animation to a different priority:
1. Hover over **Set Animation Priority**, then choose your desired
priority setting.
-## Save an animation
+## Saving an Animation
When you save an animation, Studio saves it as a
-`Class.KeyframeSequence` object in `Class.ServerStorage` and adds a reference to your rig object. Saving your animation is meant to preserve your animation progress and work. If you intend to use an animation, [export it](#export-an-animation) before referencing the published animation in your experience.
+`Class.KeyframeSequence` object in `Class.ServerStorage` and adds a reference to your rig object. Saving your animation is meant to preserve your animation progress and work. If you intend to use an animation, [export it](#exporting-an-animation) before referencing the published animation in your experience.
To save an animation:
@@ -531,7 +531,7 @@ To save an animation:
-### Access local data
+### Accessing Local Data
Roblox saves animation data locally to `Class.ServerStorage` to preserve your animation work. In most cases, your experience shouldn't directly access this local data and instead should reference a published animation.
@@ -551,9 +551,9 @@ local myAnim = ServerStorage.RBX_ANIMSAVES.myRig.myAnimation
Since local data is stored in `Class.ServerStorage`, it doesn't replicate and isn't available from clients. If your clients need access to that data, you must move the `Class.KeyframeSequence` or `Class.CurveAnimation` objects and their descendants to `Class.ReplicatedStorage`.
-### Migrate legacy data
+### Migrating Legacy Data
-The Animation Editor previously stored animation objects directly within a rig, not within `Class.ServerStorage`. If your experience references legacy animation objects in a rig, you can migrate this data to `Class.ServerStorage` using the animation migration tool, allowing you to [access local animation data](#access-local-data) in the same way.
+The Animation Editor previously stored animation objects directly within a rig, not within `Class.ServerStorage`. If your experience references legacy animation objects in a rig, you can migrate this data to `Class.ServerStorage` using the animation migration tool, allowing you to [access local animation data](#accessing-local-data) in the same way.
To migrate your legacy animation data:
@@ -565,11 +565,11 @@ To migrate your legacy animation data:
- **Delete**: Delete animations that are already published or no longer being used.
- **Migrate**: Migrate animations that are still in progress or that haven't yet been published.
- - **Ignore**: Ignore animations if you have yet to update your experience's code to [access local data](#access-local-data) from `Class.ServerStorage`. Once updated, migrate these animations.
+ - **Ignore**: Ignore animations if you have yet to update your experience's code to [access local data](#accessing-local-data) from `Class.ServerStorage`. Once updated, migrate these animations.
3. Press **OK** when complete.
-## Export an animation
+## Exporting an Animation
When you export an animation to Studio, it becomes available for use in
all experiences. This means that you only need to create an animation
@@ -581,7 +581,7 @@ once, then you can reuse it as many times as you want.
To export an animation:
-1. **(Important)** If the animation will be used to [replace a default character animation](../animation/using.md#replace-default-animations) like running or jumping, rename the final keyframe **End** as follows:
+1. **(Important)** If the animation will be used to [replace a default character animation](../animation/using.md#replacing-default-animations) like running or jumping, rename the final keyframe **End** as follows:
1. Right-click the final white keyframe symbol in the upper bar region and choose **Rename Key Keyframe** from the
contextual menu.
@@ -603,8 +603,8 @@ To export an animation:
6. Click the **Submit** button.
Once the upload is complete, you can copy the animation's asset ID
-from the [Toolbox](../projects/assets/toolbox.md) for scripting custom animations or to replace default character animations, as outlined in [Use animations](../animation/using.md).
+from the [Toolbox](../projects/assets/toolbox.md) for scripting custom animations or to replace default character animations, as outlined in [Using Animations](../animation/using.md).
1. Click the **Creations** tab and select **Animations** from the dropdown menu.
2. Right-click the desired animation and select **Copy Asset ID** from the contextual menu.
-3. See [Use animations](../animation/using.md) for instructions on how to play the animation from a script or use the animation as a default character animation.
+3. See [Using Animations](../animation/using.md) for instructions on how to play the animation from a script or use the animation as a default character animation.
diff --git a/content/en-us/animation/events.md b/content/en-us/animation/events.md
index db03eda12..d75b0979b 100644
--- a/content/en-us/animation/events.md
+++ b/content/en-us/animation/events.md
@@ -1,5 +1,5 @@
---
-title: Animation events
+title: Animation Events
description: Animation Events are markers across the timeline span in the Animation Editor.
---
@@ -7,7 +7,7 @@ You can define animation **event markers** across the timeline span and use
`Class.AnimationTrack:GetMarkerReachedSignal()|GetMarkerReachedSignal()`
to detect those markers as the animation runs.
-## Show events
+## Showing Events
By default, the event track isn't visible. To show the event track:
@@ -25,10 +25,10 @@ By default, the event track isn't visible. To show the event track:
src="../assets/animation/animation-editor/Animation-Events-Bar.png"
width="600" />
-You can now [create](#create-events), [detect](#detect-events), and
-[duplicate](#duplicate-events) events.
+You can now [create](#creating-events), [detect](#detecting-events), and
+[duplicate](#duplicating-events) events.
-## Create events
+## Creating Events
Event markers are visual indicators of where an animation event begins. After you create an event
marker, you can move it to any frame position on the timeline.
@@ -59,7 +59,7 @@ To create a new event marker:
src="../assets/animation/animation-editor/Animation-Events-Marker-In-Timeline.png"
width="700" />
-## Detect events
+## Detecting Events
To detect animation events in a `Class.LocalScript`,
connect a function to the `Class.AnimationTrack:GetMarkerReachedSignal()|GetMarkerReachedSignal()` function of `Class.AnimationTrack`. For example:
@@ -94,7 +94,7 @@ marker within the Animation Editor. This lets you pass a custom string
(single value, comma-separated string, etc.) to the `Class.AnimationTrack:GetMarkerReachedSignal()|GetMarkerReachedSignal()` function, as illustrated by the paramString argument in the code example above. This string can then be parsed or converted, if necessary, and used for whatever action you wish to perform in the event.
-## Duplicate events
+## Duplicating Events
As you create events, they become available for usage throughout the whole
animation, not only at the frame position where you originally created them. For
@@ -131,5 +131,5 @@ steps:
-You can also duplicate events by clicking the Edit Animation Events button (just as if you were creating a new event), clicking Add Event in the pop-up menu, selecting the desired event from the dropdown, and clicking Save.
+You can also duplicate events by clicking the Edit Animation Events button (just as if you were creating a new event), clicking Add Event in the pop-up menu, selecting the desired event from the dropdown, and clicking Save.
diff --git a/content/en-us/animation/index.md b/content/en-us/animation/index.md
index 7f0f45a1b..6c382d013 100644
--- a/content/en-us/animation/index.md
+++ b/content/en-us/animation/index.md
@@ -25,10 +25,10 @@ When creating animations, Studio provides the following features to animate effe
- Make realistic animations by posing and animating `Class.Bone|Bones` of a [rigged mesh](../art/modeling/rigging.md).
-## Inverse kinematics
+## Inverse Kinematics
You can use [inverse kinematics](../animation/inverse-kinematics.md) APIs to automatically create animations and poses based on environmental and external events. With inverse kinematics, you can procedurally generate various animation events, such as having a character's head track a bird flying in the sky, or making a character's arm automatically reach for a door knob when nearby.
-## Animation events
+## Animation Events
An [animation event](../animation/events.md) is a specific point in an animation that triggers an action. You can define animation event markers across the Animation Editor timeline span, then use `Class.AnimationTrack:GetMarkerReachedSignal()` to detect those markers as the animation runs to perform specific actions, such as playing a sound effect whenever the user's foot touches the ground.
diff --git a/content/en-us/animation/inverse-kinematics.md b/content/en-us/animation/inverse-kinematics.md
index 003bed92b..213884a25 100644
--- a/content/en-us/animation/inverse-kinematics.md
+++ b/content/en-us/animation/inverse-kinematics.md
@@ -26,9 +26,9 @@ This animation technique can provide solutions to the following examples:
You can use an `Class.IKControl` to procedurally add IK to your character rigs outside of the Animation Editor. Studio allows you to programmatically apply IK to all characters, such as R15, Rthro, and custom imported skinned characters, to create realistic movement and interactions in your experience.
-When adding an `Class.IKControl`, set the [required properties](#required-properties) correctly to avoid unexpected and unnatural animation results. As with all animation, [test your IKControls](#test-ikcontrols) to ensure that you achieve the desired behavior.
+When adding an `Class.IKControl`, set the [required properties](#required-properties) correctly to avoid unexpected and unnatural animation results. As with all animation, [test your IKControls](#testing-ikcontrols) to ensure that you achieve the desired behavior.
-### Required properties
+### Required Properties
When adding a `Class.IKControl` to your character's `Class.Humanoid` or `Class.AnimationController`, you must set the following required properties to enable IK:
@@ -59,7 +59,7 @@ When adding a `Class.IKControl` to your character's `Class.Humanoid` or `Class.A
-### Test IKControls
+### Testing IKControls
You can add and edit `Class.IKControl` programmatically or directly through the Explorer. You can even add and make changes to `Class.IKControl` during a Play test to quickly check how various properties affect a character's movements.
@@ -104,7 +104,7 @@ To quickly test your `Class.IKControl` using an `Class.Attachment` as a target:
-### Add constraints
+### Adding Constraints
You can use `Class.Constraint|Constraints` to restrict how joints can move when reaching its target. Constraints can ensure joints like the elbows and knees bend naturally, or to make the mechanical joints rotate in a specific orientation.
diff --git a/content/en-us/animation/using.md b/content/en-us/animation/using.md
index 7d46553f6..cf844029a 100644
--- a/content/en-us/animation/using.md
+++ b/content/en-us/animation/using.md
@@ -1,11 +1,11 @@
---
-title: Use animations
+title: Using Animations
description: Explains the process of playing animations through scripts, and replacing default animations.
---
-Once you have [created an animation](../animation/editor.md), you need to use scripts to include them in your experience. You can either [play animations manually](#play-animations-from-scripts) from scripts or [replace default animations](#replace-default-animations) for player characters.
+Once you have [created an animation](../animation/editor.md), you need to use scripts to include them in your experience. You can either [play animations manually](#playing-animations-from-scripts) from scripts or [replace default animations](#replacing-default-animations) for player characters.
-## Play animations from scripts
+## Playing Animations From Scripts
In some cases, you'll need to play an animation directly from inside a script, such as when a user presses a certain key or picks up a special item.
@@ -48,7 +48,7 @@ kickAnimationTrack:GetMarkerReachedSignal("KickEnd"):Connect(function(paramStrin
end)
```
-### Non-humanoids
+### Non-Humanoids
To play animations on rigs that do **not** contain a `Class.Humanoid`, you must create an `Class.AnimationController` with a child `Class.Animator`. For example, the following `Class.Script` (assumed to be a direct child of the rig) loads a "kick" animation and plays it.
@@ -78,7 +78,7 @@ kickAnimationTrack:GetMarkerReachedSignal("KickEnd"):Connect(function(paramStrin
end)
```
-## Replace default animations
+## Replacing Default Animations
By default, Roblox player characters include common animations like running,
climbing, swimming, and jumping. You can replace these [default animations](#default-character-animations) with animations from the [catalog](#catalog-animations) or with your own [custom](../animation/editor.md) animations.
@@ -161,10 +161,10 @@ climbing, swimming, and jumping. You can replace these [default animations](#def
Players.PlayerAdded:Connect(onPlayerAdded)
```
-## Set animation weights
+## Setting Animation Weights
You can use multiple animations for the same action. For example, there
-are two `idle` variations in the code sample for [replacing default animations](#replace-default-animations).
+are two `idle` variations in the code sample for [replacing default animations](#replacing-default-animations).
When multiple animations exist for a character state, the **Animate** script
randomly chooses which one to play, but you can influence the outcome by
@@ -181,17 +181,17 @@ In the following example, `idle.Animation1` will play ⅓ of the time the charac
animateScript.idle.Animation2.Weight.Value = 10
```
-## Animation references
+## Animation References
-### Default character animations
+### Default Character Animations
-The following table contains all of the default character animations that you can [replace](#replace-default-animations) with [catalog](#catalog-animations) animations or your own [custom](../animation/editor.md) animations. Note that **Idle** has two variations which you can [weight](#set-animation-weights) to play more or less frequently.
+The following table contains all of the default character animations that you can [replace](#replacing-default-animations) with [catalog](#catalog-animations) animations or your own [custom](../animation/editor.md) animations. Note that **Idle** has two variations which you can [weight](#setting-animation-weights) to play more or less frequently.
-
Character action
-
Animate script reference
+
Character Action
+
Animate Script Reference
**Run**
@@ -235,9 +235,9 @@ The following table contains all of the default character animations that you ca
-### Catalog animations
+### Catalog Animations
-When using avatar animation bundles to [replace default animations](#replace-default-animations), use the following references for the respective asset IDs. For example, if you want to apply the Ninja Jump animation, use `656117878`. Note that **Idle** has multiple variations.
+When using avatar animation bundles to [replace default animations](#replacing-default-animations), use the following references for the respective asset IDs. For example, if you want to apply the Ninja Jump animation, use `656117878`. Note that **Idle** has multiple variations.
diff --git a/content/en-us/art/accessories/automatic-skinning-transfer.md b/content/en-us/art/accessories/automatic-skinning-transfer.md
index bd7b5ba26..79ec87f89 100644
--- a/content/en-us/art/accessories/automatic-skinning-transfer.md
+++ b/content/en-us/art/accessories/automatic-skinning-transfer.md
@@ -1,37 +1,37 @@
---
title: Automatic Skinning Transfer
-description: Automatic Skinning Transfer can create deformation data for character accessories without manual skinning.
+description: Automatic skinning transfer can create deformation data for character accessories without manual skinning.
---
-**Automatic Skinning Transfer** allows layered clothing and facial accessories to deform accurately along with the character model it's attached to without having to skin the accessory itself. Instead of the complex task of manually [rigging and skinning](../../art/modeling/rigging.md) models in 3D modeling software, you can use this feature to transfer or generate skinning data to the accessory. When using Automatic Skinning Transfer, the Roblox Engine creates and applies skinning at runtime.
+**Automatic skinning transfer** allows layered clothing and facial accessories to deform accurately along with the character model it's attached to without having to skin the accessory itself. Instead of the complex task of manually [rigging and skinning](../../art/modeling/rigging.md) models in 3D modeling software, you can use this feature to transfer or generate skinning data to the accessory. When using automatic skinning transfer, the Roblox engine creates and applies skinning at runtime.
-**No skinning of accessory geometry is required to use Automatic Skinning Transfer**. In fact, auto-skinned accessories work well with most characters they're attached to, even if those characters have a different number of joints, bones, or use a different kind of skinning, and the accessories move accurately with characters as they animate.
+**No skinning of accessory geometry is required to use automatic skinning transfer**. In fact, auto-skinned accessories work well with most characters they're attached to, even if those characters have a different number of joints, bones, or use a different kind of skinning, and the accessories move accurately with characters as they animate.
-Skinning is still an important concept for character creation, and if you're creating custom characters, you may want to apply skinning data to the model to create a character with more natural looking poses and animations. For information on how to skin a mesh, see [Skin a humanoid model](../../art/modeling/skin-a-humanoid-model.md).
+Skinning is still an important concept for character creation, and if you're creating custom characters, you may want to apply skinning data to the model to create a character with more natural looking poses and animations. For information on how to skin a mesh, see [Skinning a Humanoid Model](../../art/modeling/skinning-a-humanoid-model.md).
Because the skinning transfer process uses a character's outer cage to help calculate skinning data to apply onto the accessory, it's important that all [layered clothing requirements](../../art/accessories/project-files.md) are still met when creating accessories.
-## Enable Automatic Skinning Transfer
+## Enabling Automatic Skinning Transfer
-To enable the Automatic skinning transfer process, you must enable the `Class.WrapLayer.AutoSkin|AutoSkin` property within the `Class.WrapLayer` instance of the layered `Class.Accessory` you want to automatically skin, then set it to one of the following values:
+To enable the automatic skinning transfer process, you must enable the `Class.WrapLayer.AutoSkin|AutoSkin` property within the `Class.WrapLayer` instance of the layered `Class.Accessory` you want to automatically skin, then set it to one of the following values:
-- `Disabled`: Disables the Automatic Skinning Transfer process. This is the default value.
-- `EnabledOverride`: Enables the Automatic Skinning Transfer process, and allows it to override any existing skinning information found on the accessory at runtime.
-- `EnabledPreserve`: Enables the Automatic Skinning Transfer process, but doesn't allow it to override any existing skinning information found on the accessory at runtime. If there isn't any skinning to maintain, the Automatic Skinning Transfer process automatically creates new skinning data.
+- `Disabled`: Disables the automatic skinning transfer process. This is the default value.
+- `EnabledOverride`: Enables the automatic skinning transfer process, and allows it to override any existing skinning information found on the accessory at runtime.
+- `EnabledPreserve`: Enables the automatic skinning transfer process, but doesn't allow it to override any existing skinning information found on the accessory at runtime. If there isn't any skinning to maintain, the automatic skinning transfer process automatically creates new skinning data.
-When there isn't any skinning data on the accessory, or if you choose to override any existing skinning data associated with the accessory, the Roblox Engine calculates skinning data from the character's geometry and cages, then the new skinning data and rig associated with the accessory drives the accessory's deformations and motions in sync with the source geometry itself.
+When there isn't any skinning data on the accessory, or if you choose to override any existing skinning data associated with the accessory, the Roblox engine calculates skinning data from the character's geometry and cages, then the new skinning data and rig associated with the accessory drives the accessory's deformations and motions in sync with the source geometry itself.
-## Best practices
+## Best Practices
-While Automatic Skinning Transfer often works better than manual skinning, there are some best practices to reduce unexpected behavior with the accessory skinning. Like all modeling processes, constantly test your layered clothing and facial accessories on different avatar types to achieve the results you want.
+While automatic skinning often works better than manual skinning, there are some best practices to reduce unexpected behavior with the accessory skinning. Like all modeling processes, constantly test your layered clothing and facial accessories on different avatar types to achieve the results you want.
-### Modify character cages
+### Modifying Character Cages
-You can modify character cages for the accessories to deform accurately to the expected character surfaces using the Automatic Skinning Transfer. For example, auto-skinning may cause layered clothing to deform based on an incorrect body part because the transfer process is based on the closest distance between the accessory and its inner cage. In the following instance, a beard accessory was modeled using a blocky-type full-body cage. This causes the beard to deform incorrectly because parts of the beard are closer to the character cage's upper chest instead of the chin:
+You can modify character cages for the accessories to deform accurately to the expected character surfaces using the automatic skinning transfer. For example, auto-skinning may cause layered clothing to deform based on an incorrect body part because the transfer process is based on the closest distance between the accessory and its inner cage. In the following instance, a beard accessory was modeled using a blocky-type full-body cage. This causes the beard to deform incorrectly because parts of the beard are closer to the character cage's upper chest instead of the chin:
@@ -45,7 +45,7 @@ To prevent a layered accessory from using skinning data from an undesired area o
-It's important to note that you could also solve the previous example's deformation issue by using a different cage altogether. For example, if you use a more humanoid cage with more space between the chest and the chin, the beard is closest to the head instead of being near the chest or neck area, so the Automatic Skinning Transfer wouldn't transfer skinning data from those regions.
+It's important to note that you could also solve the previous example's deformation issue by using a different cage altogether. For example, if you use a more humanoid cage with more space between the chest and the chin, the beard is closest to the head instead of being near the chest or neck area, so the automatic skinning transfer wouldn't transfer skinning data from those regions.
@@ -57,10 +57,10 @@ By modifying different regions of the character's cage, you can ensure that your
-During the asset creation process, it's important to verify what skinning solution works best for your design by testing your individual assets on multiple models and animations. You can always skin your assets manually and choose to use the Automatic Skinning Transfer later.
+During the asset creation process, it's important to verify what skinning solution works best for your design by testing your individual assets on multiple models and animations. You can always skin your assets manually and choose to use the automatic skinning transfer later.
-### Different accessory types
+### Different Accessory Types
Automatic skinning transfer may not work well for certain accessory types, such as eyelash, hat, and glasses-type accessories. For example, eyelash-type accessories might have issues due to the typical complexity of the character's geometry around the eye region, and hat or glasses-type accessories might introduce deformation in areas that should typically be rigid. In general, those types of accessories should remain rigid, and you shouldn't associate any skinning data with them.
diff --git a/content/en-us/art/accessories/body-scale.md b/content/en-us/art/accessories/body-scale.md
index c19232359..6523b5168 100644
--- a/content/en-us/art/accessories/body-scale.md
+++ b/content/en-us/art/accessories/body-scale.md
@@ -1,5 +1,5 @@
---
-title: Body scale and proportions
+title: Body Scale and Proportions
description: Avatars come in 3 different standard sizes, Classic, Rthro, Rthro Slender.
---
@@ -30,7 +30,7 @@ Slender body scale.
Roughly 5.25-6.25 studs tall, with narrower sho
-See the [accessory apecifications](../../art/accessories/specifications.md#body-scale) and the [body specifications](../../art/characters/specifications.md#body-scale) for specific range values and other geometry requirements.
+See [Accessory Specifications](../../art/accessories/specifications.md#body-scale) and [Body Specifications](../../art/characters/specifications.md#body-scale) for specific range values and other geometry requirements.
## AvatarPartScaleType
diff --git a/content/en-us/art/accessories/caging-best-practices.md b/content/en-us/art/accessories/caging-best-practices.md
index e5c6b165e..aec5893e6 100644
--- a/content/en-us/art/accessories/caging-best-practices.md
+++ b/content/en-us/art/accessories/caging-best-practices.md
@@ -1,5 +1,5 @@
---
-title: Caging best practices
+title: Caging Best Practices
description: In-depth description and images of various caging best practices for layered clothing.
---
diff --git a/content/en-us/art/accessories/classic-clothing.md b/content/en-us/art/accessories/classic-clothing.md
index 6566f28f3..6ada73901 100644
--- a/content/en-us/art/accessories/classic-clothing.md
+++ b/content/en-us/art/accessories/classic-clothing.md
@@ -1,21 +1,21 @@
---
-title: Classic clothing
+title: Classic Clothing
description: Classic clothing are decals you can apply to a classic character model's surface. You can create classic clothing items on Roblox and upload them to the Marketplace.
---
-Current user-generated avatars on the Marketplace do not support 2D classic clothing. For information on creating modern 3D cosmetics, including rigid accessories and clothing items, see [Get started](../../avatar/index.md).
+Current user-generated avatars on the Marketplace do not support 2D classic clothing. For information on creating modern 3D cosmetics, including rigid accessories and clothing items, see [Getting Started](../../avatar/index.md).
Classic clothing are a type of 2D cosmetic item that you can apply to the surface of a classic avatar character. You can [create](#creating) your own classic clothing items and sell them on the [Marketplace](https://www.roblox.com/catalog).
This guide covers the process of creating a classic clothes asset using the following steps:
-1. Designing an image for a [t-shirt](#t-shirts) or [shirts and pants](#shirts-and-pants) using a third-party image processing program.
-2. [Testing](#test) the look of the classic clothes in Studio.
-3. [Uploading](#upload) the image assets to the Marketplace.
+1. Designing an image for a [T-shirt](#t-shirts) or [Shirts and Pants](#shirts-and-pants) using a third-party image processing program.
+2. [Testing](#testing) the look of the classic clothes in Studio.
+3. [Uploading](#uploading) the image assets to the Marketplace.
-## Create
+## Creating
The three types of classic clothing items are **T-shirts**, **Shirts**, and **Pants**. Each has different design and format requirements.
@@ -26,22 +26,22 @@ T-shirts are square images applied to the front of an avatar's torso. To make a
1. Create a square image (such as 512×512 pixels).
2. Use an image editor to apply changes in the specific square sections of the template images.
3. Upload it to Roblox using the [Asset Manager](../../projects/assets/manager.md) to test in your own experience.
-4. Follow the [testing](#test) steps to ensure your 2D image looks as expected.
-5. Follow the [uploading](#upload) steps to upload and sell your asset on the Marketplace.
+4. Follow the [Testing](#testing) steps to ensure your 2D image looks as expected.
+5. Follow the [Uploading](#uploading) steps to upload and sell your asset on the Marketplace.
-### Shirts and pants
+### Shirts and Pants
Classic shirts and pants are image assets that wrap around an avatar's body. Because classic shirts and pants have specific size requirements, download and modify the provided template files to begin creating these assets.
-
@@ -54,8 +54,8 @@ Table of sizes for each template part
Shape
-
Pixel size (width x height)
-
Clothing parts
+
Pixel Size (width x height)
+
Clothing Parts
@@ -106,7 +106,7 @@ When applying clothing to R15 avatars in Roblox, some limits exist with the temp
-## Test
+## Testing
To ensure the best quality results, you can test your clothes before uploading or selling. You can test your clothes without needing to pay any fees.
@@ -160,7 +160,7 @@ To ensure the best quality results, you can test your clothes before uploading o
To make sure your clothing looks as good as possible on as many avatars as possible, make sure you test on a few different rig types. Some character rigs may not support classic clothing effectively.
-## Upload
+## Uploading
After finalizing and testing your design, you can upload the clothing item to the [Marketplace](https://www.roblox.com/catalog) for a [fee](../../marketplace/marketplace-fees-and-commissions.md#classic-clothing). After Roblox reviews and uploads the item to the Marketplace, you will receive a [commission](../../marketplace/marketplace-fees-and-commissions.md#commissions) for all sales of your items.
diff --git a/content/en-us/art/accessories/clothing-export-settings.md b/content/en-us/art/accessories/clothing-export-settings.md
index 9e21f5463..52db54a21 100644
--- a/content/en-us/art/accessories/clothing-export-settings.md
+++ b/content/en-us/art/accessories/clothing-export-settings.md
@@ -1,5 +1,5 @@
---
-title: Layered clothing export settings
+title: Layered Clothing Export Settings
description: Use the appropriate export settings in Maya and Blender to generate Studio-ready .fbx files.
---
diff --git a/content/en-us/art/accessories/clothing-specifications.md b/content/en-us/art/accessories/clothing-specifications.md
index c5057d970..6705f5094 100644
--- a/content/en-us/art/accessories/clothing-specifications.md
+++ b/content/en-us/art/accessories/clothing-specifications.md
@@ -1,5 +1,5 @@
---
-title: Clothing specifications
+title: Clothing Specifications
description: Layered clothing specifications lists the specific technical requirements for the visible mesh, cages, and proper rigging and skinning data.
---
@@ -158,7 +158,7 @@ See [Creating Layered Models](../../art/accessories/creating/index.md) for a bas
### Rigging and Skinning
-Rigging and skinning a layered accessory allows the accessory to move naturally with a character body. You can perform this manually through a modeling tool, or [use Automatic Skinning Transfer transfer](../../art/accessories/automatic-skinning-transfer.md) to generate an accessory's skinning data at run time.
+Rigging and skinning a layered accessory allows the accessory to move naturally with a character body. You can perform this manually through a modeling tool, or [use automatic skinning transfer](../../art/accessories/automatic-skinning-transfer.md) to generate an accessory's skinning data at run time.
If using modeling software to skin your accessories, keep in mind that **Joint Influences** (Maya) or **Bone Assignments** (Blender) per vertex should be limited to **4**.
diff --git a/content/en-us/art/accessories/creating-rigid/converting.md b/content/en-us/art/accessories/creating-rigid/converting.md
index d2ab6db7c..fec84bd6c 100644
--- a/content/en-us/art/accessories/creating-rigid/converting.md
+++ b/content/en-us/art/accessories/creating-rigid/converting.md
@@ -1,5 +1,5 @@
---
-title: Use the accessory fitting tool
+title: Using the Accessory Fitting Tool
description: Use the Accessory Fitting tool to convert your model to an rigid accessory.
next: /art/accessories/creating-rigid/publishing
prev: /art/accessories/creating-rigid/importing
@@ -24,7 +24,7 @@ To fit and generate your accessory:
5. After previewing and fitting your asset, select the **dropdown** next to **Generate** button to select **Generate Legacy Accessory**. The accessory object populates in your viewport and in the Explorer.
- - For rigid accessories that you intend to sell on the Marketplace you must use the [generate legacy accessory](../accessory-fitting-tool.md#generate-legacy-accessory) option when creating your Marketplace accessories.
+ - For rigid accessories that you intend to sell on the Marketplace you must use the [Generate Legacy Accessory](../accessory-fitting-tool.md#generate-legacy-accessory) option when creating your Marketplace accessories.
diff --git a/content/en-us/art/accessories/creating-rigid/exporting.md b/content/en-us/art/accessories/creating-rigid/exporting.md
index 12812cf0b..029491836 100644
--- a/content/en-us/art/accessories/creating-rigid/exporting.md
+++ b/content/en-us/art/accessories/creating-rigid/exporting.md
@@ -1,5 +1,5 @@
---
-title: Export from Blender
+title: Exporting
description: Use Blender's .fbx exporter with the correct settings to create a Studio-ready asset.
prev: /art/accessories/creating-rigid/texturing
next: /art/accessories/creating-rigid/importing
@@ -7,7 +7,7 @@ next: /art/accessories/creating-rigid/importing
-After modeling and texturing your asset, you can begin the process of **exporting** your Blender project as a `.fbx` or `.gltf`. For up-to-date settings, see [Export settings](../../modeling/export-requirements.md).
+After modeling and texturing your asset, you can begin the process of **exporting** your Blender project as a `.fbx` or `.gltf`. For up-to-date settings, see [Export Settings](../../modeling/export-requirements.md).
If you are creating your own accessory object, it's important to clean up your project, which can involve deleting or removing any extra objects, such as lights, cameras, or mannequins, to ensure you only export the accessory mesh, and applying any modifiers to your mesh object.
diff --git a/content/en-us/art/accessories/creating-rigid/importing.md b/content/en-us/art/accessories/creating-rigid/importing.md
index 86f7c05c4..a4a810aaf 100644
--- a/content/en-us/art/accessories/creating-rigid/importing.md
+++ b/content/en-us/art/accessories/creating-rigid/importing.md
@@ -1,5 +1,5 @@
---
-title: Use Studio's 3D Importer
+title: Using Studio's 3D Importer
description: Use Studio's 3D importer to import a third-party 3D model into Studio.
next: /art/accessories/creating-rigid/converting
prev: /art/accessories/creating-rigid/exporting
@@ -21,7 +21,7 @@ To import your asset ([downloadable reference](../../../assets/art/accessories/c
2. If textures were not imported correctly, follow the instructions below to add the file manually.
-Add textures manually
+Adding textures manually
If textures didn't load correctly, add them manually with the Asset Manager.
diff --git a/content/en-us/art/accessories/creating-rigid/index.md b/content/en-us/art/accessories/creating-rigid/index.md
index 4f1e0719a..7cc2a780a 100644
--- a/content/en-us/art/accessories/creating-rigid/index.md
+++ b/content/en-us/art/accessories/creating-rigid/index.md
@@ -1,5 +1,5 @@
---
-title: Rigid accessory creation
+title: Rigid Accessory Creation
description: This tutorial covers the basic steps required to publish a custom asset on the Marketplace.
next: /art/accessories/creating-rigid/modeling-setup
---
@@ -14,7 +14,7 @@ Unlike clothing or bodies, rigid accessories do not require additional configura
This tutorial covers the basics of each step in the workflow to create your own simple 3D model in Blender and import it into Studio. From there, you can upload the accessory to the Marketplace to sell, save the asset to your toolbox, or use the asset in your experiences.
-Creating, building, and sharing on Roblox is free. However, the last step of listing your item to sell requires a Premium Roblox account, an upload fee, and a publishing advance. For more information, see the [Marketplace policy](../../../marketplace/marketplace-policy.md#creator-requirements).
+Creating, building, and sharing on Roblox is free. However, the last step of listing your item to sell requires a Premium Roblox account, an upload fee, and a publishing advance. For more information, see [Marketplace Policy](../../../marketplace/marketplace-policy.md#creator-requirements).
diff --git a/content/en-us/art/accessories/creating-rigid/modeling-setup.md b/content/en-us/art/accessories/creating-rigid/modeling-setup.md
index 50898a26e..255f89326 100644
--- a/content/en-us/art/accessories/creating-rigid/modeling-setup.md
+++ b/content/en-us/art/accessories/creating-rigid/modeling-setup.md
@@ -1,5 +1,5 @@
---
-title: Box modeling
+title: Box Modeling
description: Create your basic rigid accessory model in Blender.
next: /art/accessories/creating-rigid/texturing
prev: /art/accessories/creating-rigid/
@@ -15,7 +15,7 @@ The following instructions are based off of the [Box Modeling 101 staff article]
Whether you are using an existing shape or creating your own 3D object, it's important to consider [technical requirements](../../../art/accessories/specifications.md), such as keeping your geometry within a polycount budget, and [policy requirements](../../../marketplace/marketplace-policy.md), such as ensuring your design does not infringe on other creator's IP both within and outside of the Roblox ecosystem.
-## General shape
+## General Shape
@@ -30,7 +30,7 @@ In a new Blender file, delete everything except the starter cube, then create th
5. Select the top face of the box and press E to extrude.
6. Drag your mouse to extrude the lid. Extend the lid to about half the height of the main body.
-## Rounded lid
+## Rounded Lid
Create the rounded lid shape using segmentation:
@@ -40,7 +40,7 @@ Create the rounded lid shape using segmentation:
3. With both lines selected, press Ctrl/Cmd+B to Bevel.
4. In the context menu at the bottom right, set the number of segments to `6` and enable **Clamp Overlap**.
-### Merge vertices
+### Merge Vertices
Sometimes tools like the Bevel tool may move vertices very close to each other without merging them. Use the Merge Vertices function to ensure that your object shares vertices wherever possible.
@@ -49,7 +49,7 @@ Sometimes tools like the Bevel tool may move vertices very close to each other w
3. Right-click and select **Merge Vertices by Distance**.
4. In the pop-up modal, set the distance to `.01`.
-## Side insets
+## Side Insets
@@ -62,11 +62,11 @@ Create the left and right insets of your chest:
4. With your new insets selected, right-click and select **Extrude Along Normals**.
5. Use the mouse to drag and adjust the distance of extrusion into the chest.
-## Front insets
+## Front Insets
Create the front and back insets of your chest by creating new lines and then extruding your faces between those lines.
-### Vertical loop cuts
+### Vertical Loop Cuts
@@ -80,7 +80,7 @@ To create your vertical loop cuts:
6. With the new lines selected, press S to scale and Y to scale within the y-axis.
7. Use the mouse to drag the lines until they nearly reach the edges of your chest. Click to confirm.
-### Horizontal loop cuts
+### Horizontal Loop Cuts
@@ -107,13 +107,13 @@ Create the extrusions for the front, top, and back of the chest.
3. With the faces selected, hold Shift and click on the metal borders to deselect them. The front and back faces, and the top segmentations, should remain selected.
4. Right click and select **Extrude Faces Along Normals**. Drag the mouse to extrude the faces about the same width as the metal borders.
-## Complete border
+## Complete Border
The chest is almost ready, but is still missing the continuous metal border across the top edge. Remove the existing faces and add new geometry to the treasure chest.
-### Delete faces
+### Delete Faces
Delete the faces of the top side metal borders:
@@ -122,7 +122,7 @@ Delete the faces of the top side metal borders:
3. Press X to delete.
4. Repeat steps 2-3 on the other side.
-### Add faces
+### Add Faces
Add new faces to the sides that complete the geometry of the treasure chest box.
diff --git a/content/en-us/art/accessories/creating-rigid/publishing.md b/content/en-us/art/accessories/creating-rigid/publishing.md
index e35208a85..38459e133 100644
--- a/content/en-us/art/accessories/creating-rigid/publishing.md
+++ b/content/en-us/art/accessories/creating-rigid/publishing.md
@@ -1,5 +1,5 @@
---
-title: Upload and publish
+title: Upload and Publish
description: Before selling your accessory, upload the accessory for validation and moderation.
prev: /art/accessories/creating-rigid/converting
---
@@ -7,7 +7,7 @@ prev: /art/accessories/creating-rigid/converting
After generating your `Class.Accessory` item, you can now begin the process of **publishing** the asset to the Marketplace. This step is optional and only applicable for creators who intend to sell their asset.
-Users must meet [creator requirements](../../../marketplace/marketplace-policy.md#creator-requirements) to be eligible to sell assets on the Marketplace. Creators must also provide an upload fee and a payment advance during the upload and publishing process.
+Users must meet [Creator Requirements](../../../marketplace/marketplace-policy.md#creator-requirements) to be eligible to sell assets on the Marketplace. Creators must also provide an upload fee and a payment advance during the upload and publishing process.
Adding your asset to the Marketplace involves 2 steps:
@@ -17,7 +17,7 @@ Adding your asset to the Marketplace involves 2 steps:
-## Upload
+## Uploading
To upload your accessory:
@@ -30,13 +30,13 @@ To upload your accessory:
1. **Title**: The name of your accessory.
2. **Description**: A short description of your asset.
- 3. **Asset Category**: The type of accessory. This should match the Accessory Type selected during the [fitting and conversion](../../../art/accessories/creating-rigid/converting.md) process.
+ 3. **Asset Category**: The type of accessory. This should match the Accessory Type selected during the [Fitting and Conversion](../../../art/accessories/creating-rigid/converting.md) process.
4. **Creator**: Use the dropdown to select if you'd like to publish this asset as an individual or as part of an associated group.
4. After you select the **Asset Category**, Studio begins validating the asset to ensure that it matches Roblox's accessory technical requirements.
-5. If the validation is successful, you can submit the asset to the upload and moderation queue for a fee. See [Fees and commissions](../../../marketplace/marketplace-fees-and-commissions.md) for current fee information.
+5. If the validation is successful, you can submit the asset to the upload and moderation queue for a fee. See [Fees and Commissions](../../../marketplace/marketplace-fees-and-commissions.md) for current fee information.
-## Publish
+## Publishing
After uploading your accessory, the asset is added to the moderation queue and may take up to 24 hours to clear.
diff --git a/content/en-us/art/accessories/creating-rigid/texturing.md b/content/en-us/art/accessories/creating-rigid/texturing.md
index 016220dc9..6fc903159 100644
--- a/content/en-us/art/accessories/creating-rigid/texturing.md
+++ b/content/en-us/art/accessories/creating-rigid/texturing.md
@@ -1,5 +1,5 @@
---
-title: Texture painting
+title: Texture Painting
description: Covers the process of associating PBR textures to rigid accessories in Blender.
prev: /art/accessories/creating-rigid/modeling-setup
next: /art/accessories/creating-rigid/exporting
@@ -15,7 +15,7 @@ This tutorial covers basic texture painting in Blender. Common workflows in the
While PBR textures are not required for accessories and is not covered in this tutorial, adding PBR textures can add extra visual flair and realism to elevate your creations. This typically requires additional software.
For more information, see [PBR textures](../../modeling/surface-appearance.md).
-## UV projecting
+## UV Projecting
@@ -25,7 +25,7 @@ Use Blender's automatic UV Project feature to "unwrap" your 3D object onto a 2D
2. In the top UV menu, select **Smart UV Project**.
3. Set Island Margin to `.02`.
-## Add new material
+## Adding New Material
@@ -39,7 +39,7 @@ Add a new material for Blender to associate this new texture, and assign it to a
1. Name the texture image file. Using an affix like "\_TXT" can help organize your files later.
2. Select the color and pick a color. This tutorial recommends using a metallic color for your metal borders to save time.
-## Texture painting
+## Texture Painting
Texture painting allows you to paint directly on the 3D object or the 2D mapping of the surface.
@@ -49,7 +49,7 @@ Since Blender automatically mapped the 2D atlas of the texture, it's not easy to
There are many ways to texture within Blender. To keep this process simple, the tutorial used Blender's [Smart UV Project](https://docs.blender.org/manual/en/2.79/editors/uv_image/uv/editing/unwrapping/mapping_types.html), but there are many ways to manually create your 2D texture islands and organize your mesh and texture.
-### Mark 3D object
+### Marking 3D Object
@@ -62,7 +62,7 @@ Switch to Texture Paint mode and use the paintbrush to track the "wood" parts of
1. Use Ctrl/Cmd+Z to undo any accidental brushes on the metal border.
2. Hold F and drag the mouse to adjust brush size.
-### Paint 2D map
+### Painting 2D Map
diff --git a/content/en-us/art/accessories/creating/armature-setup.md b/content/en-us/art/accessories/creating/armature-setup.md
index 7ddd4cc3d..10a9368e3 100644
--- a/content/en-us/art/accessories/creating/armature-setup.md
+++ b/content/en-us/art/accessories/creating/armature-setup.md
@@ -1,11 +1,11 @@
---
-title: Armature setup
+title: Armature Setup
description: Transfer and parent an armature template to your custom clothing Blender project.
-next: /art/accessories/creating/test-poses
+next: /art/accessories/creating/testing-poses
prev: /art/accessories/creating/texture-painting
---
-**Rigging** is the process that enables the clothing object to move and deform with a Roblox character's R15 rig. In this tutorial, you'll parent the clothing item to Roblox's provided R15 armature and verify the Automatic Skinning Transfer data. After rigging, be sure to test out some basic poses to ensure that your clothes move and stretch correctly with any character body.
+**Rigging** is the process that enables the clothing object to move and deform with a Roblox character's R15 rig. In this tutorial, you'll parent the clothing item to Roblox's provided R15 armature and verify the automatic skinning data. After rigging, be sure to test out some basic poses to ensure that your clothes move and stretch correctly with any character body.
@@ -24,7 +24,7 @@ The rigging process requires the following:
2. Parent the rig with Blender's automatic weights.
3. Test poses.
-## Transfer armature
+## Transferring Armature
Roblox provides an R15 base armature that you can import into your own project. While it is possible to create your own R15 armature rig, importing a premade rig saves you time and reduces the potential for error.
@@ -50,7 +50,7 @@ To import the R15 character armature into your file:
-## Parent armature
+## Parenting Armature
With the armature rig in place, you can use Blender's **Parent with Automatic Weights** functionality to quickly set your clothing mesh as a child of the armature. This feature also applies vertex weighting, or **skinning**, automatically to your mesh, which can save you significant time over skinning your clothing manually.
diff --git a/content/en-us/art/accessories/creating/caging-setup.md b/content/en-us/art/accessories/creating/caging-setup.md
index 307c0ff36..a42b381f5 100644
--- a/content/en-us/art/accessories/creating/caging-setup.md
+++ b/content/en-us/art/accessories/creating/caging-setup.md
@@ -1,7 +1,7 @@
---
-title: Caging setup
+title: Caging Setup
description: Isolate your outer cage meshes and hide extra objects before modifying your clothing cage.
-next: /art/accessories/creating/modify-cage
+next: /art/accessories/creating/modifying-cage
prev: /art/accessories/creating/testing-poses
---
diff --git a/content/en-us/art/accessories/creating/converting.md b/content/en-us/art/accessories/creating/converting.md
index d04bb2e44..df3ff3ea6 100644
--- a/content/en-us/art/accessories/creating/converting.md
+++ b/content/en-us/art/accessories/creating/converting.md
@@ -1,5 +1,5 @@
---
-title: Convert
+title: Converting
description: Use the Accessory Fitting tool to convert a Model object to an Accessory.
prev: /art/accessories/creating/importing
---
@@ -10,7 +10,7 @@ To generate the accessory object:
1. In the Avatar tab, select the **Accessory Fitting Tool**. The Accessory Fitting Tool panel displays on the left side of the workspace.
2. Select the `Class.Model` of the clothing item in the viewport. The tool's text field populates with the name of the object selected. Alternatively, you can select the object within the Explorer window.
-3. Test out various sample characters, clothing, and animations. See [Test accessories](../../../art/accessories/accessory-fitting-tool.md#test-accessories) for additional information.
+3. Test out various sample characters, clothing, and animations. See [Testing Accessories](../../../art/accessories/accessory-fitting-tool.md#testing-accessories) for additional information.
- If required, make minor cage adjustments using the editing features. Larger cage changes may require returning to your third-party modeling software and re-exporting the asset.
4. When ready to generate your accessory, click **Generate MeshPart Accessory**. The Accessory object with your model populates in your workspace.
For additional information and documentation on the tool, see [Accessory Fitting Tool](../../../art/accessories/accessory-fitting-tool.md).
@@ -31,6 +31,6 @@ Congratulations, you've completed your clothing tutorial. With this accessory, y
- Equip the accessory on an avatar-ready character by drag and dropping the accessory on an existing model, or using [HumanoidDescription](../../../characters/appearance.md#humanoiddescription).
- Save the accessory as an [avatar asset](../../../projects/assets/index.md#for-avatars) for use in an experience later.
-- If you meet certain account requirements, you can [upload your asset](../../../marketplace/publish-to-marketplace.md) for moderation and start selling it on the Marketplace.
+- If you meet certain account requirements, you can [upload your asset](../../../marketplace/publishing-to-marketplace.md) for moderation and start selling it on the Marketplace.
diff --git a/content/en-us/art/accessories/creating/exporting.md b/content/en-us/art/accessories/creating/exporting.md
index e5a1a3be2..ac53145f2 100644
--- a/content/en-us/art/accessories/creating/exporting.md
+++ b/content/en-us/art/accessories/creating/exporting.md
@@ -1,7 +1,7 @@
---
-title: Export
+title: Exporting
description: Use Blender's FBX export with specific settings when exporting a clothing asset.
-prev: /art/accessories/creating/modify-cage
+prev: /art/accessories/creating/modifying-cage
next: /art/accessories/creating/importing
---
diff --git a/content/en-us/art/accessories/creating/importing.md b/content/en-us/art/accessories/creating/importing.md
index d80043986..4a47e3e45 100644
--- a/content/en-us/art/accessories/creating/importing.md
+++ b/content/en-us/art/accessories/creating/importing.md
@@ -1,5 +1,5 @@
---
-title: Import
+title: Importing
description: Use the 3D Importer to import your custom accessory into Studio.
prev: /art/accessories/creating/exporting
next: /art/accessories/creating/converting
diff --git a/content/en-us/art/accessories/creating/index.md b/content/en-us/art/accessories/creating/index.md
index f26348019..ac8b6a2ff 100644
--- a/content/en-us/art/accessories/creating/index.md
+++ b/content/en-us/art/accessories/creating/index.md
@@ -1,5 +1,5 @@
---
-title: Basic clothing creation
+title: Basic Clothing Creation
description: This tutorial covers the basic steps required in Blender to Studio-ready clothing assets from scratch.
next: /art/accessories/creating/modeling-setup
---
diff --git a/content/en-us/art/accessories/creating/modeling-setup.md b/content/en-us/art/accessories/creating/modeling-setup.md
index 190beb88c..6ea54abdc 100644
--- a/content/en-us/art/accessories/creating/modeling-setup.md
+++ b/content/en-us/art/accessories/creating/modeling-setup.md
@@ -1,5 +1,5 @@
---
-title: Modeling setup
+title: Modeling Setup
description: Setup your Blender environment with the correct files and templates to model efficiently.
next: /art/accessories/creating/trimming
prev: /art/accessories/creating/
@@ -28,7 +28,7 @@ This modeling tutorial covers the following processes:
6. Sculpting fabric and other details onto the mesh object.
7. Closing the holes in your mesh, making it watertight.
-## Set up mesh
+## Setting Up Mesh
To get your project started, download and open Roblox's [Clothing_Cage.blend](../../../assets/modeling/meshes/reference-files/Clothing_Cage_Templates.zip) project and begin setting up your basic project objects.
@@ -56,7 +56,7 @@ To set up your project and your initial mesh object:
-## Clear extra attributes
+## Clearing Extra Attributes
The cage mesh objects in the template include some helper vertex color properties that need to be removed from your clothing mesh. If left in, the vertex colors may clash with the texture of the object after importing in Studio.
diff --git a/content/en-us/art/accessories/creating/modify-cage.md b/content/en-us/art/accessories/creating/modifying-cage.md
similarity index 98%
rename from content/en-us/art/accessories/creating/modify-cage.md
rename to content/en-us/art/accessories/creating/modifying-cage.md
index b7531515f..3ee708152 100644
--- a/content/en-us/art/accessories/creating/modify-cage.md
+++ b/content/en-us/art/accessories/creating/modifying-cage.md
@@ -1,5 +1,5 @@
---
-title: Modify outer cage
+title: Modifying Outer Cage
description: Modify the outer cage to fit tightly over your clothing item.
next: /art/accessories/creating/exporting
prev: /art/accessories/creating/caging-setup
diff --git a/content/en-us/art/accessories/creating/sculpting.md b/content/en-us/art/accessories/creating/sculpting.md
index 888d9c222..f6a3c39a5 100644
--- a/content/en-us/art/accessories/creating/sculpting.md
+++ b/content/en-us/art/accessories/creating/sculpting.md
@@ -1,5 +1,5 @@
---
-title: Sculpt detail
+title: Sculpting Detail
description: Use Blender's sculpting and simulation tools to add detail to your clothing shape.
next: /art/accessories/creating/watertight
prev: /art/accessories/creating/trimming
diff --git a/content/en-us/art/accessories/creating/test-poses.md b/content/en-us/art/accessories/creating/testing-poses.md
similarity index 92%
rename from content/en-us/art/accessories/creating/test-poses.md
rename to content/en-us/art/accessories/creating/testing-poses.md
index ae111e540..a516a31aa 100644
--- a/content/en-us/art/accessories/creating/test-poses.md
+++ b/content/en-us/art/accessories/creating/testing-poses.md
@@ -1,5 +1,5 @@
---
-title: Test poses
+title: Testing Poses
description: Test your poses after rigging a clothing item to ensure the clothes bend and deform correctly.
next: /art/accessories/creating/caging-setup
prev: /art/accessories/creating/armature-setup
@@ -12,8 +12,8 @@ If you see issues with the deformation of your clothing, you may need to correct
This tutorial doesn't cover the process of weight-painting. For additional resources on manually weight painting and instructions on updating skinning data on meshes, see the following resources:
-- [Skin a simple mesh](../../modeling/skinning-a-simple-mesh.md)
-- [Skin a humanoid mesh](../../modeling/skinning-a-humanoid-model.md)
+- [Skinning a Simple Mesh](../../modeling/skinning-a-simple-mesh.md)
+- [Skinning a Humanoid Mesh](../../modeling/skinning-a-humanoid-model.md)
diff --git a/content/en-us/art/accessories/creating/texture-map.md b/content/en-us/art/accessories/creating/texture-map.md
index 971812c71..e6257b1e5 100644
--- a/content/en-us/art/accessories/creating/texture-map.md
+++ b/content/en-us/art/accessories/creating/texture-map.md
@@ -1,5 +1,5 @@
---
-title: Create texture map
+title: Creating Texture Map
description: Generate a 2D texture map image that you can save your texture painting to.
prev: /art/accessories/creating/unwrapping
next: /art/accessories/creating/texture-painting
diff --git a/content/en-us/art/accessories/creating/texture-painting.md b/content/en-us/art/accessories/creating/texture-painting.md
index e035f7dc9..c25bbafeb 100644
--- a/content/en-us/art/accessories/creating/texture-painting.md
+++ b/content/en-us/art/accessories/creating/texture-painting.md
@@ -1,5 +1,5 @@
---
-title: Texture painting
+title: Texture Painting
description: Use Blender's Texture Painting tools to apply a surface appearance to your clothing item.
prev: /art/accessories/creating/texture-map
next: /art/accessories/creating/armature-setup
diff --git a/content/en-us/art/accessories/creating/trimming.md b/content/en-us/art/accessories/creating/trimming.md
index f305d77af..7be31d55c 100644
--- a/content/en-us/art/accessories/creating/trimming.md
+++ b/content/en-us/art/accessories/creating/trimming.md
@@ -1,5 +1,5 @@
---
-title: Trim clothing shape
+title: Trimming Clothing Shape
description: Create the general shape of your clothing item by removing unnecessary sections of your duplicated mesh.
next: /art/accessories/creating/sculpting
prev: /art/accessories/creating/modeling-setup
@@ -12,7 +12,7 @@ With a clean mesh object to work with, cut the basic shape of the type of clothi
Long-sleeve trimming of the full-body mesh.
-## Trim clothing shape
+## Trimming Clothing Shape
Create the general shape of your clothing type by trimming sections of your duplicated mannequin mesh.
@@ -27,7 +27,7 @@ To trim your clothing shape:
-## Add and smooth vertices
+## Add and Smooth Vertices
With the basic shape created, subdivide the surface of your clothing mesh to add vertices and smooth out the mesh. This process removes the grid-like surface and allows you to apply more complex sculpting detail later.
@@ -51,7 +51,7 @@ To add and smooth your vertices:
-## Scale and position
+## Scaling and Positioning
With your base clothing shape created, the next steps are to scale out the mesh and reposition it on top of the mannequin.
diff --git a/content/en-us/art/accessories/creating/unwrapping.md b/content/en-us/art/accessories/creating/unwrapping.md
index 6681699ae..49712c72b 100644
--- a/content/en-us/art/accessories/creating/unwrapping.md
+++ b/content/en-us/art/accessories/creating/unwrapping.md
@@ -1,5 +1,5 @@
---
-title: Create seams and unwrap
+title: Creating Seams and Unwrapping
description: Use Blender's seams and unwrapping functionality to project your 3D surface on a 2D texture plane.
prev: /art/accessories/creating/watertight
next: /art/accessories/creating/texture-map
@@ -8,7 +8,7 @@ next: /art/accessories/creating/texture-map
**Texturing** is the process of customizing the color, tone, and shading of your model's surface. Custom meshes and models use a 2D image, known as a texture map, to project various surface appearance elements onto your 3D object. In this tutorial, apply a complete color to your shirt and add a smaller design using Blender's Texture Paint mode.
-This tutorial does not cover [PBR textures](../../modeling/surface-appearance.md), which are advanced textures that can replicate real-world texture properties, like reflectivity and surface roughness, and are recommended to give your clothing items an extra dimension of creativity and visual pop. PBR textures often require a third-party application such as Substance Painter.
+This tutorial does not cover [PBR Textures](../../modeling/surface-appearance.md), which are advanced textures that can replicate real-world texture properties, like reflectivity and surface roughness, and are recommended to give your clothing items an extra dimension of creativity and visual pop. PBR textures often require a third-party application such as Substance Painter.
@@ -29,7 +29,7 @@ The texturing process requires the following steps:
3. Create a new texture image to save as your 2D map.
4. Paint a custom texture using Blender's Texture Paint tools.
-## Create seams
+## Creating Seams
To begin texturing, you must first generate a **UV map**, or 2D projection, of the surface of your mesh. To set up this UV map, you tell Blender which edges of your mesh to use as seams when creating the projection.
@@ -42,7 +42,7 @@ To create seams that naturally separate the front and back of the shirt:
5. **Repeat steps 3-4** to create a continuous seam across your mesh.
-## UV unwrap
+## UV Unwrapping
After applying the seams, Blender now knows how to "unwrap" the mesh surface onto a 2D plane as a front and back surface.
diff --git a/content/en-us/art/accessories/creating/watertight.md b/content/en-us/art/accessories/creating/watertight.md
index 2181b6dcf..d9ae8d2cb 100644
--- a/content/en-us/art/accessories/creating/watertight.md
+++ b/content/en-us/art/accessories/creating/watertight.md
@@ -1,5 +1,5 @@
---
-title: Make mesh watertight
+title: Making Mesh Watertight
description: Seal off your geometry to ensure that there are no angles where the interior backfaces of your object are exposed.
next: /art/accessories/creating/unwrapping
prev: /art/accessories/creating/sculpting
diff --git a/content/en-us/art/accessories/export-settings.md b/content/en-us/art/accessories/export-settings.md
index a79b9f691..d4500c389 100644
--- a/content/en-us/art/accessories/export-settings.md
+++ b/content/en-us/art/accessories/export-settings.md
@@ -1,5 +1,5 @@
---
-title: Rigid accessory export settings
+title: Rigid Accessory Export Settings
description: Use the appropriate export settings in Maya and Blender to generate Studio-ready .fbx files.
---
diff --git a/content/en-us/art/accessories/from-existing.md b/content/en-us/art/accessories/from-existing.md
index 13c71b29d..6c9fafd87 100644
--- a/content/en-us/art/accessories/from-existing.md
+++ b/content/en-us/art/accessories/from-existing.md
@@ -1,11 +1,11 @@
---
-title: Accessories from an existing model
+title: Accessories from an Existing Model
description: This tutorial covers the basic steps required to publish a custom asset on the Marketplace.
---
In many cases, you may want to convert a premade model from your modeling
software into an accessory on Roblox. If you are looking to create your
-accessory from scratch, see [Create accessories](./creating-rigid/index.md).
+accessory from scratch, see [Creating Accessories](./creating-rigid/index.md).
Using a provided 3D reference file, this tutorial covers each step in the workflow to properly configure and export a 3D model with PBR textures from Blender and generate your own rigid accessory in Studio. After you create the accessory, you can upload it to the Marketplace, save it to your toolbox, and use it in your own experiences.
@@ -41,7 +41,7 @@ Using a provided reference 3D asset, this tutorial covers the following rigid ac
While this content covers the Blender workflow with a provided reference example, you can apply the same concepts to other third-party modeling applications and custom assets.
-## Modeling setup
+## Modeling Setup
Whether you are using an existing shape or creating your own 3D object, it's important to consider [technical requirements](../../art/accessories/specifications.md), such as keeping your geometry within a polycount budget, and [policy requirements](../../marketplace/marketplace-policy.md), such as ensuring your design does not infringe on other creator's IP both within and outside of the Roblox ecosystem.
@@ -76,7 +76,7 @@ There are many tools and workflows to create your own unique asset. For addition
**Texturing** is the process of applying a surface appearance to a 3D object. Blender provides various tools and features to create and connect your own texture maps to your asset, allowing you to preview your model's final appearance and link the texture images to your exported file.
-The mask example asset uses [physically-based rendering (PBR) textures](../../art/modeling/surface-appearance.md), which are advanced textures that create realistic surfaces under different lighting environments. PBR textures use multiple image files, or **maps**, to represent the various surface properties of your 3D object.
+The mask example asset uses [Physically-Based Rendering (PBR) textures](../../art/modeling/surface-appearance.md), which are advanced textures that create realistic surfaces under different lighting environments. PBR textures use multiple image files, or **maps**, to represent the various surface properties of your 3D object.
@@ -108,7 +108,7 @@ Metalness Map
This tutorial doesn't cover the PBR texture creation process, which typically involves using third-party software such as ZBrush or Substance 3D Painter. Instead, this section goes over the process of bringing premade PBR image files into Blender and properly associating them to your asset on export.
-While PBR textures are not required for accessories, adding PBR textures can add extra visual flair and realism to elevate your creations. For an example on using Blender to create a basic, non-PBR texture, see [Texture basic clothing](../../art/accessories/creating/unwrapping.md).
+While PBR textures are not required for accessories, adding PBR textures can add extra visual flair and realism to elevate your creations. For an example on using Blender to create a basic, non-PBR texture, see [Texturing Basic Clothing](../../art/accessories/creating/unwrapping.md).
To configure and link your PBR textures to your model:
@@ -143,10 +143,10 @@ To configure and link your PBR textures to your model:
You've completed the texturing section of this tutorial. If desired, download a [reference sample](../../assets/art/accessories/creating-rigid/Rigid_Mask_Texturing-Completed.blend) of this stage of the project for comparison.
-If you are creating your own PBR textures, check out [Material references](../../art/modeling/material-reference.md) for various PBR material examples you can apply to your next accessory.
+If you are creating your own PBR textures, check out [Material References](../../art/modeling/material-reference.md) for various PBR material examples you can apply to your next accessory.
-## Clean up
+## Clean Up
After modeling and texturing your asset, you can begin the process of **exporting** your Blender project as a `.fbx`. The start of this process includes cleaning up your project, which can involve deleting or removing any extra objects, such as lights, cameras, or mannequin meshes, to ensure you only export the accessory mesh, and applying any modifiers to your mesh object.
@@ -159,7 +159,7 @@ To freeze your transforms:
-## Export
+## Exporting
After modeling and texturing your asset, you can begin the process of **exporting** your Blender project as a `.fbx`. The start of this process includes cleaning up your project, which can involve deleting or removing any extra objects, such as lights, cameras, or mannequins, to ensure you only export the accessory mesh, and applying any modifiers to your mesh object.
@@ -190,7 +190,7 @@ To export your model as a `.fbx`:
You've completed the exporting section of this tutorial. If desired, download a [reference sample](../../assets/art/accessories/creating-rigid/Rigid_Mask_Export.fbx) of this exported file for comparison. You can use this reference in the next importing step.
-## Import
+## Importing
Studio's 3D Importer provides a quick and easy way to import third-party 3D assets into your projects. The importer provides object previews and error-checking to ensure that your asset meets Studio's general 3D requirements.
@@ -231,7 +231,7 @@ To import your asset:
After successful import, your model object should populate in your project as a `Class.Model` with the appropriate textures applied. See [3D Importer](../../art/modeling/3d-importer.md) for additional information on import settings and troubleshooting.
-## Convert
+## Converting
After importing your asset into Studio, you can begin **fitting** your imported object to a mannequin and **converting** the `Class.Model` object into a `Class.Accessory`. When fitting and converting your accessory it's important to use the **Accessory Fitting Tool (AFT)** to correctly preview the placement and apply the correct configurations to your accessory.
@@ -274,7 +274,7 @@ To fit and generate your accessory:
After successful fitting and converting, your 3D model should populate in your project as a `Class.Accessory`. With this `Class.Accessory` you can perform any of the following:
-- [Upload the accessory](../../art/accessories/creating-rigid/publishing.md) to the Marketplace.
+- [Upload the accessory](../../art/accessories/creating-rigid/publishing.md) to the Marketplace.- [Upload the accessory](../../art/accessories/creating-rigid/publishing.md) to the Marketplace.
- Use the accessory in your current experience by equipping it to character models with [HumanoidDescription](../../characters/appearance.md#humanoiddescription), or by dragging and dropping the accessory under the appropriate character `Class.Model` object.
- Save the accessory to your [Toolbox](../../projects/assets/toolbox.md) to share or use within any of your experiences.
@@ -301,18 +301,18 @@ If you intend to sell the asset on the Marketplace, use the following steps to b
1. **Title**: The name of your accessory.
2. **Description**: A short description of your asset.
- 3. **Asset Category**: The type of accessory. This should match the Accessory Type selected during the [Fitting and conversion](../../art/accessories/creating-rigid/converting.md) process.
+ 3. **Asset Category**: The type of accessory. This should match the Accessory Type selected during the [Fitting and Conversion](../../art/accessories/creating-rigid/converting.md) process.
4. **Creator**: Use the dropdown to select if you'd like to publish this asset as an individual or as part of an associated group.
4. After you select the **Asset Category**, Studio begins validating the asset to ensure that it matches Roblox's accessory technical requirements.
1. If set up correctly, the window displays a green Validation Successful confirmation.
- 2. If you see an error `Could not find a Part called Handle...`, you may have published your accessory as a MeshPart instead of a legacy accessory. See [Use the Accessory Fitting tool](#convert) step 6 for more information.
+ 2. If you see an error `Could not find a Part called Handle...`, you may have published your accessory as a MeshPart instead of a legacy accessory. See [Using the Accessory Fitting Tool](#converting) step 6 for more information.
3. If other errors appear, see the error messages for specific details. Some errors may require going back to the modeling software and adjusting the asset.
-5. If the validation is successful, you can submit the asset to the upload and moderation queue for a fee. See [Fees and commissions](../../marketplace/marketplace-fees-and-commissions.md) for current fee information.
+5. If the validation is successful, you can submit the asset to the upload and moderation queue for a fee. See [Fees and Commissions](../../marketplace/marketplace-fees-and-commissions.md) for current fee information.
-## Publish
+## Publishing
After uploading your asset for moderation, you can check your asset's current moderation status on your [Creator Dashboard > Avatar Items](https://create.roblox.com/dashboard/creations). Moderation can take up to 24 hours during which a placeholder icon is used on the creation page.
@@ -329,8 +329,8 @@ You now have your accessory added to the Marketplace catalog! Use the item's Mar
See the following resources for additional Marketplace policy and related information:
- [Marketplace policy](../../marketplace/marketplace-policy.md)
-- [Fees and commissions](../../marketplace/marketplace-fees-and-commissions.md)
-- [Intellectual property](../../marketplace/intellectual-property.md)
+- [Fees and Commissions](../../marketplace/marketplace-fees-and-commissions.md)
+- [Intellectual Property](../../marketplace/intellectual-property.md)
- [Moderation](../../marketplace/moderation.md)
diff --git a/content/en-us/art/accessories/import-clothing.md b/content/en-us/art/accessories/importing-clothing.md
similarity index 87%
rename from content/en-us/art/accessories/import-clothing.md
rename to content/en-us/art/accessories/importing-clothing.md
index a3d338ca3..657ec90d7 100644
--- a/content/en-us/art/accessories/import-clothing.md
+++ b/content/en-us/art/accessories/importing-clothing.md
@@ -1,19 +1,19 @@
---
-title: Import clothing accessories
+title: Importing Clothing Accessories
description: Use the 3D Importer to add third-party models to Studio before using the Accessory Fitting Tool to convert the model to an Accessory.
---
-Use the following instructions to [import](#import-3d-assets) your `.fbx` or `.gltf` third-party model into Studio and [convert](#convert-layered-accessories) the asset to a clothing `Accessory` object that you can save to use in your experience, share with others, or upload to the Marketplace.
+Use the following instructions to [import](#importing-3d-assets) your `.fbx` or `.gltf` third-party model into Studio and [convert](#converting-layered-accessories) the asset to a clothing `Accessory` object that you can save to use in your experience, share with others, or upload to the Marketplace.
-The following asset example and instructions are part of the [Clothing accessory tutorial](../accessories/creating/index.md) which covers the process of converting a model from Blender to publishing the asset to the Marketplace.
+The following asset example and instructions are part of the [Clothing Accessory Tutorial](../accessories/creating/index.md) which covers the process of converting a model from Blender to publishing the asset to the Marketplace.
-## Import 3D assets
+## Importing 3D Assets
Studio's 3D Importer provides a quick and easy way to import third-party 3D assets into your projects. The importer provides object previews and error-checking to ensure that your asset meets Roblox's [general 3D requirements](../modeling/specifications.md).
-Keep in mind, your 3D layered accessory must also follow Roblox's [clothing specifications](../accessories/clothing-specifications.md) to eventually use this asset as a layered `Class.Accessory`, or you may experience errors later in the workflow.
+Keep in mind, your 3D layered accessory must also follow Roblox's [Clothing Specifications](../accessories/clothing-specifications.md) to eventually use this asset as a layered `Class.Accessory`, or you may experience errors later in the workflow.
To import your asset:
@@ -26,7 +26,7 @@ To import your asset:
3. Select **Import**. The asset populates in your workspace as a `Class.Model` with the appropriate textures applied as a `Class.SurfaceAppearance` or `Class.MeshPart.TextureID`.
-Manually add textures
+Manually adding textures
If textures didn't load correctly, add them manually. You may need to save and publish your experience in order to access the [Asset Manager](../../projects/assets/manager.md).
@@ -62,7 +62,7 @@ To import your asset:
After successful import, your model object should populate in your project as a `Class.Model` with the appropriate textures applied. See [3D Importer](../../art/modeling/3d-importer.md) for additional information on import settings and troubleshooting.
-## Convert layered accessories
+## Converting Layered Accessories
With the `Class.Model` in your project, the last step in the process of clothing creation requires you to use the Accessory Fitting Tool to convert this object to a standard `Class.Accessory` that avatar characters can equip.
@@ -70,7 +70,7 @@ To generate the accessory object:
1. In the Avatar tab, select the [**Accessory Fitting Tool**](../accessories/accessory-fitting-tool.md). The Accessory Fitting Tool panel displays on the left side of the workspace.
2. Select the `Class.Model` of the clothing item in the viewport. The tool's text field populates with the name of the object selected. Alternatively, you can select the object within the Explorer window.
-3. Test out various sample characters, clothing, and animations. See [Test accessories](../../art/accessories/accessory-fitting-tool.md#test-accessories) for additional information.
+3. Test out various sample characters, clothing, and animations. See [Testing Accessories](../../art/accessories/accessory-fitting-tool.md#testing-accessories) for additional information.
- If required, make minor cage adjustments using the editing features. Larger cage changes may require returning to your third-party modeling software and re-exporting the asset.
4. When ready to generate your accessory, click **Generate MeshPart Accessory**. The Accessory object with your model populates in your workspace.
For additional information and documentation on the tool, see [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md).
@@ -88,7 +88,7 @@ To generate the accessory object:
After successful fitting and converting, your 3D model should populate in your project as an `Class.Accessory`. With this `Class.Accessory` you can perform any of the following:
-- Begin the process of [uploading and publishing](../../marketplace/publish-to-marketplace.md#upload-an-asset) the clothing accessory to the Marketplace.
+- Begin the process of [uploading and publishing](../../marketplace/publishing-to-marketplace.md#uploading-an-asset) the clothing accessory to the Marketplace.
- Use the accessory in your current experience by equipping it to character models with [HumanoidDescription](../../characters/appearance.md#humanoiddescription), or by dragging and dropping the accessory under the appropriate character `Class.Model` object.
diff --git a/content/en-us/art/accessories/importing.md b/content/en-us/art/accessories/importing.md
index fea10a7d6..e9accda56 100644
--- a/content/en-us/art/accessories/importing.md
+++ b/content/en-us/art/accessories/importing.md
@@ -1,19 +1,19 @@
---
-title: Import rigid accessories
+title: Importing Rigid Accessories
description: Use the 3D Importer to add third-party models to Studio before using the Accessory Fitting Tool to convert the model to an Accessory.
---
-Use the following instructions to [import](#import-3d-assets) your `.fbx` or `.gltf` third-party model into Studio and [convert](#convert-rigid-accessories) the asset to an `Accessory` object that you can save to use in your experience, share with others, or upload to the Marketplace.
+Use the following instructions to [import](#importing-3d-assets) your `.fbx` or `.gltf` third-party model into Studio and [convert](#converting-rigid-accessories) the asset to an `Accessory` object that you can save to use in your experience, share with others, or upload to the Marketplace.
-The following asset example and instructions are part of the [Rigid accessory tutorial](../accessories/creating-rigid/index.md) which covers the process of converting a model from Blender to publishing the asset to the Marketplace.
+The following asset example and instructions are part of the [Rigid Accessory Tutorial](../accessories/creating-rigid/index.md) which covers the process of converting a model from Blender to publishing the asset to the Marketplace.
-## Import 3D assets
+## Importing 3D Assets
Studio's 3D Importer provides a quick and easy way to import third-party 3D assets into your projects. The importer provides object previews and error-checking to ensure that your asset meets Roblox's [general 3D requirements](../modeling/specifications.md).
-Keep in mind, the model that you intend to create as a rigid accessory must also follow Roblox's [accessory specifications](../accessories/specifications.md) to eventually use this asset as an `Class.Accessory`, or you may experience errors later in the workflow.
+Keep in mind, the model that you intend to create as a rigid accessory must also follow Roblox's [Accessory Specifications](../accessories/specifications.md) to eventually use this asset as an `Class.Accessory`, or you may experience errors later in the workflow.
To import your asset:
@@ -28,7 +28,7 @@ To import your asset:
3. Select **Import**. The asset populates in your workspace as a `Class.Model` with the appropriate textures applied as a `Class.SurfaceAppearance` or `Class.MeshPart.TextureID`.
-Manually add textures
+Manually adding textures
If textures didn't load correctly, add them manually. You may need to save and publish your experience in order to access the [Asset Manager](../../projects/assets/manager.md).
@@ -61,7 +61,7 @@ If textures didn't load correctly, add them manually. You may need to save and p
After successful import, your model object should populate in your project as a `Class.Model` with the appropriate textures applied. See [3D Importer](../../art/modeling/3d-importer.md) for additional information on import settings and troubleshooting.
-## Convert rigid accessories
+## Converting Rigid Accessories
After importing your asset into Studio, you can begin **fitting** your imported object to a mannequin and **converting** the `Class.Model` object into a `Class.Accessory`. When fitting and converting your accessory it's important to use the [**Accessory Fitting Tool (AFT)**](../accessories/accessory-fitting-tool.md) to correctly preview the placement and apply the correct configurations to your accessory.
@@ -98,7 +98,7 @@ To fit and generate your accessory:
After successful fitting and converting, your 3D model should populate in your project as an `Class.Accessory`. With this `Class.Accessory` you can perform any of the following:
-- Begin the process of [uploading and publishing](../../marketplace/publish-to-marketplace.md#upload-an-asset) the accessory to the Marketplace.
+- Begin the process of [uploading and publishing](../../marketplace/publishing-to-marketplace.md#uploading-an-asset) the accessory to the Marketplace.
- Use the accessory in your current experience by equipping it to character models with [HumanoidDescription](../../characters/appearance.md#humanoiddescription), or by dragging and dropping the accessory under the appropriate character `Class.Model` object.
diff --git a/content/en-us/art/accessories/index.md b/content/en-us/art/accessories/index.md
index 901e63b7a..1500a93b6 100644
--- a/content/en-us/art/accessories/index.md
+++ b/content/en-us/art/accessories/index.md
@@ -1,5 +1,5 @@
---
-title: Rigid accessories
+title: Rigid Accessories
description: Rigid accessories are basic 3D cosmetics users can equip and wear on their avatar character.
hideBreadcrumbs: true
---
@@ -22,13 +22,13 @@ To create a custom Roblox accessory for your own experience or to sell on the Ma
-## Components of a rigid accessory
+## Components of a Rigid Accessory
All accessory models are made up of the same base components of a [mesh object](#mesh-part), [textures](#textures), and [attachment](#attachments).
When [creating accessories](#creation-process), most of these components are created first in your modeling software, then converted to their appropriate Roblox Studio instance on import.
-### Mesh part
+### Mesh Part
Bow rigid accessory mesh object
@@ -64,10 +64,10 @@ In Studio, textures images are imported as image assets and are set to `Class.Me
Attachment points define where accessories attach to a character's body. In Studio, attachments are represented by `Class.Attachment` objects.
-## Creation process
+## Creation Process
Custom accessories are first created in 3D modeling programs, such as [Blender](https://www.blender.org/) or [Maya](https://www.autodesk.com/products/maya/overview), before importing the `.fbx` or `.gltf` model into Studio.
-To get started creating your first avatar asset, see the [avatar tutorials](../../avatar/tutorials.md).
+To get started creating your first avatar asset, see [Avatar Tutorials](../../avatar/tutorials.md).
Depending on the type of asset you are creating, the creation process follows these high-level workflows:
@@ -98,31 +98,31 @@ If you are interested in specific avatar creation topics, use the following tabl
[Fees and Commissions](../../marketplace/marketplace-fees-and-commissions.md)
diff --git a/content/en-us/art/accessories/layered-clothing.md b/content/en-us/art/accessories/layered-clothing.md
index 06a2247bd..fe751a9e3 100644
--- a/content/en-us/art/accessories/layered-clothing.md
+++ b/content/en-us/art/accessories/layered-clothing.md
@@ -1,5 +1,5 @@
---
-title: Layered clothing
+title: Layered Clothing
description: Layered clothing are cosmetic accessories that stretch, fit, and layer over any body type simulating real-life clothing.
hideBreadcrumbs: true
---
@@ -21,13 +21,13 @@ To create a custom Roblox accessory for your own experience or to sell on the Ma
Roblox also supports [classic clothing](#classic-clothing), 2D images that can be applied to your character's surface.
-## Components of a layered clothing accessory
+## Components of a Layered Clothing Accessory
All accessory models are made up of the same base components of a [mesh object](#mesh-part), [textures](#textures), and [attachment](#attachments). Layered clothing requires additional components, such as a [poseable rig](#rigging-armature), and an [inner and outer cage](#inner-and-outer-cages), to allow the asset to stretch, fit, and layer over a target character and existing clothing items.
When [creating accessories](#creation-process), all of the components are created first in your modeling software, then converted to their appropriate Roblox Studio instance on import.
-### Mesh part
+### Mesh Part
@@ -64,7 +64,7 @@ For layered clothing, the attachment point is used to associate with the correct
Attachments for clothing items are automatically generated in Studio using the [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md).
-### Rigging armature
+### Rigging Armature
To ensure natural movement of the clothing item, it must be weighted to a character rig
@@ -74,7 +74,7 @@ Attachments for clothing items are automatically generated in Studio using the [
A rigging armature defines how a layered asset can move with a character model. Using rigging and skinning techniques, you can set the areas of your clothes to move naturally with a character model's joints, such as ensuring a shirt sleeve correctly follows the movement of the elbow and shoulder. In Studio, this rigging and skinning data is saved to the mesh geometry.
-### Inner and outer cages
+### Inner and Outer Cages
The inner cage defines the inner surface of the clothing item where the clothes wrap over
@@ -84,7 +84,7 @@ A rigging armature defines how a layered asset can move with a character model.
Cage meshes indicate the inner and outer surfaces of a layered accessory. The inside cage of a t-shirt defines how the t-shirt stretches and fits over a character body. The outer cage of a t-shirt defines how additional layered clothing fit over the t-shirt. In Studio, these cages are represented by `Class.WrapLayer` objects.
-## Creation process
+## Creation Process
Custom accessories are first created in 3D modeling programs, such as [Blender](https://www.blender.org/) or [Maya](https://www.autodesk.com/products/maya/overview), before importing the `.fbx` or `.gltf` model into Studio.
To get started creating your first avatar asset, see [Avatar Tutorials](../../avatar/tutorials.md).
@@ -118,41 +118,41 @@ If you are interested in specific avatar creation topics, use the following tabl
[Fees and Commissions](../../marketplace/marketplace-fees-and-commissions.md)
-## Classic clothing
+## Classic Clothing
-Classic clothing assets are 2D images that you can apply to the surface of an avatar body as t-shirts, shirts, or pants. You can design these assets in any image processing software, test the textures in Studio, and then upload the designs to the Marketplace to sell. See [Classic clothing](../../art/accessories/classic-clothing.md) for more information on creating, uploading, and selling these assets.
+Classic clothing assets are 2D images that you can apply to the surface of an avatar body as t-shirts, shirts, or pants. You can design these assets in any image processing software, test the textures in Studio, and then upload the designs to the Marketplace to sell. See [Classic Clothing](../../art/accessories/classic-clothing.md) for more information on creating, uploading, and selling these assets.
diff --git a/content/en-us/art/accessories/project-files.md b/content/en-us/art/accessories/project-files.md
index c907a9f26..680e76420 100644
--- a/content/en-us/art/accessories/project-files.md
+++ b/content/en-us/art/accessories/project-files.md
@@ -1,5 +1,5 @@
---
-title: Accessory project files and references
+title: Accessory Project Files and References
description: Download various accessory-related project files and reference files.
---
@@ -10,7 +10,7 @@ See [Resources](../../avatar/resources.md) for a complete list of avatar-related
The following `.fbx`, `.blend`, and `.ma` project files are available to use as templates or as reference:
-
+
diff --git a/content/en-us/art/accessories/publish-eyebrows-eyelashes.md b/content/en-us/art/accessories/publishing-eyebrows-eyelashes.md
similarity index 87%
rename from content/en-us/art/accessories/publish-eyebrows-eyelashes.md
rename to content/en-us/art/accessories/publishing-eyebrows-eyelashes.md
index 188ae9294..4823a32ef 100644
--- a/content/en-us/art/accessories/publish-eyebrows-eyelashes.md
+++ b/content/en-us/art/accessories/publishing-eyebrows-eyelashes.md
@@ -1,5 +1,5 @@
---
-title: Publish bodies with eyelashes and eyebrows
+title: Publishing Bodies with Eyelashes and Eyebrows
description: Eyelashes and eyebrows are optional accessory items you can equip to an avatar to publish in the Marketplace.
---
@@ -20,13 +20,13 @@ Eyelashes and eyebrows are cosmetics that can help emphasize facial features and
-When publishing eyelashes and eyebrows, you must parent these `Class.Accessory` objects under the avatar character's `Class.Model` prior to uploading the character `Model` to the Marketplace. These `Accessory` face objects must adhere to Roblox's accessory requirements and include layered components such as caging, rigging, and skinning components. For an overview on creating your own eyelashes and eyebrows, see [Create face accessories](../../art/characters/facial-animation/create-face-accessories.md).
+When publishing eyelashes and eyebrows, you must parent these `Class.Accessory` objects under the avatar character's `Class.Model` prior to uploading the character `Model` to the Marketplace. These `Accessory` face objects must adhere to Roblox's accessory requirements and include layered components such as caging, rigging, and skinning components. For an overview on creating your own eyelashes and eyebrows, see [Creating Face Accessories](../../art/characters/facial-animation/creating-face-accessories.md).
-At this time, you can only bundle **eyelashes**, **eyebrows**, and **hair** with your body on Marketplace upload. Other facial accessories, such as horns, makeup, glitter, or other cosmetics are not acceptable. See [Marketplace policy](../../marketplace/marketplace-policy.md) for specific information on allowable cosmetics and other policy regulations and guidelines.
+At this time, you can only bundle **eyelashes**, **eyebrows**, and **hair** with your body on Marketplace upload. Other facial accessories, such as horns, makeup, glitter, or other cosmetics are not acceptable. See [Marketplace Policy](../../marketplace/marketplace-policy.md) for specific information on allowable cosmetics and other policy regulations and guidelines.
-## Configure eyelash and eyebrow accessories
+## Configuring Eyelash and Eyebrow Accessories
Use the following steps to import your face accessory and body assets into Studio. After converting the eyelashes and eyebrows to `Accessory` objects, parent the `Accessory` objects within the character `Model` before uploading the character to the Marketplace.
@@ -39,7 +39,7 @@ You can download reference `.fbx` models of [eyelashes](../../assets/art/referen
3. Select the appropriate **Accessory** > **Eyelash** or **Accessory** > **Eyebrow** asset type and click **Next**.
4. (Optional) Preview the fit of your face accessory.
- 1. If the face accessory was modeled on a specific character body, you may want to import that character body into Studio and use it as a mannequin in the Accessory fitting tool preview. See [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) for more information on adding custom characters.
+ 1. If the face accessory was modeled on a specific character body, you may want to import that character body into Studio and use it as a mannequin in the Accessory Fitting Tool preview. See [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) for more information on adding custom characters.
2. If using the provided reference body, you can continue to step 5.
5. Click **Generate MeshPart Accessory** to create your MeshPart.
6. **Repeat steps 2-5** for the other face accessory.
@@ -58,4 +58,4 @@ You can download reference `.fbx` models of [eyelashes](../../assets/art/referen
8. If required, rename the accessory objects to `EyelashAccessory` or `EyebrowAccessory` accordingly.
-9. Once you are ready to upload the avatar model with your face accessories, see [Upload an asset](../../marketplace/publish-to-marketplace.md#upload-an-asset) for instructions on uploading and publishing your avatar body with eyelashes and eyebrows to the Marketplace.
+9. Once you are ready to upload the avatar model with your face accessories, follow [Uploading an Asset](../../marketplace/publishing-to-marketplace.md#uploading-an-asset) for instructions on uploading and publishing your avatar body with eyelashes and eyebrows to the Marketplace.
diff --git a/content/en-us/art/accessories/rig-and-cage-existing-models.md b/content/en-us/art/accessories/rigging-and-caging-existing-models.md
similarity index 89%
rename from content/en-us/art/accessories/rig-and-cage-existing-models.md
rename to content/en-us/art/accessories/rigging-and-caging-existing-models.md
index 89167b125..a9336c5ea 100644
--- a/content/en-us/art/accessories/rig-and-cage-existing-models.md
+++ b/content/en-us/art/accessories/rigging-and-caging-existing-models.md
@@ -1,5 +1,5 @@
---
-title: Rigging and caging models (Blender)
+title: Rigging and Caging Models (Blender)
description: Convert a 3D model into a layered 3D model in Blender before importing and converting the model into Studio as an Accessory.
---
@@ -7,12 +7,12 @@ You can use a third party modeling tool, such as [Blender](https://www.blender.o
This guide covers the basic workflow for converting a 3D model into a layerable model in Blender using the following steps:
-1. [**Importing**](#import) a 3D asset into a template Blender project file.
-2. [**Parenting**](#parent-and-weight) the imported mesh object to the project file's armature rig with Blender's Automatic Weights feature.
- 1. Manual skinning is not covered, see [Skin a simple mesh](../modeling/skin-a-simple-mesh.md) for an overview of manual skinning.
-3. [**Editing**](#edit-inner-and-outer-cage-meshes) the Inner and Outer Cage meshes to represent the inner and outer surface of the model.
+1. [**Importing**](#importing) a 3D asset into a template Blender project file.
+2. [**Parenting**](#parenting-and-weighting) the imported mesh object to the project file's armature rig with Blender's Automatic Weights feature.
+ 1. Manual skinning is not covered, see [Skinning a Simple Mesh](../modeling/skinning-a-simple-mesh.md) for an overview of manual skinning.
+3. [**Editing**](#editing-inner-and-outer-cage-meshes) the Inner and Outer Cage meshes to represent the inner and outer surface of the model.
-A full list of asset requirements for a layered model can be found in [Layered model specifications](../../art/accessories/specifications.md).
+A full list of asset requirements for a layered model can be found in [Layered Model Specifications](../../art/accessories/specifications.md).
This guide uses Blender version 3.0. If you are
@@ -20,7 +20,7 @@ using another version of Blender, there may be minor differences in UI and
settings.
-## Import
+## Importing
Set up the project by opening the [rig template project](../../assets/modeling/meshes/reference-files/Rig_and_Attachments_Templates.zip) and importing the [sample accessory model](../../assets/accessories/reference-files/Tshirt-model.fbx).
@@ -43,12 +43,12 @@ To import and parent the accessory model:
-## Parent and weight
+## Parenting and Weighting
For this basic accessory, parent the imported mesh to the template mannequin armature using Blender's [Automatic Weights](https://docs.blender.org/manual/en/latest/animation/armatures/skinning/parenting.html#with-automatic-weights) feature. Parenting the accessory model mesh to the armature in this way enables the 3D model to move and deform naturally with the character in Studio.
-Complex clothing and accessory items with moving parts may require more precise skinning with Blender's Weight Painting or other skinning tools. See [Skin a simple mesh](../modeling/skin-a-simple-mesh.md) for an example of manual skinning.
+Complex clothing and accessory items with moving parts may require more precise skinning with Blender's Weight Painting or other skinning tools. See [Skinning a Simple Mesh](../modeling/skinning-a-simple-mesh.md) for an example of manual skinning.
To parent the mesh object with the mannequin armature:
@@ -67,7 +67,7 @@ To parent the mesh object with the mannequin armature:
-## Edit inner and outer cage meshes
+## Editing Inner and Outer Cage Meshes
After parenting and weighting your clothing item, you can start adding the cage meshes to your clothing to indicate the inner and outer surfaces of your clothing.
@@ -120,11 +120,11 @@ A finished outer cage should completely cover the accessory with minimal extra s
-When finished with the caging and modeling of your asset, see [Exporting requirements](../../art/modeling/export-requirements.md#blender) for details on exporting the model from Blender.
+When finished with the caging and modeling of your asset, see [Exporting Requirements](../../art/modeling/export-requirements.md#blender) for details on exporting the model from Blender.
-After exporting, see [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) and [Converting clothing accessories tutorial](../accessories/creating/converting.md) for instructions on importing and converting the model into a usable accessory.
+After exporting, see [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) and [Converting Clothing Accessories tutorial](../accessories/creating/converting.md) for instructions on importing and converting the model into a usable accessory.
-## Tips for editing cages
+## Tips for Editing Cages
The following tips may be helpful when manipulating your cage vertices:
diff --git a/content/en-us/art/accessories/specifications.md b/content/en-us/art/accessories/specifications.md
index e6e925bf8..e9ca289ea 100644
--- a/content/en-us/art/accessories/specifications.md
+++ b/content/en-us/art/accessories/specifications.md
@@ -1,5 +1,5 @@
---
-title: Rigid accessory specifications
+title: Rigid Accessory Specifications
description: Rigid accessory specifications lists the specific technical requirements for basic avatar accessories.
---
@@ -7,9 +7,9 @@ When creating rigid accessories for Roblox, it's important to meet specific tech
Although rigid accessories and layerable clothing accessories share many technical requirements, layerable accessories must include [additional components](../../art/accessories/clothing-specifications.md) to ensure the accessories deform and stretch appropriately on different body scales.
-If you are intending to publish and sell these assets on the Marketplace, there are additional [Marketplace policy](../../marketplace/marketplace-policy.md) standards that you must follow for any accessory or clothing item.
+If you are intending to publish and sell these assets on the Marketplace, there are additional [Marketplace Policy](../../marketplace/marketplace-policy.md) standards that you must follow for any accessory or clothing item.
-When ready to export, see [Export requirements](../../art/accessories/export-settings.md) for mesh export settings for Blender and Maya.
+When ready to export, see [Export Requirements](../../art/accessories/export-settings.md) for mesh export settings for Blender and Maya.
If creating other types of 3D models:
@@ -20,7 +20,7 @@ When ready to export, see [Export requirements](../../art/accessories/export-set
-## Geometry and budgets
+## Geometry and Budgets
- **Single Mesh** - Accessories must be a single mesh.
- **Budgets** - Accessories can't exceed **4k** triangles.
@@ -28,14 +28,14 @@ When ready to export, see [Export requirements](../../art/accessories/export-set
- Use **quads** whenever possible. Avoid faces with 5 or more sides.
- **Mesh Size** - Depending on the type of accessory asset, meshes must follow a standard size (in studs, centered on attachment point) depending on the [body scale](#body-scale) it is designed for.
-### Body scale
+### Body Scale
Roblox supports 3 types of body scales: `Classic`, `Normal`, and `Slender`. When designing your accessory, the size of your accessory cannot exceed the following sizes based on body scale and accessory asset type.
-See [Body scale](../accessories/body-scale.md) for more information on the different types of body proportions Roblox supports.
+See [Body Scale](../accessories/body-scale.md) for more information on the different types of body proportions Roblox supports.
-You can use tools like the [Accessory fitting tool](../../art/accessories/accessory-fitting-tool.md) to help visualize and adjust the scale of your mesh on a mannequin within a visualized boundary before uploading and publishing the asset.
+You can use tools like the [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) to help visualize and adjust the scale of your mesh on a mannequin within a visualized boundary before uploading and publishing the asset.
#### Classic
@@ -275,7 +275,7 @@ You can use tools like the [Accessory fitting tool](../../art/accessories/access
-### Attachment points
+### Attachment Points
`Class.Attachment` objects indicate where an accessory model attaches to a point on a character body. Whether you are creating rigid or [layered](./layered-clothing.md) accessories, Studio's [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) automatically adds and configures the appropriate `Class.Attachment` with the following specifications:
@@ -287,8 +287,8 @@ If setting or configuring attachments manually in Studio, use the following name
-
Accessory type
-
Attachment name
+
Accessory Type
+
Attachment Name
@@ -335,17 +335,17 @@ If setting or configuring attachments manually in Studio, use the following name
- Items using `RightShoulderAttachment` or `LeftShoulderAttachment` move with the character's arm.
- Items using `RightCollarAttachment` or `LeftCollarAttachment` do not move with the character's arm.
-## Layered properties
+## Layered Properties
-Accessories, such as clothing items, which stretch and fit around any character body type, must include additional configurations to achieve the layering effect. See [Clothing specifications](../../art/accessories/clothing-specifications.md) for specifications required to create layerable accessories.
+Accessories, such as clothing items, which stretch and fit around any character body type, must include additional configurations to achieve the layering effect. See [Clothing Specifications](../../art/accessories/clothing-specifications.md) for specifications required to create layerable accessories.
-## Marketplace requirements
+## Marketplace Requirements
Your items must meet the following requirements before you upload them to the Marketplace to sell:
- Rigid accessories that you intend to sell on the Marketplace require a `Class.SpecialMesh` and don't support [SurfaceAppearance](../../art/modeling/surface-appearance.md).
- - Use the [generate legacy accessory](./accessory-fitting-tool.md#generate-legacy-accessory) option when creating your accessory.
-- Ensure that your items adhere to the [Marketplace program guidelines](../../marketplace/marketplace-policy.md).
+ - Use the [Generate Legacy Accessory](./accessory-fitting-tool.md#generate-legacy-accessory) option when creating your accessory.
+- Ensure that your items adhere to the [Marketplace Program Guidelines](../../marketplace/marketplace-policy.md).
- Whenever applicable, ensure that your items adhere to Roblox's [custom mesh specifications](../../art/modeling/specifications.md).
- Object `Class.MeshPart.Material|Material` is set to `Plastic`.
- Object `Class.MeshPart.Transparency|Transparency` is set to 0.
diff --git a/content/en-us/art/accessories/validation-tool.md b/content/en-us/art/accessories/validation-tool.md
index ca7798b2f..47f2b1c60 100644
--- a/content/en-us/art/accessories/validation-tool.md
+++ b/content/en-us/art/accessories/validation-tool.md
@@ -18,7 +18,7 @@ The **Layered Clothing Validation Tool** is a supplemental tool you can install
While this tool can save you time in the typical iteration process between your 3D modeling program and Studio, the tool doesn't provide comprehensive verification of all aspects of layered clothing assets. You must ensure your layered clothing model meets both the [general mesh requirements](../../art/modeling/specifications.md) and Roblox-specific [layered clothing requirements](../../art/accessories/specifications.md#layered-requirements) prior to importing it into Studio.
-## Install the Clothing Validation Tool
+## Installing the Validation Tool
There are two separate installation files and instructions for Blender and Maya.
@@ -104,7 +104,7 @@ To install the Clothing Validation Tool in Maya:
-## Validate assets
+## Validating Assets
With the plugin active and a layered asset in your workspace, you can begin validating content. After the check, results with issues change to **red** (Blender) or **yellow** (Maya). You can resolve some failed checks by clicking the check button. See [Checks and Troubleshooting Steps](#checks-and-troubleshooting-steps) for details on each validation check.
@@ -129,7 +129,7 @@ To use the Validation Tool on your asset:
This Validation Tool only checks for common clothing creation issues. Ensure your layered clothing model meets both the [general mesh specifications](../../art/modeling/specifications.md) and Roblox-specific [layered clothing specifications](../../art/accessories/specifications.md#layered-requirements) before uploading to Studio.
-## Checks and troubleshooting steps
+## Checks and Troubleshooting Steps
Refer to the table below for details on the specific checks and troubleshooting steps:
diff --git a/content/en-us/art/characters/creating/blender-configurations.md b/content/en-us/art/characters/creating/blender-configurations.md
index 93359d630..6534c09fe 100644
--- a/content/en-us/art/characters/creating/blender-configurations.md
+++ b/content/en-us/art/characters/creating/blender-configurations.md
@@ -1,5 +1,5 @@
---
-title: Blender configuration
+title: Blender Configuration
description: Roblox avatar template projects have several helper configurations and settings to help expedite the character creation process.
next: /art/characters/creating/modeling-best-practices
prev: /art/characters/creating/head-objects
@@ -28,7 +28,7 @@ The following is a breakdown of what is included in each Blender template file:
width="800" />Blender Project Hierarchy
-### Disabled objects
+### Disabled Objects
When using the template project files for Blender, you might notice some objects, like attachment objects, are permanently hidden in the Viewport even when toggling the **Hide In Viewport** icon . Since attachment objects are often not modified until the end of the character creation process, these objects have **Disable In Viewport** enabled to make the organization of your project more efficient, especially when bulk toggling object visibility.
@@ -45,7 +45,7 @@ If you need access to disabled objects, use the following instructions to access
3. The **Disable In Viewport** icon now appears next to every object in the Outliner. Toggle the icon to change the Disabled status for your objects.
-### Custom skin tones
+### Custom Skin Tones
The Blender project files include a shader configuration that allows you to preview custom skin tones, similar to how they display in Roblox if users customize their skin tones.
@@ -57,7 +57,7 @@ Textures with full or partial transparency allow the underlying `Class.Part.Colo
The same avatar character using the same texture map. Each model has different underlying part colors except where the texture map applies a full color.
-#### Preview skin tones
+#### Previewing Skin Tones
You must use **Blender 3.4+** to ensure that the helper shader configurations render correctly. If you are using a previous version of Blender, textures may not render as expected.
@@ -83,16 +83,16 @@ To preview your character's skin tone in Blender:
src="../../../assets/art/avatar/basic-creation/Color_Picker_01.mp4"
width="100%">
-#### Export setup
+#### Export Setup
While the skin tone preview is a critical element to verifying your templates color and tone compatibility in Roblox, it prevents your color texture map from automatically being packaged with the final `.fbx` file. There are two ways to resolve this before exporting your model:
1. In the Shading tab, disconnect the **Mix** node and replace it with the **ColorMap** node.
2. Export your textures manually as separate image files and add them later in Studio.
-For instructions on how to perform either export workflow, see [Export textures](../../../art/characters/creating/export-textures.md).
+For instructions on how to perform either export workflow, see [Exporting Textures](../../../art/characters/creating/exporting-textures.md).
-### Scene scale
+### Scene Scale
You can skip this section if you are using the Blender downloadable templates. The `.blend` versions of the templates which already contain many of the project settings required when setting up a Blender project configuration.
@@ -112,7 +112,7 @@ Alternatively, you can modify your scaling when exporting your files:
2. Set **Transform** > **Scale** to `.01`.
-### Animation range
+### Animation Range
You can skip this section if you are using the Blender downloadable templates. The `.blend` versions of the templates which already contain many of the project settings required when setting up a Blender project configuration.
diff --git a/content/en-us/art/characters/creating/caging.md b/content/en-us/art/characters/creating/caging.md
index 93eef9f0c..3363bdea6 100644
--- a/content/en-us/art/characters/creating/caging.md
+++ b/content/en-us/art/characters/creating/caging.md
@@ -1,7 +1,7 @@
---
-title: Caging character head
+title: Caging
description: Cage your avatar characters in Blender to support layerable accessories and clothing.
-next: /art/characters/creating/combine-head-geometry
+next: /art/characters/creating/combining-head-geometry
prev: /art/characters/creating/texturing-pbr
---
diff --git a/content/en-us/art/characters/creating/combine-head-geometry.md b/content/en-us/art/characters/creating/combining-head-geometry.md
similarity index 86%
rename from content/en-us/art/characters/creating/combine-head-geometry.md
rename to content/en-us/art/characters/creating/combining-head-geometry.md
index 0138bd835..85d8c98a3 100644
--- a/content/en-us/art/characters/creating/combine-head-geometry.md
+++ b/content/en-us/art/characters/creating/combining-head-geometry.md
@@ -1,7 +1,7 @@
---
-title: Combine head geometry
+title: Combining Head Geometry
description: When creating characters in Blender, you must combine the head geometry to a single object.
-next: /art/characters/creating/remove-extra-bones
+next: /art/characters/creating/removing-extra-bones
prev: /art/characters/creating/caging
---
@@ -13,10 +13,10 @@ Whenever you are ready to export your model, it's important to clean up your pro
- Final technical checks
-Failure to combine head geometry and [remove head bones](../../characters/creating/remove-extra-bones.md) will cause issues with validation, as the character will no longer adhere to the expected R15 geometry and joint hierarchy.
+Failure to combine head geometry and [remove head bones](../../characters/creating/removing-extra-bones.md) will cause issues with validation, as the character will no longer adhere to the expected R15 geometry and joint hierarchy.
-## Combine head geometry
+## Combining Head Geometry
At this point, you should also combine the separate head and face objects within the single Head_Geo object. Some templates don't include some face objects, like lashes. To combine the head and face meshes:
diff --git a/content/en-us/art/characters/creating/export-character.md b/content/en-us/art/characters/creating/exporting-character.md
similarity index 82%
rename from content/en-us/art/characters/creating/export-character.md
rename to content/en-us/art/characters/creating/exporting-character.md
index f86f20bed..cd42c729c 100644
--- a/content/en-us/art/characters/creating/export-character.md
+++ b/content/en-us/art/characters/creating/exporting-character.md
@@ -1,11 +1,11 @@
---
-title: Export character model
+title: Exporting Character Model
description: Export your character model from Blender using the correct settings and processes.
prev: /art/characters/creating/exporting-textures
---
-It's important to test your assets multiple times at every point of the asset creation process, whether it is within Blender or after importing into Studio. See [Test characters](../../../art/characters/testing/index.md) for more information.
+It's important to test your assets multiple times at every point of the asset creation process, whether it is within Blender or after importing into Studio. See [Testing Characters](../../../art/characters/testing/index.md) for more information.
Whether you are exporting your character for testing, or are performing a final export out of Blender, you must apply the appropriate export settings to ensure that Blender exports the proper character data.
@@ -24,7 +24,7 @@ To export your character:
-After exporting your .fbx file, see [Test characters](../../../art/characters/testing/index.md) In Studio for steps on importing your character model into a test place and verifying your avatar and related components.
+After exporting your .fbx file, see [Testing Characters](../../../art/characters/testing/index.md) In Studio for steps on importing your character model into a test place and verifying your avatar and related components.
diff --git a/content/en-us/art/characters/creating/export-textures.md b/content/en-us/art/characters/creating/exporting-textures.md
similarity index 84%
rename from content/en-us/art/characters/creating/export-textures.md
rename to content/en-us/art/characters/creating/exporting-textures.md
index 0970ecff7..546090e1a 100644
--- a/content/en-us/art/characters/creating/export-textures.md
+++ b/content/en-us/art/characters/creating/exporting-textures.md
@@ -1,24 +1,24 @@
---
-title: Export textures
+title: Exporting Textures
description: Export your character textures from Blender using the correct settings and processes.
-next: /art/characters/creating/export-character
+next: /art/characters/creating/exporting-character
prev: /art/characters/creating/final-checks
---
-It's important to test your assets multiple times at every point of the asset creation process, whether it is within Blender or after importing into Studio. See [Test characters](../../../art/characters/testing/index.md) for more information.
+It's important to test your assets multiple times at every point of the asset creation process, whether it is within Blender or after importing into Studio. See [Testing Characters](../../../art/characters/testing/index.md) for more information.
Whether you are exporting your character for testing, or are performing a final export out of Blender, you must apply the appropriate export settings to ensure that Blender exports the proper character data.
-## Export textures
+## Exporting Textures
Including the default PBR textures, your template character includes four separate image maps that make up its surface appearance. Depending on your workflow, you can choose to embed the image maps to your export file or export the textures separately as image files. Both methods have advantages:
-- [Embedding textures](#embed-textures) simplifies your export by packing all of your textures within the single `.fbx` file.
-- [Exporting texture images](#export-textures) directly allows you direct access to the image textures, so you can test and swap them more quickly.
+- [Embedding textures](#embedding-textures) simplifies your export by packing all of your textures within the single `.fbx` file.
+- [Exporting texture images](#exporting-textures) directly allows you direct access to the image textures, so you can test and swap them more quickly.
-### Embed textures
+### Embedding Textures
Embedding the texture maps to your `.fbx` export can simplify the Blender export and Studio import process. When embedding your textures with Roblox's template files, you need to make a quick adjustment to custom skin tone shader nodes in the Blender file.
@@ -43,7 +43,7 @@ To prepare your textures to embed with export:
-### Unpack image files
+### Unpacking Image Files
As an alternative to embedding textures, you can export your texture files as separate `.png` image files, which allows you to quickly access and swap image texture maps.
diff --git a/content/en-us/art/characters/creating/final-checks.md b/content/en-us/art/characters/creating/final-checks.md
index a720a239f..80464dcfb 100644
--- a/content/en-us/art/characters/creating/final-checks.md
+++ b/content/en-us/art/characters/creating/final-checks.md
@@ -1,8 +1,8 @@
---
-title: Final checks
+title: Final Checks
description: Before exporting, verify that your model meets Studio's requirements.
-next: /art/characters/creating/export-textures
-prev: /art/characters/creating/verify-attachments
+next: /art/characters/creating/exporting-textures
+prev: /art/characters/creating/verifying-attachments
---
Depending on the types of customizations you made to your template project or model, the following are additional tasks to look out for when cleaning up your project:
diff --git a/content/en-us/art/characters/creating/head-objects.md b/content/en-us/art/characters/creating/head-objects.md
index 1fd199543..dcc2806dc 100644
--- a/content/en-us/art/characters/creating/head-objects.md
+++ b/content/en-us/art/characters/creating/head-objects.md
@@ -1,5 +1,5 @@
---
-title: Template head structure
+title: Template Head Structure
description: Each Roblox avatar template contains modular separate pieces that must later be combined or removed.
next: /art/characters/creating/blender-configurations
prev: /art/characters/creating/template-files
@@ -7,7 +7,7 @@ prev: /art/characters/creating/template-files
In each template file, each avatar body includes extra head mesh objects and face armature bones. Separating these objects within the templates allow you to make easier changes to each of these separate objects, as demonstrated during the texturing step.
-To avoid validation errors, you must [join](../../../art/characters/creating/combine-head-geometry.md) and [remove](../../../art/characters/creating/remove-extra-bones.md) these extra objects during the cleanup process prior to exporting.
+To avoid validation errors, you must [join](../../../art/characters/creating/combining-head-geometry.md) and [remove](../../../art/characters/creating/removing-extra-bones.md) these extra objects during the cleanup process prior to exporting.
The extra head mesh objects are the following:
diff --git a/content/en-us/art/characters/creating/index.md b/content/en-us/art/characters/creating/index.md
index 72ac1f956..28355abd4 100644
--- a/content/en-us/art/characters/creating/index.md
+++ b/content/en-us/art/characters/creating/index.md
@@ -1,5 +1,5 @@
---
-title: Create with templates
+title: Creating with Templates
description: Use Roblox's supplied template models to create your own unique avatar character in Blender.
next: /art/characters/creating/template-files
---
@@ -16,7 +16,7 @@ This tutorial is intended for creators of all skill levels with moderate Blender
6. Exporting your asset for use or testing in Studio
- Starting template model
+ Starting Template ModelExample model after modifications
diff --git a/content/en-us/art/characters/creating/modeling-best-practices.md b/content/en-us/art/characters/creating/modeling-best-practices.md
index fcc75319a..babd9a6cb 100644
--- a/content/en-us/art/characters/creating/modeling-best-practices.md
+++ b/content/en-us/art/characters/creating/modeling-best-practices.md
@@ -1,5 +1,5 @@
---
-title: Modeling best practices
+title: Modeling Best Practices
description: Understand important modeling concepts to prevent major issues before any modeling steps.
next: /art/characters/creating/modeling-tips
prev: /art/characters/creating/blender-configurations
@@ -19,7 +19,7 @@ By understanding how to make non-destructive sculpting changes to the head, the
When editing templates, **don't delete or add vertices to your character body**. This ensures that your character's skinning and facial animation data remains unaltered and fully functional. See [Best Practices](#best-practices) for additional information on customizing your character body without breaking the underlying structure of the avatar template.
-## Non-destructive modeling
+## Non-Destructive Modeling
Non-destructive modeling means using a process that doesn't alter the physical shape or construction of the base mesh object. When modifying a template model, don't use tools or functions that delete or add vertices to your meshes. Instead, use Blender's sculpting tools to alter the shape of your character by **only changing the position of existing vertices**. This ensures that vertices and faces that have skinning or animation data associated with them retain that important character data.
@@ -27,7 +27,7 @@ Non-destructive modeling means using a process that doesn't alter the physical s
Extreme geometric changes, even if the vertices are not deleted, can still adversely affect your rigging and skinning. It's important to choose a starting template file close to your final design and to make consistent and proportional changes when sculpting.
-## Edge flow
+## Edge Flow
Edge flow is a common modeling concept of ensuring that the vertices of your model naturally follow the organic curvature of your model's shape. When making changes to your model's topography, you should maintain a natural edge flow by ensuring that your vertices remain a proportionate distance from each other and follow the common muscle groups and contours of your model.
@@ -36,8 +36,8 @@ Even when maintaining edge flow, you should avoid sculpting certain regions of t
-
Round head region
-
Edge flow notes
+
Round Head Region
+
Edge Flow Notes
diff --git a/content/en-us/art/characters/creating/modeling-tips.md b/content/en-us/art/characters/creating/modeling-tips.md
index 8426bb977..68042a801 100644
--- a/content/en-us/art/characters/creating/modeling-tips.md
+++ b/content/en-us/art/characters/creating/modeling-tips.md
@@ -1,5 +1,5 @@
---
-title: Modeling tips
+title: Modeling Tips
description: Use these Blender modeling tips to expedite your character creation.
next: /art/characters/creating/sculpting
prev: /art/characters/creating/modeling-best-practices
@@ -7,7 +7,7 @@ prev: /art/characters/creating/modeling-best-practices
There are many tips and tricks during the modeling process that can save you time and prevent major issues in your workflow. There are many resources online that can help you make your modeling process more efficient. The following are various beginner-friendly tips and settings in Blender that allow you to visualize and configure objects efficiently in your project.
-### Hide inactive objects
+### Hiding Inactive Objects
In your Outliner, hide objects you aren't editing by enabling the **Hide In Viewport** icon . This cleans up your workspace and helps ensure you don't make unintentional changes to another object or collection.
@@ -16,7 +16,7 @@ You can quickly bulk hide and unhide any parent and child objects that are not [
1. In the Outliner, navigate to a parent object, such as **Cage** or **Joints**.
2. Hold Shift and click the **Hide In Viewport** icon to toggle the object's visibility.
-### Enable wireframe view
+### Enable Wireframe View
Whenever you use a modeling application, switch between different viewport options, like X-Ray and Wireframe, to gain a better perspective on your vertices and shapes. This tutorial uses a wireframe view over the mesh shape, and many examples use various material settings and viewport options.
diff --git a/content/en-us/art/characters/creating/remove-extra-bones.md b/content/en-us/art/characters/creating/removing-extra-bones.md
similarity index 82%
rename from content/en-us/art/characters/creating/remove-extra-bones.md
rename to content/en-us/art/characters/creating/removing-extra-bones.md
index f45a8b8ad..caed4ce10 100644
--- a/content/en-us/art/characters/creating/remove-extra-bones.md
+++ b/content/en-us/art/characters/creating/removing-extra-bones.md
@@ -1,14 +1,14 @@
---
-title: Remove extra bones
+title: Removing Extra Bones
description: When creating characters in Blender, you must remove the extra head bones included in the template.
-next: /art/characters/creating/verify-attachments
-prev: /art/characters/creating/combine-head-geometry
+next: /art/characters/creating/verifying-attachments
+prev: /art/characters/creating/combining-head-geometry
---
The helper bones used to help place the head geometries also require removal to validate correctly. While these extra bones do not include any skinning data, do not delete any of the facial animation bones parented within DynamicHead, as these include important skinning data that drives facial animation.
-Failure to [combine head geometry](../../characters/creating/combine-head-geometry.md) and remove head bones will cause issues with validation, as the character will no longer adhere to the expected R15 geometry and joint hierarchy.
+Failure to [combine head geometry](../../characters/creating/combining-head-geometry.md) and remove head bones will cause issues with validation, as the character will no longer adhere to the expected R15 geometry and joint hierarchy.
Remove the additional head bones by selecting them and deleting them in edit mode:
diff --git a/content/en-us/art/characters/creating/sculpting.md b/content/en-us/art/characters/creating/sculpting.md
index 77ecaa361..1aafa6640 100644
--- a/content/en-us/art/characters/creating/sculpting.md
+++ b/content/en-us/art/characters/creating/sculpting.md
@@ -1,5 +1,5 @@
---
-title: Sculpt the head
+title: Sculpting the Head
description: Use Blender's sculpting tools to make unique changes to the shape of your character.
next: /art/characters/creating/texturing-setup
prev: /art/characters/creating/modeling-tips
diff --git a/content/en-us/art/characters/creating/template-files.md b/content/en-us/art/characters/creating/template-files.md
index e2eefb1bd..4542fff20 100644
--- a/content/en-us/art/characters/creating/template-files.md
+++ b/content/en-us/art/characters/creating/template-files.md
@@ -1,5 +1,5 @@
---
-title: Template files
+title: Template Files
description: Roblox provides template models to create your own unique avatar character in Blender.
next: /art/characters/creating/head-objects
prev: /art/characters/creating/
@@ -10,15 +10,15 @@ Each template comes pre-baked with the [necessary components of an avatar charac
-
Template prototype
+
Template Prototype
-
Sample customizations
+
Sample Customizations
-
Muzzle head template
+
Muzzle Head Template
@@ -28,7 +28,7 @@ Each template comes pre-baked with the [necessary components of an avatar charac
-
Round head template
+
Round Head Template
diff --git a/content/en-us/art/characters/creating/texturing-eyes.md b/content/en-us/art/characters/creating/texturing-eyes.md
index 20677092c..1efaa0c48 100644
--- a/content/en-us/art/characters/creating/texturing-eyes.md
+++ b/content/en-us/art/characters/creating/texturing-eyes.md
@@ -1,5 +1,5 @@
---
-title: Texturing eyes
+title: Texturing Eyes
description: Use Blender's texture painting tools to apply a custom surface appearance on your character's eyes.
next: /art/characters/creating/texturing-face
prev: /art/characters/creating/texturing-setup
diff --git a/content/en-us/art/characters/creating/texturing-face.md b/content/en-us/art/characters/creating/texturing-face.md
index c478a4ea6..1b9704d99 100644
--- a/content/en-us/art/characters/creating/texturing-face.md
+++ b/content/en-us/art/characters/creating/texturing-face.md
@@ -1,5 +1,5 @@
---
-title: Texturing face
+title: Texturing Face
description: Use Blender to apply a custom surface appearance on your character's face.
next: /art/characters/creating/texturing-pbr
prev: /art/characters/creating/texturing-eyes
diff --git a/content/en-us/art/characters/creating/texturing-pbr.md b/content/en-us/art/characters/creating/texturing-pbr.md
index 41e07c4d3..48b7dd818 100644
--- a/content/en-us/art/characters/creating/texturing-pbr.md
+++ b/content/en-us/art/characters/creating/texturing-pbr.md
@@ -1,5 +1,5 @@
---
-title: PBR textures (optional)
+title: PBR Textures (Optional)
description: PBR textures are high-definition texture maps that can elevate your custom characters.
next: /art/characters/creating/caging
prev: /art/characters/creating/texturing-face
@@ -13,4 +13,4 @@ Physically-based rendering (PBR) textures use multiple texture maps to define ho
PBR textures allow for virtually any type of material surface, such as leather and denim.
-Although each template includes PBR textures, for the purpose of demonstrating the basic texturing process within Blender, this tutorial doesn't cover the PBR texturing process. For more information and references on advanced texturing, see [PBR textures](../../../art/modeling/surface-appearance.md).
+Although each template includes PBR textures, for the purpose of demonstrating the basic texturing process within Blender, this tutorial doesn't cover the PBR texturing process. For more information and references on advanced texturing, see [PBR Textures](../../../art/modeling/surface-appearance.md).
diff --git a/content/en-us/art/characters/creating/texturing-setup.md b/content/en-us/art/characters/creating/texturing-setup.md
index 1993c2a12..c7330e256 100644
--- a/content/en-us/art/characters/creating/texturing-setup.md
+++ b/content/en-us/art/characters/creating/texturing-setup.md
@@ -1,5 +1,5 @@
---
-title: Texturing setup
+title: Texturing Setup
description: Set up Blender to optimize your project for texturing the eyes and face of your template.
next: /art/characters/creating/texturing-eyes
prev: /art/characters/creating/sculpting
@@ -13,7 +13,7 @@ prev: /art/characters/creating/sculpting
Model after texturing
-Each template comes with a color texture map, which you can alter and modify using Blender's texture editing tools. Since most Roblox avatars can take advantage of custom skin tones, it's important to understand how to [preview custom skin tones](../../../art/characters/creating/index.md#preview-skin-tones) in Blender to verify how your final asset will look in a Roblox experience.
+Each template comes with a color texture map, which you can alter and modify using Blender's texture editing tools. Since most Roblox avatars can take advantage of custom skin tones, it's important to understand how to [preview custom skin tones](../../../art/characters/creating/index.md#previewing-skin-tones) in Blender to verify how your final asset will look in a Roblox experience.
For the purpose of demonstrating the basic texturing process, this tutorial goes over basic texture painting setup, applies a completely opaque texture over parts of the character eyes, and partially opaque details over the face. You can apply these same techniques to other parts of your character geometry.
@@ -21,7 +21,7 @@ For the purpose of demonstrating the basic texturing process, this tutorial goes
When texturing parts of your character model's body, ensure that your character model includes a modesty layer over sensitive regions. See [Community Standards](../../../marketplace/marketplace-policy.md) for more information on Roblox's policies.
-## Set texture resolution
+## Setting Texture Resolution
Roblox Studio supports a texture resolution of **1024 x 1024** for albedo texture maps. When using applications like Blender or Maya to texture paint directly on a model, extremely fine details may not paint as expected due to the resolution and level of detail of the painting.
diff --git a/content/en-us/art/characters/creating/verify-attachments.md b/content/en-us/art/characters/creating/verifying-attachments.md
similarity index 96%
rename from content/en-us/art/characters/creating/verify-attachments.md
rename to content/en-us/art/characters/creating/verifying-attachments.md
index f290d2f84..ba81a9dbb 100644
--- a/content/en-us/art/characters/creating/verify-attachments.md
+++ b/content/en-us/art/characters/creating/verifying-attachments.md
@@ -1,8 +1,8 @@
---
-title: Verify attachment placement
+title: Verifying Attachment Placement
description: When creating characters in Blender, the character model requires minor attachment adjustments to be Studio-ready.
next: /art/characters/creating/final-checks
-prev: /art/characters/creating/remove-extra-bones
+prev: /art/characters/creating/removing-extra-bones
---
Attachment points are non-rendered objects of your avatar where rigid accessories attach to. Each template includes the required attachments at their expected locations ending with **\_Att**. Before exporting, it's important to verify the attachment position and, if necessary, adjust the location if you made any changes to the shape of your model.
diff --git a/content/en-us/art/characters/export-settings.md b/content/en-us/art/characters/export-settings.md
index 27c6d72cf..a15f7d8de 100644
--- a/content/en-us/art/characters/export-settings.md
+++ b/content/en-us/art/characters/export-settings.md
@@ -1,5 +1,5 @@
---
-title: Character body export settings
+title: Character Body Export Settings
description: Use the appropriate export settings in Maya and Blender to generate Studio-ready .fbx files.
---
@@ -12,7 +12,7 @@ Check that your model meets Roblox's [avatar character specifications](../../art
- If you are creating a generic mesh, ensure that your model follows Roblox's [general specifications](../../art/modeling/specifications.md) and use the [general export settings](../../art/modeling/export-requirements.md).
-If you are using Roblox's avatar template files, you must perform the [cleanup steps](../../art/characters/creating/combine-head-geometry.md) in order for the assets to properly validate.
+If you are using Roblox's avatar template files, you must perform the [cleanup steps](../../art/characters/creating/combining-head-geometry.md) in order for the assets to properly validate.
@@ -41,7 +41,7 @@ To export the `.fbx` file in Blender:
7. Click the **Export FBX** button.
-8. After exporting, use Studio's [3D importer](../../art/modeling/3d-importer.md) to import your model. See [Test characters in Studio](../../art/characters/testing/studio.md) for additional importing and testing information
+8. After exporting, use Studio's [3D Importer](../../art/modeling/3d-importer.md) to import your model. See [Testing Characters in Studio](../../art/characters/testing/studio.md) for additional importing and testing information
@@ -60,7 +60,7 @@ To export a mesh in Maya as a `.fbx` file:
- Navigate to **FBX File Format**, then set the **Type** property to **Binary**, and the **Version** property to **FBX 2020**.
9. Click the **Export All** button.
-10. After exporting, use Studio's [3D importer](../../art/modeling/3d-importer.md) to import your model. See [Test characters in Studio](../../art/characters/testing/studio.md) for additional importing and testing information.
+10. After exporting, use Studio's [3D Importer](../../art/modeling/3d-importer.md) to import your model. See [Testing Characters in Studio](../../art/characters/testing/studio.md) for additional importing and testing information
diff --git a/content/en-us/art/characters/export-avatar-animations-from-maya.md b/content/en-us/art/characters/exporting-avatar-animations-from-maya.md
similarity index 98%
rename from content/en-us/art/characters/export-avatar-animations-from-maya.md
rename to content/en-us/art/characters/exporting-avatar-animations-from-maya.md
index 6b77eac43..ccfed7ad8 100644
--- a/content/en-us/art/characters/export-avatar-animations-from-maya.md
+++ b/content/en-us/art/characters/exporting-avatar-animations-from-maya.md
@@ -1,5 +1,5 @@
---
-title: Export avatar animations from Maya
+title: Exporting Avatar Animations from Maya
description: Explains the process for exporting avatar animations from Maya.
---
@@ -20,11 +20,11 @@ description: Explains the process for exporting avatar animations from Maya.
This guide uses a downloadable [R15-Mannequin-Rig.ma](../../assets/animation/exporting-avatar-animations-from-maya/R15-Mannequin-Rig.ma) file that contains an R15 mannequin that you can use as a reference to create and export animations. If you choose to animate on your own R15 rig, the same rig configuration and export settings apply.
-## Configure the rig
+## Configuring the Rig
Before you export your avatar animation from Maya, you must configure your rig to be compatible with Studio's import requirements, including making sure that the rig follows a specific hierarchy and naming conventions so that Studio is able to recognize the file as an avatar animation, and that the rig's translation channel is muted so that the root node doesn't move with the animation.
-### Hierarchy and naming conventions
+### Hierarchy and Naming Conventions
Studio requires a specific hierarchy and naming conventions for a humanoid rig's internal joint structure so that it can recognize what you're importing as an avatar animation. If you aren't using the downloadable R15 mannequin reference rig to create your animations, make sure your rig uses the following joint hierarchy and naming convention exactly as it is:
@@ -46,7 +46,7 @@ Studio requires a specific hierarchy and naming conventions for a humanoid rig's
- RightLowerLeg
- RightFoot
-### Mute the translation channel
+### Muting the Translation Channel
Roblox avatar animations cannot move a character when they play; instead, avatar animations animate rigs at their world position. If your avatar animation is a locomotion-type of animation where the root node moves in space, such as a character that moves forward as their walk animation plays, you must mute the rig's translation channel so that the animation plays without moving the rig on export.
@@ -78,7 +78,7 @@ To mute the translation channel:
When you play the animation, the character's root node doesn't move in space anymore, and the character animates in place at the origin of the scene.
-## Export the animation
+## Exporting the Animation
Now that your rig animates in place and has a hierarchy and naming data that is compatible with Studio, you can export the animation into a `.fbx` format. Maya doesn't load this capability by default, so you need to enable an FBX plugin to gain the additional settings necessary to export the file in a format Studio can recognize.
@@ -123,7 +123,7 @@ To export your avatar animation from Maya:
1. In the bottom right corner, click the **Export All** button. After a moment, the avatar animation `.fbx` file displays in your file browser.
-## Test the animation in Studio
+## Testing the Animation in Studio
Once you have your avatar animation `.fbx` file, you can test it within Studio to make sure that the animation plays without any errors.
diff --git a/content/en-us/art/characters/facial-animation/animate-heads.md b/content/en-us/art/characters/facial-animation/animating-heads.md
similarity index 86%
rename from content/en-us/art/characters/facial-animation/animate-heads.md
rename to content/en-us/art/characters/facial-animation/animating-heads.md
index 00e9994e8..203938a2e 100644
--- a/content/en-us/art/characters/facial-animation/animate-heads.md
+++ b/content/en-us/art/characters/facial-animation/animating-heads.md
@@ -1,12 +1,12 @@
---
-title: Animate heads
+title: Animating Heads
description: You can create facial animations for a character with live heads using the Animation Editor.
---
-You can use the [Animation Editor](../../../animation/editor.md) to animate supported heads in the following ways:
+You can utilize the [Animation Editor](../../../animation/editor.md) to animate supported heads in the following ways:
-- You can manually set values to each facial pose on separate [animation tracks](#use-animation-tracks).
-- You can use the [Face Animation Editor](#use-the-face-animation-editor) to access facial sliders that let you quickly create and save unique expressions on the timeline.
+- You can manually set values to each facial pose on separate [animation tracks](#using-animation-tracks).
+- You can use the [Face Animation Editor](#using-the-face-animation-editor) to access facial sliders that let you quickly create and save unique expressions on the timeline.
- You can use the [Animation Capture for Faces](../../../animation/capture.md#face) extension to automatically track and record facial movements with a webcam that converts your movement into keyframes on the timeline.
In all methods, creating and combining multiple facial expressions over a duration of time results in a face animation. Since you cannot import face animations, these methods are the only ways to create and utilize them.
@@ -15,15 +15,15 @@ After you create and publish a head that supports facial animation to Roblox, yo
-## Create animations
+## Creating Animations
-After you have [opened](../../../animation/editor.md#open-the-animation-editor) the Animation Editor and selected the character model with a head you want to create an animation for, you can either create a head animation by using animation tracks or the Face Animation Editor.
+After you have [opened](../../../animation/editor.md#opening-the-animation-editor) the Animation Editor and selected the character model with a head you want to create an animation for, you can either create a head animation by using animation tracks or the Face Animation Editor.
For details on using Animation Capture to track facial movement as keyframes, see [Animation Capture - Face](../../../animation/capture.md#face).
-### Use animation tracks
+### Using Animation Tracks
-Similar to inserting other objects like `Class.MeshPart|MeshParts` or `Class.Bone|Bones` as animation tracks, you can manually add one FACS value at a time to the track list to manipulate a single body part, such as the character's eyes, jaw, or tongue. The [Animation Editor](../../../animation/editor.md) represents FACS values as a percentage between 0 and 1, and these values map directly to `Class.FaceControls` values. While this process provides precise control over individual values, the [Face Animation Editor](#use-the-face-animation-editor) enhances this workflow and lets you quickly change values to multiple facial features at once on the animation timeline.
+Similar to inserting other objects like `Class.MeshPart|MeshParts` or `Class.Bone|Bones` as animation tracks, you can manually add one FACS value at a time to the track list to manipulate a single body part, such as the character's eyes, jaw, or tongue. The [Animation Editor](../../../animation/editor.md) represents FACS values as a percentage between 0 and 1, and these values map directly to `Class.FaceControls` values. While this process provides precise control over individual values, the [Face Animation Editor](#using-the-face-animation-editor) enhances this workflow and lets you quickly change values to multiple facial features at once on the animation timeline.
To create an animation by inserting individual FACS values:
@@ -37,7 +37,7 @@ To create an animation by inserting individual FACS values:
-### Use the Face Animation Editor
+### Using the Face Animation Editor
The Face Animation Editor is an intuitive, visual way to automatically create keyframes as you adjust **sliders** to achieve your desired facial expression. For example, when you drag the thumb of the `LeftEyeClosed` slider all the way down, the character's left eye closes and a new animation track for `LeftEyeClosed` displays with a value of `1` within the track list.
@@ -91,14 +91,14 @@ To create an animation for your head using the Face Animation Editor:
4. When you are finished creating your animation, navigate to the **Media and Playback Controls** and click the **…** button. A pop-up menu displays.
5. Select **Save** or **Save As** to save the animation. The animation displays in the **Explorer** window as a child of the **AnimSaves** object (itself a child of the rig).
-## Export animations
+## Exporting Animations
-When you export a head that supports animation to Studio, it becomes available for use in all of your experiences. This means that you only need to create a head animation once, then you can reuse it as many times for as many characters as you want as long as the character has an [animatable head](../../../art/characters/facial-animation/use-heads-in-studio.md).
+When you export a head that supports animation to Studio, it becomes available for use in all of your experiences. This means that you only need to create a head animation once, then you can reuse it as many times for as many characters as you want as long as the character has an [animatable head](../../../art/characters/facial-animation/using-heads-in-studio.md).
-You can export head animations using the same workflow as [exporting other animations](../../../animation/editor.md#export-an-animation). Once the upload is complete, copy the animation's asset ID by clicking the copy button. **This ID is required for scripting animations**.
+You can export head animations using the same workflow as [exporting other animations](../../../animation/editor.md#exporting-an-animation). Once the upload is complete, copy the animation's asset ID by clicking the copy button. **This ID is required for scripting animations**.
-## Script animations
+## Scripting Animations
-Once you have created an animation, you need to use a script to play it in your experience. Like generic animations, you can either play animations for heads manually from your scripts or automatically by replacing default animations for player characters. For more information, see [Use animations](../../../animation/using.md).
+Once you have created an animation, you need to use a script to play it in your experience. Like generic animations, you can either play animations for heads manually from your scripts or automatically by replacing default animations for player characters. For more information, see [Using Animations](../../../animation/using.md).
diff --git a/content/en-us/art/characters/facial-animation/create-basic-heads.md b/content/en-us/art/characters/facial-animation/creating-basic-heads.md
similarity index 93%
rename from content/en-us/art/characters/facial-animation/create-basic-heads.md
rename to content/en-us/art/characters/facial-animation/creating-basic-heads.md
index 4897f2b82..b5e9e244a 100644
--- a/content/en-us/art/characters/facial-animation/create-basic-heads.md
+++ b/content/en-us/art/characters/facial-animation/creating-basic-heads.md
@@ -1,5 +1,5 @@
---
-title: Create basic heads
+title: Creating Basic Heads
description: The process of creating a basic animatable head in Blender.
---
@@ -10,8 +10,8 @@ description: The process of creating a basic animatable head in Blender.
You can create or modify an existing model to support animated heads in a third-party modeling software, such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview). When creating a head, your character model must meet the following requirements:
- The model follows standard [modeling requirements](#modeling-requirements), and includes head geometry, such as eyes, a mouth, and teeth.
-- The model's head must include a [rig](#rigging), or internal bone structure. These bones drive the various deformation of vertices to create facial expressions. You can create a [control system](#add-controls) to simplify the posing process.
-- The model has facial poses [saved to the animation timeline](#pose) and [mapped to the head mesh](#map). Typical animatable heads include [50 standard base poses](../../../art/characters/facial-animation/facs-poses-reference.md) that allow for a diverse range of expressions.
+- The model's head must include a [rig](#rigging), or internal bone structure. These bones drive the various deformation of vertices to create facial expressions. You can create a [control system](#adding-controls) to simplify the posing process.
+- The model has facial poses [saved to the animation timeline](#posing) and [mapped to the head mesh](#mapping). Typical animatable heads include [50 standard base poses](../../../art/characters/facial-animation/facs-poses-reference.md) that allow for a diverse range of expressions.
To meet these requirements, you can apply the steps in this guide when designing and posing your own head. This guide covers the basic processes of adding facial bones, posing, and mapping 5 basic FACS poses in Blender on a simplified reference character (Cubie), then exporting the model.
@@ -19,7 +19,7 @@ To meet these requirements, you can apply the steps in this guide when designing
For reference, this guide uses Blender version 3.0. If you are using another version of Blender, there might be minor differences in UI and settings.
-## Reference files
+## Reference Files
The following are head reference files, including all example files from this guide:
@@ -30,7 +30,7 @@ The reference character model provided is meant for educational purposes and doe
-
Reference files
+
Reference Files
Description
@@ -62,7 +62,7 @@ The reference character model provided is meant for educational purposes and doe
-## Modeling requirements
+## Modeling Requirements
Many character models already include a head with distinct facial features, but they might require minor modeling adjustments for head compatibility. When modeling a character with a head, ensure the head mesh meets the [Avatar character specifications](../../../art/characters/specifications.md) for Studio import, as well as the following requirements:
@@ -76,11 +76,11 @@ You can follow along the rest of this head creation process using a [rigged Cubi
## Rigging
-Your character must have an internal bone structure to drive the vertices of the face geometry and make facial poses. Unlike [rigging a humanoid model](../../../art/modeling/rig-a-humanoid-model.md), Studio doesn't require a specific bone hierarchy for a head. However, in order for the facial rig to work properly, the rig must include a [RootFaceJoint](#rootfacejoint) bone and [additional face bones](#face-bones).
+Your character must have an internal bone structure to drive the vertices of the face geometry and make facial poses. Unlike [rigging a humanoid model](../../../art/modeling/rigging-a-humanoid-model.md), Studio doesn't require a specific bone hierarchy for a head. However, in order for the facial rig to work properly, the rig must include a [RootFaceJoint](#rootfacejoint) bone and [additional face bones](#face-bones).
### RootFaceJoint
-The **RootFaceJoint** is a bone that is parented under the standard R15 head bone. This root bone does not control any vertices, but it must parent all other face bones. In Blender, you can quickly add a bone by **extruding** a child bone from the head bone and then map the bone name as a property in the Head_Geo mesh. The RootFaceJoint bone object is commonly named "DynamicHead" in the reference templates and examples, but you can use any name as long as you [map the root bone](#map) in custom properties.
+The **RootFaceJoint** is a bone that is parented under the standard R15 head bone. This root bone does not control any vertices, but it must parent all other face bones. In Blender, you can quickly add a bone by **extruding** a child bone from the head bone and then map the bone name as a property in the Head_Geo mesh. The RootFaceJoint bone object is commonly named "DynamicHead" in the reference templates and examples, but you can use any name as long as you [map the root bone](#mapping) in custom properties.
To add a RootFaceJoint bone:
@@ -90,30 +90,30 @@ To add a RootFaceJoint bone:
2. Click on any bones to select the armature, then switch to **Edit Mode**.
3. In the **Outliner**, click on the **Head** bone.
4. In the **Viewport**, press E and drag your mouse up to extrude an additional child bone from the **Head** bone.
-5. In the **Outliner**, rename this bone **DynamicHead**. You will reference this bone by name later in the [mapping](#map) section.
+5. In the **Outliner**, rename this bone **DynamicHead**. You will reference this bone by name later in the [mapping](#mapping) section.
- You must map the RootFaceJoint so Studio can properly locate that joint and hide all of the children joints and their bones within the `Class.FaceControls` instance on import.
+ You must map the RootFaceJoint so Studio can properly locate that joint and hide all of the children joints and their bones within the `Class.FaceControls` instance on import.
-### Face bones
+### Face Bones
Face bones drive the bending and deformation of the face geometry. Each poseable face feature of your head typically requires at least one bone. Complex features, such as eyes and mouth, might require several bones to make certain poses possible.
The rigging and skinning process depends on the character model and differs between tools and modelers. It's important to plan out the full range of facial poses your character requires to avoid additional adjustments to your head bones later.
-The following instructions describe a basic process of [adding face bones](#add-face-bones) and [skinning](#skin-face-bones), or applying influences, to the reference model's **eyes** and **eyelids**. You can continue to apply this technique to the rest of the facial features that need articulation, such as the character's mouth, cheeks, and jaw. After adding your bones and applying influences, you can create [controls](#add-controls) that can help make the next posing process more efficient.
+The following instructions describe a basic process of [adding face bones](#adding-face-bones) and [skinning](#skinning-face-bones), or applying influences, to the reference model's **eyes** and **eyelids**. You can continue to apply this technique to the rest of the facial features that need articulation, such as the character's mouth, cheeks, and jaw. After adding your bones and applying influences, you can create [controls](#adding-controls) that can help make the next posing process more efficient.
You can download a [reference Cubie model](../../../assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Complete.fbx) with a completed rig with 30+ facial bones added and skinned. You can use this for a reference for unique bone placements not covered in this guide, such as cheeks, lips, and jaws.
- See [Use heads in Studio](../../../art/characters/facial-animation/use-heads-in-studio.md) for download links of more complex characters.
+ See [Using Heads in Studio](../../../art/characters/facial-animation/using-heads-in-studio.md) for download links of more complex characters.
-#### Add face bones
+#### Adding Face Bones
The specific head bones your character requires depend on the poses you intend for it to use. The following examples cover the process for adding 1 bone for each eye and 4 bones for the eyelids to allow for blinking, winking, and gaze direction.
@@ -177,11 +177,11 @@ To add bones to the character eyelids:
-#### Skin face bones
+#### Skinning Face Bones
You can apply [skinning](../../../art/modeling/rigging.md) to a character rig using several methods. The following example uses Blender's **Weight Paint** mode to paint which vertices a single bone can control. Skinning is typically a time consuming step for complex characters and a background in skinning and facial posing is recommended.
-When applying detailed or shared influences for complex models, it's recommended to enable [Auto Normalize](../../../art/modeling/skin-a-simple-mesh.md#auto-normalize) to prevent influence conflicts between bones.
+When applying detailed or shared influences for complex models, it's recommended to enable [Auto Normalize](../../../art/modeling/skinning-a-simple-mesh.md#auto-normalize) to prevent influence conflicts between bones.
When parenting bones to the character using Automatic Weights, some of your vertices might already have influences applied. Always test your influences to make sure influence assignments are correct.
@@ -237,7 +237,7 @@ To add influence to the left eyelid:
You can download [a version of this project](../../../assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Eye-Bones-Skinned.blend) with the bones skinned up to this point as reference.
-#### Add controls
+#### Adding Controls
Since creating heads requires saving several poses consecutively, while not required, controls can help you pose your bones quickly and effectively. You can create controls by adding external controller bones that influence the internal ones, making it easier to access and pose as well as reset to a neutral transformation.
@@ -302,11 +302,11 @@ To create custom bone shapes for easier control bone access:
-## Pose
+## Posing
**Posing** is the process of manipulating the bones of your head mesh into a specific position per animation frame. After the model's head has been rigged, you can begin the process of saving poses to the timeline. This data enables Studio to access each facial movement and animate or blend facial poses to create dynamic expressions.
-When posing the bones of your character's head mesh to new positions, follow the [Facial Action Coding System](../../../art/characters/facial-animation/facs-poses-reference.md) (FACS) as a reference for your facial expression poses. FACS is a comprehensive, anatomically-based system for describing all visually discernible facial movement, and it allows for all facial animations to be shareable between characters. This means that once you create a facial animation, you can reuse it for any character with an [animatable head](../../../art/characters/facial-animation/use-heads-in-studio.md) with a `Class.FaceControls` instance.
+When posing the bones of your character's head mesh to new positions, follow the [Facial Action Coding System](../../../art/characters/facial-animation/facs-poses-reference.md) (FACS) as a reference for your facial expression poses. FACS is a comprehensive, anatomically-based system for describing all visually discernible facial movement, and it allows for all facial animations to be shareable between characters. This means that once you create a facial animation, you can reuse it for any character with an [animatable head](../../../art/characters/facial-animation/using-heads-in-studio.md) with a `Class.FaceControls` instance.
Each frame within your modeling software's animation timeline can contain one unique FACS pose, so when you want to create multiple FACS poses, you must save each FACS pose to a different frame. You must also include a frame with your character having a neutral face with the face controllers and bones set to their default values. This ensures that Studio can calculate the bone position differences between your character's neutral expression and each FACS pose. For this reason, set Frame 0 as your character's neutral expression, and save FACS poses starting at Frame 1.
@@ -345,7 +345,7 @@ When all the poses are saved in your timeline, set the Start and End of the anim
-### Combination poses
+### Combination Poses
You can combine 2-3 base FACS poses in a single animation frame to display complex facial expressions. However, when you combine FACS poses that control the **same** facial regions, the facial features might either collide or disfigure the character.
@@ -385,7 +385,7 @@ A **combination pose**, or **corrective**, is the combination of 2-3 FACS poses
On import, Studio calculates and stores the corrective difference for combination poses in the head's `Class.FaceControls` instance, and the `Class.FaceControls` instance corrects the base poses values as they combine in the Animation Editor.
-## Map
+## Mapping
After you finish posing each FACS pose that your character needs, you must map, or link, **each animation frame that you pose** to its corresponding FACS base or combination pose name. Mapping stores the bone positions and translations within the head `Class.MeshPart`, and when you begin to animate your head within the [Animation Editor](../../../animation/editor.md), the `Class.FaceControls` instance uses this stored data to transform your character's facial features to the applicable FACS pose.
@@ -402,7 +402,7 @@ Aside from mapping each pose to its proper pose name, you also need to map the [
- If you leave any empty strings, or try to import the head into Studio with multiple frames per FACS pose name, the head will fail the [import process](../../../art/characters/facial-animation/use-heads-in-studio.md#import-heads).
+ If you leave any empty strings, or try to import the head into Studio with multiple frames per FACS pose name, the head will fail the [import process](../../../art/characters/facial-animation/using-heads-in-studio.md#importing-heads).
To map your saved poses and the RootFaceJoint:
@@ -441,7 +441,7 @@ You can download a [version of this project](../../../assets/avatar/dynamic-head
-## Export
+## Exporting
After you finish posing and mapping your head for your character, you can export the character model as a `.fbx` to import into Studio, allowing you to access the 4 eye poses using the `Class.FaceControls` instance in Studio. You can also reference the fully configured Cubie head `.fbx` to access all 50+ base poses.
@@ -456,7 +456,7 @@ The export settings for animatable heads differ slightly from [standard third-pa
7. Expand **Bake Animation** and uncheck **NLA Strips**, **All Actions**, and **Force Start/End Keyframes**.
8. Click the **Export FBX** button. Save the FBX to the directory of your choice.
-At this point, you can now import the `.fbx` into Studio as a character with a supported animatable head. For model import and usage instructions, see [Use heads in Studio](../../../art/characters/facial-animation/use-heads-in-studio.md).
+At this point, you can now import the `.fbx` into Studio as a character with a supported animatable head. For model import and usage instructions, see [Using Heads in Studio](../../../art/characters/facial-animation/using-heads-in-studio.md).
When importing Cubie into Studio, make sure to also save the head texture Cubie-Texture_ALB.png which you can apply to the head mesh of the imported character as a TextureID.
diff --git a/content/en-us/art/characters/facial-animation/create-face-accessories.md b/content/en-us/art/characters/facial-animation/creating-face-accessories.md
similarity index 87%
rename from content/en-us/art/characters/facial-animation/create-face-accessories.md
rename to content/en-us/art/characters/facial-animation/creating-face-accessories.md
index 0d5aa7ee7..8b161cbf2 100644
--- a/content/en-us/art/characters/facial-animation/create-face-accessories.md
+++ b/content/en-us/art/characters/facial-animation/creating-face-accessories.md
@@ -1,5 +1,5 @@
---
-title: Create face accessories
+title: Creating Face Accessories
description: Face accessories are 3D accessories that move and animate with a live head.
---
@@ -15,13 +15,13 @@ To create a face accessory, use a third-party modeling tool, such as [Blender](h
- The model must be parented (Blender) or bound (Maya) to an R15 character rig.
- The model must include an inner and outer cage.
-This guide covers the basic process in Blender for applying rigging and cage data to a basic reference model using the Cubie model referenced in [Create basic heads](../../../art/characters/facial-animation/create-basic-heads.md).
+This guide covers the basic process in Blender for applying rigging and cage data to a basic reference model using the Cubie model referenced in [Creating Basic Heads](../../../art/characters/facial-animation/creating-basic-heads.md).
This guide uses Blender version 3.0. If you are using another version of Blender, there might be minor differences in UI and settings.
-## Reference files
+## Reference Files
The following are face accessory reference files, including all example files from this guide:
@@ -43,7 +43,7 @@ The reference character model provided is meant for educational purposes and doe
@@ -80,11 +80,11 @@ If creating your own model, consider the following guidelines:
## Rigging
-You must [rig](../../../art/modeling/rigging.md) your accessory to the character's bone structure so the accessory can bend and deform along with your character's facial poses. After rigging, you can skin your model in your modeling tool, or you can transfer skinning data from your character to the accessory at runtime by using [Automatic skinning transfer](../../../art/accessories/automatic-skinning-transfer.md).
+You must [rig](../../../art/modeling/rigging.md) your accessory to the character's bone structure so the accessory can bend and deform along with your character's facial poses. After rigging, you can skin your model in your modeling tool, or you can transfer skinning data from your character to the accessory at runtime by using [Automatic Skinning Transfer](../../../art/accessories/automatic-skinning-transfer.md).
-### Project setup
+### Project Setup
-As an example in this guide, we are using the completed [basic Head model](../../../assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Complete.fbx) from [Create a basic head](../../../art/characters/facial-animation/create-basic-heads.md) and a [simple eyebrow model](../../../assets/avatar/dynamic-heads/creating-face-accessories/reference-files/CubieEyebrow_Geo.fbx) in a new Blender project.
+As an example in this guide, we are using the completed [basic Head model](../../../assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Complete.fbx) from [Creating a Basic Head](../../../art/characters/facial-animation/creating-basic-heads.md) and a [simple eyebrow model](../../../assets/avatar/dynamic-heads/creating-face-accessories/reference-files/CubieEyebrow_Geo.fbx) in a new Blender project.
To set up your Blender project:
@@ -114,7 +114,7 @@ To set up your Blender project:
-### Parent armature
+### Parenting Armature
Connect the mesh object to the character's armature by parenting the armature to the mesh object. To parent the armature:
@@ -127,11 +127,11 @@ Connect the mesh object to the character's armature by parenting the armature to
Parenting with Automatic Weights automatically applies some influences to your model which can save some time during the [optional skinning](#optional-skinning) step. You can alternatively **Parent** with **Empty Weights** to not apply any skinning influence to your accessory mesh. See Blender's documentation on [Automatic Weights](https://docs.blender.org/manual/en/latest/animation/armatures/skinning/parenting.html#with-automatic-weights) for more information.
-### Optional skinning
+### Optional Skinning
-In many cases, you can skip the [skinning](../../../art/modeling/rigging.md) process for your accessory and use Roblox's [Automatic Skinning Transfer transfer](../../../art/accessories/automatic-skinning-transfer.md) instead. You can still apply manual skinning through a modeling software and opt to use Automatic Skinning Transfer transfer later.
+In many cases, you can skip the [skinning](../../../art/modeling/rigging.md) process for your accessory and use Roblox's [automatic skinning transfer](../../../art/accessories/automatic-skinning-transfer.md) instead. You can still apply manual skinning through a modeling software and opt to use automatic skinning transfer later.
-If you do not intend to apply skinning manually, continue directly to [caging](#caging).
+If you do not intend to apply skinning manually, continue directly to [Caging](#caging).
If you are skinning your accessory in your modeling software on a character model with a fully posed head, you can test the accessory on various FACS poses saved to the timeline within your modeling software before importing into Studio.
@@ -151,9 +151,9 @@ To cage the eyebrow accessory:
-If you are using Automatic Skinning Transfer transfer, you can ensure that Automatic Skinning Transfer transfer only applies to specific parts of the accessory by removing unnecessary sections of the cage. For more information, see [Modifying Character Cages](../../../art/accessories/automatic-skinning-transfer.md#modify-character-cages).
+If you are using automatic skinning transfer, you can ensure that automatic skinning transfer only applies to specific parts of the accessory by removing unnecessary sections of the cage. For more information, see [Modifying Character Cages](../../../art/accessories/automatic-skinning-transfer.md#modifying-character-cages).
-## Export
+## Exporting
Export your model when ready to test your accessory model in Studio or when setting up for final export. When exporting face accessories, keep in mind the following guidelines:
@@ -172,10 +172,10 @@ To export:
2. Follow Studio's [Export Requirements for Blender](../../../art/accessories/export-settings.md) and save the file to your preferred location. The final export of the eyebrow `.fbx` is available for reference.
-## Test in Studio
+## Testing in Studio
-To use your exported model into Studio as an `Class.Accessory`, use the [Accessory Fitting tool](../../../art/accessories/accessory-fitting-tool.md) to test and generate the accessory object. At this point, you can equip the accessory to a humanoid character. If you intend to transfer skinning data from your character to the accessory model at runtime, you can enable [Automatic Skinning Transfer transfer](../../../art/accessories/automatic-skinning-transfer.md) for your accessory.
+To use your exported model into Studio as an `Class.Accessory`, use the [Accessory Fitting Tool](../../../art/accessories/accessory-fitting-tool.md) to test and generate the accessory object. At this point, you can equip the accessory to a humanoid character. If you intend to transfer skinning data from your character to the accessory model at runtime, you can enable [automatic skinning transfer](../../../art/accessories/automatic-skinning-transfer.md) for your accessory.
-If following the references provided by this guide, only **EnabledOverride** applies the skinning transfer in Studio, since some skinning data will have been applied to the model during the [parenting](#parent-armature) process.
+If following the references provided by this guide, only **EnabledOverride** applies the skinning transfer in Studio, since some skinning data will have been applied to the model during the [parenting](#parenting-armature) process.
diff --git a/content/en-us/art/characters/facial-animation/facs-poses-reference.md b/content/en-us/art/characters/facial-animation/facs-poses-reference.md
index 4356ac81e..69a22c325 100644
--- a/content/en-us/art/characters/facial-animation/facs-poses-reference.md
+++ b/content/en-us/art/characters/facial-animation/facs-poses-reference.md
@@ -1,17 +1,17 @@
---
-title: FACS poses reference
+title: FACS Poses Reference
description: The Facial Action Coding System (FACS) ensures that all face animations have a common pose reference and can create similar face animations.
---
-The [Facial Action Coding System](https://en.wikipedia.org/wiki/Facial_Action_Coding_System) (FACS) is a comprehensive, anatomically-based system for describing all visually discernible facial movement. This system breaks down all facial expressions into individual types of muscle movement, such as `LeftEyeClosed` or `MouthLeft`. You can [configure](../../../art/characters/facial-animation/creating-basic-heads.md#posing) and store these muscle movements, or **poses**, within the head model through a third-party modeling software, such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview). When you import the head model into Studio, you can then access and [animate](../../../art/characters/facial-animation/animate-heads.md) these poses to create lively facial expressions.
+The [Facial Action Coding System](https://en.wikipedia.org/wiki/Facial_Action_Coding_System) (FACS) is a comprehensive, anatomically-based system for describing all visually discernible facial movement. This system breaks down all facial expressions into individual types of muscle movement, such as `LeftEyeClosed` or `MouthLeft`. You can [configure](../../../art/characters/facial-animation/creating-basic-heads.md#posing) and store these muscle movements, or **poses**, within the head model through a third-party modeling software, such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview). When you import the head model into Studio, you can then access and [animate](../../../art/characters/facial-animation/animating-heads.md) these poses to create lively facial expressions.
-The following is a list of 50 base poses that you can use in Roblox to portray a wide range of face emotions. Except for the first neutral pose, the order of poses you save to your character model doesn't matter since this information is set during the [mapping](../../../art/characters/facial-animation/create-basic-heads.md#map) process as a custom property.
+The following is a list of 50 base poses that you can use in Roblox to portray a wide range of face emotions. Except for the first neutral pose, the order of poses you save to your character model doesn't matter since this information is set during the [mapping](../../../art/characters/facial-animation/creating-basic-heads.md#mapping) process as a custom property.
If you intend to publish your avatar to the Marketplace, your avatar head must include the required [17 facial base poses](../../../art/characters/specifications.md#facial-animations). Marketplace validation rejects assets that do not include these 17 required base poses.
-You can combine multiple FACS base poses together in one animation frame to create complex facial expressions. However, some combinations of poses might collide unless you also add a [corrective](../../../art/characters/facial-animation/create-basic-heads.md#combination-poses) to their full default values.
+You can combine multiple FACS base poses together in one animation frame to create complex facial expressions. However, some combinations of poses might collide unless you also add a [corrective](../../../art/characters/facial-animation/creating-basic-heads.md#combination-poses) to their full default values.
## EyesLookDown
diff --git a/content/en-us/art/characters/facial-animation/index.md b/content/en-us/art/characters/facial-animation/index.md
index 0f21e9009..be947b663 100644
--- a/content/en-us/art/characters/facial-animation/index.md
+++ b/content/en-us/art/characters/facial-animation/index.md
@@ -1,5 +1,5 @@
---
-title: Facial animation
+title: Facial Animation
description: Facial animations enable avatars to create dynamic facial expressions.
---
@@ -16,7 +16,7 @@ An animatable head model contains an internal facial [rig](../../../art/modeling
When importing a head that supports facial animation into Studio, Studio creates a `Class.FaceControls` instance you can use to access and combine these individual poses to create expressions and animations. Unlike typical rigged models, you cannot access the facial `Class.Bone|Bones` of a head mesh directly in Studio.
-For information on implementing heads in Studio, including information on how to import custom heads and face accessories in addition to a reference experience and example model files, see [Use heads in Studio](../../../art/characters/facial-animation/use-heads-in-studio.md).
+For information on implementing heads in Studio, including information on how to import custom heads and face accessories in addition to a reference experience and example model files, see [Using Heads in Studio](../../../art/characters/facial-animation/using-heads-in-studio.md).
@@ -29,27 +29,27 @@ For information on implementing heads in Studio, including information on how to
-## Animate heads
+## Animating Heads
-You can [animate any supported head](../../../art/characters/facial-animation/animate-heads.md) through the [Animation Editor](../../../animation/editor.md) by manually setting poses on the animation track, using the **Face Animation Editor** to quickly create complex expressions, or using the [Animation Capture Tool](../../../animation/capture.md) to automatically track facial movements from your webcam.
+You can [animate any supported head](../../../art/characters/facial-animation/animating-heads.md) through the [Animation Editor](../../../animation/editor.md) by manually setting poses on the animation track, using the **Face Animation Editor** to quickly create complex expressions, or using the [Animation Capture tool](../../../animation/capture.md) to automatically track facial movements from your webcam.
After you create, save, and publish a head animation to Roblox, you can play the animation from a script or replace a character's default animation with your new animation.
-## Create basic heads
+## Creating Basic Heads
-Using third-party modeling tools, you can either modify a rigged character model to meet head requirements, or create a head from scratch. For step-by-step instructions on how to add face bones, apply skinning, posing, and mapping poses on a head model in Blender, see [Create basic heads](../../../art/characters/facial-animation/create-basic-heads.md). This guide includes several reference files you can use to compare and track your progress.
+Using third-party modeling tools, you can either modify a rigged character model to meet head requirements, or create a head from scratch. For step-by-step instructions on how to add face bones, apply skinning, posing, and mapping poses on a head model in Blender, see [Creating Basic Heads](../../../art/characters/facial-animation/creating-basic-heads.md). This guide includes several reference files you can use to compare and track your progress.
-## Create face accessories
+## Creating Face Accessories
Similar to creating heads, you can design and model face accessories using a third-party modeling software and import the models as a cosmetic `Class.Accessory` in Studio. When created correctly, equipped accessories stretch and deform as the head animates and emotes.
-See [Create face accessories](../../../art/characters/facial-animation/create-face-accessories.md) for step-by-step instructions on setting up a reference model as a face accessory. This guide includes several project files you can use for reference and covers details on time-saving steps, such as auto-skin transfer.
+See [Creating Face Accessories](../../../art/characters/facial-animation/creating-face-accessories.md) for step-by-step instructions on setting up a reference model as a face accessory. This guide includes several project files you can use for reference and covers details on time-saving steps, such as auto-skin transfer.
-## FACS poses reference
+## FACS Poses Reference
Animatable heads use the Facial Action Coding System (FACS) as a universal system that allows modelers and animators to reference similar facial features and head mesh across different head models.
-When creating your head in a third-party modeling software, see [FACS poses reference](../../../art/characters/facial-animation/facs-poses-reference.md) for a list of the base facial poses, their descriptions, and video examples.
+When creating your head in a third-party modeling software, see [FACS Poses Reference](../../../art/characters/facial-animation/facs-poses-reference.md) for a list of the base facial poses, their descriptions, and video examples.
diff --git a/content/en-us/art/characters/facial-animation/moods.md b/content/en-us/art/characters/facial-animation/moods.md
index 4545e1384..1515d2bfc 100644
--- a/content/en-us/art/characters/facial-animation/moods.md
+++ b/content/en-us/art/characters/facial-animation/moods.md
@@ -3,7 +3,7 @@ title: Moods
description: Moods are a type of facial animation that loop indefinitely, allowing users to express persistent facial emotion.
---
-A **mood** is a type of [facial animation](../../../art/characters/facial-animation/index.md) for animatable heads that loops indefinitely, allowing users to express themselves and react to others with a persistent facial emotion. Moods play simultaneously with other character [default animations](../../../animation/use.md#replace-default-animations), such as walking, climbing, and swimming, and if the default animation has a facial animation, the default animation blends with the character's mood.
+A **mood** is a type of [facial animation](../../../art/characters/facial-animation/index.md) for animatable heads that loops indefinitely, allowing users to express themselves and react to others with a persistent facial emotion. Moods play simultaneously with other character [default animations](../../../animation/using.md#replacing-default-animations), such as walking, climbing, and swimming, and if the default animation has a facial animation, the default animation blends with the character's mood.
@@ -20,9 +20,9 @@ A **mood** is a type of [facial animation](../../../art/characters/facial-animat
A mood is a type of facial animation, but not all facial animations are moods. While a mood refers to a specific animation slot that belongs to each character, a facial animation refers to **any** animation that modifies the face channels.
-## Create moods
+## Creating Moods
-If you have a character model with an animatable head, you can create any mood animation you can think of using the [Face Animation Editor](../../../art/characters/facial-animation/animate-heads.md#use-the-face-animation-editor). If you don't want to use the [Blocky](../../../assets/avatar/dynamic-heads/reference-files/BlockyCharacter.fbx) or [Goblin](../../../assets/avatar/dynamic-heads/reference-files/GoblinCharacter.zip) reference character models, you can create or modify an existing model to support animated heads in a third-party modeling software, such as Blender or Maya. For information on how to create an animatable head, see [Create basic heads](../../../art/characters/facial-animation/create-basic-heads.md).
+If you have a character model with an animatable head, you can create any mood animation you can think of using the [Face Animation Editor](../../../art/characters/facial-animation/animating-heads.md#using-the-face-animation-editor). If you don't want to use the [Blocky](../../../assets/avatar/dynamic-heads/reference-files/BlockyCharacter.fbx) or [Goblin](../../../assets/avatar/dynamic-heads/reference-files/GoblinCharacter.zip) reference character models, you can create or modify an existing model to support animated heads in a third-party modeling software, such as Blender or Maya. For information on how to create an animatable head, see [Creating Basic Heads](../../../art/characters/facial-animation/creating-basic-heads.md).
To create a mood:
@@ -69,7 +69,7 @@ To create a mood:
-## Set moods
+## Setting Moods
Every character with an animatable head has a child **Animate** `Class.LocalScript` with a child **mood** `Class.StringValue` that contains the mood animation that plays on the character's head. The mood animation's default `Class.Animation.AnimationID` plays a smiling animation, but you can change the character's mood to something else by either directly editing the `Class.Animation.AnimationID` within the mood `Class.StringValue`, or using the `Class.HumanoidDescription` system.
@@ -79,7 +79,7 @@ Every character with an animatable head has a child **Animate** `Class.LocalScri
The code for playing moods doesn't occur in the **Animate** `Class.LocalScript`, but in a hidden, internal Roblox script. While you can't edit this internal script, the **mood** `Class.StringValue` allows you to interact with it in order to customize moods within your experiences.
-### Edit AnimationIds
+### Editing AnimationIds
You can set a specific mood for each character within your experience by editing their mood's `Class.Animation.AnimationID` whenever a user triggers an event. For example, the following `Class.Script` edits any previously set mood to an animation that [opens the character's mouth](https://www.roblox.com/library/7715145252/moods-11-FaceAnimation) as soon as the user enters the experience:
@@ -99,7 +99,7 @@ end
Players.PlayerAdded:Connect(onPlayerAdded)
```
-### Use the HumanoidDescription
+### Using the HumanoidDescription
You can also use the `Class.HumanoidDescription` system to find user characters and edit their `Class.Animation.AnimationID|AnimationIDs` for any default animation. For example, the following `Class.Script` edits any previously set mood to an animation that gives the character a [half-smile](https://www.roblox.com/catalog/10725833199/Chiseled-Good-Looks-Mood) on the left-side of their face whenever their character is idling:
@@ -113,7 +113,7 @@ if humanoid then
end
```
-## Disable moods
+## Disabling Moods
To disable moods from your experience, you can delete the mood object underneath the **Animate** `Class.LocalScript`. For example, the following `Class.Script` removes every character's **mood** `Class.StringValue` as soon as they join the experience:
diff --git a/content/en-us/art/characters/facial-animation/use-heads-in-studio.md b/content/en-us/art/characters/facial-animation/using-heads-in-studio.md
similarity index 89%
rename from content/en-us/art/characters/facial-animation/use-heads-in-studio.md
rename to content/en-us/art/characters/facial-animation/using-heads-in-studio.md
index 67944790e..8355be9ec 100644
--- a/content/en-us/art/characters/facial-animation/use-heads-in-studio.md
+++ b/content/en-us/art/characters/facial-animation/using-heads-in-studio.md
@@ -1,5 +1,5 @@
---
-title: Use heads in Studio
+title: Using Heads in Studio
description: If you have a model with a live head, you can import the model into Studio, equip face accessories, and create and save animations.
---
@@ -7,16 +7,16 @@ You can import character models with animatable heads into Studio and use the au
To set up heads with facial animation in your experience:
-1. [Import a model with an animatable head](../../../art/characters/testing/studio.md#import). You can either create your own or use one of the provided reference model files.
-2. (Optional) [Import face accessories](#import-face-accessories) you want to deform with the facial expressions of your head. You can either create your own or use one of the provided reference accessory files.
-3. [Animate the head](#animate-heads) in the Animation Editor by either adding in individual animation tracks, or by using the Face Animation Editor.
+1. [Import a model with an animatable head](../../../art/characters/testing/studio.md#importing). You can either create your own or use one of the provided reference model files.
+2. (Optional) [Import face accessories](#importing-face-accessories) you want to deform with the facial expressions of your head. You can either create your own or use one of the provided reference accessory files.
+3. [Animate the head](#animating-heads) in the Animation Editor by either adding in individual animation tracks, or by using the Face Animation Editor.
-If you want to experiment with pre-made heads before [making your own](../../../art/characters/facial-animation/create-basic-heads.md), Roblox has a reference experience you can access to see how heads interact with Studio's interface, as well as two reference models and accessories you can import directly into your own experience:
+If you want to experiment with pre-made heads before [making your own](../../../art/characters/facial-animation/creating-basic-heads.md), Roblox has a reference experience you can access to see how heads interact with Studio's interface, as well as two reference models and accessories you can import directly into your own experience:
-
Reference files
+
Reference Files
Description
@@ -44,7 +44,7 @@ If you want to experiment with pre-made heads before [making your own](../../../
-## Import face accessories
+## Importing Face Accessories
You can import and equip face accessories that you want to deform with the facial expressions of your head. For example, when you import and equip eyebrows as a face accessory, you can animate the eyebrows to move with the character's eyes.
@@ -56,7 +56,7 @@ To import a face accessory:
-2. Using the [Accessory Fitting tool](../../../art/accessories/accessory-fitting-tool.md), convert the `Class.MeshPart` into an `Class.Accessory` instance.
+2. Using the [Accessory Fitting Tool](../../../art/accessories/accessory-fitting-tool.md), convert the `Class.MeshPart` into an `Class.Accessory` instance.
1. In the **Avatar** tab, click on the **Accessory Fitting Tool**. The **Accessory Fitting Tool** window displays.
2. In the **Explorer** window, select the **MeshPart** you imported as a face accessory. Its name displays in the **Part** field.
@@ -78,9 +78,9 @@ You can preview the accessory on your imported model by making the `Class.Access
-You can also save the `Class.Accessory` instance to your toolbox and use the asset ID at any time in your experiences. For information on equipping accessories by applying a `Class.HumanoidDescription`, see [Customize characters with humanoid description](../../../characters/appearance.md#set-multiple-accessories).
+You can also save the `Class.Accessory` instance to your toolbox and use the asset ID at any time in your experiences. For information on equipping accessories by applying a `Class.HumanoidDescription`, see [Customizing Characters with Humanoid Description](../../../characters/appearance.md#setting-multiple-accessories).
-### AutoSkin property
+### Accessory Skinning
You can enable the `Class.WrapLayer.AutoSkin` property in the accessory's `Class.WrapLayer` instance to apply the skinning of the head to the face accessory. This allows a face accessory to fit and follow a character's expressions without having to apply any skinning influences to it during the 3D modeling process.
@@ -90,7 +90,7 @@ The following options are available for the `Class.WrapLayer.AutoSkin` property:
- **EnabledOverride**: Enables the Auto-Skin Transfer process and allows Studio to override any existing skinning information found on the accessory. Choose this setting when you want to set or replace the existing skinning of an accessory using the Auto-Skin Transfer version.
- **EnabledPreserve**: Enables the Automatic Skinning Transfer process but **doesn't** allow it to override any existing skinning information found on the accessory. Choose this setting when you want to preserve and maintain any existing skinning of an accessory. If there isn't any skinning to maintain, the Auto-Skin Transfer creates new skinning automatically.
-## Animate heads
+## Animating Heads
Animatable head `Class.MeshPart|MeshParts` include a `Class.FaceControls` instance which allows you to access your facial pose properties.
@@ -105,20 +105,20 @@ Animatable head `Class.MeshPart|MeshParts` include a `Class.FaceControls` instan
-You can adjust these properties in the Animation Editor to animate your head. For more information, see [Animate heads](../../../art/characters/facial-animation/animate-heads.md).
+You can adjust these properties in the Animation Editor to animate your head. For more information, see [Animating Heads](../../../art/characters/facial-animation/animating-heads.md).
## Troubleshooting
-When importing custom head models, the [Output Window](../../../studio/output.md) displays an error or warning message if there were any issues during the configuration process.
+When importing custom head models, the [Output window](../../../studio/output.md) displays an error or warning message if there were any issues during the configuration process.
-### Error messages
+### Error Messages
Error messages indicate a failure to properly import a model with a head. Reference the following table for a summary of all head error messages and troubleshooting tips:
-
Error message
+
Error Message
Troubleshooting
@@ -186,14 +186,14 @@ Error messages indicate a failure to properly import a model with a head. Refere
-### Warning messages
+### Warning Messages
Warning messages indicate a potential issue with an imported head model. Reference the following table for a summary of all head warning messages and troubleshooting tips:
-
Error message
+
Error Message
Troubleshooting
diff --git a/content/en-us/art/characters/import.md b/content/en-us/art/characters/importing.md
similarity index 87%
rename from content/en-us/art/characters/import.md
rename to content/en-us/art/characters/importing.md
index 44fabc9bf..22177eaa1 100644
--- a/content/en-us/art/characters/import.md
+++ b/content/en-us/art/characters/importing.md
@@ -1,17 +1,17 @@
---
-title: Import character bodies
+title: Importing Character Bodies
description: Use the 3D Importer to add third-party models to Studio before testing, using, or uploading the character model.
---
Use the following instructions to import a full character body model into Studio as a `Model` object that you can save to use in your experience, share with others, or upload to the Marketplace.
-If you are using a single-mesh character body for the Roblox Auto-Setup tool, see [Avatar auto-setup](../modeling/avatar-setup.md#avatar-auto-setup).
+If you are using a single-mesh character body for the Roblox Auto-Setup tool, see [Avatar Auto-Setup](../modeling/avatar-setup.md#avatar-auto-setup).
Studio's 3D Importer provides a quick and easy way to import third-party 3D assets into your projects. The importer provides object previews and error-checking to ensure that your asset meets Roblox's [general 3D requirements](../modeling/specifications.md).
-Keep in mind, your character model must also follow Roblox's [avatar character specifications](../characters/specifications.md) to use or sell this asset as an avatar-ready character model, or you may experience errors later in the workflow.
+Keep in mind, your character model must also follow Roblox's [Avatar Character Specifications](../characters/specifications.md) to use or sell this asset as an avatar-ready character model, or you may experience errors later in the workflow.
To import your asset:
@@ -21,7 +21,7 @@ To import your asset:
- If textures don't load for your asset, you can manually import your textures later.
- - See [3D importer](../../art/modeling/3d-importer.md) for additional information on import settings and troubleshooting.
+ - See [3D Importer](../../art/modeling/3d-importer.md) for additional information on import settings and troubleshooting.
3. To begin body validation after import, enable **Validate UGC Body**. This can save you time if you intend on uploading your body to the Marketplace.
4. Set the **Rig Scale** to the appropriate [Body Scale](../characters/specifications.md#body-scale) of your character.
@@ -30,7 +30,7 @@ To import your asset:
5. Select **Import**. The asset populates in your workspace as a `Class.Model` with the appropriate textures applied as a `Class.SurfaceAppearance` or `Class.MeshPart.TextureID`.
-Manually add textures
+Manually adding textures
If textures didn't load correctly, add them manually. You may need to save and publish your experience in order to access the [Asset Manager](../../projects/assets/manager.md).
@@ -80,12 +80,12 @@ After successful fitting and converting, your 3D model should populate in your p
-Character creation is a complex process that requires lots of testing and iteration. See [Test characters](../../art/characters/testing/index.md) for steps on importing your character model into a test place and verifying your avatar and related components.
+Character creation is a complex process that requires lots of testing and iteration. See [Testing Characters](../../art/characters/testing/index.md) for steps on importing your character model into a test place and verifying your avatar and related components.
With this new character `Class.Model`, you can perform any of the following:
-- Begin the process of [uploading and publishing](../../marketplace/publish-to-marketplace.md#upload-an-asset) the character model to the Marketplace. This involves some additional validation and moderation steps.
+- Begin the process of [uploading and publishing](../../marketplace/publishing-to-marketplace.md#uploading-an-asset) the character model to the Marketplace. This involves some additional validation and moderation steps.
- Use the model in your current experience and modify the model's appearance with [HumanoidDescription](../../characters/appearance.md#humanoiddescription).
diff --git a/content/en-us/art/characters/index.md b/content/en-us/art/characters/index.md
index ec9ac9530..e887ce474 100644
--- a/content/en-us/art/characters/index.md
+++ b/content/en-us/art/characters/index.md
@@ -1,5 +1,5 @@
---
-title: Avatar characters
+title: Avatar Characters
description: All Roblox users are represented by an avatar character which can be customized with body parts, accessories, and clothes from the Marketplace or within experiences.
hideBreadcrumbs: true
---
@@ -18,7 +18,7 @@ Custom avatars are first created in 3D modeling programs, such as [Blender](http
- Review the [basic character creation tutorial](../characters/creating/index.md) to get started on creating your first avatar character using Roblox's templates.
- [Various tools, resources, and guides](#resources) provided by Roblox to standardize and expedite the creation process.
-## Components of an avatar
+## Components of an Avatar
All avatar character models are made up of several fundamental components that provide users the functionality and flexibility to interact with their world. Many of these components are never made visible to the user, but they enable powerful avatar features that enhance social and environmental interactions. When creating avatar characters, all of these components are typically created first in your modeling software and then converted to their appropriate Roblox Studio instance on import.
@@ -48,7 +48,7 @@ Each avatar character is made up of the following rendered and non-rendered comp
-### Body parts
+### Body Parts
Each avatar character is made up of 15 separate mesh objects
@@ -72,7 +72,7 @@ Textures are image files that define the surface appearance of your character. Y
When texturing parts of your character model's body, ensure that your character model includes a modesty layer over sensitive regions. See [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410#safety) for more information on Roblox's policies.
-### Rigging armature
+### Rigging Armature
The armature is made up of 16 bones, 1 for each body part geometry and a root bone
@@ -82,7 +82,7 @@ When texturing parts of your character model's body, ensure that your character
An armature allows each character to articulate its limbs and move naturally through the environment. Often referred to as bones or joints, this rigging character information includes skinning data which allows connected limbs, like the knees or elbows to bend organically. In Studio, each bone of the character armature is represented by `Class.Bone` objects that connect the character `Class.MeshPart` objects together.
-### Face animation data
+### Face Animation Data
Each avatar character face is rigged and skinned to create various expressions
@@ -93,7 +93,7 @@ An armature allows each character to articulate its limbs and move naturally thr
Each required face pose is saved as a keyframe in the animation timeline.
Facial animation data allow each character to use global facial expressions. Each character includes facial bones and skinning, animation timeline data, and mapped pose data that allows it. In Studio, these facial animation elements are represented by a `Class.FaceControls` instance.
-### Cage meshes
+### Cage Meshes
Head and Upper Torso cage mesh objects (wireframe)
@@ -117,20 +117,20 @@ Attachment points define where rigid 3D accessories and equipables attach to the
When wearing layered clothing, the clothing isn't attached directly to the attachment, but it does reference the associated attachment point during ragdoll and dismemberment animations.
-## Creation process
+## Creation Process
When designing an avatar model, you must export all of the avatar components in a single `.fbx` or `.gltf` for import into Studio. Since 3D creation isn't a linear process and always requires reiteration and testing, the process of creating an avatar character model can differ between individuals and various creation workflows.
In general, the creation process follows these typical workflows:
-
Basic Creation with Templates
Customize a Roblox template character that already includes all the necessary components. See [Create with templates](../characters/creating/index.md) for guides and instructions.
+
Basic Creation with Templates
Customize a Roblox template character that already includes all the necessary components. See [Creating with Templates](../characters/creating/index.md) for guides and instructions.
Advanced Creation from Scratch
Create characters from scratch, allowing full customization of the avatar character's components.
-Ensure that all assets you create follow any applicable [Marketplace policies](../marketplace/marketplace-policy.md) and [Roblox Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards).
+Ensure that all assets you create follow any applicable [Marketplace Policies](../marketplace/marketplace-policy.md) and [Roblox Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards).
## Resources
@@ -149,40 +149,40 @@ If you are interested in specific avatar creation topics, use the following tabl
Tutorials
-
[Basic character creation tutorial](../accessories/creating/index.md)
+
[Basic Character Creation Tutorial](../accessories/creating/index.md)
-
Reference files
-
[Avatar references and project files](../characters/project-files.md)
[Fees and Commissions](../marketplace/marketplace-fees-and-commissions.md)
diff --git a/content/en-us/art/characters/project-files.md b/content/en-us/art/characters/project-files.md
index faf52935c..8a070d950 100644
--- a/content/en-us/art/characters/project-files.md
+++ b/content/en-us/art/characters/project-files.md
@@ -1,5 +1,5 @@
---
-title: Avatar project files and references
+title: Avatar Project Files and References
description: Download various character-related project files and reference files.
---
@@ -7,7 +7,7 @@ description: Download various character-related project files and reference file
See [Resources](../../avatar/resources.md) for a complete list of avatar-related downloadable content.
-## Project files
+## Project Files
The following `.fbx`, `.blend`, and `.ma` project files are available to use as examples, boilerplate, or reference:
@@ -23,7 +23,7 @@ The following `.fbx`, `.blend`, and `.ma` project files are available to use as
A skinned R15 character created from the Skin a humanoid model guide. Since this reference model doesn't yet have [inner and outer cage mesh data](../../art/characters/specifications.md#inner-and-outer-cages), this model can't equip layered clothing or accessories.
+
A skinned R15 character created from the Skinning a Humanoid Model guide. Since this reference model doesn't yet have [inner and outer cage mesh data](../../art/characters/specifications.md#inner-and-outer-cages), this model can't equip layered clothing or accessories.
A [classic](../../art/characters/specifications.md#classic) body type blank mannequin with **body cages** to use in Studio or your modeling application for clothing design. Due to unconfigured cage objects, this file may not import correctly into Studio until modified.
+
A [Classic](../../art/characters/specifications.md#classic) body type blank mannequin with **body cages** to use in Studio or your modeling application for clothing design. Due to unconfigured cage objects, this file may not import correctly into Studio until modified.
@@ -143,12 +143,12 @@ The following `.fbx`, `.blend`, and `.ma` project files are available to use as
## Templates
-If you are creating character models, you can choose from a variety of starting templates that best match your final design and save time on creating the [avatar components](../../art/characters/index.md#components-of-an-avatar). See [Create with templates](../../art/characters/creating/index.md#template-files) for important information on using these template files.
+If you are creating character models, you can choose from a variety of starting templates that best match your final design and save time on creating the [avatar components](../../art/characters/index.md#components-of-an-avatar). See [Creating with Templates](../../art/characters/creating/index.md#template-files) for important information on using these template files.
Each `.zip` contains a `.blend`, `.fbx`, and PBR texture `.png` files for that template model. If using Blender or following the [template creation guides](../../art/characters/creating/index.md), use the `.blend` project.
-If you are using Roblox's avatar template files, you must perform the [cleanup steps](../../art/characters/creating/combine-head-geometry.md) in order for the assets to properly validate before publishing to the Marketplace.
+If you are using Roblox's avatar template files, you must perform the [cleanup steps](../../art/characters/creating/combining-head-geometry.md) in order for the assets to properly validate before publishing to the Marketplace.
diff --git a/content/en-us/art/characters/specifications.md b/content/en-us/art/characters/specifications.md
index e49e96699..ecef3014d 100644
--- a/content/en-us/art/characters/specifications.md
+++ b/content/en-us/art/characters/specifications.md
@@ -1,18 +1,18 @@
---
-title: Character specifications
+title: Character Specifications
description: Character specification lists the specific technical requirements for custom characters created outside of Studio.
---
Character models require a specific set of components and configuration standards to ensure all avatar features work as expected. Check that your model meets the following modeling specifications and guidelines before exporting to ensure Studio compatibility.
-When ready to export, see the [export requirements](../../art/characters/export-settings.md) for mesh export settings for Blender and Maya.
+When ready to export, see [Export Requirements](../../art/characters/export-settings.md) for mesh export settings for Blender and Maya.
If creating other types of 3D models:
-
When creating a generic mesh, your model must meet [general mesh specifications](../modeling/specifications.md).
-
When creating a rigid accessory model, see the [accessory specifications](../../art/accessories/specifications.md).
-
When creating a clothing accessory model, see the [clothing specifications](../../art/accessories/clothing-specifications.md).
+
When creating a generic mesh, your model must meet [General Mesh Specifications](../modeling/specifications.md).
+
When creating a rigid accessory model, see [Accessory Specifications](../../art/accessories/specifications.md).
+
When creating a clothing accessory model, see [Clothing Specifications](../../art/accessories/clothing-specifications.md).
@@ -26,7 +26,7 @@ Avatar character models are made up of 15 separate mesh objects and require addi
- **Orientation** - Characters must face positive Z and stand up in positive Y.
- **Pose** - Before exporting, set your character to an I-Pose, A-Pose, or T-Pose when possible.
-### Body scale
+### Body Scale
Roblox supports 3 standards of body scales: **Normal**, **Slender**, and **Classic**. These standards allow developers to create experiences and spaces with consistent body sizes for standardizing movement and interaction. While the minimum sizes for each body scale is the same, each body scale has a unique maximum total body size, as well as a range for each body asset.
@@ -54,7 +54,7 @@ A Rthro Normal body scale [downloadable mannequin](../../avatar/resources.md#ref
-In the [3D importer](../../art/modeling/3d-importer.md#avatar-general), use **Rig Type** > **Rthro** to import your model as a Normal body scale.
+In the [3D Importer](../../art/modeling/3d-importer.md#avatar-general), use **Rig Type** > **Rthro** to import your model as a Normal body scale.
@@ -162,7 +162,7 @@ A Rthro Slender (Narrow) body scale [downloadable mannequin](../../avatar/resour
-In the [3D importer](../../art/modeling/3d-importer.md#avatar-general), use **Rig Type** > **Rthro Narrow** to import your model as a Slender body scale.
+In the [3D Importer](../../art/modeling/3d-importer.md#avatar-general), use **Rig Type** > **Rthro Narrow** to import your model as a Slender body scale.
@@ -367,18 +367,18 @@ In the [3D Importer](../../art/modeling/3d-importer.md#avatar-general), use **Ri
-### Triangle budgets
+### Triangle Budgets
-Although model geometries are typically created using quads, the Roblox Engine converts imported assets into tris. Each asset of your character model must not exceed our maximum tri budget. To quickly get the number of expected tris in your third-party modeling application, you can double the number of quads in your model.
+Although model geometries are typically created using quads, the Roblox engine converts imported assets into tris. Each asset of your character model must not exceed our maximum tri budget. To quickly get the number of expected tris in your third-party modeling application, you can double the number of quads in your model.
When character models are uploaded to Studio and created into assets for the Marketplace, the body is split into 6 individual assets: **DynamicHead**, **Torso**, **LeftArm**, **RightArm**, **LeftLeg**, **RightLeg**.
-
Asset type
-
Included mesh objects
-
Maximum triangles
+
Asset Type
+
Included Mesh Objects
+
Maximum Triangles
@@ -420,7 +420,7 @@ Although model geometries are typically created using quads, the Roblox Engine c
-### Body parts
+### Body Parts
See the following specifications for the individual mesh objects that make up a character model:
@@ -444,9 +444,9 @@ See the following specifications for the individual mesh objects that make up a
-### Face accessories
+### Face Accessories
-Face accessories, such as hair, eyebrows, and eyelashes are unique accessories that you can bundle with an avatar body upload. At this time, eyebrows and eyelashes can not be uploaded as standalone accessories and must be bundled with an avatar body. See [Accessory specifications](../accessories/specifications.md#face-accessories) for additional information on face accessories.
+Face accessories, such as hair, eyebrows, and eyelashes are unique accessories that you can bundle with an avatar body upload. At this time, eyebrows and eyelashes can not be uploaded as standalone accessories and must be bundled with an avatar body. See [Accessory Specifications](../accessories/specifications.md#face-accessories) for additional information on face accessories.
### Visibility
@@ -491,8 +491,8 @@ Attachments must follow a specific naming convention and positional consistency:
-
Mesh part
-
Attachment name
+
Mesh Part
+
Attachment Name
Details
@@ -646,7 +646,7 @@ See the following requirements for skinning:
- **No Root Influences** - Do not apply influences to the Root bone or joint.
- **Symmetry** - When possible, maintain symmetry when applying influences to a rig.
-## Facial animations
+## Facial Animations
Roblox supports facial animation on character heads and can support more than 50 base poses. If you are creating an avatar character, it must, at minimum, include the following 17 [FACS reference poses](../../art/characters/facial-animation/facs-poses-reference.md) to support avatar chat:
@@ -674,7 +674,7 @@ While the 17 poses are a minimum requirement, it's recommended to include as man
Avatar characters must follow Roblox's [texture specifications](../../art/modeling/texture-specifications.md). Characters created for the Marketplace can take advantage of [custom skin tones](#custom-skin-tone) which use alpha layers allow users to select their own base color.
-### Custom skin tone
+### Custom Skin Tone
When texturing an avatar character model where the user can set their own skin tone, set the exposed skin areas as transparent so a default color or texture is not baked into the texture. When rendering, the Studio engine applies the transparent layer on top without any layer effects. This step applies mostly to human-like characters with exposed skin that you intend users to customize.
@@ -711,24 +711,24 @@ The following are examples of skin tone shading for the face, and you can apply
-## Outer cages
+## Outer Cages
Outer cages on your character model allow your character to wear layerable accessories, such as clothing. Models, such as an avatar character, that are the target of meshes that will stretch over it, only require an outer cage, but meshes that deform, like [layered clothing](../accessories/clothing-specifications.md#cage-meshes), require an inner and outer cage.
For general use, see the following requirements for adding outer cage meshes to your model:
-- Use Roblox's [body cage templates](../../avatar/resources.md#project-files) to ensure naming convention and other configurations are correct.
+- Use Roblox's [Body Cage templates](../../avatar/resources.md#project-files) to ensure naming convention and other configurations are correct.
- **Naming Conventions** - The outer cage of a body part must be named after the primary mesh object with **\_OuterCage** affixed, for example `LeftUpperArm_OuterCage`.
- **Vertices and UV Map** - Don't delete vertices or alter the UVs on the Outer Cages as this can cause errors when importing in Studio or when equipping onto a character. Use the Roblox provided templates for the cage meshes to ensure compatibility with other layered assets.
- **Symmetry and consistency** - Keep each face (the space between vertices) consistently sized and retain symmetry wherever possible. Use symmetry tools in your modeling software whenever possible.
-## Marketplace requirements
+## Marketplace Requirements
Along with the other technical requirements listed, your items must meet the following additional specifications before uploading them to the Marketplace to sell:
-- Ensure that your items adhere to the [Marketplace program guidelines](../../marketplace/marketplace-policy.md).
+- Ensure that your items adhere to the [Marketplace Program Guidelines](../../marketplace/marketplace-policy.md).
- Whenever possible, ensure that your items adhere to the following modeling requirements:
- - [Custom mesh specifications](../../art/modeling/specifications.md)
+ - [Custom Mesh Specifications](../../art/modeling/specifications.md)
- Any applicable [avatar specifications](../../art/characters/specifications.md)
- Object `Class.MeshPart.Material|Material` is set to `Plastic`.
- Object `Class.MeshPart.Transparency|Transparency` is set to `0`.
diff --git a/content/en-us/art/characters/testing/blender.md b/content/en-us/art/characters/testing/blender.md
index 0832d227c..401903fce 100644
--- a/content/en-us/art/characters/testing/blender.md
+++ b/content/en-us/art/characters/testing/blender.md
@@ -1,5 +1,5 @@
---
-title: Test in Blender
+title: Testing in Blender
comments:
description: Verify the important aspects of your character model in Blender before importing into Studio.
next: /art/characters/testing/studio
@@ -8,7 +8,7 @@ prev: /art/characters/testing/
You can quickly verify many of your components in Blender, allowing you to catch out problems that may cause issues later on. You can use a mix of Blender native tools and Roblox's helper plugins to check for many common issues in your character model.
-## Facial animation data
+## Facial Animation Data
Facial animation uses multiple modeling components to work effectively. If using a template, or making changes to a model with existing facial animation data, it's sometimes possible to make a change that affects the saved poses, either in the animation timeline, or in the custom property of the head mesh.
@@ -30,17 +30,17 @@ Use the following steps to help verify the integrity of your facial animation da
2. In templates and some reference models, this bone is commonly named `DynamicHead` and indicates the beginning of the facial animation rig.
2. There should be about the same number of custom properties as unique animation frames, with each animation pose having its own mapped custom property.
- 3. The names for the mapped poses here should match the spelling and capitalization of the [FACS pose reference](../../../art/characters/facial-animation/facs-poses-reference.md).
+ 3. The names for the mapped poses here should match the spelling and capitalization of the [FACS Pose Reference](../../../art/characters/facial-animation/facs-poses-reference.md).
-If you discover issues with your face animation data, you may need to repeat the skinning, posing, or mapping processes for your character's head. See [Creating Heads](../../../art/characters/facial-animation/create-basic-heads.md) for a general overview of the avatar head creation process.
+If you discover issues with your face animation data, you may need to repeat the skinning, posing, or mapping processes for your character's head. See [Creating Heads](../../../art/characters/facial-animation/creating-basic-heads.md) for a general overview of the avatar head creation process.
If you are using a template and run into issues, it's possible the facial data was overridden by a saved animation, or the rigging or mapped data was mistakenly deleted. If it's difficult to quickly identify and resolve the issue, it may be quicker to restart your character customization from the original template file.
-## Body skin
+## Body Skinning
Properly skinning your character models ensures natural joint movements and realistic poses and expressions. There are several ways to verify skinning data, like using Blender's Pose Mode to pose the joints and examine how certain orientations can affect the joint skinning.
@@ -57,24 +57,24 @@ Use the following steps in Blender to verify your joint skinning in Pose mode:
-You can also run through common poses and movements using Roblox's [Calisthenics Tool](../../../art/modeling/calisthenics-tool.md) add-on, which applies several common animations to an avatar armature that you can play back and review in Blender's animation timeline.
+You can also run through common poses and movements using Roblox's [Calisthenics tool](../../../art/modeling/calisthenics-tool.md) add-on, which applies several common animations to an avatar armature that you can play back and review in Blender's animation timeline.
-The [Calisthenics Tool](../../../art/modeling/calisthenics-tool.md) adds animations to your timeline to quickly preview body animations. Be careful when saving or exporting your character when using this tool, as it may conflict with saved facial animation data that uses the same timeline.
+The [Calisthenics tool](../../../art/modeling/calisthenics-tool.md) adds animations to your timeline to quickly preview body animations. Be careful when saving or exporting your character when using this tool, as it may conflict with saved facial animation data that uses the same timeline.
-If you discover issues with your skinning, you may need to troubleshoot and reapply rigging and skinning steps to your humanoid. See [Rigging and skinning](../../../art/modeling/rigging.md) for an overview of the rigging and skinning processes.
+If you discover issues with your skinning, you may need to troubleshoot and reapply rigging and skinning steps to your humanoid. See [Rigging and Skinning](../../../art/modeling/rigging.md) for an overview of the rigging and skinning processes.
If you are using a template, it's possible the skinning data was affected by a destructive modeling change. This may require reskinning, or starting over your character customization from the original template file.
-## Technical specifications
+## Technical Specifications
Your avatar components should match the requirements provided in the [avatar specifications](../../../art/characters/specifications.md). When using templates and following appropriate non-destructive modeling practices, most of these components should not be touched, but you should still double-check that each component is compliant with the technical requirements.
-If you are using Roblox character templates and are ready to export into Studio, see [Exporting instructions](../../../art/characters/creating/export-textures.md) for specific export instructions for template files.
+If you are using Roblox character templates and are ready to export into Studio, see [Exporting instructions](../../../art/characters/creating/exporting-textures.md) for specific export instructions for template files.
diff --git a/content/en-us/art/characters/testing/index.md b/content/en-us/art/characters/testing/index.md
index 87fd47697..edb2b013a 100644
--- a/content/en-us/art/characters/testing/index.md
+++ b/content/en-us/art/characters/testing/index.md
@@ -1,5 +1,5 @@
---
-title: Testing characters
+title: Testing Characters
comments:
description: Verify the important aspects of your character model in Blender and in Studio.
next: /art/characters/testing/blender
@@ -7,7 +7,7 @@ next: /art/characters/testing/blender
It's important to constantly test your models during and after the creation process to ensure that your character can interact with various social and environmental elements in any experience.
-Whether you are using a template character, or your own custom assets, use the information provided in [Test in Blender](../../../art/characters/testing/blender.md) and [Test in Studio](../../../art/characters/testing/studio.md) throughout your workflow to comprehensively test your assets and quality check your models.
+Whether you are using a template character, or your own custom assets, use the information provided in [Testing in Blender](../../../art/characters/testing/blender.md) and [Testing in Studio](../../../art/characters/testing/studio.md) throughout your workflow to comprehensively test your assets and quality check your models.
Use the following table as an overview of common tests and resources to verify each component of your character model.
@@ -20,7 +20,7 @@ Use the following table as an overview of common tests and resources to verify e
Component
-
Testing recommendations
+
Testing Recommendations
@@ -60,7 +60,7 @@ Use the following table as an overview of common tests and resources to verify e
Component
-
Testing recommendations
+
Testing Recommendations
diff --git a/content/en-us/art/characters/testing/studio.md b/content/en-us/art/characters/testing/studio.md
index 148ff2df1..368c74aaa 100644
--- a/content/en-us/art/characters/testing/studio.md
+++ b/content/en-us/art/characters/testing/studio.md
@@ -1,5 +1,5 @@
---
-title: Test in Studio
+title: Testing in Studio
comments:
description: Verify the important aspects of your character model in a custom Studio test experience.
prev: /art/avatar/testing/blender
@@ -9,7 +9,7 @@ Test your character model in Studio to understand how it looks and feels within
Roblox provides an [Avatar Test experience](https://www.roblox.com/games/13176231501/Avatar-Test-Place) that you can open in Studio and import your character model in. This experience provides a wide variety of environmental and clothing tests to ensure that your character model and related components work as expected.
-## Set up test experience
+## Setting up Test Experience
The following is the general testing process setting up the Avatar Test experience:
@@ -18,7 +18,7 @@ The following is the general testing process setting up the Avatar Test experien
3. Set your model as the starter character.
4. Launch a playtest of the experience.
-### Open in Studio
+### Opening in Studio
In order to use the [Avatar Test experience](https://www.roblox.com/games/13176231501/Avatar-Test-Place), you must first download it from Roblox. You can save the experience locally and make any changes that may help your testing workflow. Roblox may update this experience periodically to add or improve features.
@@ -30,7 +30,7 @@ To download the Avatar Test experience:
-### Import
+### Importing
After you open the test experience in Studio, import your custom character model.
@@ -56,10 +56,10 @@ After you open the test experience in Studio, import your custom character model
4. Click **Import**. The character's model populates into the workspace.
- If an error or warning message displays in the Output Window, see [Troubleshooting](../../../art/characters/facial-animation/use-heads-in-studio.md#troubleshooting) for guidance on how to handle your specific error or warning message.
+ If an error or warning message displays in the Output window, see [Troubleshooting](../../../art/characters/facial-animation/using-heads-in-studio.md#troubleshooting) for guidance on how to handle your specific error or warning message.
-### Add SurfaceAppearance
+### Adding SurfaceAppearance
If you exported your textures separately, or if the 3D Importer fails to pick up your PBR textures, you can add them manually.
@@ -83,7 +83,7 @@ To add individual image texture files:
-### Set model as StarterPlayer
+### Setting Model as StarterPlayer
In order to play as the character during a playtest, rename and move the model instance:
@@ -95,7 +95,7 @@ In order to play as the character during a playtest, rename and move the model i
After you rename and add your model, navigate to the **Test** > **Play** button to start a test session of the experience as the custom model.
-## Use test experience
+## Using Test Experience
The Avatar Test experience includes several features in the interface and environment to quickly perform comprehensive tests of your avatar characters. You can use the [test checklist](#checklist) to ensure you are reviewing all the important aspects of your avatar character.
@@ -146,7 +146,7 @@ When playtesting the experience, use the following UI buttons on the right side
Use the following checklists to ensure that you are comprehensively testing each component of your avatar. Use the Avatar menu to switch between your custom avatar and a control avatar to verify expected behavior.
-#### Movement and animation
+#### Movement and Animation
Testing guitar animation emote
@@ -204,7 +204,7 @@ Check the following for any anomalies:
If you see unexpected behavior with your character's movement, there may be some issues with the rigging or skinning of your character. It may require revisiting the rigging and armature components of your avatar model in your modeling application.
-#### Lighting and color
+#### Lighting and Color
Testing skin tones
@@ -235,7 +235,7 @@ Check the following for any anomalies:
If you see unexpected behavior with your character's appearance in various lighting and color selections, there may be some issues with the texturing of your character. It may require re-adjusting the texturing components of your avatar model in your modeling application.
-#### Clothing and accessories
+#### Clothing and Accessories
Test a mix of clothing and accessories
diff --git a/content/en-us/art/characters/validation-tool.md b/content/en-us/art/characters/validation-tool.md
index 917faf8b0..7ebe27cbd 100644
--- a/content/en-us/art/characters/validation-tool.md
+++ b/content/en-us/art/characters/validation-tool.md
@@ -1,5 +1,5 @@
---
-title: Blender validation tool
+title: Blender Validation Tool
description: The Avatar Validation Tool checks for common character model issues in Blender.
---
@@ -9,7 +9,7 @@ The **Avatar Validation Tool** is a supplemental Blender add-on you can use to q
This tool can save you time by checking for common validation specifications before you export your model, but it doesn't provide a comprehensive verification of all aspects of your character model. You should always continually test your character model, including testing your characters [in Studio](../../art/characters/testing/studio.md) and verifying on your own if your model meets Roblox's [character specifications](../../art/characters/specifications.md).
-## Install
+## Installing
The Validation Tool plugin is compatible with Blender 3.5.1+. You may experience unexpected behavior if using earlier versions of Blender.
@@ -42,7 +42,7 @@ To install the Validation Tool in Blender:
-## Validate
+## Validating
After installing the plugin, you can begin validating your character models. When validating, results with issues display as red. In some cases, you can apply an automatic fix to checks that have issues. See [Checks and Troubleshooting Steps](#checks-and-troubleshooting) for details on each validation check.
@@ -59,7 +59,7 @@ To use the validation tool on your asset:
This validation tool only checks for common validation issues. You should always continually test your character model, including testing your characters [in Studio](../../art/characters/testing/studio.md) and verifying on your own if your model meets Roblox's [character specifications](../../art/characters/specifications.md).
-## Checks and troubleshooting
+## Checks and Troubleshooting
Each button on the validation tool performs a different check against the expected [character specifications](../../art/characters/specifications.md). The following are the specific types of verification each check performs, as well as general troubleshooting steps to resolve discovered issues:
diff --git a/content/en-us/art/index.md b/content/en-us/art/index.md
index 3c50d665c..1275fcda1 100644
--- a/content/en-us/art/index.md
+++ b/content/en-us/art/index.md
@@ -1,5 +1,5 @@
---
-title: 3D art in Roblox
+title: 3D Art in Roblox
description: An overview of 3D art tools, resources, and workflows for creators of all experience levels.
hideInPageNavigation: true
hideBreadcrumbs: true
@@ -11,7 +11,7 @@ No matter your creative background, Roblox provides a variety of tools, guides,
-
Quick reference
+
Quick Reference
Whether you're just getting started with Roblox or need a quick refresher, use the following popular resources to get up to speed.
@@ -22,9 +22,9 @@ Whether you're just getting started with Roblox or need a quick refresher, use t
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- 3D art in Roblox Studio
+ 3D Art in Roblox StudioGet up to speed with the many powerful tools and functions in Roblox Studio!
- Studio for artists
+ Studio for Artists
@@ -35,11 +35,11 @@ Whether you're just getting started with Roblox or need a quick refresher, use t
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Use third-party applications
+ Using Third-Party ApplicationsUnderstand how to use incorporate your creations from off-platform into Studio.Overview
- General modeling requirements
- Downloadable references
+ General Modeling Requirements
+ Downloadable References
@@ -51,11 +51,11 @@ Whether you're just getting started with Roblox or need a quick refresher, use t
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Create avatar items
+ Creating Avatar ItemsCreate accessories, clothing, and bodies that you can sell on the Marketplace.Overview
- Marketplace overview
- Fees and commissions
+ Marketplace Overview
+ Fees and Commissions
@@ -77,8 +77,8 @@ that teaches you the skills you need to create and monetize your experiences.
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Environmental art
- Environmental art teaches you how to recreate a high-quality environment for a first-person laser tag experience.
+ Environmental Art
+ Environmental Art teaches you how to recreate a high-quality environment for a first-person laser tag experience.
- Avatar item tutorials
+ Avatar Item TutorialsCheck out our tutorials on creating your own Avatar items ready for the Marketplace.
- Create accessories
- Create clothes
- Create characters from templates
+ Creating Accessories
+ Creating Clothes
+ Creating Characters from Templates
@@ -119,11 +119,11 @@ Check out the following showcases made by Roblox and the community. Each of thes
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Roblox creations
+ Roblox CreationsCheck out various experiences created by Roblox. Click to see documentation, downloadable resources, and links to try out the experiences yourself!Mystery of Duvall DriveBeyond the Dark
- Modern City template
+ Modern City template
@@ -134,7 +134,7 @@ Check out the following showcases made by Roblox and the community. Each of thes
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Community creations
+ Community CreationsCheck out these amazing showcase experiences created members of the community!Toyokawa Inaru Shrine by @nezkoHotel Resort by @ChooShu_Cho
@@ -143,7 +143,7 @@ Check out the following showcases made by Roblox and the community. Each of thes
-
@@ -403,11 +403,11 @@ The following is a list of common 3D art resources ordered by subject, as well a
-Facial animation and live heads
+Facial Animation and Live Heads
-Basic head creation
-Create face accessories
-FACS pose references
+Basic Head Creation
+Creating Face Accessories
+FACS Pose References
@@ -415,14 +415,14 @@ The following is a list of common 3D art resources ordered by subject, as well a
-Rigging and skinning
+Rigging and Skinning
-Rigging and skinning overview
-Avatar rig requirements
-Rig basic meshes
-Rig facial bones
-Skin facial bones
-Auto skin transfer
+Rigging and Skinning Overview
+Avatar Rig Requirements
+Rigging Basic Meshes
+Rigging Facial Bones
+Skinning Facial Bones
+Auto Skin Transfer
@@ -430,13 +430,13 @@ The following is a list of common 3D art resources ordered by subject, as well a
-Publish to Creator Store and Marketplace
+Publishing to Creator Store and Marketplace
-Creator Store overview
-Marketplace overview
-Marketplace policy
-Publish avatar items to Marketplace
-Marketplace fees and commissions
+Creator Store Overview
+Marketplace Overview
+Marketplace Policy
+Publishing Avatar Items to Marketplace
+Marketplace Fees and Commissions
diff --git a/content/en-us/art/modeling/3d-importer.md b/content/en-us/art/modeling/3d-importer.md
index 8b45bc36b..bf88b3c5b 100644
--- a/content/en-us/art/modeling/3d-importer.md
+++ b/content/en-us/art/modeling/3d-importer.md
@@ -8,18 +8,18 @@ description: 3D Importer imports third-party .fbx, .gltf, and .obj 3D model asse
The 3D Importer allows you to import `.fbx`, `.gltf`, or `.obj` 3D models into Studio as a custom `Class.Model`. This tool supports a wide variety of 3D models, including:
-- Meshes with basic or PBR ([surface appearance](../../art/modeling/surface-appearance.md)) textures.
-- Meshes with [rigging and skinning data](../../art/modeling/rigging.md).
+- Meshes with basic or PBR ([Surface Appearance](../../art/modeling/surface-appearance.md)) textures.
+- Meshes with [rigging and skinning data](../../art/modeling/rigging.md)
- Meshes with animation data.
- Specialized meshes, such as [accessories](../../art/accessories/index.md), or characters with [facial animation data](../../art/characters/facial-animation/index.md).
-To directly import 3D assets using HTTP requests, see the [Open Cloud usage guide for assets](../../cloud/open-cloud/usage-assets.md).
+To directly import 3D assets using HTTP requests, see [Cloud Usage Guide for Assets](../../cloud/open-cloud/usage-assets.md).
The 3D Importer is divided into three sections:
-
+
A. The **preview panel**, located in the top left, allows you to rotate and examine 3D objects before importing into your workspace or Toolbox.
@@ -27,7 +27,7 @@ B. The **hierarchy panel**, located in the bottom left, allows you to select spe
C. The **inspector panel**, located on the right, allows you to apply various settings to the imported object.
-## Import 3D objects
+## Importing 3D Objects
@@ -35,7 +35,7 @@ C. The **inspector panel**, located on the right, allows you to apply various se
-Before importing a 3D object, ensure that the `.fbx`, `.gltf` or `.obj` meets Studio's [mesh requirements](../../art/characters/specifications.md) to reduce errors or unexpected behavior.
+Before importing a 3D object, ensure that the `.fbx`, `.gltf` or `.obj` meets Studio's [Mesh Requirements](../../art/characters/specifications.md) to reduce errors or unexpected behavior.
To import a 3D object:
@@ -43,12 +43,12 @@ To import a 3D object:
-2. Select the `.fbx`, `.gltf` or `.obj` you intend to import. The Importer window displays.
+2. Select the `.fbx`, `.gltf` or `.obj` you intend to import. The importer window displays.
3. Verify the object preview and check that the [import settings](#import-settings) are correct for your object.
4. Verify any [warning or error messages](#warnings-and-errors).
5. Click **Import**.
-### Import settings
+### Import Settings
Depending on the object selected in the hierarchy panel, the inspector panel displays the following groups of settings:
@@ -59,7 +59,7 @@ Depending on the object selected in the hierarchy panel, the inspector panel dis
- **Object General**: Affects the selected child object.
- **Object Geometry**: Affects the geometry of the selected child object.
-#### File general
+#### File General
The 3D Importer provides the following settings for all meshes:
@@ -101,12 +101,12 @@ The 3D Importer provides the following settings for all meshes:
Uses Cage
-
If enabled, the 3D Importer finds cage meshes in the model and converts them to `WrapInstance` objects, such as `Class.WrapLayer` or `Class.WrapTarget`. If disabled, the Importer treats them as regular meshes. If the 3D Importer initially detects cage meshes in the model, this is **enabled** by default.
+
If enabled, the 3D Importer finds cage meshes in the model and converts them to `WrapInstance` objects, such as `Class.WrapLayer` or `Class.WrapTarget`. If disabled, the importer treats them as regular meshes. If the 3D Importer initially detects cage meshes in the model, this is **enabled** by default.
-#### Rig general
+#### Rig General
The 3D Importer provides the following settings for meshes with rigging data:
@@ -120,7 +120,7 @@ The 3D Importer provides the following settings for meshes with rigging data:
Rig Type
-
Sets the type of rig the mesh should be associated with. The options are: - **R15** - **Custom** - **No Rig**
By default, the 3D importer attempts to select the most appropriate setting based on the detected rigging and skinning data of the mesh.
+
Sets the type of rig the mesh should be associated with. The options are: - **R15** - **Custom** - **No Rig**
By default, the 3D Importer attempts to select the most appropriate setting based on the detected rigging and skinning data of the mesh.
Validate UGC Body
@@ -133,7 +133,7 @@ The 3D Importer provides the following settings for meshes with rigging data:
-#### File transform
+#### File Transform
The 3D Importer provides the following settings for all meshes:
@@ -156,7 +156,7 @@ The 3D Importer provides the following settings for all meshes:
-#### File geometry
+#### File Geometry
File geometry includes information on the file dimensions and polycount of the entire model. You can edit the following settings for all meshes:
@@ -183,7 +183,7 @@ File geometry includes information on the file dimensions and polycount of the e
-#### Object general
+#### Object General
When selecting a specific child object of your mesh, the 3D Importer populates Object General settings. You can edit the following settings for the selected child objects:
@@ -210,7 +210,7 @@ When selecting a specific child object of your mesh, the 3D Importer populates O
-#### Object geometry
+#### Object Geometry
Object Geometry includes information on the dimensions and polycount of the selected child object of the model. You can edit the following settings for the selected child objects:
@@ -233,7 +233,7 @@ Object Geometry includes information on the dimensions and polycount of the sele
-### Warnings and errors
+### Warnings and Errors
diff --git a/content/en-us/art/modeling/avatar-setup.md b/content/en-us/art/modeling/avatar-setup.md
index c31d39aea..ca1c77f4c 100644
--- a/content/en-us/art/modeling/avatar-setup.md
+++ b/content/en-us/art/modeling/avatar-setup.md
@@ -1,6 +1,6 @@
---
title: Avatar Setup
-description: The Avatar setup tool previews animations, clothing, accessories, and body constructs on avatar rigs, directly in Studio.
+description: The Avatar Setup tool previews animations, clothing, accessories, and body constructs on avatar rigs, directly in Studio.
---
The **Avatar Setup** tool allows you to auto-setup avatar meshes, preview animations, clothing, skin tones, and test avatar character bodies directly in Studio. Marketplace creators can also begin the uploading and validation process from this tool to quickly publish their assets.
@@ -14,11 +14,11 @@ The **Avatar Setup** tool allows you to auto-setup avatar meshes, preview animat
- Using additional Avatar setup features, you can [test](#testing-interface) out skin tones, animations, rigid and layered clothing, and more.
+ Using additional Avatar Setup features, you can [test](#testing-interface) out skin tones, animations, rigid and layered clothing, and more.
-## Avatar auto-setup
+## Avatar Auto-Setup
The **auto-setup** feature converts a body model into a finished avatar model with all the advanced components that allow characters to interact with the world and express themselves.
@@ -33,7 +33,7 @@ Auto-setup performs the following on a submitted character model:
- **Partitioning** — Separates the body mesh into the appropriate R15 parts.
- **Creating attachments** — Adds the appropriate attachment points enabling the character to wear rigid accessories.
-### How auto-setup works
+### How Auto-Setup Works
The auto-setup tool utilizes machine learning (ML) models that handles the rigging, skinning, and caging application. After creating the rigging, skinning, and caging data, the tool applies body partitioning and attachment point generation using a geometry-based solution. If existing non-rig components, such as cages, attachments, or animation, are already included in the imported `Class.Model`, the auto-setup tool removes them and generates new components. If the model includes a compatible R15 rig, the tool preserves the rigging and skinning data and does not overwrite this data.
@@ -58,7 +58,7 @@ See the following examples for the types of bodies and styles that work best wit
Roblox intends to continue releasing updated versions of the auto-setup ML models over time. When uploading an avatar body asset, Studio gives you the option to add your input model as part of a dataset for additional training and improvements as well as provide feedback on the quality of the auto-setup output.
-### Model requirements
+### Model Requirements
For best results, Avatar auto-setup expects the input body model to follow a specific set of requirements. These requirements may require using a third-party modeling tool to adjust your current character mesh, as they are different from the traditional [avatar character requirements](../characters/specifications.md). As the auto-setup tool improves, some of these requirements may lift.
@@ -102,9 +102,9 @@ The full requirements for the input body model are as follows:
-
Body part grouping
-
Maximum triangles
-
Maximum quads
+
Body Part Grouping
+
Maximum Triangles
+
Maximum Quads
@@ -151,13 +151,13 @@ The full requirements for the input body model are as follows:
14. **Includes texture** — Models should include one or more texture maps. If the input body includes multiple textures, the tool bakes the textures to a single map. This applies to [PBR textures](../modeling/surface-appearance.md) where the four textures are baked — one for each albedo, normal, metalness and roughness.
15. **Follows Marketplace and Community Policy** — The model must conform to Roblox's [Marketplace Policy](../../marketplace/marketplace-policy.md) and [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards).
-#### Examples of non-supported models
+#### Examples of Non-Supported Models
The following are common examples of models that may not yield expected results with auto-setup:
-Non-supported model examples
+Non-Supported Model Examples
@@ -165,32 +165,32 @@ The following are common examples of models that may not yield expected results
-
**Asymmetry** — setup tool expects symmetry with limbs.
+
**Asymmetry** — Setup tool expects symmetry with limbs.
-
**I-pose** — setup tool expects A-Pose.
+
**I-pose** — Setup tool expects A-Pose.
-
**Non-contiguous mesh** — setup tool expects the body mesh to be completely contiguous.
+
**Non-contiguous mesh** — Setup tool expects the body mesh to be completely contiguous.
-
**No neck** — setup tool expects a neck connecting a head to the torso.
+
**No neck** — Setup tool expects a neck connecting a head to the torso.
-
**Out of proportion limbs** — setup tool expects a more realistic humanoid-style character model.
+
**Out of proportion limbs** — Setup tool expects a more realistic humanoid-style character model.
-
**Out of proportion limbs** — setup tool expects a more realistic humanoid-style character model.
+
**Out of proportion limbs** — Setup tool expects a more realistic humanoid-style character model.
@@ -198,7 +198,7 @@ The following are common examples of models that may not yield expected results
-### Import models
+### Importing Models
Studio supports `.gltf`, `.fbx`, and `.obj` models using the 3D Importer. If you are exporting your model from a third-party tool, see [Export Settings](../characters/export-settings.md) for export configurations.
@@ -264,14 +264,14 @@ To import the model into Studio:
When a new model is imported, it's also added to the moderation queue. If an avatar asset is moderated incorrectly, you will receive a moderation email with a link to appeal. This appeal takes up to 10 minutes to resolve.
-### Run auto-setup
+### Running Auto-Setup
When your project has the appropriate `Class.Model` in your workspace, you can begin the auto-setup process.
1. Select the model in the workspace.
1. If you want to select only specific meshes of your model, navigate to the Explorer, expand the `Class.Model` object, and hold shift and click on the individual mesh objects.
-2. With the Model selected, navigate to the **Avatar tab** and select **Avatar setup**.
-3. In the Avatar setup panel, click the blue **Set Up Avatar** button. This process can take several minutes.
+2. With the Model selected, navigate to the **Avatar tab** and select **Avatar Setup**.
+3. In the Avatar Setup panel, click the blue **Set Up Avatar** button. This process can take several minutes.
4. Once complete, a `Class.Model` of your avatar populates in your workspace.
@@ -283,30 +283,30 @@ When your project has the appropriate `Class.Model` in your workspace, you can b
- 2. Use the various [Avatar setup tools](#test-interface) to verify the components of your avatar before saving the `Class.Model` to your Toolbox or uploading to the Marketplace.
+ 2. Use the various [Avatar Setup tools](#testing-interface) to verify the components of your avatar before saving the `Class.Model` to your Toolbox or uploading to the Marketplace.
-## Test interface
+## Testing Interface
After auto-setup, or when using the tool with an avatar-ready character model, the character populates in the preview window. It's important to test that your avatar components have correctly generated by testing out different clothing, rigid accessories, and animations. If you discover any issues, you may need to update your base input model in your third-party modeling software and/or retry the auto-setup process.
-Once an avatar is added to the tool, four tabs appear on the left side of the panel:
[Check body](#check-body)
[Check face](#check-face)
[Test in experience](#test-in-experience)
[Publish](#publish)
+Once an avatar is added to the tool, four tabs appear on the left side of the panel:
[Check Body](#check-body)
[Check Face](#check-face)
[Test in Experience](#test-in-experience)
[Publish](#publish)
-### Check body
+### Check Body
The **Check Body** interface contains tabs for Animations, Clothing, Accessories, and Body assets, such as skin-tone and swapping body parts. Clicking a subtab like Shirts, Waist, or Skin reveals a selection column along the left side of the window for testing various cosmetics and visuals.
-#### Equip items
+#### Equipping Items
Selected items are equipped on the avatar and are added to the currently equipped column on the right side. Selected animations begin playing as a preview of how they'll look in a running experience.
To unequip an item, click it again in the selection column, press the **X** button at the top right of the equipped item, or right-click the asset in the Equipped column and select **Unequip**. You can also drag and order the various equipped accessories to set the worn order.
-#### Add items
+#### Adding Items
The add item button allows you to add custom assets to the tool's palette for testing.
@@ -319,7 +319,7 @@ To add an item to the palette:
3. The item appears in the appropriate section and subsection of the Check Body interface, such as **Accessories** → **Hair**.
-### Check face
+### Check Face
The **Check Face** interface zooms into the face and allows you test various facial poses.
@@ -334,9 +334,9 @@ The **Check Face** interface zooms into the face and allows you test various fac
-### Test in experience
+### Test in Experience
-The **Test in Experience** button starts playtesting the experience with the previewed avatar. Any changes made in the Avatar setup preview tools, such as equipped clothing or accessories, or modifications, such as skin tone or body part swaps, do not transfer over to the playable character model in this mode.
+The **Test in Experience** button starts playtesting the experience with the previewed avatar. Any changes made in the Avatar Setup preview tools, such as equipped clothing or accessories, or modifications, such as skin tone or body part swaps, do not transfer over to the playable character model in this mode.
### Publish
@@ -348,6 +348,6 @@ The upload option opens the following prompt which goes through additional valid
For additional resources on the publishing process and Marketplace, see the following:
-- [Publish to the Marketplace](../../marketplace/publish-to-marketplace.md)
-- [Marketplace fees and commissions](../../marketplace/marketplace-fees-and-commissions.md)
-- [Marketplace policy](../../marketplace/marketplace-policy.md)
+- [Publishing to the Marketplace](../../marketplace/publishing-to-marketplace.md)
+- [Marketplace Fees and Commissions](../../marketplace/marketplace-fees-and-commissions.md)
+- [Marketplace Policy](../../marketplace/marketplace-policy.md)
diff --git a/content/en-us/art/modeling/calisthenics-tool.md b/content/en-us/art/modeling/calisthenics-tool.md
index 7c4bdf388..fff8f609d 100644
--- a/content/en-us/art/modeling/calisthenics-tool.md
+++ b/content/en-us/art/modeling/calisthenics-tool.md
@@ -3,9 +3,9 @@ title: Calisthenics Tool
description: Calisthenics Tool is a Blender plugin that you can use to verify skinning quality of an asset.
---
-The **Calisthenics tool** is a supplemental [Blender](https://www.blender.org/) add-on that allows you to quickly test your asset through a set of animation cycles to verify your skinning data. At any point during the animation testing, you can pause and use Blender's skinning tools, such as [Weight Painting brushes](https://docs.blender.org/manual/en/latest/sculpt_paint/weight_paint/introduction.html), to resolve any skinning imperfections.
+The **Calisthenics Tool** is a supplemental [Blender](https://www.blender.org/) add-on that allows you to quickly test your asset through a set of animation cycles to verify your skinning data. At any point during the animation testing, you can pause and use Blender's skinning tools, such as [Weight Painting brushes](https://docs.blender.org/manual/en/latest/sculpt_paint/weight_paint/introduction.html), to resolve any skinning imperfections.
-Skinning your clothing and characters is a critical and often time-intensive process to create high quality assets that move and fit with different character bodies. Similar to the [Layered Clothing Validation Tool](../../art/accessories/validation-tool.md), the Calisthenics Tool can save you time when testing your character models after rigging and skinning.
+Skinning your clothing and characters is a critical and often time-intensive process to create high quality assets that move and fit with different character bodies. Similar to the [Layered Clothing Validation tool](../../art/accessories/validation-tool.md), the Calisthenics Tool can save you time when testing your character models after rigging and skinning.
The Calisthenics tool doesn't provide complete verification of all potential skinning issues. You must also ensure that your custom models meet Studio's [avatar character specifications](../../art/characters/specifications.md) and any applicable [layered clothing specifications](../../art/accessories/specifications.md) for the best results in your experience.
@@ -59,7 +59,7 @@ To install the Calisthenics Tool in Blender:
-## Use the Calisthenics Tool
+## Using the Calisthenics Tool
After installation, you can use the Calisthenics Tool whenever you want to test an R15 character rig with skinning data. With the Calisthenics Tool, you can check how a character would move with generic animations, as well as attach rigid reference accessories to verify attachment during these movements. The tool also includes an option to automatically export your character, removing reference animation and accessory data.
@@ -69,7 +69,7 @@ You can try out the Calisthenics Tool using an [example character model](../../a
For demonstration purposes, this reference model doesn't contain FACS data. If you require a reference with facial animation, you can download the same model with FACS data from our [reference models](../../art/characters/specifications.md#reference-files).
-### Test animations
+### Testing Animations
When testing your character model, first set the armature in the Calisthenics Tool then select one of the reference animations. It is important to visually verify your skinning quality using various movements and angles to ensure the best results for your model.
@@ -92,10 +92,10 @@ To test animations:
5. Press **Stop Animation** to clear animation data.
-6. If you notice any unexpected skinning deformations, pause on the frame and switch to **Weight Paint mode** or use Blender's other skinning tools to resolve. See [Skin a humanoid model](../../art/modeling/skin-a-humanoid-model.md) for additional instruction.
+6. If you notice any unexpected skinning deformations, pause on the frame and switch to **Weight Paint mode** or use Blender's other skinning tools to resolve. See [Skinning a Humanoid Model](../../art/modeling/skinning-a-humanoid-model.md) for additional instruction.
-### Test accessory attachments
+### Testing Accessory Attachments
You can add reference attachments to your character model using the **Attach Test Accessory** buttons. These test accessories help preview how rigid accessories attach to your character and how they can move with your model. The tool includes two sets of rigid accessories to apply to your character.
@@ -118,7 +118,7 @@ To test accessories:
- **Detach Test Accessories**: Removes any test accessories from your character.
2. If an accessory is not attaching at an expected location, reposition the associated **Attachment object** in your character rig.
-### Export models
+### Exporting Models
When you are ready to export your model, you can export your character directly through the Calisthenics Tool. The tool automatically clears any of the test data and applies appropriate export settings.
diff --git a/content/en-us/art/modeling/export-requirements.md b/content/en-us/art/modeling/export-requirements.md
index 0a65815de..4c1b1f0d1 100644
--- a/content/en-us/art/modeling/export-requirements.md
+++ b/content/en-us/art/modeling/export-requirements.md
@@ -1,14 +1,14 @@
---
-title: Export settings
+title: Export Settings
description: Use the appropriate export settings in Maya and Blender to generate Studio-ready .fbx files.
---
-Export your mesh or model as a `.fbx` to take advantage of all of Studio's 3D import features. When rigging or skinning a model, a `.fbx` export contains both the rig and influence data you need to later [import](../../parts/meshes.md#import-meshes) into Studio.
+Export your mesh or model as a `.fbx` to take advantage of all of Studio's 3D import features. When rigging or skinning a model, a `.fbx` export contains both the rig and influence data you need to later [import](../../parts/meshes.md#importing-meshes) into Studio.
Check that your model meets Roblox's [modeling specifications](../../art/modeling/specifications.md) before exporting to ensure Studio compatibility. Specific types of assets, like characters and accessories, have additional specifications:
-- If you are creating an avatar character model, ensure that your model follows the [character specifications](../../art/characters/specifications.md).
-- If you are creating an accessory model, ensure that your model follows the [accessory specifications](../../art/accessories/specifications.md).
+- If you are creating an avatar character model, ensure that your model follows [Character Specifications](../../art/characters/specifications.md).
+- If you are creating an accessory model, ensure that your model follows [Accessory Specifications](../../art/accessories/specifications.md).
diff --git a/content/en-us/art/modeling/index.md b/content/en-us/art/modeling/index.md
index 4946bfde7..410758f4c 100644
--- a/content/en-us/art/modeling/index.md
+++ b/content/en-us/art/modeling/index.md
@@ -1,5 +1,5 @@
---
-title: Custom meshes
+title: Custom Meshes
description: External modeling is the use of a third-party modeling software to create custom meshes.
---
@@ -13,7 +13,7 @@ In Roblox, custom 3D assets generally fall under three types of applications:
- **Avatar models** for users or non-player characters (NPCs).
- **Accessory models** that character models can equip and wear, like clothing and cosmetics.
-If you meet certain account requirements, you can publish and sell your avatar-ready models on the Marketplace and earn a commission for each sale. For more information, see [Roblox avatars](../../avatar/index.md).
+If you meet certain account requirements, you can publish and sell your avatar-ready models on the Marketplace and earn a commission for each sale. For more information, see Roblox's [Avatar documentation](../../avatar/index.md).
@@ -30,7 +30,7 @@ If you meet certain account requirements, you can publish and sell your avatar-r
-## Supported meshes
+## Supported Meshes
Roblox supports many types of custom meshes, as long as they adhere to the [general mesh specifications](../../art/modeling/specifications.md). A basic custom mesh consists of at least one mesh object and one texture:
@@ -51,7 +51,7 @@ Roblox supports many types of custom meshes, as long as they adhere to the [gene
Studio also supports meshes that include [rigging and skinning](#rigging-and-skinning) data, [PBR textures](#pbr-textures), and other [Studio-related objects](#studio-related-objects) like cage meshes and attachments. Many of these various components are required if you are creating avatar character models or accessories.
-### Rigging and skinning
+### Rigging and Skinning
A **rigged mesh** is a mesh with an internal poseable skeleton rig and bone structure. Rigged meshes allow mesh surfaces to rotate and move where internal bone joints are placed within a model, such as a character's knee or elbow. Skinning a rigged mesh allows the mesh object to bend organically, imitating the natural way joints would move in real life.
@@ -66,20 +66,20 @@ A **rigged mesh** is a mesh with an internal poseable skeleton rig and bone stru
-For more information on rigging and skinning, see [Rigging and skinning](../../art/modeling/rigging.md).
+For more information on rigging and skinning, see [Rigging and Skinning](../../art/modeling/rigging.md).
-### PBR textures
+### PBR Textures
-**Physically-Based rendering** (PBR) textures allow you to represent realistic shading and lighting by using multiple types of texture images, or **maps**, on a single object. Combining multiple texture maps can more accurately simulate color, roughness, and reflectivity in any lighting environment and can enhance the visual elements of your assets and environment.
+**Physically-Based Rendering** (PBR) textures allow you to represent realistic shading and lighting by using multiple types of texture images, or **maps**, on a single object. Combining multiple texture maps can more accurately simulate color, roughness, and reflectivity in any lighting environment and can enhance the visual elements of your assets and environment.
-For more information on PBR textures, see [PBR textures](../../art/modeling/surface-appearance.md).
+For more information on PBR textures, see [PBR Textures](../../art/modeling/surface-appearance.md).
-### Studio-related objects
+### Studio-Related Objects
Studio automatically converts certain types of objects found in 3D modeling files as specific workspace objects in the experience. These are typically used when creating a character or accessory, and configuring these in your modeling software can sometimes be the primary way of correctly setting up these Studio objects.
@@ -105,38 +105,38 @@ If you are interested in specific avatar creation topics, use the following tabl
-
Reference files
-
[Example models, project kits, and templates](../../art/modeling/project-files.md)
[Fees and Commissions](../../marketplace/marketplace-fees-and-commissions.md)
diff --git a/content/en-us/art/modeling/material-reference.md b/content/en-us/art/modeling/material-reference.md
index 7f2fa28d6..4ab5a2754 100644
--- a/content/en-us/art/modeling/material-reference.md
+++ b/content/en-us/art/modeling/material-reference.md
@@ -1,5 +1,5 @@
---
-title: Material references
+title: Material References
description: PBR texture examples and various texture map values.
---
@@ -11,7 +11,7 @@ The following figure illustrates the various base surface types you can achieve
-## Common materials
+## Common Materials
You can use the following material reference values as a baseline for creating your own custom surfaces:
@@ -115,16 +115,16 @@ You can use the following material reference values as a baseline for creating y
-## Clothing examples
+## Clothing Examples
Layered clothing can take advantage of PBR textures to achieve realistic and visually popping cosmetics for avatar characters. Use the following reference examples to compare how various material values are used to achieve a certain cosmetic effect and its comparable real-time rendering in Substance Painter and Roblox Studio:
-
Substance Painter render
-
Roblox Studio render
-
Material values
+
Substance Painter Render
+
Roblox Studio Render
+
Material Values
diff --git a/content/en-us/art/modeling/project-files.md b/content/en-us/art/modeling/project-files.md
index bd4d629ef..e9abf3f51 100644
--- a/content/en-us/art/modeling/project-files.md
+++ b/content/en-us/art/modeling/project-files.md
@@ -1,5 +1,5 @@
---
-title: Modeling project files and references
+title: Modeling Project Files and References
description: Download various modeling-related project files and reference files.
hideInPageNavigation: true
hideBreadcrumbs: true
@@ -13,12 +13,12 @@ The following `.fbx`, `.blend`, and `.ma` project files are available to use as
-
Maple leaf tree
+
Maple Leaf Tree
-A skinned tree model with the soil, branches, and leaves as separate meshes bound to a single armature. This is packaged with UV textures that can be applied with `Class.SurfaceAppearance`. This is an advanced version of the tree model used in the Skin a simple mesh guide.
+A skinned tree model with the soil, branches, and leaves as separate meshes bound to a single armature. This is packaged with UV textures that can be applied with `Class.SurfaceAppearance`. This is an advanced version of the tree model used in the Skinning a Simple Mesh guide.
@@ -66,9 +66,9 @@ Creature model from the
@@ -146,7 +146,7 @@ A Blocky character model with an animatable head and a full body cage.
-A skinned R15 character created from the Skin a humanoid model guide. Since this reference model doesn't yet have [inner and outer cage mesh data](../../art/characters/specifications.md#outer-cages), this model can't equip layered clothing or accessories.
+A skinned R15 character created from the Skinning a Humanoid Model guide. Since this reference model doesn't yet have [inner and outer cage mesh data](../../art/characters/specifications.md#inner-and-outer-cages), this model can't equip layered clothing or accessories.
@@ -164,7 +164,7 @@ A skinned R15 character created from the
@@ -183,7 +183,7 @@ Uncaged example clothing ready for caging in a 3D modeling software.
-
Clothing examples
+
Clothing Examples
@@ -203,7 +203,7 @@ Caged 3D accessory models and associated PBR textures. Ready for import into Stu
-
Classic mannequin
+
Classic Mannequin
@@ -214,7 +214,7 @@ A blank mannequin using Roblox's [Classic](../../art/characters/specifications.m
-
+
@@ -224,7 +224,7 @@ A blank mannequin using Roblox's [Classic](../../art/characters/specifications.m
-
Rthro mannequin
+
Rthro Mannequin
@@ -235,7 +235,7 @@ A blank mannequin using Roblox's [Rthro Normal](../../art/characters/specificati
-
+
@@ -245,7 +245,7 @@ A blank mannequin using Roblox's [Rthro Normal](../../art/characters/specificati
-
Rthro slender mannequin
+
Rthro Slender Mannequin
@@ -256,7 +256,7 @@ A blank mannequin using Roblox's [Rthro Slender](../../art/characters/specificat
-
+
@@ -265,10 +265,10 @@ A blank mannequin using Roblox's [Rthro Slender](../../art/characters/specificat
## Templates
-These project files require additional configuration before they are ready for Studio import. See [Create with templates](../characters/creating/index.md) for additional information.
+These project files require additional configuration before they are ready for Studio import. See [Creating with Templates](../characters/creating/index.md) for additional information.
-If you are using Roblox's avatar template files, you must perform the [cleanup steps](../../art/characters/creating/combine-head-geometry.md) in order for the assets to properly validate before publishing to the Marketplace.
+If you are using Roblox's avatar template files, you must perform the [cleanup steps](../../art/characters/creating/combining-head-geometry.md) in order for the assets to properly validate before publishing to the Marketplace.
@@ -280,7 +280,7 @@ If you are using Roblox's avatar template files, you must perform the [cleanup s
-Blender and .fbx template files with pre-baked avatar components.
+Blender and .fbx template files with pre-baked avatar components.
See [Creating with Templates](../../art/characters/creating/index.md) for instructions.
@@ -300,7 +300,7 @@ Blender and .fbx template files with pre-baked avatar components.
-Blender and .fbx template files with pre-baked avatar components.
+Blender and .fbx template files with pre-baked avatar components.
See [Creating with Templates](../../art/characters/creating/index.md) for instructions.
@@ -321,7 +321,7 @@ Blender and .fbx template files with pre-baked avatar components.
-Blender and .fbx template files with pre-baked avatar components.
+Blender and .fbx template files with pre-baked avatar components.
See [Creating with Templates](../../art/characters/creating/index.md) for instructions.
@@ -342,7 +342,7 @@ Blender and .fbx template files with pre-baked avatar components.
-Blender and .fbx template files with pre-baked avatar components.
+Blender and .fbx template files with pre-baked avatar components.
See [Creating with Templates](../../art/characters/creating/index.md) for instructions.
@@ -363,7 +363,7 @@ Blender and .fbx template files with pre-baked avatar components.
-Blender and .fbx template files with pre-baked avatar components.
+Blender and .fbx template files with pre-baked avatar components.
See [Creating with Templates](../../art/characters/creating/index.md) for instructions.
@@ -384,7 +384,7 @@ Blender and .fbx template files with pre-baked avatar components.
-Blender and .fbx template files with pre-baked avatar components.
+Blender and .fbx template files with pre-baked avatar components.
See [Creating with Templates](../../art/characters/creating/index.md) for instructions.
@@ -403,7 +403,8 @@ Blender and .fbx template files with pre-baked avatar components.
-Blender and .fbx template files with pre-baked avatar components.
+Blender and .fbx template files with pre-baked avatar components.
See [Creating with Templates](../../art/characters/creating/index.md) for instructions.
+
@@ -415,7 +416,7 @@ Blender and .fbx template files with pre-baked avatar components.
-### Project files
+### Project Files
@@ -423,7 +424,7 @@ Blender and .fbx template files with pre-baked avatar components.
-
R15 rig and attachments
+
R15 Rig and Attachments
@@ -442,7 +443,7 @@ Standard armature rig template for Blender. Use this template for rigging **bodi
-
Cages for clothing
+
Cages for Clothing
@@ -461,7 +462,7 @@ Project files for creation, includes a full-body inner and outer cage mesh for c
-
Cages for bodies
+
Cages for Bodies
@@ -481,7 +482,7 @@ Project files for creation, includes the 15 individual body part cages required
-
Combined project files
+
Combined Project Files
@@ -499,7 +500,7 @@ Template file containing all content from previous templates, includes rig skele
-### Add-ons and tools
+### Add-Ons and Tools
@@ -507,7 +508,7 @@ Template file containing all content from previous templates, includes rig skele
-
Blender Studio plugin
+
Blender Studio Plugin
@@ -527,7 +528,7 @@ Open-source Blender Studio add-on that allows you to upload assets directly from
-
Blender validation tool
+
Blender Validation Tool
@@ -536,7 +537,7 @@ Blender add-on for verifying avatar technical compatibility before importing int
-
+
@@ -546,7 +547,7 @@ Blender add-on for verifying avatar technical compatibility before importing int
-
Blender Calisthenics tool
+
Blender Calisthenics Tool
@@ -556,7 +557,7 @@ Blender add-on for checking skinning data on characters and clothing.
-
+
diff --git a/content/en-us/art/modeling/rig-a-humanoid-model.md b/content/en-us/art/modeling/rigging-a-humanoid-model.md
similarity index 86%
rename from content/en-us/art/modeling/rig-a-humanoid-model.md
rename to content/en-us/art/modeling/rigging-a-humanoid-model.md
index ba4bd1e7c..0e31b2397 100644
--- a/content/en-us/art/modeling/rig-a-humanoid-model.md
+++ b/content/en-us/art/modeling/rigging-a-humanoid-model.md
@@ -1,18 +1,18 @@
---
-title: Rig a humanoid model
+title: Rigging a Humanoid Model
description: Explains the process for rigging a humanoid R15 model in Blender.
---
An R15 humanoid character model, such as those that make up user avatar characters, is made up of 15 individual mesh objects. Similar to rigging a simple mesh, you can bind or parent a group of meshes to an internal rig. Models made up of multiple meshes require additional steps to rig in a third-party modeling tool such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview).
-This advanced guide covers the process of rigging a humanoid model in Blender using a provided template and humanoid model. This rigging step is required before [skinning the humanoid model](../../art/modeling/skin-a-humanoid-model.md). You should be familiar with [rigging a basic model](./rig-a-simple-mesh.md) before continuing.
+This advanced guide covers the process of rigging a humanoid model in Blender using a provided template and humanoid model. This rigging step is required before [skinning the humanoid model](../../art/modeling/skinning-a-humanoid-model.md). You should be familiar with [rigging a basic model](./rigging-a-simple-mesh.md) before continuing.
To rig a humanoid model in Blender:
-- [Import a character model](#import-model) into a template file to easily access a premade R15 bone structure.
-- [Create, size, and position bones](#set-bones-and-armature) symmetrically for a humanoid character.
-- [Parent](#parent-armature) multiple meshes to a single armature to bind the skeleton rig.
-- [Assign full influence](#assign-meshes-to-bones) to each mesh object and bone by assigning influences.
+- [Import a character model](#importing-model) into a template file to easily access a premade R15 bone structure.
+- [Create, size, and position bones](#setting-bones-and-armature) symmetrically for a humanoid character.
+- [Parent](#parenting-armature) multiple meshes to a single armature to bind the skeleton rig.
+- [Assign full influence](#assigning-meshes-to-bones) to each mesh object and bone by assigning influences.
This guide uses a downloadable [Rig and Attachment Template Blender Project](../../assets/modeling/meshes/reference-files/Rig_and_Attachments_Templates.zip), a reference [Lola Character model](../../assets/modeling/meshes/reference-files/lola-base-model.fbx), and [Blender version 3.0](https://www.blender.org/download/releases/3-0/). If you are
@@ -20,16 +20,16 @@ using another version of Blender, there may be minor differences in UI and
settings.
-## Set up Blender
+## Setting Up Blender
To begin creating a humanoid rigged mesh, first set up the following in your Blender project:
-- [Import](#import-model) the Lola character model in the Mannequin Template Blender project.
+- [Import](#importing-model) the Lola character model in the Mannequin Template Blender project.
- Set up your [Viewport visualizations](#viewport-visualizations) to optimize the rigging process.
-### Import model
+### Importing Model
-When rigging a model, make sure the character model you are using follows Studio's [Avatar character specifications](../../art/characters/specifications.md). For this guide, import a [Lola reference model](../../assets/modeling/meshes/reference-files/lola-base-model.fbx) into the mannequin template project.
+When rigging a model, make sure the character model you are using follows Studio's [Avatar Character Specifications](../../art/characters/specifications.md). For this guide, import a [Lola reference model](../../assets/modeling/meshes/reference-files/lola-base-model.fbx) into the mannequin template project.
To import your model:
@@ -39,7 +39,7 @@ To import your model:
-### Viewport visualizations
+### Viewport Visualizations
For better visualization and access to your bone objects, set your bone objects to always be displayed in front of the Viewport.
@@ -52,7 +52,7 @@ To set the bone visualization:
At any point during the skinning process, you can also toggle one of the various material previews options in the top right of your 3D Viewport to change the visualization of your character model, such as enabling X-ray or texture view.
-## Set bones and armature
+## Setting Bones and Armature
In this guide, set up X-Axis Mirroring to make symmetrical changes to the left and right bones before repositioning the bones to the imported model. Try to maintain symmetry whenever possible when rigging a model.
@@ -60,7 +60,7 @@ In this guide, set up X-Axis Mirroring to make symmetrical changes to the left a
If modifying bones or creating a new bone structure, keep in mind the specific bone hierarchy and naming requirements for R15 character models.
-### Enable x-axis mirror
+### Enable X-Axis Mirror
The X-Axis Mirror setting allows you to maintain symmetry with your left and right bones by mirroring changes to their positions. To reduce issues with posing and animating, it is important to retain symmetry with your bone structure whenever possible.
@@ -72,7 +72,7 @@ To set up X-Axis Mirror:
-### Position bones
+### Positioning Bones
With the model added to the project, you can reposition the bones provided in the template to match the character structure. In most cases, each bone should be positioned in the center of their corresponding mesh objects, such as the Head bone being centered within the Head_Geo mesh object.
@@ -91,11 +91,11 @@ To position your individual bones:
-### Parent armature
+### Parenting Armature
After you position the bone structure, you need to parent the bone armature to the model. You must parent all 15 mesh objects to one armature.
-For this example, the mesh objects are parented to the armature with Empty Groups to illustrate the vertex group assignment and weight painting process in the following [Skin a humanoid model](../../art/modeling/skin-a-humanoid-model.md) guide.
+For this example, the mesh objects are parented to the armature with Empty Groups to illustrate the vertex group assignment and weight painting process in the following [Skinning a Humanoid Model](../../art/modeling/skinning-a-humanoid-model.md) guide.
To parent the model to the armature:
@@ -107,9 +107,9 @@ To parent the model to the armature:
-## Assign meshes to bones
+## Assigning Meshes to Bones
-Now that you have connected your armature to the mesh object, you can assign the vertices of your individual limbs to be fully influenced by one corresponding bone. After this process is completed, the model will be ready for skinning. See [Skin a humanoid model](../../art/modeling/skin-a-humanoid-model.md) for instructions on applying multiple bone influences to a mesh.
+Now that you have connected your armature to the mesh object, you can assign the vertices of your individual limbs to be fully influenced by one corresponding bone. After this process is completed, the model will be ready for skinning. See [Skinning a Humanoid Model](../../art/modeling/skinning-a-humanoid-model.md) for instructions on applying multiple bone influences to a mesh.
The **Root** and **HumanoidRootNode** parent bones in a humanoid rig should not have any influences applied to them. Any added influences are dropped when importing into Studio.
@@ -135,7 +135,7 @@ To quickly assign vertex groups to the rest of the body meshes:
-## Test
+## Testing
You can test and pose bones and their assigned mesh objects in Pose Mode. It is important to test your model after applying or editing any influences.
@@ -152,4 +152,4 @@ To navigate to Pose mode and test your poses:
To reset the rotation of a selected bone to neutral, press Alt+R. While rotating, you can also press your mouse's scroll wheel to change the axes of your rotation.
-At this stage, if all of your mesh objects are influenced by their corresponding bones, you can [export](../../art/modeling/export-requirements.md) this rigged model as an `.fbx` for use in Studio or continue on to the next stage of [Skin a humanoid model](../../art/modeling/skin-a-humanoid-model.md).
+At this stage, if all of your mesh objects are influenced by their corresponding bones, you can [export](../../art/modeling/export-requirements.md) this rigged model as an `.fbx` for use in Studio or continue on to the next stage of [Skinning a Humanoid Model](../../art/modeling/skinning-a-humanoid-model.md).
diff --git a/content/en-us/art/modeling/rig-a-simple-mesh.md b/content/en-us/art/modeling/rigging-a-simple-mesh.md
similarity index 90%
rename from content/en-us/art/modeling/rig-a-simple-mesh.md
rename to content/en-us/art/modeling/rigging-a-simple-mesh.md
index fcec3f55a..04ad70562 100644
--- a/content/en-us/art/modeling/rig-a-simple-mesh.md
+++ b/content/en-us/art/modeling/rigging-a-simple-mesh.md
@@ -1,5 +1,5 @@
---
-title: Rig a simple mesh
+title: Rigging a Simple Mesh
description: Explains the process for rigging a basic model in Blender.
---
@@ -7,24 +7,24 @@ You can create a **rigged mesh** using a third party modeling tool such as [Blen
To rig a simple model in Blender:
-- [Set up Blender](#set-up-blender) to Studio's relative scene units before importing a model to rig.
-- [Create and reposition bones](#create-a-bone-structure) within the mesh object.
-- [Parent the mesh to the armature](#parent-armature) to bind the bone armature to the mesh object.
-- [Assign vertices to specific bones](#assign-vertices-to-bones) to define which parts of the mesh is driven by which bones.
-- [Test your rigged mesh](#test) to ensure that the bones are properly positioned and influenced within the mesh.
+- [Set up Blender](#setting-up-blender) to Studio's relative scene units before importing a model to rig.
+- [Create and reposition bones](#creating-a-bone-structure) within the mesh object.
+- [Parent the mesh to the armature](#parenting-armature) to bind the bone armature to the mesh object.
+- [Assign vertices to specific bones](#assigning-vertices-to-bones) to define which parts of the mesh is driven by which bones.
+- [Test your rigged mesh](#testing) to ensure that the bones are properly positioned and influenced within the mesh.
This guide uses a downloadable [example robot model](../../assets/modeling/meshes/reference-files/shoebot-base-model.fbx) and [Blender version 3.0](https://www.blender.org/download/releases/3-0/). If you are using another version of Blender, there may be minor differences in UI and settings.
-## Set up Blender
+## Setting up Blender
To start the process of creating a rigged mesh, first set up the following in your Blender project:
- Set up Blender's [scene unit and unit scale properties](#set-scene-and-scale) to Studio's proportions.
-- [Import the model into Blender](#import-a-model) using Blender's file importer.
+- [Import the model into Blender](#importing-a-model) using Blender's file importer.
-### Set scene and scale
+### Set Scene and Scale
When setting up Blender projects for Roblox Studio to import, you should modify Blender's default **scene units** and **unit scale** properties to ensure they closely align with Studio's scale.
@@ -40,7 +40,7 @@ To start a new Blender project and set scene unit properties:
-### Import a model
+### Importing a Model
For this example, import a [robot model](../../assets/modeling/meshes/reference-files/shoebot-base-model.fbx) into Blender as your mesh object.
@@ -52,11 +52,11 @@ To import an existing `.fbx` model:
-## Create a bone structure
+## Creating a Bone Structure
Now that your model is within Blender, you must add an **armature** and **bones** to your mesh object. An **armature** is a skeleton-like rigging object that acts as a container for bones, while **bones** are objects that control the movement and deformation of the group of vertices, or **vertex group**, that surround the bone.
-### Add an armature
+### Adding an Armature
An armature is a structure required to add bones to your mesh. After you add in an armature, you can create and reposition any number of bones inside of your mesh object.
@@ -70,7 +70,7 @@ To add an armature:
-### Add and position bones
+### Adding and Positioning Bones
When you add an armature to your project, Blender automatically adds one bone to the armature at a default position and scale which will act as the root bone.
@@ -96,7 +96,7 @@ To add and position two additional bones:
-## Parent armature
+## Parenting Armature
After you create and position the bone structure, you need to connect the armature to the mesh object by parenting the armature to the mesh object.
@@ -112,7 +112,7 @@ To parent an armature to a mesh:
-## Assign vertices to bones
+## Assigning Vertices to Bones
With your armature connected to the mesh object, you can now assign the mesh vertices of your limbs to be fully influenced by their corresponding
bones. As a rigid model, each limb will completely bend and articulate when the bones are rotated, which is ideal for a non-organic character like a robot.
@@ -138,7 +138,7 @@ To assign bone influence to the left and right arms:
-## Test
+## Testing
You can test your rig in different poses in Pose mode. It's important to test your rigs after applying or changing influences before exporting.
diff --git a/content/en-us/art/modeling/rigging.md b/content/en-us/art/modeling/rigging.md
index e59f6fd2e..fdf6d1244 100644
--- a/content/en-us/art/modeling/rigging.md
+++ b/content/en-us/art/modeling/rigging.md
@@ -1,5 +1,5 @@
---
-title: Rigging and skinning
+title: Rigging and Skinning
description: Rigging and skinning is a modeling process that connects an armature to a mesh, allowing it to be animated or posed in Studio.
---
@@ -29,16 +29,16 @@ description: Rigging and skinning is a modeling process that connects an armatur
See the following resources to learn the basics and intermediate steps required to skin models in Blender:
-- [Rig a simple mesh](../../art/modeling/rig-a-simple-mesh.md)
-- [Skin a simple mesh](../../art/modeling/skin-a-simple-mesh.md)
-- [Rig a humanoid model](../../art/modeling/rig-a-humanoid-model.md)
-- [Skin a humanoid model](../../art/modeling/skin-a-humanoid-model.md)
+- [Rigging a Simple Mesh](../../art/modeling/rigging-a-simple-mesh.md)
+- [Skinning a Simple Mesh](../../art/modeling/skinning-a-simple-mesh.md)
+- [Rigging a Humanoid Model](../../art/modeling/rigging-a-humanoid-model.md)
+- [Skinning a Humanoid Model](../../art/modeling/skinning-a-humanoid-model.md)
-## Rigs and bones
+## Rigs and Bones
The **rig**, or bone structure, within a rigged mesh creates additional poseable points for the 3D model in Studio. By rotating or moving the bones of a mesh, the parts of the mesh assigned to those bones can move independently from the rest of the mesh. The assignment of influence between meshes and bones, such as a **LowerLeftArm** bone driving the movement of the **LowerLeftArm** geometry, is set in a third-party application like Blender or Maya. When imported into Studio, Roblox saves this influence assignment data to the `Class.MeshPart` asset data.
-Once you successfully [import](../../parts/meshes.md#import-meshes) a rigged mesh model into Studio, Studio represents this rig structure with `Class.Bone` instances that you can then pose and animate. You can view bones in Studio by toggling **Constraint Details** in the Model tab, or when you are using the [Animation Editor](../../animation/editor.md).
+Once you successfully [import](../../parts/meshes.md#importing-meshes) a rigged mesh model into Studio, Studio represents this rig structure with `Class.Bone` instances that you can then pose and animate. You can view bones in Studio by toggling **Constraint Details** in the Model tab, or when you are using the [Animation Editor](../../animation/editor.md).
@@ -57,14 +57,14 @@ When `Class.Bone` objects are used in animation, they affect the appearance of t
-## Types of rigs
+## Types of Rigs
Rigged models use a naming convention starting with "R" and ending with the number of individual meshes that make up the model. This is used to quickly identify the type and number of meshes that a model has. Although R6 and R15 models are common, a model can be of varying subjects, sizes and can have any number of individual meshes, such as a R5, R20, or R200.
- **R1** refers to a single mesh that is rigged, or associated with an internal skeleton structure. Many models, such as a tree or accessory item, are good candidates to be made into an R1 model. Even humanoid characters, such as NPCs, can be created as R1 models but they will not be able to take full advantage of the animation and humanoid options available for R15 characters.
- See [Rig a simple mesh](../../art/modeling/rig-a-simple-mesh.md) for instructions on turning a basic mesh into an R1 model in Blender.
+ See [Rigging a Simple Mesh](../../art/modeling/rigging-a-simple-mesh.md) for instructions on turning a basic mesh into an R1 model in Blender.
- **R15** typically refers to humanoid models used as player or avatar characters. An R15 model is made up of 15 specific meshes that are parented to a single rig. A R15 character model often includes skinning data to allow the model to bend and pose naturally. Roblox uses the R15 standard for all avatars, and requires the [R15 technical specifications](../../art/characters/specifications.md) to ensure universal behavior and quality.
- See [Rig a humanoid model](../../art/modeling/rig-a-humanoid-model.md) for instructions on turning a character model into an R15 humanoid model in Blender.
+ See [Rigging a Humanoid Model](../../art/modeling/rigging-a-humanoid-model.md) for instructions on turning a character model into an R15 humanoid model in Blender.
diff --git a/content/en-us/art/modeling/roblox-blender-plugin.md b/content/en-us/art/modeling/roblox-blender-plugin.md
index 2474ff3a3..2fbf2701d 100644
--- a/content/en-us/art/modeling/roblox-blender-plugin.md
+++ b/content/en-us/art/modeling/roblox-blender-plugin.md
@@ -1,10 +1,10 @@
---
-title: Roblox Blender plugin
+title: Roblox Blender Plugin
description: The Roblox Blender plugin allows you to transfer assets directly from Blender to Studio.
---
-The Roblox Blender plugin is a Blender add-on that allows you to link your Roblox account and quickly transfer 3D modeling objects directly from Blender to your Studio session. This tool helps you save time and reduce errors by skipping the process of exporting and importing third-party modeling files between applications.
+The Roblox Blender Plugin is a Blender add-on that allows you to link your Roblox account and quickly transfer 3D modeling objects directly from Blender to your Studio session. This tool helps you save time and reduce errors by skipping the process of exporting and importing third-party modeling files between applications.
-The Roblox Blender plugin is an open-source implementation of Roblox's [Open Cloud API](../../cloud/open-cloud/index.md) and developers are encouraged to extend and build upon this tool for their own projects. For installation, use, licensing, and contribution details, see the [Roblox Blender plugin GitHub page](https://github.com/Roblox/roblox-blender-plugin).
+The Roblox Blender plugin is an open-source implementation of Roblox's [Open Cloud API](../../cloud/open-cloud/index.md) and developers are encouraged to extend and build upon this tool for their own projects. For installation, use, licensing, and contribution details, see the [Roblox Blender Plugin GitHub page](https://github.com/Roblox/roblox-blender-plugin).
diff --git a/content/en-us/art/modeling/skin-a-humanoid-model.md b/content/en-us/art/modeling/skinning-a-humanoid-model.md
similarity index 90%
rename from content/en-us/art/modeling/skin-a-humanoid-model.md
rename to content/en-us/art/modeling/skinning-a-humanoid-model.md
index 3a7ec112e..b8cda109e 100644
--- a/content/en-us/art/modeling/skin-a-humanoid-model.md
+++ b/content/en-us/art/modeling/skinning-a-humanoid-model.md
@@ -1,33 +1,33 @@
---
-title: Skin a humanoid model
+title: Skinning a Humanoid Model
description: Explains the process for skinning a humanoid R15 model in Blender.
---
A humanoid skinned mesh is a character model that, when posed or animated, bends and stretches naturally at its joints. You can create a skinned mesh using a third party modeling tool such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview).
-This is an advanced guide on skinning a humanoid model into an R15 model in Blender using the humanoid model completed in [Rig a humanoid model](./rig-a-humanoid-model.md). Before skinning a humanoid model, you should also familiarize yourself with the basic concepts in [Skin a simple mesh](../../art/modeling/skin-a-simple-mesh.md).
+This is an advanced guide on skinning a humanoid model into an R15 model in Blender using the humanoid model completed in [Rigging a Humanoid Model](./rigging-a-humanoid-model.md). Before skinning a humanoid model, you should also familiarize yourself with the basic concepts in [Skinning a Simple Mesh](../../art/modeling/skinning-a-simple-mesh.md).
To skin a humanoid model in Blender, you need to:
-- [Set up Blender](#set-up-blender) with a rigged model to optimize the weight painting process with bone visualization settings and Auto Normalize.
+- [Set up Blender](#setting-up-blender) with a rigged model to optimize the weight painting process with bone visualization settings and Auto Normalize.
- [Weight paint](#weight-painting) vertices of your mesh objects by balancing influence of your vertices between two or more bones of a humanoid rig architecture.
-This guide uses the humanoid model rigged in [Rig a humanoid model](./rig-a-humanoid-model.md) and [Blender version 3.0](https://www.blender.org/download/releases/3-0/). If you are
+This guide uses the humanoid model rigged in [Rigging a Humanoid Model](./rigging-a-humanoid-model.md) and [Blender version 3.0](https://www.blender.org/download/releases/3-0/). If you are
using another version of Blender, there may be minor differences in UI and
settings.
-## Set up Blender
+## Setting Up Blender
-This guide uses the rigged model completed in [Rig a humanoid model](./rig-a-humanoid-model.md). You can also download the rigged model [Blender project](../../assets/modeling/meshes/reference-files/lola-rigged-r15.blend) to follow along with this guide.
+This guide uses the rigged model completed in [Rigging a Humanoid Model](./rigging-a-humanoid-model.md). You can also download the rigged model [Blender project](../../assets/modeling/meshes/reference-files/lola-rigged-r15.blend) to follow along with this guide.
To optimize the process of skinning a rigid character, first set up the following in your Blender project:
- Open the Blender project and configure the [bone visualization](#bone-visualization) settings.
- Enable [Auto Normalize](#auto-normalize) to help optimize the weight-painting process.
-### Bone visualization
+### Bone Visualization
By default, Blender displays bone objects as octahedral shapes. This original shape is useful when positioning bones but can get in the way while weight painting. To help visualization during the weight painting process, change your bone visualization to sticks.
@@ -38,7 +38,7 @@ To update the visualization of your bones:
-### Auto normalize
+### Auto Normalize
The Auto Normalize setting forces the influence on your vertices to equal one. This makes weight painting multiple meshes and bones more efficient by ensuring that each vertex in your character is fully influenced by at least one bone. See Blender's documentation on the [Auto Normalize](https://docs.blender.org/manual/en/latest/sculpt_paint/weight_paint/tool_settings/options.html) for more information.
@@ -69,9 +69,9 @@ To enable Auto Normalize:
-## Weight painting
+## Weight Painting
-Weight painting applies specific weights, or influences, that bones will have over parts of a mesh using a painting workflow. There are also additional ways to apply influences through weight painting or other tools, some which are covered in [Skin a simple mesh](../../art/modeling/skin-a-simple-mesh.md). See additional online resources such as Blender's [Character Rigging](https://www.youtube.com/watch?v=f2pTkW-1JkE) and [Vertex Groups](https://www.youtube.com/watch?v=dKZrzG5r13g) fundamental guides for more information on skinning and applying weights.
+Weight painting applies specific weights, or influences, that bones will have over parts of a mesh using a painting workflow. There are also additional ways to apply influences through weight painting or other tools, some which are covered in [Skinning a Simple Mesh](../../art/modeling/skinning-a-simple-mesh.md). See additional online resources such as Blender's [Character Rigging](https://www.youtube.com/watch?v=f2pTkW-1JkE) and [Vertex Groups](https://www.youtube.com/watch?v=dKZrzG5r13g) fundamental guides for more information on skinning and applying weights.
This guide will cover one process of weight painting the head and arm meshes of a humanoid model. These weight painting techniques can be used to weight paint the rest of the model.
@@ -79,7 +79,7 @@ This guide will cover one process of weight painting the head and arm meshes of
Do not apply influences on the Root or HumanoidRootNode parent bones in a humanoid rig. Any added influences are dropped when importing into Studio.
-### Paint the head mesh
+### Painting the Head Mesh
The head mesh connects to the upper torso at the bottom vertices of the neck. To create a realistic bend in the model, the head mesh needs to share influence with the Head bone and the Upper Torso bone near the neckline.
@@ -117,7 +117,7 @@ The final result of weight painting the head of the model should balance the hea
-### Paint the arm meshes
+### Painting the Arm Meshes
Similar to the process for balancing influences between the Head bone and Upper Torso bone, arms and legs require a similar weight painting process.
@@ -149,7 +149,7 @@ You can add and skin additional bones, such as fingers, if you want additional c
Extra bone objects that are skinned to a mesh but do not share a Humanoid bone object name (such as LowerTorso, LeftFoot, Right UpperArm) are imported into Studio as a `Class.Bone` with the same name it was assigned with in the 3D modeling software.
-#### Lower arm
+#### Lower Arm
After the wrist of the right hand is weight painted, you can proceed to balance the influences of the Lower Arm mesh between the **Lower Arm bone** and the **Upper Arm bone** to create a natural bend at the elbow.
@@ -168,7 +168,7 @@ To weight paint influences to the lower arm:
-#### Upper arm
+#### Upper Arm
After the elbow of the right lower arm is weight painted, you can proceed to balance the influences of the Upper Arm mesh between the **Upper Arm bone** and the **Upper Torso bone** to create a natural bend at the underarm.
diff --git a/content/en-us/art/modeling/skin-a-simple-mesh.md b/content/en-us/art/modeling/skinning-a-simple-mesh.md
similarity index 93%
rename from content/en-us/art/modeling/skin-a-simple-mesh.md
rename to content/en-us/art/modeling/skinning-a-simple-mesh.md
index 39b89aa6e..f17b4756e 100644
--- a/content/en-us/art/modeling/skin-a-simple-mesh.md
+++ b/content/en-us/art/modeling/skinning-a-simple-mesh.md
@@ -1,17 +1,17 @@
---
-title: Skin a simple mesh
+title: Skinning a Simple Mesh
description: Explains the process for skinning a basic model in Blender.
---
A skinned mesh is a rigged mesh that bends and flexes naturally when the internal skeleton rig is posed or animated. You can create a skinned mesh using a third party modeling tool such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview). Skinning must be completed after the model is [rigged](./rigging.md).
-This guide covers the process for rigging and then skinning a simple tree model in Blender with 3 bones. For basics on rigging, see [Rig a simple mesh](./rig-a-simple-mesh.md) before continuing this guide.
+This guide covers the process for rigging and then skinning a simple tree model in Blender with 3 bones. For basics on rigging, see [Rigging A Simple Mesh](./rigging-a-simple-mesh.md) before continuing this guide.
To skin a simple mesh, you need to:
-- [Set up Blender](#set-up-blender) to Studio's relative scene units before importing a model.
-- [Create, size, and position bones](#position-bones) inside of an armature.
-- [Parent a mesh to an armature](#parent-armature) to bind the skeleton rig to the mesh object.
+- [Set up Blender](#setting-up-blender) to Studio's relative scene units before importing a model.
+- [Create, size, and position bones](#positioning-bones) inside of an armature.
+- [Parent a mesh to an armature](#parenting-armature) to bind the skeleton rig to the mesh object.
- [Weight paint](#weight-painting) the mesh to assign which parts of the mesh will move with which bone.
@@ -20,14 +20,14 @@ using another version of Blender, there may be minor differences in UI and
settings.
-## Set up Blender
+## Setting Up Blender
To start the process of creating a skinned mesh, first set up the following in your Blender project:
-- Set [scene unit and unit scale properties](#adjust-scene-and-scale) to Studio's proportions.
-- [Import the model into Blender](#import-a-model) using Blender's file importer.
+- Set [scene unit and unit scale properties](#adjusting-scene-and-scale) to Studio's proportions.
+- [Import the model into Blender](#importing-a-model) using Blender's file importer.
-### Adjust scene and scale
+### Adjusting Scene and Scale
When setting up Blender projects for Roblox Studio import, modify Blender's default **scene units** and **unit scale** properties to ensure they closely align with Studio's scale.
@@ -43,7 +43,7 @@ To modify Blender's scene and scale units in a new project:
-### Import a model
+### Importing a Model
For this guide, you'll import a [maple tree model](../../assets/modeling/skinned-meshes/MapleLeafTree.fbx) into Blender as your mesh object.
@@ -55,11 +55,11 @@ To import a model into Blender:
-## Create a bone structure
+## Creating a Bone Structure
Now that your model is within Blender, add an armature and **bones** to your mesh object. An **armature** is a skeleton-like rigging object that acts as a container for bones, while **bones** are objects that control the movement and deformation of the group of vertices, or **vertex group**, that surround the bone.
-### Add an armature
+### Adding an Armature
An armature is a structure required to add bones to your mesh. After you add in an armature, you can create and reposition any number of bones inside of your mesh object.
@@ -78,7 +78,7 @@ To add an armature:
-### Position bones
+### Positioning Bones
When you add an armature to your project, Blender also adds one bone to the armature at a default position and scale. You can rotate and scale the bone to more accurately represent the internal structure of your mesh object.
@@ -95,7 +95,7 @@ To reposition the bone:
5. Press and hold your mouse's scroll wheel to move the camera around the mesh object to see different views and angles to ensure that the bone is centered within the mesh object.
-### Add additional bones
+### Adding Additional Bones
In this guide, you need 3 bones within your mesh so the tree can move and rotate at three points.
@@ -121,7 +121,7 @@ To add additional bones into the armature:
-## Parent armature
+## Parenting Armature
After the bone structure is created and positioned, you need to connect the armature to the mesh object by parenting the armature to the mesh object.
@@ -139,7 +139,7 @@ To parent an armature to a mesh:
src="../../assets/modeling/skinned-meshes/Parenting-Armature.mp4"
width="80%">
-## Weight paint
+## Weight Painting
With your armature connected to the mesh object, you can use the process of **weight painting** to change the amount of influence (weight) the bones will have on specific vertices to allow for more natural movement and flexibility.
@@ -149,13 +149,13 @@ You can quickly assign influence with the [Brush tool](https://docs.blender.org/
-To optimize the painting process, [set up visualization and brush settings](#setup) before [painting influences](#paint-influence) to the mesh.
+To optimize the painting process, [set up visualization and brush settings](#setup) before [painting influences](#painting-influence) to the mesh.
### Setup
When assigning influences for complex models, you can configure the following Blender settings to optimize the Weight Painting process.
-#### Bone visualization
+#### Bone Visualization
By default, Blender displays bone objects as octahedral shapes. This original shape is useful when positioning bones within the rig but can get in the way while painting. To help visualize the weight painting process, change your bone visualization to sticks.
@@ -169,7 +169,7 @@ To update the visualization of your bones:
src="../../assets/modeling/skinned-meshes/Stick-Visualization.mp4"
width="80%">
-#### Auto normalize
+#### Auto Normalize
The [**Auto Normalize**](https://docs.blender.org/manual/en/latest/sculpt_paint/weight_paint/tool_settings/options.html) setting forces the influence on your vertices to equal one. This makes weight painting more efficient by ensuring that each vertex in your character is fully influenced by at least one bone. In this guide, Auto Normalize allows you to first apply full influence to the entire mesh quickly and then make minor adjustments with each bone.
@@ -190,7 +190,7 @@ To enable Auto Normalize:
src="../../assets/modeling/skinned-meshes/Enabling-Autonormalize.mp4"
width="80%">
-#### Projected brush
+#### Projected Brush
A projected brush allows you to easily apply influence through a mesh, instead of just the surface. This is useful when painting influences on meshes that may be geometrically layered, such as the foliage of the tree.
@@ -207,11 +207,11 @@ To set up a projected brush:
src="../../assets/modeling/skinned-meshes/Setting-Projected-Brush.mp4"
width="80%">
-### Paint influence
+### Painting Influence
With the [projected brush](#projected-brush) set up, you can now begin applying influence to the tree. Take advantage of the [Auto Normalize](#auto-normalize) setting by painting full red influence to the entire tree to the bottom bone and then assigning a partial influence on the middle and top bones.
-#### Bottom bone
+#### Bottom Bone
The bottom bone should fully influence the movement of the entire tree starting from the trunk.
@@ -236,7 +236,7 @@ To start painting influence to the bottom bone:
src="../../assets/modeling/skinned-meshes/Test-Bottom-Bone.mp4"
width="80%">
-#### Middle bone
+#### Middle Bone
The middle bone represents most of the foliage above the bottom bone. For a more subtle effect, apply a 50% influence (green) from the middle bone upwards.
@@ -253,7 +253,7 @@ To paint influence to the middle bone:
src="../../assets/modeling/skinned-meshes/Paint-Middle-Bone.mp4"
width="80%">
-#### Top bone
+#### Top Bone
The top bone should influence the top leaf area above the middle bone. Paint this top area using 25% influence (teal) for a more natural effect.
@@ -276,7 +276,7 @@ After weight painting each bone, each section of this tree should now be influen
src="../../assets/modeling/skinned-meshes/Test-Bones.mp4"
width="80%">
-### Test
+### Testing
It is important to constantly test the influences of your bone **throughout** the weight painting process.
diff --git a/content/en-us/art/modeling/specifications.md b/content/en-us/art/modeling/specifications.md
index c1cb6d8fe..f76d88564 100644
--- a/content/en-us/art/modeling/specifications.md
+++ b/content/en-us/art/modeling/specifications.md
@@ -1,5 +1,5 @@
---
-title: General specifications
+title: General Specifications
description: Lists the specific technical requirements for custom models created outside of Studio.
---
@@ -7,14 +7,14 @@ Roblox supports a wide variety of mesh configurations created from third-party s
Check that your model meets the following modeling specifications and guidelines before exporting to ensure Studio compatibility. Specific types of assets, like characters and accessories, have additional specifications:
-- If you are creating a rigid accessory model, ensure that your model follows the [accessory specifications](../../art/accessories/specifications.md).
-- If you are creating a clothing accessory model, ensure that your model follows the [clothing specifications](../../art/accessories/clothing-specifications.md).
-- If you are creating an avatar character model, ensure that your model follows the [character specifications](../../art/characters/specifications.md).
+- If you are creating a rigid accessory model, ensure that your model follows [Accessory Specifications](../../art/accessories/specifications.md).
+- If you are creating a clothing accessory model, ensure that your model follows [Clothing Specifications](../../art/accessories/clothing-specifications.md).
+- If you are creating an avatar character model, ensure that your model follows [Character Specifications](../../art/characters/specifications.md).
-When ready to export, see the [export settings](../../art/modeling/export-requirements.md) for mesh export settings for Blender and Maya.
+When ready to export, see [Export Requirements](../../art/modeling/export-requirements.md) for mesh export settings for Blender and Maya.
-If you meet certain account requirements, you can sell your custom meshes as accessories on the Marketplace. See [Rigid accessories](../../art/accessories/index.md) for an overview on the creation process for these types of accessories.
+If you meet certain account requirements, you can sell your custom meshes as accessories on the Marketplace. See [Clothing and Accessories](../../art/accessories/index.md) for an overview on the creation process for these types of accessories.
## Geometry
@@ -26,9 +26,9 @@ See the following specifications for general geometry:
- **No N-gons** - Meshes must be in quads where possible.
- **Volume** - Meshes cannot be 0 thickness and must have some volume.
-## Rigging and skinning
+## Rigging and Skinning
-Roblox supports third-party meshes with an internal rig, or skeleton structure that can be used as additional articulation points in your model. See [Character rigs](../../art/characters/specifications.md#rig) for specific standards for an R15 character rig.
+Roblox supports third-party meshes with an internal rig, or skeleton structure that can be used as additional articulation points in your model. See [Character Rigs](../../art/characters/specifications.md#rigging) for specific standards for an R15 character rig.
@@ -45,36 +45,36 @@ See the following requirements for general rigging and skinning:
- **Transformations** - All bones (Blender) or joints (Maya) must be frozen and have scale values set to `1`, `1`, `1` and rotation values set to `0`, `0`, `0`.
- **Symmetry** - When possible, maintain symmetry when applying influences to a rig
-- **Root joint** - The root bone or joint should always be set to `0`, `0`, `0`.
-- **Max influences** - A vertex can not be influenced by more than 4 bones or joints.
-- **No Root influences** - Do not apply influences to the Root bone or joint.
+- **Root Joint** - The root bone or joint should always be set to `0`, `0`, `0`.
+- **Max Influences** - A vertex can not be influenced by more than 4 bones or joints.
+- **No Root Influences** - Do not apply influences to the Root bone or joint.
## Textures
-Roblox supports basic color textures and modern [PBR textures](../../art/modeling/surface-appearance.md). For technical requirements and best practices when generating individual texture images, see [Texture specifications](../../art/modeling/texture-specifications.md).
+Roblox supports basic color textures and modern [PBR textures](../../art/modeling/surface-appearance.md). For technical requirements and best practices when generating individual texture images, see [Texture Specifications](../../art/modeling/texture-specifications.md).
## Animations
-An animation can be included on any `.fbx` mesh export. For information on prepping a character animation from a modeling software for export, see [Export animations from Maya](../../art/characters/export-avatar-animations-from-maya.md).
+An animation can be included on any `.fbx` mesh export. For information on prepping a character animation from a modeling software for export, see [Exporting Animations from Maya](../../art/characters/exporting-avatar-animations-from-maya.md).
See the following requirements for assets with animation:
-- **Single track animation** - Only a single animation track can be exported with a mesh or model. If you want to export multiple animations, you need to create separate exports for each animation you want to import.
+- **Single Track Animation** - Only a single animation track can be exported with a mesh or model. If you want to export multiple animations, you need to create separate exports for each animation you want to import.
-## Inner and outer cages
+## Inner and Outer Cages
Inner and Outer cages are non-rendered meshes that Roblox uses to define the inner and outer surfaces of a mesh using a `Class.WrapLayer` or `Class.WrapTarget` instance. These cages are most often used with characters and accessories, though you can use cage meshes for any mesh object.
-Character models must include an outer cage in order to properly equip layered clothing and accessories. See [Character specifications](../../art/characters/specifications.md) for additional information.
+Character models must include an outer cage in order to properly equip layered clothing and accessories. See [Character Specifications](../../art/characters/specifications.md) for additional information.
For general use, see the following requirements for adding inner and outer cage meshes to your model:
-- **Naming conventions** - The inner and outer cage must be named after the primary mesh object with **\_InnerCage** and **\_OuterCage** affixed.
+- **Naming Conventions** - The inner and outer cage must be named after the primary mesh object with **\_InnerCage** and **\_OuterCage** affixed.
-- **Outer cage** - Models, such as a playable character, that aren't expected deform but are the target of meshes that will stretch over it, only require an Outer Cage.
-- **Vertices and UV map** - Don't delete vertices or alter the UVs on the Inner or Outer Cages as this can cause errors when importing in Studio or when equipping onto a character.
+- **Outer Cage** - Models, such as a playable character, that aren't expected deform but are the target of meshes that will stretch over it, only require an Outer Cage.
+- **Vertices and UV Map** - Don't delete vertices or alter the UVs on the Inner or Outer Cages as this can cause errors when importing in Studio or when equipping onto a character.
- **Symmetry and consistency** - Keep each face (the space between vertices) consistently sized and retain symmetry wherever possible. Use symmetry tools in your modeling software whenever possible.
diff --git a/content/en-us/art/modeling/surface-appearance.md b/content/en-us/art/modeling/surface-appearance.md
index 41b705ade..48e102a74 100644
--- a/content/en-us/art/modeling/surface-appearance.md
+++ b/content/en-us/art/modeling/surface-appearance.md
@@ -1,9 +1,9 @@
---
-title: PBR textures
+title: PBR Textures
description: PBR textures are advanced textures using multiple texture maps.
---
-**Physically-Based rendering** (PBR) textures allow you to represent realistic shading and lighting by using multiple types of texture images, or **maps**, on a single object. Combining multiple texture maps can more accurately simulate color, roughness, and reflectivity in any lighting environment and can enhance the visual elements of your assets and environment.
+**Physically-Based Rendering** (PBR) textures allow you to represent realistic shading and lighting by using multiple types of texture images, or **maps**, on a single object. Combining multiple texture maps can more accurately simulate color, roughness, and reflectivity in any lighting environment and can enhance the visual elements of your assets and environment.
@@ -22,9 +22,9 @@ description: PBR textures are advanced textures using multiple texture maps.
Various applications and workflows are available for creating PBR textures. You can use these during the modeling and texturing phases of custom 3D object creation, provided that Roblox Studio [supports](../../art/characters/specifications.md#textures) the specific texture maps you're using.
-This guide provides instructions on [setting up](#enable-surface-appearance) your mesh objects to use PBR texture maps, and describes common use-cases and best practices for Roblox's supported PBR [texture maps](#texture-maps). When creating your own surfaces, see [Material references](../../art/modeling/material-reference.md) for common material values, image comparisons and clothing examples.
+This guide provides instructions on [setting up](#enabling-surface-appearance) your mesh objects to use PBR texture maps, and describes common use-cases and best practices for Roblox's supported PBR [texture maps](#texture-maps). When creating your own surfaces, see [Material References](../../art/modeling/material-reference.md) for common material values, image comparisons and clothing examples.
-## Enable surface appearance
+## Enabling Surface Appearance
You can add PBR textures to any `Class.MeshPart` by adding a `Class.SurfaceAppearance` object which overwrites the original assigned texture. In general, you can't modify `Class.SurfaceAppearance` properties by scripts during an experience because the engine requires some pre-processing to display these graphics. Similar to adding a basic texture, each texture image map must point to the appropriate uploaded image asset ID.
@@ -39,7 +39,7 @@ To enable surface appearance for a `Class.MeshPart`:
-## Texture maps
+## Texture Maps
Studio currently supports 4 types of PBR texture maps: **Color**, **Normal**, **Metalness**, **Roughness**. Each of these maps correspond to an important aspect of the object's surface appearance. Texture maps only change visual appearance and don't affect the geometry of the `Class.MeshPart` object.
@@ -51,19 +51,19 @@ See the following examples for an overview of Roblox's supported texture maps an
-The `Class.SurfaceAppearance.ColorMap|ColorMap` property sets the color data of the surface, including any transparency present in the map. See [Color (albedo)](#color-albedo) for additional information.
+The `Class.SurfaceAppearance.ColorMap|ColorMap` property sets the color data of the surface, including any transparency present in the map. See [Color (Albedo)](#color-albedo) for additional information.
- Example map
+ Example Map
- Example mesh
+ Example Mesh
- Mesh and texture
+ Mesh and Texture
@@ -72,15 +72,15 @@ The `Class.SurfaceAppearance.NormalMap|NormalMap` texture property defines the t
- Example map
+ Example Map
- Example mesh
+ Example Mesh
- Mesh and texture
+ Mesh and Texture
@@ -89,15 +89,15 @@ The grayscale `Class.SurfaceAppearance.RoughnessMap|RoughnessMap` texture proper
- Example map
+ Example Map
- Example mesh
+ Example Mesh
- Mesh and texture
+ Mesh and Texture
@@ -106,15 +106,15 @@ The grayscale `Class.SurfaceAppearance.MetalnessMap|MetalnessMap` texture proper
- Example map
+ Example Map
- Example mesh
+ Example Mesh
- Mesh and texture
+ Mesh and Texture
@@ -124,7 +124,7 @@ The grayscale `Class.SurfaceAppearance.MetalnessMap|MetalnessMap` texture proper
For technical details on texture file requirements, see [texture requirements](../../art/modeling/texture-specifications.md).
-### Color (albedo)
+### Color (Albedo)
The **color**, or **albedo**, map determines the color of your texture and consists of mostly color information with little to no lighting or textural information. For additional customization, you can also add [transparency](#alpha-modes) in your albedo texture by adding opacity to your image map.
@@ -132,7 +132,7 @@ The **color**, or **albedo**, map determines the color of your texture and consi
While albedo maps and generic [non-PBR texture maps](../../parts/textures-decals.md), commonly known as **diffuse maps**, contain very similar base color data for a surface, diffuse maps often include shading and lighting values to imitate a specific visual element that are more effectively handled by PBR's [normal](#normal), [roughness](#roughness), and [metalness](#metalness) maps. Using a typical diffuse map instead of an albedo map may often look incorrect when the lighting doesn't match with these added baked-in texture elements.
-#### Alpha modes
+#### Alpha Modes
For objects that require partial or complete sections of transparency, such as grass, leaves, lace, or decals like dirt or grunge, you can use various **alpha modes** to apply transparency to your color map. If your color map image format supports alpha channels, you can apply a grayscale alpha map where 0.0 is opaque and 1.0 is transparent. Similarly, when using an image format such as a `.png`, any opacity on the color map applies as transparency on the asset.
@@ -175,7 +175,7 @@ The following example uses the **Overlay** mode for custom characters, revealing
-See [Custom skin tone](../../art/characters/specifications.md#custom-skin-tone) for additional details on optimizing an overlay for skin and similar applications.
+See [Custom Skin Tone](../../art/characters/specifications.md#custom-skin-tone) for additional details on optimizing an overlay for skin and similar applications.
##### Transparency
@@ -218,7 +218,7 @@ The following example demonstrates how a partial and full transparency in this m
-#### Color tinting
+#### Color Tinting
You can apply a tint to your color map by modifying the `Class.SurfaceAppearance.Color` property. Tinting does not affect performance and you can save on memory by reusing a single ColorMap with different tints. Use color tinting to create additional low-cost variation between your `Class.MeshPart` PBR textures or to programmatically modify your PBR surface colors in real-time.
@@ -317,7 +317,7 @@ Various combinations of the roughness and metalness can represent almost every p
**Fresnel** refers to the amount of reflection of a surface in reference to the current viewing angle. Studio's Fresnel processing aims for physical real-world accuracy, although you may get unexpected specular contribution at certain angles even with rough surfaces. In some cases, you can compensate by making your roughness map around 0.1 more rough to achieve a consistent lighting response with your materials.
-Even though Roblox renders this lighting effect accurately, the brightness and reflectivity of a surface may not respond consistently between your texture content creating software, such as Substance Painter, and Studio. See [Clothing examples](../../art/modeling/material-reference.md#clothing-examples) for differences in rendering between applications.
+Even though Roblox renders this lighting effect accurately, the brightness and reflectivity of a surface may not respond consistently between your texture content creating software, such as Substance Painter, and Studio. See [Clothing Examples](../../art/modeling/material-reference.md#clothing-examples) for differences in rendering between applications.
### Metalness
@@ -345,5 +345,5 @@ Different PBR renderers use various workflows for processing reflectiveness. Stu
In most cases, you should set this value to either 0.0 (non-metal) or 1.0 (metal). You can use partial metalness values when creating more uncommon surfaces with moderate reflective properties, like satin or silk. This practice can subtly fake the reflections in the material to highlight the color from the [color/albedo map](#color-albedo) over colors reflected in the environment.
-Various combinations of the roughness and metalness can represent almost every possible real-world material surface. See [Material references](../../art/modeling/material-reference.md) for examples and references of how combinations of material values can create various surface appearances.
+Various combinations of the roughness and metalness can represent almost every possible real-world material surface. See [Material References](../../art/modeling/material-reference.md) for examples and references of how combinations of material values can create various surface appearances.
diff --git a/content/en-us/art/modeling/texture-specifications.md b/content/en-us/art/modeling/texture-specifications.md
index 1c123b7d3..89c232c8e 100644
--- a/content/en-us/art/modeling/texture-specifications.md
+++ b/content/en-us/art/modeling/texture-specifications.md
@@ -1,24 +1,24 @@
---
-title: Texture specifications
+title: Texture Specifications
description: Texture Specifications lists the specific technical requirements and best practices for custom textures created outside of Studio.
---
-A texture is a digital image applied to the surface of a 3D object to simulate and enhance its visual appearance. Roblox supports various texture types that you import with a custom 3D object, or upload directly as individual image files. For details on implementing basic textures, see [Textures and decals](../../parts/textures-decals.md).
+A texture is a digital image applied to the surface of a 3D object to simulate and enhance its visual appearance. Roblox supports various texture types that you import with a custom 3D object, or upload directly as individual image files. For details on implementing basic textures, see [Textures and Decals](../../parts/textures-decals.md).
-Roblox also supports [physically-based rendering (PBR) textures](../../art/modeling/surface-appearance.md) which override a mesh's existing `Class.MeshPart.TextureID|TextureID` and can be used to create immersive environments and objects.
+Roblox also supports [Physically Based Rendering (PBR) textures](../../art/modeling/surface-appearance.md) which override a mesh's existing `Class.MeshPart.TextureID|TextureID` and can be used to create immersive environments and objects.
See the following requirements when creating your own basic and advanced textures:
-- **File formats** — File formats for textures that are uploaded separately in Studio must be submitted as a `.png`, `.jpg`, `.tga`, or `.bmp`.
+- **File Formats** — File formats for textures that are uploaded separately in Studio must be submitted as a `.png`, `.jpg`, `.tga`, or `.bmp`.
- **Resolution** — Roblox supports up to 1024×1024 pixel texture resolutions. To optimize for performance, you may consider using smaller resolutions. Use the following general guidance:
- For smaller 5×5 stud objects, use 256×256 texture resolutions.
- For medium 10×10 stud objects, use 512×512 texture resolutions.
- For larger 20×20 stud objects, use 1024×1024 texture resolutions.
- - See [PBR texture budgets](#surfaceappearance) for similar guidances with PBR texture maps.
+ - See [PBR Texture Budgets](#surfaceappearance) for similar guidances with PBR texture maps.
-- **Single material** - Mesh objects can only have one material assigned.
+- **Single Material** - Mesh objects can only have one material assigned.
Roblox default [materials](../../parts/materials.md) follow a similar texel resolution pattern:
@@ -28,7 +28,7 @@ Roblox default [materials](../../parts/materials.md) follow a similar texel reso
## SurfaceAppearance
-You can add a [surface appearance](../../art/modeling/surface-appearance.md) to your mesh in Studio to add PBR texture options. The `Class.SurfaceAppearance` instance uses UV mapping, a form of texture mapping, to accurately map up to four 2D images onto the mesh object.
+You can add a [Surface Appearance](../../art/modeling/surface-appearance.md) to your mesh in Studio to add PBR texture options. The `Class.SurfaceAppearance` instance uses UV mapping, a form of texture mapping, to accurately map up to four 2D images onto the mesh object.
See the following requirements for `Class.SurfaceAppearance` assets:
@@ -37,9 +37,9 @@ See the following requirements for `Class.SurfaceAppearance` assets:
-
Texture type
-
Texture schema suffix
-
Texture image details
+
Texture Type
+
Texture Schema Suffix
+
Texture Image Details
@@ -71,9 +71,9 @@ See the following requirements for `Class.SurfaceAppearance` assets:
-
Recommended map size
-
Approximate asset size (unit cube)
-
Example assets
+
Recommended Map Size
+
Approximate Asset Size (Unit Cube)
+
Example Assets
@@ -104,7 +104,7 @@ See the following requirements for `Class.SurfaceAppearance` assets:
When rendering many textures at the same time, Roblox may downsample textures to optimize for performance.
-## UV mapping
+## UV Mapping
All textures use UV mapping, a 3D modeling process to project a 3D model's surface to a 2D image, or UV atlas. See the following requirements for UV mapping, especially if you're manually editing or optimizing your UV atlas:
diff --git a/content/en-us/art/overview-dcc.md b/content/en-us/art/overview-dcc.md
index b0ba2aa80..60834f261 100644
--- a/content/en-us/art/overview-dcc.md
+++ b/content/en-us/art/overview-dcc.md
@@ -1,50 +1,50 @@
---
-title: Work with third-party software
+title: Working With Third-Party Software
description: An overview of how to incorporate content created from other software into Studio.
---
-Creators on Roblox often leverage third-party creation tools to make custom assets and content. These external tools typically specialize in areas like **3D modeling**, **texture creation**, or **audio editing**, and offer additional features and flexibility that complement the Roblox Engine. Check out [Roblox staff 3D art articles](https://devforum.roblox.com/tags/c/resources/roblox-staff/278/art) for guides, tips, and tutorials on using various third-party software.
+Creators on Roblox often leverage third-party creation tools to make custom assets and content. These external tools typically specialize in areas like **3D modeling**, **texture creation**, or **audio editing**, and offer additional features and flexibility that complement the Roblox engine. Check out [Roblox Staff 3D art articles](https://devforum.roblox.com/tags/c/resources/roblox-staff/278/art) for guides, tips, and tutorials on using various third-party software.
-In most workflows, you create custom assets in [third-party software](#examples-of-third-party-software), export them as a common file type, and then [import the file into Studio](#import-to-studio).
+In most workflows, you create custom assets in [third-party software](#examples-of-third-party-software), export them as a common file type, and then [import the file into Studio](#importing-to-studio).
-## Examples of third-party software
+## Examples of Third-Party Software
The following are examples of third-party software that creators commonly use:
-- **3D modeling software**
+- **3D Modeling Software**
- Creators use external 3D modeling software such as [Blender](https://www.blender.org/), [Maya](https://www.autodesk.com/products/maya/overview), or [Cinema 4D](https://www.maxon.net/en/cinema-4d) to design intricate and detailed 3D models. These models can include characters, props, and environmental assets.
-- **Image editors and texture creation tools**
+- **Image Editors and Texture Creation Tools**
- Graphics designers and texture artists can use tools like [Photoshop](https://www.adobe.com/products/photoshop) or [Substance Painter](https://www.adobe.com/products/substance3d-painter) to create high-quality images. You can use these images for graphic interfaces or as textures for your 3D models. These tools allow for detailed painting, mapping, and manipulation of textures to achieve realistic or stylized effects.
-- **Audio editing software**
+- **Audio Editing Software**
- Creators working on sound design or music for their Roblox games might use external audio editing software like [Audacity](https://www.audacityteam.org/) or [Reaper](https://www.reaper.fm/). These tools allow for precise control when creating audio assets.
By using third-party software, creators can tap into specialized features, workflows, and expertise, while expanding their creative possibilities and enhancing the overall quality of their Roblox experiences.
-## Import to Studio
+## Importing to Studio
Studio provides several tools to get your third-party content into Studio depending on the type of asset you upload:
- Models
- - Uploaded models must follow Studio's [modeling specifications](../art/modeling/specifications.md).
+ - Uploaded models must follow Studio's [Model Specifications](../art/modeling/specifications.md).
- Studio's [3D Importer](../art/modeling/3d-importer.md) supports `.gltf`, `.fbx`, `.obj` file formats.
- - You can also use tools like the [Roblox Blender plugin](../art/modeling/roblox-blender-plugin.md) to connect your modeling software to Studio and directly upload your modeling assets between applications.
+ - You can also use tools like the [Roblox Blender Plugin](../art/modeling/roblox-blender-plugin.md) to connect your modeling software to Studio and directly upload your modeling assets between applications.
- Images
- - Uploaded textures must follow Studio's [texture specifications](../art/modeling/specifications.md).
+ - Uploaded textures must follow Studio's [Texture Specifications](../art/modeling/specifications.md).
- Studio's [Asset Manager](../projects/assets/manager.md) supports `.png`, `.jpg`, `.tga`, or `.bmp` file formats and allows for bulk file imports.
- Sounds
- - Uploaded sounds must follow Roblox's [sound requirements](../sound/assets.md#requirements).
+ - Uploaded sounds must follow Roblox's [Sound Requirements](../sound/assets.md#requirements).
- Studio's [Asset Manager](../projects/assets/manager.md) supports `.mp3`, and `.ogg` file formats and allows for bulk file imports.
-Roblox performs asset moderation on upload of any asset type. Roblox can also moderate assets after the initial upload. For more information, see [Asset moderation](../projects/assets/index.md#asset-moderation).
+Roblox performs asset moderation on upload of any asset type. Roblox can also moderate assets after the initial upload. For more information, see [Asset Moderation](../projects/assets/index.md#asset-moderation).
diff --git a/content/en-us/art/overview-studio.md b/content/en-us/art/overview-studio.md
index 6ce5962bf..d3b8fa379 100644
--- a/content/en-us/art/overview-studio.md
+++ b/content/en-us/art/overview-studio.md
@@ -1,5 +1,5 @@
---
-title: 3D art and Studio
+title: 3D Art and Studio
description: An overview of fundamental 3D art tools, concepts, workflows, and resources for Roblox Studio.
hideBreadcrumbs: true
---
@@ -15,7 +15,7 @@ Each of the following sections include a brief description as well as additional
- [Materials and Textures](#materials-and-textures) - Discover how Roblox uses materials and textures with your models to enhance the surface appearance of your objects.
- [Environments](#environments) - Craft immersive environments using terrain tools, lighting effects, and atmospheric elements.
-## Basic layout
+## Basic Layout
After [installing Studio](../studio/setup.md), familiarize yourself with Studio's many 3D art tools and interfaces. While you can customize Studio to show various layouts and tools, Studio opens with the most commonly used windows by default:
@@ -31,9 +31,9 @@ After [installing Studio](../studio/setup.md), familiarize yourself with Studio'
- **Output** — This window displays all error, warning, or manually returned messages from the Roblox Engine. This window is useful for troubleshooting behavior in your experience.
-For more information on the Studio interface and individual tools, see the [Studio overview](../studio/index.md).
+For more information on the Studio interface and individual tools, see [Studio Overview](../studio/index.md).
-## Common shortcuts
+## Common Shortcuts
Like all creation tools, keyboard shortcuts allow you to work efficiently and quickly. While Studio has many built-in keyboard shortcuts and offers various customizations, the following shortcuts and settings can be very useful for 3D artists:
@@ -94,9 +94,9 @@ Like all creation tools, keyboard shortcuts allow you to work efficiently and qu
-For additional keyboard shortcuts, see [Studio shortcuts](../studio/shortcuts.md).
+For additional keyboard shortcuts, see [Studio Shortcuts](../studio/shortcuts.md).
-## Assets and packages
+## Assets and Packages
Before you begin creating, it's important to understand how Roblox handles **assets** and **packages**, the most basic object or group of objects that you can save, use, and share.
@@ -128,7 +128,7 @@ The **Creator Store** is where you can find many assets created and shared by Ro
Access the Creator Store through Studio's Toolbox or the [Creator Hub](https://create.roblox.com/store/models). For more information, see [Creator Store](../production/creator-store.md).
-#### Roblox created models
+#### Roblox Created Models
Roblox also provides free model packs that you can use within your experiences. These are high quality assets used in many of Roblox's showcase experiences. You can add these to your toolbox in various ways by directly adding them from the Creator Dashboard, or searching for them in the Toolbox.
@@ -148,7 +148,7 @@ The **Marketplace** is where all Roblox users can purchase virtual cosmetics, su
To sell assets on the Marketplace, your creation must follow specific avatar specifications and meet certain policies and guidelines. For more information, see [Avatar](../avatar/index.md) and [Marketplace](../marketplace/index.md).
-## 3D modeling
+## 3D Modeling
3D modeling is the process of creating three-dimensional digital representations of objects or environments. Roblox supports [basic 3D modeling](#basic-parts) in Studio, using primitive parts and allowing you to combine, subtract, and intersect the basic parts into more complex models.
@@ -169,7 +169,7 @@ Roblox also supports [custom 3D models](#mesh-parts) created from 3D modeling so
-### Basic parts
+### Basic Parts
Studio natively supports basic parts that allow you to quickly add simple geometry to your experience. This is ideal for creating simple environments or even greyboxing or prototyping a more complex 3D space.
@@ -182,7 +182,7 @@ Basic parts include the following benefits:
For more information on using basic parts, as well as solid modeling operations, see [Parts](../parts/index.md).
-### Mesh parts
+### Mesh Parts
Meshes are collections of vertices, edges, and faces that make up a 3D object. Unlike parts, which you can directly create in Studio, you first create meshes in a third-party modeling application like Blender or Maya before importing the model file into Studio. After importing a mesh, Studio represents the mesh object as a `Class.MeshPart`.
@@ -202,9 +202,9 @@ Meshes are collections of vertices, edges, and faces that make up a 3D object. U
-For more information on creating custom meshes, see [Custom meshes](../art/modeling/index.md).
+For more information on creating custom meshes, see [3D Art Modeling](../art/modeling/index.md).
-## Materials and textures
+## Materials and Textures
It's always important to consider the surface appearance of your objects, as this empowers you to create cohesive and engaging assets and environments. Studio includes many tools to manage the look and feel of your assets, primarily by customizing your objects with [materials](#materials) and [textures](#textures).
@@ -226,7 +226,7 @@ Materials also affect physical properties beyond appearance. The following are v
- **Glass** - When a part's material is set to glass and its transparency is greater than `0`, it distorts and slightly blurs the image behind it, and becomes less transparent when viewed from an angle.
- **Forcefield** - Any texture object placed on a mesh using the `ForceField` material will shimmer and shine at random intervals depending on the R channel of the texture's RGB color.
-- **Neon** - Adds a glowing effect on parts. This is useful for decorating places, especially sci-fi or night city environments. This behavior might change at lower render settings when playing on less performant devices. For more information on performance behavior, see [Improve performance](../performance-optimization/improve.md).
+- **Neon** - Adds a glowing effect on parts. This is useful for decorating places, especially sci-fi or night city environments. This behavior might change at lower render settings when playing on less performant devices. For more information on performance behavior, see [Performance Optimization](../performance-optimization/improving.md).
For additional information, see [Materials](../parts/materials.md).
@@ -258,7 +258,7 @@ There are two types of textures in Roblox, single image **basic textures** and *
Loading many unique PBR textures at once can affect performance in your experience. When working with many similar meshes, you can save processing power and memory by using a single set of PBR textures and [modifying alpha channels in combination with your mesh object base colors](https://devforum.roblox.com/t/using-alpha-masks-in-color-maps-to-customizetint-base-colors).
-For additional tips on improving performance with your assets, see [Improve performance](../performance-optimization/improve.md#rendering).
+For additional tips on improving performance with your assets, see [Performance Optimization](../performance-optimization/improving.md#rendering).
@@ -270,7 +270,7 @@ For additional tips on improving performance with your assets, see [Improve perf
-For more information see [Textures and decals](../parts/textures-decals.md) and [PBR textures](../art/modeling/surface-appearance.md).
+For more information see [Textures and Decals](../parts/textures-decals.md) and [PBR Textures](../art/modeling/surface-appearance.md).
## Environments
@@ -284,7 +284,7 @@ Environments refer to the visual and spatial world within your experience. Envir
While many experiences are include interior spaces, such as a city building or spaceship, it's important to use terrain for outdoor environments whenever possible to ensure performance and expected lighting and environmental behavior.
-For more information, see [Environmental terrain](../parts/terrain.md).
+For more information, see [Terrain](../parts/terrain.md).
### Lighting
@@ -294,7 +294,7 @@ For more information, see [Environmental terrain](../parts/terrain.md).
Lighting can be categorized into the following:
-- **Global lighting** - Refers to the luminescence from either the sun or moon in an outdoor environment. You can set the properties of your global lighting by adjusting the Lighting service. For additional hands-on instructions on adjusting global lighting, see the [Customize global lighting](../tutorials/curriculums/core/building/customize-global-lighting.md) lesson of our Core Curriculum.
+- **Global lighting** - Refers to the luminescence from either the sun or moon in an outdoor environment. You can set the properties of your global lighting by adjusting the Lighting service. For additional hands-on instructions on adjusting global lighting, see the [Customize Global Lighting](../tutorials/curriculums/core/building/customize-global-lighting.md) lesson of our Core Curriculum.
- **Local lighting** - Refers to light sources placed within your experiences, such as pointlights, spotlights, and surface lights. You can modify lighting scenarios based on different interior rooms or sections of your experience by using one or more light sources.
-For additional information on modifying your environment's lighting, see [Global lighting](../environment/lighting.md).
+For additional information on modifying your environment's lighting, see [Lighting](../environment/lighting.md).
diff --git a/content/en-us/assets/audio/playing-audio/Sound-Property-SoundId-Generic.png b/content/en-us/assets/audio/playing-audio/Sound-Property-SoundId-Generic.png
new file mode 100644
index 000000000..49d3af32c
--- /dev/null
+++ b/content/en-us/assets/audio/playing-audio/Sound-Property-SoundId-Generic.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c9dc59822ee0c3c6d1f1c27e6a52a87be96390fab8576411336e1395ede68c69
+size 18962
diff --git a/content/en-us/assets/audio/sound-groups/Assigning-Audio-Cursor-Changes.png b/content/en-us/assets/audio/sound-groups/Assigning-Audio-Cursor-Changes.png
new file mode 100644
index 000000000..b35ffb7d3
--- /dev/null
+++ b/content/en-us/assets/audio/sound-groups/Assigning-Audio-Cursor-Changes.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:20a7545f8a520379534ed24fc1294305748e6cc730dc0fb1cc6721a6dc06f953
+size 13352
diff --git a/content/en-us/assets/audio/sound-groups/Assigning-Audio-Update.png b/content/en-us/assets/audio/sound-groups/Assigning-Audio-Update.png
new file mode 100644
index 000000000..2935b1838
--- /dev/null
+++ b/content/en-us/assets/audio/sound-groups/Assigning-Audio-Update.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:25a574778449e04117655bbacf15ab642c9a340cd1037b954052756aec61cf39
+size 29709
diff --git a/content/en-us/assets/audio/sound-groups/Insert-Dynamic-Effect.png b/content/en-us/assets/audio/sound-groups/Insert-Dynamic-Effect.png
new file mode 100644
index 000000000..5c15e8b14
--- /dev/null
+++ b/content/en-us/assets/audio/sound-groups/Insert-Dynamic-Effect.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:754bca29b7e33ba4e428eafa37b954b7c15c96dc8625f381ac0c5fb39dfe6d2d
+size 12249
diff --git a/content/en-us/assets/audio/sound-groups/SoundService-SoundGroup-Object.png b/content/en-us/assets/audio/sound-groups/SoundService-SoundGroup-Object.png
new file mode 100644
index 000000000..93c8819cd
--- /dev/null
+++ b/content/en-us/assets/audio/sound-groups/SoundService-SoundGroup-Object.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:71d1519bd3586b71d780b5b99af98b33489318623025b260997aadfe646a082f
+size 12004
diff --git a/content/en-us/assets/audio/sound-objects/Background-Audio-Sound.png b/content/en-us/assets/audio/sound-objects/Background-Audio-Sound.png
new file mode 100644
index 000000000..2a161d4ec
--- /dev/null
+++ b/content/en-us/assets/audio/sound-objects/Background-Audio-Sound.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1e5462621c844d5cd9b8240d34f18339d3125d79cb39e8745b8c1240bf0a7a34
+size 18483
diff --git a/content/en-us/assets/audio/sound-objects/Point-Source-Sound.png b/content/en-us/assets/audio/sound-objects/Point-Source-Sound.png
new file mode 100644
index 000000000..f8524d999
--- /dev/null
+++ b/content/en-us/assets/audio/sound-objects/Point-Source-Sound.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:06f7ea47b34788802d0685504db6c12c4e70f5d8f9f766ec3e381b4481b50f23
+size 21252
diff --git a/content/en-us/assets/audio/sound-objects/Volumetric-Sound.png b/content/en-us/assets/audio/sound-objects/Volumetric-Sound.png
new file mode 100644
index 000000000..18f3b4982
--- /dev/null
+++ b/content/en-us/assets/audio/sound-objects/Volumetric-Sound.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:068e017ce874e1e6ef644167ff7b53db9946335058821543c2bd87ef417ae89c
+size 14953
diff --git a/content/en-us/assets/studio/explorer/SoundService-SoundGroup-ReverbSoundEffect.png b/content/en-us/assets/studio/explorer/SoundService-SoundGroup-ReverbSoundEffect.png
deleted file mode 100644
index 479a091ca..000000000
--- a/content/en-us/assets/studio/explorer/SoundService-SoundGroup-ReverbSoundEffect.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:185104534c83452e3b97dcdbd4784161ef277448fa593b55eb58c1f63617a623
-size 21012
diff --git a/content/en-us/assets/studio/explorer/SoundService-SoundGroup.png b/content/en-us/assets/studio/explorer/SoundService-SoundGroup.png
deleted file mode 100644
index 0109ec09e..000000000
--- a/content/en-us/assets/studio/explorer/SoundService-SoundGroup.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0f8731bba68e2b095b2ab3fd58e7f5ac2fa032cef0b3e21fa387f3876d5dea61
-size 14866
diff --git a/content/en-us/assets/studio/properties/Sound-SoundGroup.png b/content/en-us/assets/studio/properties/Sound-SoundGroup.png
deleted file mode 100644
index f52da2c17..000000000
--- a/content/en-us/assets/studio/properties/Sound-SoundGroup.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:472373d56e3b86e5290c306497600121c8c0d0faee157ca1c5edb4904a699039
-size 14485
diff --git a/content/en-us/assets/studio/properties/Sound-SoundId.png b/content/en-us/assets/studio/properties/Sound-SoundId.png
deleted file mode 100644
index 2b79fdda1..000000000
--- a/content/en-us/assets/studio/properties/Sound-SoundId.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:868454eee0bbfcbf7903b849d09da6bede1551339d115077ef35ffae8671a66d
-size 15886
diff --git a/content/en-us/assistant/guide.md b/content/en-us/assistant/guide.md
index 32d2228cc..62a219366 100644
--- a/content/en-us/assistant/guide.md
+++ b/content/en-us/assistant/guide.md
@@ -15,17 +15,17 @@ description: How to use Assistant to help build, grow, and monetize your creatio
[Built with Meta Llama 3](https://llama.meta.com/llama3/license/)
-## Studio features
+## Studio Features
You can access Assistant from [Studio](../studio/index.md) and the [documentation](/assistant), but Studio has the larger set of features. In Studio, Assistant consists of a large language model (LLM) that generates code and a run-command module (similar to the existing [command bar](../studio/ui-overview.md#command-bar)) that runs code.
As a result, Assistant can act directly on your data model, such as inserting and modifying objects, writing and inserting scripts, and automating repetitive tasks like modifying properties in bulk.
-For a more in-depth look at what Assistant can do and how to use it, see the [Prompt guide and examples](prompt-engineering.md) and the following Roblox Staff livestream for tips, tricks, and inspiration.
+For a more in-depth look at what Assistant can do and how to use it, see the [Prompt Guide and Examples](prompt-engineering.md) and the following Roblox Staff livestream for tips, tricks, and inspiration.
-### Insert and modify scripts
+### Insert and Modify Scripts
Assistant can insert new scripts, modify existing ones, and perform these actions across multiple objects as necessary. For example, if you ask it to create a remote event, it can create a local script, a server script, and the event all at once.
@@ -35,7 +35,7 @@ If you enter a script generation request like "Make the player's character jump
The generated script might not function flawlessly. In these cases, you can either make further edits in the [Script Editor](../studio/script-editor.md) or ask Assistant to edit the script it just created. It can even act on existing scripts that it didn't create if you need help with code that you've written yourself.
-### Insert and modify objects
+### Insert and Modify Objects
Assistant can create, edit, delete and iterate on instances in your data model, including inserting items from the Creator Store.
@@ -43,19 +43,19 @@ Assistant can create, edit, delete and iterate on instances in your data model,
If you examine the code, you can see that Assistant calls `Class.InsertService:GetFreeModels()` to query the Creator Store for a wheelbarrow model and uses `Class.Model:PivotTo()` to place it near a tree.
-### Provide answers and suggestions
+### Provide Answers and Suggestions
If you need general knowledge or help while creating an experience, you can ask Assistant questions like how to make a team system, how to design a game loop, how to use specific Studio tools, and much more. It can even explain code that it generated or that you wrote yourself.
-### Generate materials
+### Generate Materials
When given a request to generate a material, Assistant in Studio can quickly style existing parts through a lightweight implementation of the [Material Generator](../studio/material-generator.md).
-## Access Assistant
+## Accessing Assistant
Assistant is available in two locations: Studio and the documentation.
@@ -67,14 +67,14 @@ To access Assistant from Studio:
-2. Type a request into the field near the bottom of the window, using guidance from the [prompt guide](prompt-engineering.md) to generate improved responses.
+2. Type a request into the field near the bottom of the window, using guidance from the [Prompt Guide](prompt-engineering.md) to generate improved responses.
- Click thumbs up or thumbs down to rate the result and improve future results.
- Click the redo icon to process a new result.
-### From the documentation
+### From the Documentation
To access Assistant from the [documentation](/assistant):
@@ -82,7 +82,7 @@ To access Assistant from the [documentation](/assistant):
-1. Select a premade question or type your own. See the [prompt guide](prompt-engineering.md) for guidance on generating improved responses.
+1. Select a premade question or type your own. See the [Prompt Guide](prompt-engineering.md) for guidance on generating improved responses.
diff --git a/content/en-us/assistant/prompt-engineering.md b/content/en-us/assistant/prompt-engineering.md
index 622d2f1cb..fc0536d63 100644
--- a/content/en-us/assistant/prompt-engineering.md
+++ b/content/en-us/assistant/prompt-engineering.md
@@ -1,5 +1,5 @@
---
-title: Assistant prompt guide and examples
+title: Assistant Prompt Guide and Examples
description: Get tips and tricks on how best to prompt Roblox's AI Assistant to get the best results.
---
@@ -9,14 +9,14 @@ description: Get tips and tricks on how best to prompt Roblox's AI Assistant to
This document gives guidance on prompting Assistant and provides examples and inspiration on what Assistant can do.
-## Be specific
+## Be Specific
If Assistant fails, add more details to your prompt and try again. Use instance names exactly as they're spelled, specify which function you want Assistant to use, and tell Assistant which type it's working with, such as a part or a model.
-
**Not specific**
-
**More specific**
+
**Not Specific**
+
**More Specific**
Place the trees in a circle.
@@ -32,21 +32,21 @@ If Assistant fails, add more details to your prompt and try again. Use instance
-## Use your selection
+## Use Your Selection
Selection is a great way of specifying an object or set of objects you want to refer to in your prompt. Select multiple objects and ask Assistant to modify them, make duplicates and place them somewhere, or continue a position pattern like maintaining placement in a line.
-## Edit time and run time
+## Edit Time and Run Time
Assistant sometimes confuses the difference between edit time and run time. If you ask Assistant to take an action, it will likely bias towards doing it at edit time. If you want the action to happen during run time, ask Assistant to insert a script that takes the action. For example, tell Assistant "add a script to make the time of day 8:00 AM" instead of "make the time of day 8:00 AM."
-## Keep trying
+## Keep Trying
Don't get discouraged if Assistant doesn't work exactly the way you want the first time. Often, making small tweaks and trying again can lead to better results. Many AI tools are non-deterministic, meaning they don't create the exact same output each time you ask them to do something. There's some variance, which you can tap into and control using tweaks to your prompt.
AI in its current state requires work. It takes time to understand how to best speak to Assistant, what it can do, and how to get what you want out of it.
-## Multi-step prompts
+## Multi-Step Prompts
Consider using multi-step prompts to encourage Assistant to think. Instead of asking "Can you explain this script to me?" and pasting in the script, ask it to explain step-by-step by separating the question from the script with `###`. This separation helps Assistant deconstruct and organize the information to provide better answers.
@@ -70,7 +70,7 @@ _part.Touched:Connect(onTouched)_
-
+
_Certainly! This script is an example of how to handle collisions between two parts in Roblox. Let's break it down step by step:_
@@ -88,7 +88,7 @@ _Certainly! This script is an example of how to handle collisions between two pa
These examples demonstrate the vast variety of tasks that Assistant can help with today. Some of them might take a few tries for you to reproduce, but give them a try and see what you can come up with yourself.
-### Game mechanics - Shoot fireballs that explode
+### Game Mechanics - Shooting Fireballs that Explode
**Prompt:**
Propel a fireball away from the player in the direction the player is facing when the player presses "e".
@@ -96,28 +96,28 @@ Make the fireball explode when it hits something.
-### Game mechanics - Set up a teams system and assign players
+### Game Mechanics - Set Up a Teams System and Assign Players
**Prompt:**
Add a script to make a system of teams (red, blue, green, yellow) and assign each player randomly to a team.
-### Game mechanics - Temple run style constant running
+### Game Mechanics - Temple Run Style Constant Running
**Prompt:**
Make my character run forward constantly like in a temple run game.
-### Game mechanics - Fire power up
+### Game Mechanics - Fire Power Up
**Prompt:**
Add a script that makes the player light on fire and jump 3 time as high if they press "q". The fire should be attached to the player and move with them. If they press "q" again, turn off the fire and reset the jump power.
-### Game mechanics - NPC lasers
+### Game Mechanics - NPC Lasers
**Prompt:**
Add a script that makes this shoot a laser using a long thin part that's blue and neon at the player if they're within 30 studs.
@@ -126,7 +126,7 @@ Add a script to make this look towards and slowly move towards the closest playe
-### Game mechanics - Interactive NPC
+### Game Mechanics - Interactive NPC
**Prompt:**
This is an NPC. Add a prompt that lets the player interact with it. If the player interacts, have the NPC say "hello [player's name]" where player's name is the actual player's name, in a text pop up.
@@ -135,7 +135,7 @@ Add a script that makes this npc always look towards the closest player.
-### Game mechanics - NPC patrolling
+### Game Mechanics - NPC Patrolling
**Prompt:**
Add a script to make this NPC move slowly between startpart and endpart repeatedly.
@@ -144,7 +144,7 @@ If the player comes within 10 studs, turn the NPC red and make it chase the play
-### Game mechanics - Update scoreboard
+### Game Mechanics - Updating Scoreboard
**Prompt:**
Add a script that deletes this and adds 100 to the players score.
@@ -153,28 +153,28 @@ Add a script to show the player's score on the scoreboard.
-### Camera - Lock to top down
+### Camera - Locking to Top Down
**Prompt:**
Add a script that locks the camera in a top down view on the player and follow the player, making sure the player remains in the center of the screen.
-### Camera - Lock to first person
+### Camera - Locking to First Person
**Prompt:**
Create a script to lock the camera in first person view.
-### UI - Drop-down menu
+### UI - Drop-down Menu
**Prompt:**
Create a drop down menu with 5 items.
-### UI - Health bar
+### UI - Health Bar
**Prompt:**
Add a part on the ground, when a player touches it, it decreases health by 10%. Put a UI health bar in the upper center of the screen that turns red when the players health is less than 20%.
@@ -188,21 +188,21 @@ Create a heads up display in StarterGui. Add a healthbar to the top right, and a
-### Building - Scatter objects with randomization
+### Building - Scattering Objects with Randomization
**Prompt:**
Add 0-5 of the selected instance "Mushroom" around each "RedwoodTree-Var01".
-### Building - Night / day cycle with street lights
+### Building - Night / Day Cycle with Street Lights
**Prompt:**
Add a script that changes the time of day by 1 hour every second. Start at 3pm. At 7pm, turn every spotlight's brightness up to 10. At 8am turn every spotlight's brightness down to 0.
-### Building - Physics-based suspension bridge
+### Building - Physics-based Suspension Bridge
**Prompt:**
Create a rope bridge. Make 10 wood planks that are 5 studs wide and 2 studs long.
@@ -212,35 +212,35 @@ visible, anchor the 1st and 10th part, and add a drag detector on the 1st and 10
-### Building - Add smoke to chimneys
+### Building - Adding Smoke to Chimneys
**Prompt:**
Insert an invisible brick that is non-collidable into every chimney in every house. The brick should have a particle inside it that makes smoke that flows upwards, and the smoke must be white.
-### Building - Rename instances
+### Building - Renaming Instances
**Prompt:**
Rename all the "emptyscripts" objects to "Script+uniqueID".
-### Building - Create terrain
+### Building - Creating Terrain
**Prompt:**
Create a terrain region with rolling hills.
-### Building - Add behavior at scale
+### Building - Adding Behavior at Scale
**Prompt:**
Add a script to make the spotlights in the folder StreetLights flicker on and off randomly.
-### Building - Replace greyboxes with assets
+### Building - Replacing Greyboxes with Assets
**Prompt:**
Replace each of the selected parts with a model of the same name currently in the data model inside the AssetLibrary Folder under workspace. For example, if the part is called "Suburban House", look for a model called "Suburban House" and replace the part with that model.
diff --git a/content/en-us/avatar/index.md b/content/en-us/avatar/index.md
index 61d7a510e..9b02fd126 100644
--- a/content/en-us/avatar/index.md
+++ b/content/en-us/avatar/index.md
@@ -1,5 +1,5 @@
---
-title: Roblox avatars
+title: Roblox Avatars
description: Create and upload avatar characters, clothing, and accessories to the Roblox Marketplace.
hideBreadcrumbs: true
---
@@ -13,15 +13,15 @@ Whether you're creating and selling a basic accessory, clothes, or an avatar cha
-1. **Modeling and creation** — Create the asset in a third-party software such as Blender or Maya.
+1. **Modeling and Creation** — Create the asset in a third-party software such as Blender or Maya.
- Roblox supports many types of third-party models, but assets intended for the Marketplace require their own specifications for [rigid accessories](../art/accessories/specifications.md), [clothing accessories](../art/accessories/clothing-specifications.md), and [bodies](../art/characters/specifications.md).
-2. **Importing and uploading** — Add your creation to the Roblox servers through Studio.
+2. **Importing and Uploading** — Add your creation to the Roblox servers through Studio.
- Initial validation and moderation of the asset occurs during this stage. See each item category section for specific instructions.
-3. **Publishing and selling** — Manage your asset on your [Creator Dashboard](https://create.roblox.com/dashboard/creations) where you can set your item price and other Marketplace configurations before you enable the item for sale.
+3. **Publishing and Selling** — Manage your asset on your [Creator Dashboard](https://create.roblox.com/dashboard/creations) where you can set your item price and other Marketplace configurations before you enable the item for sale.
- See [Marketplace](../marketplace/index.md) for an overview of this process.
@@ -42,7 +42,7 @@ Create avatar items for Roblox, ranging from clothing, accessories, bodies, and
Understand the various components that make up rigid accessories, the most basic form of 3D avatar cosmetics.
-
+
@@ -54,7 +54,7 @@ Create avatar items for Roblox, ranging from clothing, accessories, bodies, and
Understand the advanced components of layered clothing, accessories that stretch and fit over a target.
-
+
@@ -69,7 +69,7 @@ Create avatar items for Roblox, ranging from clothing, accessories, bodies, and
Learn the various components that make up the unique Roblox avatar, including using mesh geometry, rigs, facial animation, and other important components.
-
+
@@ -81,7 +81,7 @@ Create avatar items for Roblox, ranging from clothing, accessories, bodies, and
Follow step-by-step guides to create accessories, clothing, and characters to start creating your own unique 3D avatar asset.
-
+
@@ -101,23 +101,23 @@ After creating your items, you can begin the process of selling your assets on t
- Marketplace policy
+ Marketplace Policy
Learn about the user requirements for selling, as well as the technical and community-related specifications required for the Marketplace.
-
+
-Intellectual property
+Intellectual Property
Understand how IP works on the Roblox ecosystem to protect yourself and the community.
-
+
@@ -125,34 +125,34 @@ Understand how IP works on the Roblox ecosystem to protect yourself and the comm
- Publishing steps
+ Publishing Steps
Upload your catalog-ready asset to the Marketplace and set the item on sale using various creator controls.
-
+
- Fees and commissions
+ Fees and Commissions
Understand how fees, payments, commissions, and other monetary and purchasing details work for your various asset types.
-
+
-## Resources and tools
+## Resources and Tools
Roblox provides additional resources and tools to enable creation. Check out the various Studio and third-party tools designed to expedite and ease the process of creation.
- Downloadable resources
+ Downloadable Resources
View various downloadable resources ranging from sample model files, template files, project boilerplates, and more.
@@ -162,12 +162,12 @@ Roblox provides additional resources and tools to enable creation. Check out the
- Studio tools
+ Studio Tools
Studio provides several tools designed to make the creation process more straightforward and efficient.
-
+
@@ -175,12 +175,12 @@ Roblox provides additional resources and tools to enable creation. Check out the
- Third-party add-ons
+ Third-Party Add-ons
Third-party add-ons and tools are available to help expedite the creation process in your third-party applications.
-
+
diff --git a/content/en-us/avatar/resources.md b/content/en-us/avatar/resources.md
index 295f960c2..7c613a069 100644
--- a/content/en-us/avatar/resources.md
+++ b/content/en-us/avatar/resources.md
@@ -138,7 +138,7 @@ A Blocky character model with an animatable head and a full body cage.
-A skinned R15 character created from the Skinning a Humanoid Model guide. Since this reference model doesn't yet have [inner and outer cage mesh data](../art/characters/specifications.md#inner-and-outer-cages), this model can't equip layered clothing or accessories.
+A skinned R15 character created from the Skinning a Humanoid Model guide. Since this reference model doesn't yet have [inner and outer cage mesh data](../art/characters/specifications.md#inner-and-outer-cages), this model can't equip layered clothing or accessories.
@@ -194,7 +194,7 @@ Caged 3D accessory models and associated PBR textures. Ready for import into Stu
-## Auto-setup references
+## Auto-Setup References
The following assets are designed for the specific [auto-setup requirements](../art/modeling/avatar-setup.md#model-requirements). If uploaded as-is, these assets will fail normal validation.
@@ -244,7 +244,7 @@ This Auto-Setup template is not compatible with the traditional avatar creation
-## Project files
+## Project Files
The following are base rig, attachment, and cage files for avatar item creation in third-party applications. Choose the appropriate type of project file for your use-case. These assets are not suitable for direct import into Studio.
@@ -328,7 +328,7 @@ Template file containing all content from previous templates, includes rig skele
-## Mannequin models
+## Mannequin Models
Use the following models when designing your avatar accessory and clothing items. You can use these assets as scale, body shape, and caging reference.
@@ -401,12 +401,12 @@ A blank mannequin using Roblox's [Rthro Slender](../art/characters/specification
## Templates
-Use these templates if following along the [Create characters with templates](../art/characters/creating/index.md) tutorial content.
+Use these templates if following along the [Creating Characters with Templates](../art/characters/creating/index.md) tutorial content.
These assets require additional steps in third-party tools to pass validation in Studio.
-If you are using Roblox's avatar template files, you must perform the [cleanup steps](../art/characters/creating/combine-head-geometry.md) in order for the assets to properly validate before publishing to the Marketplace.
+If you are using Roblox's avatar template files, you must perform the [cleanup steps](../art/characters/creating/combining-head-geometry.md) in order for the assets to properly validate before publishing to the Marketplace.
@@ -418,7 +418,7 @@ If you are using Roblox's avatar template files, you must perform the [cleanup s
-Blender and .fbx template files with pre-baked avatar components.
See [Create with templates](../art/characters/creating/index.md) for instructions.
+Blender and .fbx template files with pre-baked avatar components.
See [Creating with Templates](../art/characters/creating/index.md) for instructions.
@@ -438,7 +438,7 @@ Blender and .fbx template files with pre-baked avatar components.
-Blender and .fbx template files with pre-baked avatar components.
See [Create with templates](../art/characters/creating/index.md) for instructions.
+Blender and .fbx template files with pre-baked avatar components.
See [Creating with Templates](../art/characters/creating/index.md) for instructions.
@@ -458,7 +458,7 @@ Blender and .fbx template files with pre-baked avatar components.
-Blender and .fbx template files with pre-baked avatar components.
See [Create with templates](../art/characters/creating/index.md) for instructions.
+Blender and .fbx template files with pre-baked avatar components.
See [Creating with Templates](../art/characters/creating/index.md) for instructions.
@@ -479,7 +479,7 @@ Blender and .fbx template files with pre-baked avatar components.
-Blender and .fbx template files with pre-baked avatar components.
See [Create with templates](../art/characters/creating/index.md) for instructions.
+Blender and .fbx template files with pre-baked avatar components.
See [Creating with Templates](../art/characters/creating/index.md) for instructions.
@@ -500,7 +500,7 @@ Blender and .fbx template files with pre-baked avatar components.
-Blender and .fbx template files with pre-baked avatar components.
See [Create with templates](../art/characters/creating/index.md) for instructions.
+Blender and .fbx template files with pre-baked avatar components.
See [Creating with Templates](../art/characters/creating/index.md) for instructions.
@@ -521,7 +521,7 @@ Blender and .fbx template files with pre-baked avatar components.
-Blender and .fbx template files with pre-baked avatar components.
See [Create with templates](../art/characters/creating/index.md) for instructions.
+Blender and .fbx template files with pre-baked avatar components.
See [Creating with Templates](../art/characters/creating/index.md) for instructions.
@@ -540,7 +540,7 @@ Blender and .fbx template files with pre-baked avatar components.
-Blender and .fbx template files with pre-baked avatar components.
See [Create with templates](../art/characters/creating/index.md) for instructions.
+Blender and .fbx template files with pre-baked avatar components.
See [Creating with Templates](../art/characters/creating/index.md) for instructions.
@@ -553,7 +553,7 @@ Blender and .fbx template files with pre-baked avatar components.
-## Add-ons and tools
+## Add-Ons and Tools
Use the following add-ons and tools to help aid your creation process. Some of these tools are not actively supported and may be incompatible with your hardware version.
diff --git a/content/en-us/avatar/tutorials.md b/content/en-us/avatar/tutorials.md
index c280b086e..237b2784c 100644
--- a/content/en-us/avatar/tutorials.md
+++ b/content/en-us/avatar/tutorials.md
@@ -33,7 +33,7 @@ Learn how to create assets with structured tutorials that walks through each cre
-
Rigid accessories
+
Rigid Accessories
This tutorial covers the basic steps to successfully create and sell an accessory. Model and texture an object in Blender, upload the publishable accessory item to Studio, and sell the item on the Marketplace.
@@ -89,7 +89,7 @@ style={{position: "relative"}}>
-
diff --git a/content/en-us/characters/appearance.md b/content/en-us/characters/appearance.md
index f09c300ec..b671253a1 100644
--- a/content/en-us/characters/appearance.md
+++ b/content/en-us/characters/appearance.md
@@ -1,5 +1,5 @@
---
-title: Character appearance
+title: Character Appearance
description: Customize your in-experience character appearance and properties with the Avatar Game Settings and HumanoidDescription.
---
@@ -15,7 +15,7 @@ To create a unique experience that alters the appearance of your users, you can
- Configure the Avatar [Game Settings](#game-settings) to set basic global avatar appearance defaults for all users.
- Use [HumanoidDescription](#humanoiddescription) at any point to apply a wide-range of specific character customizations to one or more users in your experience.
-## Game settings
+## Game Settings
The **Avatar** section in [Game Settings](../studio/game-settings.md#avatar) menu allows you to quickly set several global character properties in your experience. When editing the Avatar Game Settings, your avatar displays in the workspace as a visual preview.
@@ -59,7 +59,7 @@ You can adjust the following character properties in your experience using the A
-### Avatar types
+### Avatar Types
The **Avatar Type** setting sets your experience to only load **R15** or **R6** character models.
@@ -78,7 +78,7 @@ The **Avatar Type** setting sets your experience to only load **R15** or **R6**
-### Collision boundaries
+### Collision Boundaries
The **Collision** setting sets the collision boundaries for characters in the experience. This doesn't impact the physical appearance of the characters in your experience.
@@ -95,7 +95,7 @@ You can adjust the following character properties in your experience using `Clas
-
Character property
+
Character Property
Description
@@ -129,15 +129,15 @@ You can adjust the following character properties in your experience using `Clas
You can customize a character with `Class.HumanoidDescription` using the following steps:
-1. [Create a description](#create-humanoiddescription) from the user's character, a specific Outfit ID, or from a specific User ID.
-2. [Modify the description](#modify-humanoiddescription) to customize the properties that you want to apply to the `Class.Humanoid` character.
-3. [Apply the description](#apply-humanoiddescription) on either a single character, all player characters, or even on all spawning characters.
+1. [Create a description](#creating-humanoiddescription) from the user's character, a specific Outfit ID, or from a specific User ID.
+2. [Modify the description](#modifying-humanoiddescription) to customize the properties that you want to apply to the `Class.Humanoid` character.
+3. [Apply the description](#applying-humanoiddescription) on either a single character, all player characters, or even on all spawning characters.
When updating a character's properties through `Class.HumanoidDescription`, it is important to use an up-to-date `Class.HumanoidDescription` of that specific `Class.Humanoid` with `Class.Humanoid:GetAppliedDescription()|Humanoid:GetAppliedDescription()`.
-### Create HumanoidDescription
+### Creating HumanoidDescription
You can create a new `Class.HumanoidDescription` instance directly within the Explorer hierarchy or within a `Class.Script` with the following code:
@@ -147,7 +147,7 @@ local humanoidDescription = Instance.new("HumanoidDescription")
In most cases, you should use an existing `Class.HumanoidDescription` instead of a default new `Class.HumanoidDescription` by referencing an [existing player character](#from-the-player-character), [avatar outfit](#from-an-existing-outfit), or [user ID](#from-a-specific-user).
-#### From the player character
+#### From the Player Character
Use the following code sample to create a new `Class.HumanoidDescription` based on the player character's current properties:
@@ -161,7 +161,7 @@ if humanoid then
end
```
-#### From an existing outfit
+#### From an Existing Outfit
Use the following sample code to create a `Class.HumanoidDescription` from an outfit ID using `Class.Players:GetHumanoidDescriptionFromOutfitId()|Players.GetHumanoidDescriptionFromOutfitID`:
@@ -173,7 +173,7 @@ local outfitId = 480059254
local humanoidDescriptionFromOutfit = Players:GetHumanoidDescriptionFromOutfitId(outfitId)
```
-#### From a specific user
+#### From a Specific User
Use the following sample code to create a `Class.HumanoidDescription` from a user ID using `Class.Players:GetHumanoidDescriptionFromUserId()`:
@@ -185,7 +185,7 @@ local userId = 491243243
local humanoidDescriptionFromUser = Players:GetHumanoidDescriptionFromUserId(userId)
```
-### Modify HumanoidDescription
+### Modifying HumanoidDescription
To customize `Class.HumanoidDescription` properties, set them directly on the `Class.HumanoidDescription` or use a specified method before applying the `Class.HumanoidDescription` to a character.
@@ -201,7 +201,7 @@ humanoidDescription.GraphicTShirt = 1711661
humanoidDescription.HeadColor = Color3.new(0, 1, 0)
```
-#### Set multiple accessories
+#### Setting Multiple Accessories
For layered or bulk accessory changes, you can use `Class.HumanoidDescription:SetAccessories()` to make accessory related updates. The following code sample adds a layered sweater and jacket in that order to a `Class.HumanoidDescription`:
@@ -223,7 +223,7 @@ local accessoryTable = {
humanoidDescription:SetAccessories(accessoryTable, false)
```
-### Apply HumanoidDescription
+### Applying HumanoidDescription
Apply `Class.HumanoidDescription` to specific `Class.Humanoid` characters in your experience with `Class.Humanoid:ApplyDescription()` or `Class.Player:LoadCharacterWithHumanoidDescription()|Humanoid.LoadCharacterWithHumanoidDescription`.
@@ -231,7 +231,7 @@ Apply `Class.HumanoidDescription` to specific `Class.Humanoid` characters in you
Changing the assets on a character while also changing `Class.HumanoidDescription` might lead to undefined behavior.
-#### On a single character
+#### On a Single Character
`Class.Humanoid:ApplyDescription()|ApplyDescription()` can target any `Class.Humanoid`. Use the following code to add a new pair of sunglasses and a new torso to the player character:
@@ -247,7 +247,7 @@ if humanoid then
end
```
-#### On all player characters
+#### On All Player Characters
Use the following sample code to apply a `Class.HumanoidDescription` to all current players in the game:
@@ -270,7 +270,7 @@ for _, player in Players:GetPlayers() do
end
```
-#### On all spawning characters
+#### On All Spawning Characters
Use the following sample code to set a specific `Class.HumanoidDescription` for all spawning player characters:
diff --git a/content/en-us/characters/emotes.md b/content/en-us/characters/emotes.md
index a49bc8be2..a9dc78921 100644
--- a/content/en-us/characters/emotes.md
+++ b/content/en-us/characters/emotes.md
@@ -9,16 +9,16 @@ Emotes are expressive character [animations](../animation/index.md) that are acc
In your experience, you can perform the following emote customizations:
-- [Open and close](#open-and-close) a user's emotes menu programmatically.
-- [Add or remove](#add-and-remove-emotes) emotes options from a user's menu.
-- [Disable](#disable) access to the menu.
-- [Play](#play-emotes) an emote, targeting a specific user character.
+- [Open and close](#opening-and-closing) a user's emotes menu programmatically.
+- [Add or remove](#adding-and-removing-emotes) emotes options from a user's menu.
+- [Disable](#disabling) access to the menu.
+- [Play](#playing-emotes) an emote, targeting a specific user character.
-## Emotes menu
+## Emotes Menu
You can open and close a user's emote menu manually, customize the menu to display specific emotes, or disable the menu completely.
-### Open and close
+### Opening and Closing
To manually open or close a player's emote menu, call `Class.GuiService:SetEmotesMenuOpen()` with a boolean value of true or false.
@@ -32,7 +32,7 @@ GuiService:SetEmotesMenuOpen(true)
If you need to detect whether the emotes menu is open, call `Class.GuiService:GetEmotesMenuOpen()`. This returns a boolean indicating the menu's current state.
-### Add and remove emotes
+### Adding and Removing Emotes
Customize the emote menu by setting emotes from the catalog and then equipping emotes to a `Class.Humanoid`. Set emotes with the `Class.HumanoidDescription:SetEmotes()` method and equip up to 8 emotes to the emotes menu using `Class.HumanoidDescription:SetEquippedEmotes()`.
@@ -63,7 +63,7 @@ humanoidDescription:SetEquippedEmotes(equippedEmotes)
Key names, such as "Shrug" or "Salute" are customizable and will appear to the player as written. Emotes will also show up in the order they were set, starting at the top of the wheel and continuing clockwise.
-### Disable
+### Disabling
Disable the emotes menu with `Class.StarterGui:SetCoreGuiEnabled()`. Disabling the emotes menu will not prevent emotes from being performed with a chat command.
@@ -76,7 +76,7 @@ StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.EmotesMenu, false)
In addition to disabling the menu, you can disable loading of user-owned emotes by setting the `Class.StarterPlayer.UserEmotesEnabled` property within **StarterPlayer** > **Character** to **false**. This specific property can only be set in Studio and cannot be set by scripts.
-## Play emotes
+## Playing Emotes
To manually play an emote that a character has in its `Class.HumanoidDescription`, call `Class.Humanoid:PlayEmote()`, passing the string name of the emote. This call will return true to indicate that the emote was played successfully, or false otherwise.
diff --git a/content/en-us/characters/index.md b/content/en-us/characters/index.md
index e7d983d15..d4924b916 100644
--- a/content/en-us/characters/index.md
+++ b/content/en-us/characters/index.md
@@ -9,7 +9,7 @@ Characters can range between **basic** characters, such as a simple non-player c
All Roblox users are associated with an account-based avatar character. Along with this avatar character, Roblox represents users as **players** in the data model, giving developers access to additional character customization properties, social features, and relevant gameplay and account information. For more information on account specific player features, see [Players](../players/index.md).
-## Basic characters
+## Basic Characters
Basic characters are often used as NPCs and typically perform one or two simple tasks. A common component of basic characters include a display name, health, and basic movement.
@@ -33,9 +33,9 @@ You can use the following components within your `Class.Model` object to enable
-With these components, the character model displays a `Class.Humanoid.DisplayName`, has health, and can move with `Class.Humanoid.Move()`. For more information on additional configurations of the display and health elements, see [Name/health display](../characters/name-health-display.md).
+With these components, the character model displays a `Class.Humanoid.DisplayName`, has health, and can move with `Class.Humanoid.Move()`. For more information on additional configurations of the display and health elements, see [Name/Health Display](../characters/name-health-display.md).
-## Avatar characters
+## Avatar Characters
Avatar characters use a standardized set of character components that allow you to use body and facial animations, and equip clothing and accessories. By standardizing the components, all avatar character models can access these features, whether they are controlled by a player or an NPC.
@@ -68,4 +68,4 @@ If you are creating your own custom avatar character, you must configure your ch
See [Avatars](../art/characters/index.md) for information regarding the creation of avatar components, creation guides, and marketplace information.
-For information on modifying and customizing existing characters in your experience, see [Character appearance](../characters/appearance.md).
+For information on modifying and customizing existing characters in your experience, see [Character Appearance](../characters/appearance.md).
diff --git a/content/en-us/characters/name-health-display.md b/content/en-us/characters/name-health-display.md
index dc0fa3018..a1704eb9c 100644
--- a/content/en-us/characters/name-health-display.md
+++ b/content/en-us/characters/name-health-display.md
@@ -1,5 +1,5 @@
---
-title: Character name/health display
+title: Character Name/Health Display
description: You can customize character UI, like name and health displays, using Class.Humanoid.
---
@@ -10,7 +10,7 @@ The `Class.Humanoid` instance is used to create character models, both for user
Through various `Class.Humanoid` properties, you can modify the following:
- The [distance](#display-distance-type) from which users can see the name/health of other humanoids in relation to their own character's humanoid.
-- The [display name](#override-display-names) which shows over a humanoid.
+- The [display name](#overriding-display-names) which shows over a humanoid.
- Whether a humanoid's [health bar](#health-display-type) always appears, never appears, or only appears when the humanoid is damaged.
- Whether names and health bars are [occluded](#occlusion) (hidden) when line-of-sight between the camera and another humanoid is blocked.
@@ -18,9 +18,9 @@ Through various `Class.Humanoid` properties, you can modify the following:
As noted in the introduction, character name/health display requires that the `Class.Humanoid` instance is inside a `Class.Model` and that the model contains a `Class.BasePart` named **Head**. Both objects must also be at the same level in the model's hierarchy.
-## Display properties
+## Display Properties
-### Display distance type
+### Display Distance Type
The `Class.Humanoid.DisplayDistanceType` property sets how users see the name/health of other characters in relation to their own character.
@@ -46,7 +46,7 @@ When a humanoid's `Class.Humanoid.DisplayDistanceType|DisplayDistanceType` is se
-### Health display type
+### Health Display Type
The `Class.Humanoid.HealthDisplayType` property provides further control over the character's health bar visibility. The bar reflects the humanoid's `Class.Humanoid.Health|Health` as a factor of its `Class.Humanoid.MaxHealth|MaxHealth` and it changes color from green to yellow to red as the humanoid's health decreases.
@@ -100,9 +100,9 @@ In the following scenario, both **Watchman** and **Octavia** are sufficiently hi
-## Modify character displays
+## Modifying Character Displays
-### User avatars
+### User Avatars
To modify the name or health display for every incoming avatar in an experience, connect the `Class.Players.PlayerAdded` and `Class.Player.CharacterAdded` events in a `Class.Script` and set [display properties](#display-properties) on the character's `Class.Humanoid`.
@@ -157,7 +157,7 @@ Players.PlayerAdded:Connect(onPlayerAdded)
When a player is assigned to a `Class.Team`, their character's name appears in the same color as the team's `Class.Team.TeamColor|TeamColor`. This helps identify teammates and opposing players in team-based experiences.
-### NPC characters
+### NPC Characters
For NPC characters already placed in the 3D world, you can edit name/health directly on the `Class.Humanoid` object in the [Properties](../studio/properties.md) window.
@@ -166,15 +166,15 @@ For NPC characters already placed in the 3D world, you can edit name/health dire
-## Override display names
+## Overriding Display Names
By default, a humanoid's display name matches the user's Roblox account **Display Name** which is unique and separate from their account **Username**. To show a fully custom name that's unrelated to the user's account, you can override the `Class.Humanoid.DisplayName` property.
-### Set directly
+### Setting Directly
You can set the `Class.Humanoid.DisplayName|DisplayName` property of any `Class.Humanoid` instance which you gain reference to through a `Class.Script`, such as the [team customization](#team-customization-script) example, or directly on an [NPC](#npc-characters) character's **Humanoid** object.
-### Set through user input
+### Setting Through User Input
In some genres like roleplaying or fighting, you may want to provide a method for users to input their own character name, pet character name, etc. that's specific to the experience and isn't tied to their account display name. You can gather this input on the client side through a `Class.TextBox` name entry.
diff --git a/content/en-us/characters/pathfinding.md b/content/en-us/characters/pathfinding.md
index 1cc463c6c..250cf858d 100644
--- a/content/en-us/characters/pathfinding.md
+++ b/content/en-us/characters/pathfinding.md
@@ -1,5 +1,5 @@
---
-title: Character pathfinding
+title: Character Pathfinding
description: Pathfinding is the process of moving a character along a logical path to reach a destination.
---
@@ -7,13 +7,13 @@ description: Pathfinding is the process of moving a character along a logical pa
-## Navigation visualization
+## Navigation Visualization
To assist with pathfinding layout and debugging, Studio can render a navigation mesh and [modifier](#pathfinding-modifiers) labels. To enable them, toggle on **Navigation mesh** and **Pathfinding modifiers** from the [Visualization Options](../studio/ui-overview.md#visualization-options) widget in the upper‑right corner of the 3D viewport.
-With **Navigation mesh** enabled, colored areas show where a character might walk or swim, while non-colored areas are blocked. The small arrows indicate areas that a character will attempt to reach by jumping, assuming you set `AgentCanJump` to `true` when [creating the path](#create-paths).
+With **Navigation mesh** enabled, colored areas show where a character might walk or swim, while non-colored areas are blocked. The small arrows indicate areas that a character will attempt to reach by jumping, assuming you set `AgentCanJump` to `true` when [creating the path](#creating-paths).
@@ -21,11 +21,11 @@ With **Pathfinding modifiers** enabled, text labels indicate specific materials
-## Known limitations
+## Known Limitations
Pathfinding features specific limitations to ensure efficient processing and optimal performance.
-### Vertical placement limit
+### Vertical Placement Limit
Pathfinding calculations consider only parts within certain vertical boundaries:
@@ -33,11 +33,11 @@ Pathfinding calculations consider only parts within certain vertical boundaries:
- Upper Boundary — Parts with a top **Y** coordinate exceeding 65,536 studs are ignored.
- Vertical Span — The vertical distance from the lowest part's bottom **Y** coordinate to the highest part's top **Y** coordinate must not exceed 65,536 studs; otherwise, the pathfinding system will ignore those parts during the pathfinding computation.
-### Search distance limitation
+### Search Distance Limitation
The direct line-of-sight distance for pathfinding from the start to the finish point must not exceed 3,000 studs. Exceeding this distance will result in a `Enum.PathStatus|NoPath` status.
-## Create paths
+## Creating Paths
Pathfinding is initiated through `Class.PathfindingService` and its `Class.PathfindingService:CreatePath()|CreatePath()` function.
@@ -111,7 +111,7 @@ local path = PathfindingService:CreatePath({
})
```
-Note that the agent can climb `Class.TrussPart|TrussParts` during pathfinding assuming you set `AgentCanClimb` to `true` when [creating the path](#create-paths) and nothing blocks the agent from the truss climbing path. A climbable path has the **Climb** label and the [cost](#set-material-costs) for a climbable path is **1** by default.
+Note that the agent can climb `Class.TrussPart|TrussParts` during pathfinding assuming you set `AgentCanClimb` to `true` when [creating the path](#creating-paths) and nothing blocks the agent from the truss climbing path. A climbable path has the **Climb** label and the [cost](#setting-material-costs) for a climbable path is **1** by default.
@@ -126,7 +126,7 @@ local path = PathfindingService:CreatePath({
})
```
-## Move along paths
+## Moving Along Paths
This section uses the following pathfinding script for the player's character. To test while reading:
@@ -198,7 +198,7 @@ end
followPath(TEST_DESTINATION)
```
-### Compute the path
+### Computing the Path
After you've created a valid path with `Class.PathfindingService:CreatePath()|CreatePath()`, it must be **computed** by calling `Class.Path:ComputeAsync()` with a `Datatype.Vector3` for both the starting point and destination.
@@ -230,7 +230,7 @@ end
-### Get waypoints
+### Getting Waypoints
Once the `Class.Path` is computed, it will contain a series of **waypoints** that trace the path from start to end. These points can be gathered with the `Class.Path:GetWaypoints()` function.
@@ -271,7 +271,7 @@ end
Waypoints indicated across computed path
-### Path movement
+### Path Movement
Each waypoint consists of both a **position** (`Datatype.Vector3`) and **action** (`Enum.PathWaypointAction|PathWaypointAction`). To move a character containing a `Class.Humanoid`, like a typical Roblox character, the easiest way is to call `Class.Humanoid:MoveTo()` from waypoint to waypoint, using the `Class.Humanoid.MoveToFinished|MoveToFinished` event to detect when the character reaches each waypoint.
@@ -339,7 +339,7 @@ end
-### Handle blocked paths
+### Handling Blocked Paths
Many Roblox worlds are dynamic; parts might move or fall and floors may collapse. This can block a computed path and prevent the character from reaching its destination. To handle this, you can connect the `Class.Path.Blocked` event and re-compute the path around whatever blocked it.
@@ -393,15 +393,15 @@ end
Currently, `Class.Model|Models` containing a `Class.Humanoid` instance, including typical player characters, will **not** be considered for path [computation](#computing-the-path) or path blockage, although the agent may still be blocked by those models physically.
-## Pathfinding modifiers
+## Pathfinding Modifiers
By default, `Class.Path:ComputeAsync()` returns the **shortest** path between the starting point and destination, with the exception that it attempts to avoid jumps. This looks unnatural in some situations — for instance, a path may go through water rather than over a nearby bridge simply because the path through water is geometrically shorter.
-To optimize pathfinding even further, you can implement **pathfinding modifiers** to compute smarter paths across various [materials](#set-material-costs), around defined [regions](#work-with-regions), or through [obstacles](#ignore-obstacles).
+To optimize pathfinding even further, you can implement **pathfinding modifiers** to compute smarter paths across various [materials](#setting-material-costs), around defined [regions](#working-with-regions), or through [obstacles](#ignoring-obstacles).
-### Set material costs
+### Setting Material Costs
When working with `Class.Terrain` and `Class.BasePart` materials, you can include a `Costs` table within `Class.PathfindingService:CreatePath()|CreatePath()` to make certain materials more traversable than others. All materials have a default cost of **1** and any material can be defined as non-traversable by setting its value to `Library.math.huge`.
@@ -423,9 +423,9 @@ local path = PathfindingService:CreatePath({
-### Work with regions
+### Working With Regions
-In some cases, [material preference](#set-material-costs) is not enough. For example, you might want characters to avoid a **defined region**, regardless of the materials underfoot. This can be achieved by adding a `Class.PathfindingModifier` object to a part.
+In some cases, [material preference](#setting-material-costs) is not enough. For example, you might want characters to avoid a **defined region**, regardless of the materials underfoot. This can be achieved by adding a `Class.PathfindingModifier` object to a part.
1. Create an `Class.BasePart.Anchored|Anchored` part around the dangerous region and set its `Class.BasePart.CanCollide|CanCollide` property to **false**.
@@ -451,7 +451,7 @@ In some cases, [material preference](#set-material-costs) is not enough. For exa
-### Ignore obstacles
+### Ignoring Obstacles
In some cases, it's useful to pathfind through solid obstacles as if they didn't exist. This lets you compute a path through specific physical blockers, versus the computation failing outright.
@@ -467,7 +467,7 @@ In some cases, it's useful to pathfind through solid obstacles as if they didn't
-## Pathfinding links
+## Pathfinding Links
Sometimes it's necessary to find a path across a space that cannot be normally traversed, such as across a chasm, and perform a custom action to reach the next waypoint. This can be achieved through the `Class.PathfindingLink` object.
@@ -611,14 +611,14 @@ To create a `Class.PathfindingLink` using this example:
-## Streaming compatibility
+## Streaming Compatibility
In-experience [instance streaming](../workspace/streaming.md) is a powerful feature that dynamically loads and unloads 3D content as a player's character moves around the world. As they explore the 3D space, new subsets of the space stream to their device and some of the existing subsets might stream out.
Consider the following best practices for using `Class.PathfindingService` in streaming-enabled experiences:
-- Streaming can block or unblock a given path as a character moves along it. For example, while a character runs through a forest, a tree might stream in somewhere ahead of them and obstruct the path. To make pathfinding work seamlessly with streaming, it's highly recommended that you use the [handling blocked paths](#handle-blocked-paths) technique and re-compute the path when necessary.
+- Streaming can block or unblock a given path as a character moves along it. For example, while a character runs through a forest, a tree might stream in somewhere ahead of them and obstruct the path. To make pathfinding work seamlessly with streaming, it's highly recommended that you use the [Handling Blocked Paths](#handling-blocked-paths) technique and re-compute the path when necessary.
-- A common approach in pathfinding is to use the coordinates of existing objects for [computation](#compute-the-path), such as setting a path destination to the position of an existing **TreasureChest** model in the world. This approach is fully compatible with server-side `Class.Script|Scripts` since the server has full view of the world at all times, but `Class.LocalScript|LocalScripts` and `Class.ModuleScript|ModuleScripts` that run on the client may fail if they attempt to compute a path to an object that's not streamed in.
+- A common approach in pathfinding is to use the coordinates of existing objects for [computation](#computing-the-path), such as setting a path destination to the position of an existing **TreasureChest** model in the world. This approach is fully compatible with server-side `Class.Script|Scripts` since the server has full view of the world at all times, but `Class.LocalScript|LocalScripts` and `Class.ModuleScript|ModuleScripts` that run on the client may fail if they attempt to compute a path to an object that's not streamed in.
To address this issue, consider setting the destination to the position of a `Class.BasePart` within a [persistent](../workspace/streaming.md#model-streaming-controls) model. Persistent models load soon after the player joins and they never stream out, so a client-side script can connect to the `Class.Workspace.PersistentLoaded|PersistentLoaded` event and safely access the model for creating waypoints after the event fires.
diff --git a/content/en-us/characters/r6-to-r15-adapter.md b/content/en-us/characters/r6-to-r15-adapter.md
index bd9b27503..162c741ad 100644
--- a/content/en-us/characters/r6-to-r15-adapter.md
+++ b/content/en-us/characters/r6-to-r15-adapter.md
@@ -1,5 +1,5 @@
---
-title: R6 to R15 Adapter
+title: R6 To R15 Adapter
description: The R6 to R15 adapter enables R15 avatar characters to join your R6 experience.
---
@@ -9,9 +9,9 @@ This feature is only applicable to developers who manage an active experience wi
The **R6 to R15 Adapter** allows R15 avatars to join your R6 experience. All avatars in the experience will still use the R6-like scale and movement systems. The adapter allows your experience to take advantage of modern R15 components, such as layered clothing and animatable heads, with minimal performance or gameplay impact to your experience.
-It's important to understand how the adapter uses [adapter parts](#adapter-parts) and review the feature's [known limitations](#known-limitations) before [enabling](#enable-the-r6-to-r15-adapter) and testing the adapter for your experience.
+It's important to understand how the adapter uses [adapter parts](#adapter-parts) and review the feature's [known limitations](#known-limitations) before [enabling](#enabling-the-r6-to-r15-adapter) and testing the adapter for your experience.
-## Adapter parts
+## Adapter Parts
The R6 to R15 Adapter implements a Lua-script injection when an avatar spawns that creates adapter parts.
@@ -25,7 +25,7 @@ The adapter parts perform the following:
- Acts as a shim between R6 and R15 body parts. Property changes applied to the invisible R6 parts are passed along to their corresponding visible R15 parts.
- For example, a color change in R6 `LeftArm` is passed to the R15 `LeftUpperArm`, `LeftLowerArm` and `LeftHand` parts.
-## Enable the R6 to R15 Adapter
+## Enabling the R6 to R15 Adapter
You can enable the R6 to R15 Adapter by setting the `Class.Workspace.AvatarUnificationMode` property in Workspace. You can only access this property if **Avatar Type** is set to `R6` in your **Game Settings**. At this time, the **Default** setting disables the `Class.Workspace.AvatarUnificationMode|AvatarUnificationMode`.
@@ -34,42 +34,42 @@ To enable the R6 to R15 Adapter:
1. In the Explorer, navigate to **Workspace**.
2. In the Properties window, set **AvatarUnificationMode** to **Enabled**.
-## Known limitations
+## Known Limitations
In a majority of cases, the R6 to R15 Adapter works out-of-the-box with the systems of a R6 experience. In rare cases, there may be conflicts with custom systems that handle game security, or character-related behavior. See the following for a list of potential limitations or conflicts that you may encounter when using the R6 to R15 Adapter.
-### Game security
+### Game Security
Some R6 experiences with active cheat detection can interpret the Lua-script injection as an attempt to circumvent the security.
Since the default behavior of R6 avatars is to spawn with all their parts already in place, many experiences tend to flag changes in body parts as potential exploits. In experiences with the adapter enabled, the R15 avatars spawn with their default bodies before changing body parts based on their saved avatar body parts and accessories.
-### Custom avatar editors
+### Custom Avatar Editors
Experiences with custom avatar editors that allow players to swap body parts might break the connection with the adapter parts.
-### Pre-existing R15 support
+### Pre-existing R15 Support
Experiences that check the avatar rig type and include solutions specific for each R15 and R6 case might not work properly with the adapter. `AvatarUnificationMode` uses code paths corresponding to R15 which may require testing in your experience.
-### Body part rescaling
+### Body Part Rescaling
Games that resize the R6 body parts won't see the scale change propagated to the proxied R15 parts. This is also the case if joint attachments are moved.
-### GetChildren API calls
+### GetChildren API Calls
`Class.Instance:GetChildren()|GetChildren()` calls return both the R6 proxy parts and their corresponding R15 parts. You may need to account for this extra information.
-### FindFirstChild API calls
+### FindFirstChild API Calls
Don't immediately use `Class.Instance:FindFirstChild()|FindFirstChild()`, or "dot indexing," in your scripts to find character parts. Instead, use `Class.Instance:WaitForChild()|WaitForChild()` before you call `Class.Instance:FindFirstChild()|FindFirstChild()`. Replication in `Class.Workspace.AvatarUnificationMode|AvatarUnificationMode` is different, and the experience may fail to find a child that doesn't exist yet.
This has always been a best practice for Roblox scripts, even if some cases work without following this practice.
-### Head.ClassName conditionals
+### Head.ClassName Conditionals
`Class.Workspace.AvatarUnificationMode|AvatarUnificationMode` sets the Head to a `Class.MeshPart`. Any calls that read or write to the `Class.SpecialMesh.MeshId` property will fail.
-### Head collisions
+### Head Collisions
R15 characters joining an R6 experience don't support collisions with their Head part. If your game detects or depends on collisions with a character's Head, you must also update your scripts to check for `CollisionHead` as well.
diff --git a/content/en-us/chat/bubble-chat.md b/content/en-us/chat/bubble-chat.md
index f6cf669f2..564d3068e 100644
--- a/content/en-us/chat/bubble-chat.md
+++ b/content/en-us/chat/bubble-chat.md
@@ -1,13 +1,13 @@
---
-title: Customize bubble chat
+title: Customizing Bubble Chat
description: The text chat system allows users to communicate and socialize with each other.
---
-With [TextChatService](../chat/in-experience-text-chat.md), you can use bubble chat to display customizable speech chat bubbles above user avatars and NPCs. Bubble chat can make your experience more visually immersive and help users easily identify messages and their speakers in a contextually relevant manner. This feature is especially useful for experiences where users need to focus on the content in the meantime communicating with others in a less obtrusive way.
+With [TextChatService](../chat/in-experience-text-chat.md), you can use **bubble chat** to display customizable speech chat bubbles above user avatars and NPCs. Bubble chat can make your experience more visually immersive and help users easily identify messages and their speakers in a contextually relevant manner. This feature is especially useful for experiences where users need to focus on the content in the meantime communicating with others in a less obtrusive way.
-## Enable bubble chat
+## Enabling Bubble Chat
To enable bubble chat in your experience:
@@ -19,7 +19,7 @@ To enable bubble chat in your experience:
-## Bubble customization
+## Bubble Customization
After enabling bubble chat, you can customize the appearance and behavior of your chat bubbles to match your experience theme. Use the [Properties](../studio/properties.md) window of `Class.BubbleChatConfiguration` for [basic](#basic-customization) changes like text color and spacing, or implement [advanced](#advanced-customization) customization for bubble background images and other visual adjustments.
@@ -27,7 +27,7 @@ After enabling bubble chat, you can customize the appearance and behavior of you
Alternatively, add a `Class.LocalScript` in `Class.StarterPlayerScripts` with all your customization settings. This allows the engine to apply your customizations during runtime, overriding the settings in Studio. It's useful for adding special effects to chat bubbles when users trigger certain events or conditions.
-### Basic customization
+### Basic Customization
The following table shows common bubble chat customization properties. For a full list of customization properties, see `Class.BubbleChatConfiguration`.
@@ -125,7 +125,7 @@ The following table shows common bubble chat customization properties. For a ful
-### Advanced customization
+### Advanced Customization
For advanced customization of your bubble, add UI objects representing certain aspects of the bubble appearance as children under `Class.BubbleChatConfiguration`, including:
@@ -321,7 +321,7 @@ The following tables outline the available `Class.GuiObject` and [appearance mod
-## Per-bubble customization
+## Per-Bubble Customization
You can individually style and modify chat bubble behaviors based on specific conditions in order to override your general settings. For example, you can use chat bubbles to differentiate NPCs and users, highlight critical health status, and apply special effects to messages with pre-defined keywords.
@@ -435,13 +435,13 @@ end
-## Manually display bubbles
+## Manually Displaying Bubbles
You might want to display a chat bubble when players haven't sent a message, such as with NPCs. Use the `Class.TextChatService:DisplayBubble` method to manually display a chat bubble.
Customization of these bubbles is the same as the customization of the bubbles that are automatically displayed when Players send messages through TextChannels using the [`Class.TextChatService.OnBubbleAdded` callback](#per-bubble-customization).
-### NPC bubbles
+### NPC Bubbles
Display chat bubbles for non-player characters (NPCs) by calling `Class.TextChatService:DisplayBubble(character, message)`, with the NPC character and the message as parameters. These bubbles are customizable using the `Class.TextChatService.OnBubbleAdded` callback just like any other chat bubble.
diff --git a/content/en-us/chat/chat-window.md b/content/en-us/chat/chat-window.md
index 5014dc31f..d9fdfc895 100644
--- a/content/en-us/chat/chat-window.md
+++ b/content/en-us/chat/chat-window.md
@@ -1,17 +1,13 @@
---
-title: Customize the chat window
+title: Customizing the Chat Window
description: Customize the chat window and message UI of your in-experience text chat.
---
The [in-experience text chat](../chat/in-experience-text-chat.md) system, powered by `Class.TextChatService`, allows players to easily communicate and socialize with each other in live experiences. In addition to supporting the default text chat, you can [customize](#chat-window-configuration) the front‑end user interface.
-## Chat window configuration
+## Chat Window Configuration
-The overall chat window consists of:
-
-- Chat window
-- Input bar
-- Channel tabs (optional)
+The overall chat window consists of the **chat window**, an **input bar**, and optional **channel tabs**.
@@ -50,13 +46,13 @@ end
-When `Class.ChannelTabsConfiguration` is enabled, each default `Class.TextChannel` appears in a tab as outlined in the following table. In addition, each custom `Class.TextChannel` creates a tab corresponding to the channel's `Class.Instance.Name|Name` property.
+When `Class.ChannelTabsConfiguration` is enabled, each **default** `Class.TextChannel` appears in a tab as outlined in the following table. In addition, each **custom** `Class.TextChannel` creates a tab corresponding to the channel's `Class.Instance.Name|Name` property.
-
Default channel
-
Tab name
+
Default Channel
+
Tab Name
@@ -79,9 +75,9 @@ When `Class.ChannelTabsConfiguration` is enabled, each default `Class.TextChanne
-### Window appearance
+### Window Appearance
-Appearance of the overall chat window is customizable through `Class.ChatWindowConfiguration`.
+Appearance of the overall **chat window** is customizable through `Class.ChatWindowConfiguration`.
@@ -152,9 +148,9 @@ Appearance of the overall chat window is customizable through `Class.ChatWindowC
-### Input bar appearance
+### Input Bar Appearance
-Appearance of the chat input bar is customizable through `Class.ChatInputBarConfiguration`.
+Appearance of the chat **input bar** is customizable through `Class.ChatInputBarConfiguration`.
@@ -220,7 +216,7 @@ Appearance of the chat input bar is customizable through `Class.ChatInputBarConf
-### Channel tabs appearance
+### Channel Tabs Appearance
Appearance of the **channel tabs** is customizable through `Class.ChannelTabsConfiguration`.
@@ -283,7 +279,7 @@ Appearance of the **channel tabs** is customizable through `Class.ChannelTabsCon
-## Customize messages
+## Customizing Messages
You can customize the appearance of chat message bodies and prefixes using `Class.ChatWindowMessageProperties` and `Class.TextChatService.OnChatWindowAdded` callbacks without overriding the existing UI. The customization options let you modify the appearance of chat messages to match your experience's theme, and you can also sort or highlight messages from different user groups by adding chat tags and coloring prefixes.
@@ -291,9 +287,9 @@ You can customize the appearance of chat message bodies and prefixes using `Clas
`Class.ChatWindowMessageProperties` and `Class.TextChatService.OnChatWindowAdded|OnChatWindowAdded` only affect the appearance of messages in the chat window. To customize chat bubbles, see [Bubble Chat](../chat/bubble-chat.md).
-### Color user names
+### Coloring User Names
-When a user sends a chat message, their `Class.Player.DisplayName|DisplayName` displays as the prefix portion of the message. By default, each user's name is colored according to their `Class.Player.TeamColor` but you can change the colors of chat names using `Class.ChatWindowMessageProperties|ChatWindowMessageProperties` and `Class.TextChatService.OnChatWindowAdded|OnChatWindowAdded`. The following `Class.LocalScript` in `Class.StarterPlayerScripts` assigns a predetermined color to each user, picking randomly from a table of RGB colors.
+When a user sends a chat message, their `Class.Player.DisplayName|DisplayName` displays as the **prefix** portion of the message. By default, each user's name is colored according to their `Class.Player.TeamColor` but you can change the colors of chat names using `Class.ChatWindowMessageProperties|ChatWindowMessageProperties` and `Class.TextChatService.OnChatWindowAdded|OnChatWindowAdded`. The following `Class.LocalScript` in `Class.StarterPlayerScripts` assigns a predetermined color to each user, picking randomly from a table of RGB colors.
@@ -354,9 +350,9 @@ TextChatService.OnChatWindowAdded = function(message: TextChatMessage)
end
```
-### Add chat tags
+### Adding Chat Tags
-If your experience has users with special [attributes](../studio/properties.md#instance-attributes) like VIP status, you can attach chat tags wrapped in brackets to the front of user messages to highlight their messages. The following `Class.LocalScript` in `Class.StarterPlayerScripts` examines all `Class.Player` instances representing users in your experience and appends VIP chat tags to those with the `IsVIP` attribute.
+If your experience has users with special [attributes](../studio/properties.md#instance-attributes) like VIP status, you can attach **chat tags** wrapped in brackets to the front of user messages to highlight their messages. The following `Class.LocalScript` in `Class.StarterPlayerScripts` examines all `Class.Player` instances representing users in your experience and appends VIP chat tags to those with the `IsVIP` attribute.
@@ -383,7 +379,7 @@ TextChatService.OnChatWindowAdded = function(message: TextChatMessage)
end
```
-### Rich text customization
+### Rich Text Customization
Rich text [font color tags](../ui/rich-text.md#supported-tags) can be used to format chat messages, helpful if you want to apply formatting to very specific parts of the message. Note that rich text does not support gradients, but the following code sample shows how you can move the user name (stored in `Class.TextChatMessage.PrefixText`) into the message body and then apply rich text tagging to only the name portion.
@@ -417,7 +413,7 @@ TextChatService.OnChatWindowAdded = function(message: TextChatMessage)
end
```
-## Send messages from non‑player sources
+## Sending Messages from Non‑Player Sources
Sometimes, you might want to show non‑player dialogue in the chat window, such as "speech" from a public address system or a non‑player character.
@@ -442,9 +438,9 @@ generalChannel:DisplaySystemMessage(PREFIX .. player.DisplayName)
For a more detailed guide on how to customize the appearance of system messages, see [Customizing System Messages](./examples/custom-system-messages.md).
-#### Default system messages
+#### Default System Messages
-When `Class.TextChatService.CreateDefaultTextChannels` is true, one of the default text channels is the RBXSystem channel. The default chat scripts automatically display system messages in this channel. You can customize the appearance of these messages using the `Class.TextChannel.OnIncomingMessage` callback.
+When `Class.TextChatService.CreateDefaultTextChannels` is true, one of the default text channels is the **RBXSystem** channel. The default chat scripts automatically display system messages in this channel. You can customize the appearance of these messages using the `Class.TextChannel.OnIncomingMessage` callback.
You might want to customize or alter the system messages that are automatically emitted by the chat system. Since the default system messages are localized for users, you should reference them by `TextChatMessage.Metadata` in your [text chat callbacks](../chat/in-experience-text-chat.md#text-chat-hooks-and-callbacks) if you wish to customize their appearance.
@@ -585,7 +581,7 @@ Below is a reference of the default system messages that are emitted by the chat
-### NPC/object
+### NPC/Object
You can also stylize non-player dialogue and add [chat bubbles](../chat/bubble-chat.md) to make it appear like messages are coming from an NPC or object within the 3D world.
diff --git a/content/en-us/chat/examples/custom-system-messages.md b/content/en-us/chat/examples/custom-system-messages.md
index 01c41deda..87c2583d2 100644
--- a/content/en-us/chat/examples/custom-system-messages.md
+++ b/content/en-us/chat/examples/custom-system-messages.md
@@ -1,5 +1,5 @@
---
-title: Custom text chat system messages
+title: Custom Text Chat System Messages
description: Learn how to display and format system messages in the chat window.
---
@@ -45,7 +45,7 @@ TextChannel.OnIncomingMessage = function(message: TextChatMessage)
end
```
-## Use metadata to categorize messages
+## Using Metadata to Categorize Messages
Use metadata however you see fit to categorize messages and apply different styles to different types of messages.
diff --git a/content/en-us/chat/examples/custom-text-chat-commands.md b/content/en-us/chat/examples/custom-text-chat-commands.md
index 8c06d29aa..e1493de40 100644
--- a/content/en-us/chat/examples/custom-text-chat-commands.md
+++ b/content/en-us/chat/examples/custom-text-chat-commands.md
@@ -1,24 +1,24 @@
---
-title: Custom text chat commands
+title: Custom Text Chat Commands
description: Learn how to create custom chat commands.
---
-`Class.TextChatService` has built-in chat commands for common purposes, such as muting other players and using avatar emotes. You can enable them by setting `Class.TextChatService.CreateDefaultCommands` to true in the Studio properties panel.
+`Class.TextChatService` has built-in chat commands for common purposes, such as muting other players and using avatar emotes. You can enable them by setting `Class.TextChatService.CreateDefaultCommands` to true in the Studio **Properties** panel.
You can also add custom commands using `Class.TextChatCommand`. Users sending a defined command in the chat input bar trigger a callback defined by `Class.TextChatCommand.Triggered` to perform your customized actions.
The following example shows how to create a chat command that allows players to increase or decrease their character's size when they input `/super` or `/mini`.
1. Add a `Class.TextChatCommand` instance inside `Class.TextChatService`.
-2. Rename it SizeCommand.
+1. Rename it **SizeCommand**.
-3. Set its PrimaryAlias property to `/super` and its SecondaryAlias to `/mini`.
+1. Set its **PrimaryAlias** property to `/super` and its **SecondaryAlias** to `/mini`.
-4. Insert the following `Class.Script` inside `Class.ServerScriptService` to define a callback for the chat command that scales the character's size:
+1. Insert the following `Class.Script` inside `Class.ServerScriptService` to define a callback for the chat command that scales the character's size:
```lua title='Script' highlight='4,6'
local TextChatService = game:GetService("TextChatService")
diff --git a/content/en-us/chat/examples/group-chat-tags.md b/content/en-us/chat/examples/group-chat-tags.md
index 11575fcf8..37d0debd6 100644
--- a/content/en-us/chat/examples/group-chat-tags.md
+++ b/content/en-us/chat/examples/group-chat-tags.md
@@ -1,11 +1,11 @@
---
-title: Assign chat tags by group membership
+title: Assigning Chat Tags by Group Membership
description: Example of how to assign chat tags to players based on their membership of a group.
---
This example demonstrates how to assign chat tags to players based on their membership of a group. Chat tags are a way to visually identify a player in the chat window and useful for indicating a player's role, status, or group membership.
-First, create a script in ServerScriptStorage, and add the following code to it:
+First, create a script in **ServerScriptStorage**, and add the following code to it:
```lua title='Server'
local Players = game:GetService("Players")
diff --git a/content/en-us/chat/examples/proximity-chat.md b/content/en-us/chat/examples/proximity-chat.md
index f49559a83..add4a1a6d 100644
--- a/content/en-us/chat/examples/proximity-chat.md
+++ b/content/en-us/chat/examples/proximity-chat.md
@@ -1,9 +1,9 @@
---
-title: Proximity-based chat
+title: Proximity-Based Chat
description: Learn how to implement exclusive chat for users who are close to each other in locations using the TextChatService.
---
-This example shows how to implement an exclusive chat for users who are near each other in the game world. It extends the callback with a function using `Class.TextSource` to identify the locations of a user who might be a potential message receiver. If this function returns false, it means that the user locates further than the preset valid range from the message sender, so the system doesn't deliver the message to that user. Add the following to a `Class.Script` in ServerScriptStorage:
+This example shows how to implement an exclusive chat for users who are near each other in the game world. It extends the callback with a function using `Class.TextSource` to identify the locations of a user who might be a potential message receiver. If this function returns false, it means that the user locates further than the preset valid range from the message sender, so the system doesn't deliver the message to that user. Add the following to a `Class.Script` in **ServerScriptStorage**:
```lua title='Server'
-- Get the text chat and players services
diff --git a/content/en-us/chat/examples/simple-custom-frontend-ui.md b/content/en-us/chat/examples/simple-custom-frontend-ui.md
index 1a128ea47..75e08b343 100644
--- a/content/en-us/chat/examples/simple-custom-frontend-ui.md
+++ b/content/en-us/chat/examples/simple-custom-frontend-ui.md
@@ -1,20 +1,20 @@
---
-title: Custom text chat UI
+title: Custom Text Chat UI
description: Example of how to create a simple frontend UI powered with TextChatService.
---
This example shows how to use the `Class.TextChatService` API to design your own frontend. It reuses the default text channels from `TextChatService.CreateDefaultTextChannels` and is very simple compared to the default UI.
-1. First, disable the default UI that comes with the `TextChatService` by setting the `ChatWindowConfiguration.Enabled` and `ChatInputBarConfiguration.Enabled` properties to `false` in the studio properties window.
+1. First, disable the default UI that comes with the `TextChatService` by setting the `ChatWindowConfiguration.Enabled` and `ChatInputBarConfiguration.Enabled` properties to `false` in the Studio **Properties** window.

-2. Create a replacement for the chat input bar. This is the text box that emits messages when the user presses Enter.
+1. Create a replacement for the chat input bar. This is the text box that emits messages when the user presses Enter.
1. Create a `ScreenGui` and parent it to the `StarterGui`.
- 2. Create a `TextBox` and parent it to the `ScreenGui`. To position the text box at the bottom-center of the screen, set the `TextBox.AnchorPoint` to `Vector2.new(0.5, 1)` and the `TextBox.Position` to `UDim2.new(0.5, 0, 1, 0)`.
- 3. Create a `LocalScript` and parent it to the `TextBox`.
- 4. Add the following code to the `LocalScript`:
+ 1. Create a `TextBox` and parent it to the `ScreenGui`. To position the text box at the bottom-center of the screen, set the `TextBox.AnchorPoint` to `Vector2.new(0.5, 1)` and the `TextBox.Position` to `UDim2.new(0.5, 0, 1, 0)`.
+ 1. Create a `LocalScript` and parent it to the `TextBox`.
+ 1. Add the following code to the `LocalScript`:
```lua title='Client'
--!strict
@@ -41,13 +41,13 @@ This example shows how to use the `Class.TextChatService` API to design your own
end)
```
-3. Create a replacement for the chat window. This is the `ScrollingFrame` that displays messages as they are received from `TextChatService.MessageReceived`. This step also creates a `UIListLayout` to automatically layout the messages.
+1. Create a replacement for the chat window. This is the `ScrollingFrame` that displays messages as they are received from `TextChatService.MessageReceived`. This step also creates a `UIListLayout` to automatically layout the messages.
1. Create a `ScreenGui` and parent it to the `StarterGui`.
- 2. Create a `ScrollingFrame` and parent it to the `ScreenGui`.
- 3. Create a `UIListLayout` and parent it to the `ScrollingFrame`.
- 4. Create a `LocalScript` and parent it to the `ScrollingFrame`.
- 5. Add the following code to the `LocalScript`:
+ 1. Create a `ScrollingFrame` and parent it to the `ScreenGui`.
+ 1. Create a `UIListLayout` and parent it to the `ScrollingFrame`.
+ 1. Create a `LocalScript` and parent it to the `ScrollingFrame`.
+ 1. Add the following code to the `LocalScript`:
```lua title='Client'
--!strict
diff --git a/content/en-us/chat/guidelines.md b/content/en-us/chat/guidelines.md
index a8985b314..15c284f59 100644
--- a/content/en-us/chat/guidelines.md
+++ b/content/en-us/chat/guidelines.md
@@ -1,5 +1,5 @@
---
-title: Usage guidelines
+title: Usage Guidelines
description: Important guidelines for using the in-experience text chat feature.
comments: Eventually fold the key points of this page into other pages and remove.
---
diff --git a/content/en-us/chat/in-experience-text-chat.md b/content/en-us/chat/in-experience-text-chat.md
index 1158ae537..4c3b10ebf 100644
--- a/content/en-us/chat/in-experience-text-chat.md
+++ b/content/en-us/chat/in-experience-text-chat.md
@@ -1,23 +1,23 @@
---
-title: TextChatService overview
+title: TextChatService Overview
description: The TextChatService system allows players to communicate with each other using text-based messages in live sessions.
---
-Roblox offers text-based messaging between players in live sessions through `Class.TextChatService`. This service has its standard functionality, but also provides a set of methods and events for extending and customizing chat, such as delivering messages based on [customized requirements](#conditionally-deliver-messages), adding special permissions or moderation to specific players, and creating [custom commands](./examples/custom-text-chat-commands.md) to execute specific actions.
+Roblox offers text-based messaging between players in live sessions through `Class.TextChatService`. This service has its standard functionality, but also provides a set of methods and events for extending and customizing chat, such as delivering messages based on [customized requirements](#conditionally-delivering-messages), adding special permissions or moderation to specific players, and creating [custom commands](./examples/custom-text-chat-commands.md) to execute specific actions.
This page includes a high-level overview of how messaging works and instructions on migrating from legacy chat, but the easiest way to get started with customizing your experience's chat system is to [see the examples](examples/simple-custom-frontend-ui.md).
-## Text chat instances
+## Text Chat Instances
The following sections summarize the primary classes and instances that you can use to customize the chat system.
-### Top-level configuration
+### Top-Level Configuration
- `Class.TextChatService` - This singleton class is responsible for managing the overall chat system, including handling chat message filtering, moderation, and user permissions. Use properties like `Class.TextChatService.CreateDefaultTextChannels` and `Class.TextChatService.CreateDefaultCommands` to enable or disable default chat channels and commands.
-### Default UI configuration
+### Default UI Configuration
`TextChatService` provides a default UI that can be customized to fit your experience's needs. Each of these configurations can be disabled to hide the associated UI element and can be replaced with custom interfaces if desired.
@@ -25,7 +25,7 @@ The following sections summarize the primary classes and instances that you can
- `Class.ChatInputBarConfiguration` - Represents the default chat input bar UI, including its appearance and behavior.
- `Class.BubbleChatConfiguration` - Represents the default bubble chat UI, including its appearance and behavior.
-### Channels, messages, and commands
+### Channels, Messages, and Commands
- `Class.TextChannel` - Represents a text chat channel that passes user-sent chat messages from the client to the server, which then displays them to other users based on permissions. These instances must be parented to `TextChatService` in order to function. If `Class.TextChatService.CreateDefaultTextChannels` is set to true, the service automatically creates two text channels, `RBXGeneral` and `RBXSystem`. You can manually create additional `TextChannel` instances and parent them to `Class.TextChatService`, as well.
@@ -34,7 +34,7 @@ The following sections summarize the primary classes and instances that you can
- `Class.TextChatMessage` - Represents a single chat message in a text channel, with basic information such as the sender of the message, the original message, the filtered message, and the creation timestamp.
- `Class.TextChatCommand` - Allows users to invoke specific actions or behaviors by sending messages that match `Class.TextChatCommand.PrimaryAlias` or `Class.TextChatCommand.SecondaryAlias`. These instances must be parented to `TextChatService` in order to function. Chat commands are helpful for adding additional functionality and interactivity to the chat experience. If `Class.TextChatService.CreateDefaultCommands` is set to true, default chat commands will be created automatically. You can manually create additional `TextChatCommand` instances and parent them to `Class.TextChatService`, as well.
-## Chat flowchart
+## Chat Flowchart
Text chat uses the [client‑server](../projects/client-server.md) model, with a **sending client**, the **server**, and **receiving clients**.
@@ -57,7 +57,7 @@ Text chat uses the [client‑server](../projects/client-server.md) model, with a
2. The second time is on the receiving clients, which triggers the `Class.TextChatService.MessageReceived` event to display the message to other players.
-### Text chat hooks and callbacks
+### Text Chat Hooks and Callbacks
The `Class.TextChatService` API encourages a clear separation on the appearance and delivery of chat messages. Multiple instances of the text chat system provide hooks and callbacks to format in centralized, clear locations.
@@ -78,16 +78,16 @@ All callbacks are expected to be non-yielding functions. Yielding or waiting for
| `Class.TextChatService.OnBubbleAdded` | `Class.BubbleChatMessageProperties` |
| `Class.TextChatService.OnChatWindowAdded` | `Class.ChatWindowMessageProperties` |
-#### Conditionally deliver messages
+#### Conditionally Delivering Messages
- `Class.TextChannel.ShouldDeliverCallback` - This callback should be defined on the server only. The callback is fired for each `Class.TextSource` child of the text channel when a message is sent to determine whether the message should be delivered. This callback can be used to implement custom message delivery logic that may depend on additional gameplay context, such as:
- [Proximity-based chat](./examples/proximity-chat.md) where users can only send messages to those close to them.
- Preventing users with certain attributes from sending messages to others.
-#### Customize message display
+#### Customizing Message Display
-The default `TextChatService` UI relies on [rich text](../ui/rich-text.md) to format and customize how messages are displayed. You can use the following callbacks to format messages before they are displayed to users. You might want to add colors or [chat tags](../chat/chat-window.md#add-chat-tags) to user's names or format message content.
+The default `TextChatService` UI relies on [rich text](../ui/rich-text.md) to format and customize how messages are displayed. You can use the following callbacks to format messages before they are displayed to users. You might want to add colors or [chat tags](../chat/chat-window.md#adding-chat-tags) to user's names or format message content.
The following callbacks are called on every `TextChatMessage` that is about to be displayed, which lets you customize chat window appearance based on the `TextChannel`, `TextSource`, or `TextChatMessage` content.
@@ -98,7 +98,7 @@ When a client sends a message, these callbacks are called once when the message
- `Class.TextChatService.OnBubbleAdded` - This callback should be defined on the client only. Use it to customize the appearance of chat bubbles independent of the appearance of the message in the chat window UI.
- `Class.TextChatService.OnChatWindowAdded` - This callback should be defined on the client only. Use it to customize the appearance of chat messages in the chat window UI independent of the appearance of the message in chat bubbles.
-## Migrate from legacy chat
+## Migrating From Legacy Chat
This section assists you in migrating from the [legacy chat system](../chat/legacy/legacy-chat-system.md) by providing alternative methods for implementing common chat functionalities and behaviors using `TextChatService`.
@@ -109,7 +109,7 @@ To switch the chat system of an existing experience from the legacy chat system
-### Basic functionalities
+### Basic Functionalities
Though both systems share the same basic chat functionalities, TextChatService implementations are in general more sustainable and easier to iterate on.
@@ -117,7 +117,7 @@ Though both systems share the same basic chat functionalities, TextChatService i
Functionality
-
Legacy chat
+
Legacy Chat
TextChatService
Differences
@@ -156,7 +156,7 @@ Though both systems share the same basic chat functionalities, TextChatService i
-### Message filtering
+### Message Filtering
TextChatService automatically filters chat messages based on each player's account information, so you don't need to manually implement text filtering for all kinds of chat messages.
@@ -164,7 +164,7 @@ TextChatService automatically filters chat messages based on each player's accou
Functionality
-
Legacy chat
+
Legacy Chat
TextChatService
@@ -182,7 +182,7 @@ TextChatService automatically filters chat messages based on each player's accou
-### Window and bubble chat
+### Window and Bubble Chat
Both the [chat window](../chat/chat-window.md) and [bubble chat](../chat/bubble-chat.md) behavior and customization options of `TextChatService` are identical to those of the legacy chat system. As the legacy chat system only allows customization using chat modules or the `Class.Players` container, `TextChatService` provides dedicated classes (`Class.ChatWindowConfiguration` and `Class.BubbleChatConfiguration`) to manage all chat window and bubble chat properties. Additionally, you can easily adjust and preview your bubble chat appearance and behavior properties using Studio settings instead of having to script them all.
@@ -190,7 +190,7 @@ Both the [chat window](../chat/chat-window.md) and [bubble chat](../chat/bubble-
Functionality
-
Legacy chat
+
Legacy Chat
TextChatService
@@ -223,7 +223,7 @@ Both the [chat window](../chat/chat-window.md) and [bubble chat](../chat/bubble-
-### Migrate speaker "extra data"
+### Migrating Speaker "Extra Data"
The legacy Lua chat system allowed devleopers to use `SetExtraData` on the `Speaker` class. This data was used to format the name color, chat color, or to apply name tags for a given speaker.
diff --git a/content/en-us/chat/legacy/admin-commands.md b/content/en-us/chat/legacy/admin-commands.md
index f75b6d738..5fb59c64e 100644
--- a/content/en-us/chat/legacy/admin-commands.md
+++ b/content/en-us/chat/legacy/admin-commands.md
@@ -1,12 +1,12 @@
---
-title: Admin commands
+title: Admin Commands
description: Create custom admin commands for the deprecated legacy chat.
comments: |
1. This guide is intentionally not available in the nav list, but still searchable for users who want to use the legacy chat system.
---
- This guide covers admin commands of the legacy chat system, which is deprecated and no longer onboarding new users in favor of `Class.TextChatService` with easier and more modern chat settings. If you are using the default chat system powered by `Class.TextChatService`, see [In-Experience Text Chat](../../chat/in-experience-text-chat.md#create-custom-commands) for creating custom chat commands.
+ This guide covers admin commands of the legacy chat system, which is deprecated and no longer onboarding new users in favor of `Class.TextChatService` with easier and more modern chat settings. If you are using the default chat system powered by `Class.TextChatService`, see [In-Experience Text Chat](../../chat/in-experience-text-chat.md#creating-custom-commands) for creating custom chat commands.
An **admin command** is a keyword or phrase that a user with certain level of control can type into the chat window to trigger an action. This library uses chat modules, which allows for easy implementation of admin commands on top of the legacy chat system. Chat modules listen to incoming messages on the server and can execute actions based on whatever criteria is desired.
@@ -17,7 +17,7 @@ Whenever a Roblox place loads it checks if the Chat service is empty. If it does
The first step in setting up the admin commands library is to add a new Chat Module to the Chat service. The library in this tutorial takes care of the heavy lifting done by a Chat Module so the only object you need to add to the Chat service is a new `Class.ModuleScript` . The name of your module script can be anything, but I suggest something intuitive like `AdminCommands`.
-## Implement new commands
+## Implementing New Commands
Rather than implementing most of the Chat Module logic you will simply require the library module that does a bulk of the work and adds extra functionality. The simplest way to add the library into your module is to require it by its assetId at the top of your script.
@@ -108,7 +108,7 @@ Current utility functions are:
| ToBoolean() | string parameter | bool |
| ValidateData() | string expectedType, ... | bool |
-## Example commands
+## Example Commands
A useful command to have would be one that prints a list of all optional commands that users have available. This command outputs each command bound to the library and a few of its properties.
@@ -209,7 +209,7 @@ end
AdminCommands:BindCommand({"explode"}, explodeCommand, 1, "Makes the specified player explode.")
```
-## Permission library
+## Permission Library
If a non-admin tries to speak a command like this, which has a higher permission level than 0, it will not be triggered. The command system uses a separate Permission library, to which the experience creator is automatically given the permission level math.huge. Admins can be added using the following functions on your AdminCommands module object:
@@ -229,11 +229,11 @@ SetGroupRankPermission(number requesterUserId, number targetGroupId, number targ
| GetGroupRankPermission() | targetGroupId, targetRankId | int |
| GetUserGroupRankPermission() | number userId | int |
-## Quick-start module
+## Quick-Start Module
For easier setup you can also use this [Quick Start](https://www.roblox.com/library/1163353653/Quick-Start-Admin-Commands), which is a module that has already implemented the Admin Commands library. The model is a module with the same format as described above. Additionally, the module has a few commands already included so that you do not have to re-implement.
-| Command/binding | Spoken parameter |
+| Command/Binding | Spoken Parameter |
| -------------------------------- | -------------------------------- |
| "list", "commands" | username |
| "sparkles" | username |
diff --git a/content/en-us/chat/legacy/client-side-chat-modules.md b/content/en-us/chat/legacy/client-side-chat-modules.md
index f48c865fa..c8ee30810 100644
--- a/content/en-us/chat/legacy/client-side-chat-modules.md
+++ b/content/en-us/chat/legacy/client-side-chat-modules.md
@@ -1,15 +1,15 @@
---
-title: Client-side chat modules
+title: Client-Side Chat Modules
description: Client-side chat modules allow you to extend and customize the deprecated legacy chat.
comments: |
1. This guide is intentionally not available in the nav list, but still searchable for users who want to use the legacy chat system.
---
- This guide covers client-side chat modules of the legacy chat system, which is deprecated and no longer onboarding new users in favor of `Class.TextChatService` with easier and more modern chat settings. If you are using the default chat system powered by `Class.TextChatService`, see In-experience text chat.
+ This guide covers client-side chat modules of the legacy chat system, which is deprecated and no longer onboarding new users in favor of `Class.TextChatService` with easier and more modern chat settings. If you are using the default chat system powered by `Class.TextChatService`, see In-Experience Text Chat.
-You can use the following chat modules to support client-side behaviors of the [Legacy chat system](../../chat/legacy/legacy-chat-system.md#message-creator-modules).
+You can use the following chat modules to support client-side behaviors of the [Legacy Chat System](../../chat/legacy/legacy-chat-system.md#message-creator-modules).
## ChatWindow
@@ -314,7 +314,7 @@ local ChatSettings = require(ClientChatModules:WaitForChild("ChatSettings"))
ChatSettings.MaximumMessageLength = 100
```
-### Chat behavior settings
+### Chat Behavior Settings
#### WindowDraggable
@@ -358,7 +358,7 @@ ChatSettings.MaximumMessageLength = 100
- **Default:** `game:GetService("Players").ClassicChat`
- **Description:** Determines whether classic chat is enabled.
-### Chat text size settings
+### Chat Text Size Settings
#### ChatWindowTextSize
@@ -384,7 +384,7 @@ ChatSettings.MaximumMessageLength = 100
- **Default:** `14`
- **Description:** Determines the size of the text in the [ChatBar](#chatbar) for phones.
-### Font settings
+### Font Settings
#### DefaultFont
@@ -398,7 +398,7 @@ ChatSettings.MaximumMessageLength = 100
- **Default:** `Enum.Font.SourceSansBold`
- **Description:** Determines the default `Font` of the [ChatBar](#chatbar) `TextBox`.
-### Color settings
+### Color Settings
#### BackGroundColor
@@ -442,7 +442,7 @@ ChatSettings.MaximumMessageLength = 100
- **Default:** `Color3.fromRGB(245, 50, 50)`
- **Description:** Determines the `TextColor3` of error messages.
-### Window settings
+### Window Settings
#### MinimumWindowSize
@@ -481,7 +481,7 @@ ChatSettings.MaximumMessageLength = 100
- **Default:** `UDim2.new(0.3, 0, 0.25, (7 * 2) + (5 * 2))`
- **Description:** Determines the default size of the [ChatWindow](#chatwindow) on desktop.
-### Fade out and in settings
+### Fade Out and In Settings
#### ChatWindowBackgroundFadeOutTime
@@ -513,7 +513,7 @@ ChatSettings.MaximumMessageLength = 100
- **Default:** `20.0`
- **Description:** Determines the framerate of fading animations in the chat UI.
-### Channel settings
+### Channel Settings
#### GeneralChannelName
@@ -545,7 +545,7 @@ ChatSettings.MaximumMessageLength = 100
- **Default:** `false`
- **Description:** Determines whether the help text for joining/leaving channels is shown.
-### Message settings
+### Message Settings
#### MaximumMessageLength
@@ -571,7 +571,7 @@ ChatSettings.MaximumMessageLength = 100
- **Default:** `true`
- **Description:** Determines whether the player can click on a channel's tab to set it as their main channel.
-### Miscellaneous settings
+### Miscellaneous Settings
#### WhisperCommandAutoCompletePlayerNames
diff --git a/content/en-us/chat/legacy/legacy-chat-system.md b/content/en-us/chat/legacy/legacy-chat-system.md
index 6bf8e4785..26bf569d6 100644
--- a/content/en-us/chat/legacy/legacy-chat-system.md
+++ b/content/en-us/chat/legacy/legacy-chat-system.md
@@ -1,10 +1,10 @@
---
-title: Legacy chat system
+title: Legacy Chat System
description: Explains how to use and fork the legacy Chat system for your Roblox experience.
---
-This guide covers basics of the **legacy** chat system which is deprecated in favor of `Class.TextChatService` for easier and more modern chat customization. If you're using the modern chat system powered by `Class.TextChatService`, see [In‑experience text chat](../../chat/in-experience-text-chat.md).
+This guide covers basics of the **legacy** chat system which is deprecated in favor of `Class.TextChatService` for easier and more modern chat customization. If you're using the modern chat system powered by `Class.TextChatService`, see [In‑Experience Text Chat](../../chat/in-experience-text-chat.md).
## Hierarchy
@@ -28,7 +28,7 @@ The `Class.Chat` engine service itself is the essential storage unit for the cha
If a **ChatModules** `Class.Folder` already exists in the `Class.Chat` service, the default chat modules (which implement whisper chat and colored names, among other features) won't be inserted. To force insertion of default chat modules, insert a `Class.BoolValue` named **InsertDefaultModules** with `Class.BoolValue.Value|Value` of `true` into the folder.
-## Modify the chat system
+## Modifying the Chat System
To modify or customize the legacy chat system, you must first make a copy of the hierarchy above.
@@ -49,7 +49,7 @@ To modify or customize the legacy chat system, you must first make a copy of the
When making a copy of ("forking") the legacy chat system in this manner, your version will no longer change if the system is updated by Roblox. This gives you strict control over your experience's chat, but your version won't get bug fixes or other updates.
-## Chat workflow
+## Chat Workflow
Before making modules to customize the chat, it is important to understand the workflow that a chat message goes through. Along with sending text messages, there are various commands built into the chat system, so every message has to be checked to see if they need to be interpreted as a command or just a text message. Even text messages can be modified and filtered in the process.
@@ -61,12 +61,12 @@ When the user finishes typing and hits Enter the text, their input is
Once the message reaches the server, it goes through another set of command processors. Just like the [Completed](#completed-message-commands) processors on the client, if any of these processors return true, then the message stops executing. Otherwise the message gets passed through a set of filters (including the default Roblox chat filter). Once all of this is done the message is sent to all of the channels and appropriate speakers.
-## Server modules
+## Server Modules
Modules put into **ChatModules** can be used for a variety of purposes. These modules can be used to manage chat channels and speakers, add filter and command functions, run chatbots, or anything else that needs to be handled on the server. To interact with the chat system, each module is passed a [ChatService](../../chat/legacy/server-side-chat-modules.md#chatservice) object.
-For spec on server-side chat module components such as **ChatSpeaker** and **ChatChannel**, see [Server-side chat modules](../../chat/legacy/server-side-chat-modules.md).
+For spec on server-side chat module components such as **ChatSpeaker** and **ChatChannel**, see [Server-Side Chat Modules](../../chat/legacy/server-side-chat-modules.md).
When the **ChatServiceRunner** starts up, it requires each module inside of **ChatModules**. It expects each module to return a function as it then calls each of the modules in turn, passing in it's [ChatService](../../chat/legacy/server-side-chat-modules.md#chatservice) object to each function. Regardless of what the module is intended to do (running a bot, adding a filter function, etc), it needs to follow this form in order to work.
@@ -79,7 +79,7 @@ end
return Run
```
-### Add channels
+### Adding Channels
One of the simplest things a **ChatModule** can do is to manage **channels**. Channel objects can be created with the `AddChannel()` method of [ChatService](../../chat/legacy/server-side-chat-modules.md#chatservice). Note that the channel object only needs to be used when calling members of that channel (such as its properties and functions). When referring to channels from the context of [ChatService](../../chat/legacy/server-side-chat-modules.md#chatservice) or [ChatSpeakers](../../chat/legacy/server-side-chat-modules.md#chatspeaker), the channel's name is used to reference it.
@@ -91,7 +91,7 @@ end
return Run
```
-### Basic channel configuration
+### Basic Channel Configuration
Channels have several properties that can be used to slightly modify them. For example, this module creates a channel and sets the Welcome Message and causes users to automatically join the channel when they enter the experience.
@@ -108,7 +108,7 @@ end
return Run
```
-### Channel events
+### Channel Events
Channels have several events that can be subscribed to. These events fire when a [ChatMessage](../../chat/legacy/server-side-chat-modules.md#chatmessage) is posted to the channel, when a [ChatSpeaker](../../chat/legacy/server-side-chat-modules.md#chatspeaker) leaves or joins, or when a Speaker is muted or unmuted. For example, this module will create a channel with the name `MyChannel`. Whenever a speaker joins or leaves the channel, a system message will be sent to all of the speakers in the channel informing them of the event.
@@ -131,7 +131,7 @@ end
return Run
```
-### Command functions
+### Command Functions
Another powerful thing that **ChatModules** can do are chat **commands**. When a message is sent to the server, the chat will send the message through each command function that has been registered to the [ChatService](../../chat/legacy/server-side-chat-modules.md#chatservice) and relevant channel. These functions are sent the speaker, message, and channel that the message is being sent to. The function can take any action that it needs to and then return true or false. If the function returns true, then the message stops being processed by the chat system. It will not be sent to any more command functions nor will it be displayed in the chat window. If the function returns false, then the message continues through all of the other command functions. If none of the command functions returns true, the message will then be sent through filters and then will be displayed.
@@ -158,7 +158,7 @@ return Run
Both [ChatChannels](../../chat/legacy/server-side-chat-modules.md#chatchannel) and [ChatService](../../chat/legacy/server-side-chat-modules.md#chatservice) itself can have chat commands. **ChatService** command processors will run on every message that is sent to the server, while channel commands will only run if the message was sent to the channel the command is registered to.
-### Filter functions
+### Filter Functions
Messages that are not stopped by a [Command Function](#command-functions) will go through all of the filter functions that are registered to the [ChatService](../../chat/legacy/server-side-chat-modules.md#chatservice) and relevant channels. Each filter function is passed the speaker, message object, and channel name. Any changes made to the message object will persist and each following filter function will see the updated message. Note that filter functions do not need to return a value.
@@ -176,15 +176,15 @@ end
return Run
```
-## Client modules
+## Client Modules
Modules put into **ClientChatModules** can be used to make custom behavior for clients. These modules are divided into two different folders: [Command Modules](#command-modules) and [Message Creator Modules](#message-creator-modules).
-For spec on client-side chat module components such as **ChatWindow** and **ChatBar**, see [Client-side chat modules](../../chat/legacy/client-side-chat-modules.md).
+For spec on client-side chat module components such as **ChatWindow** and **ChatBar**, see [Client-Side Chat Modules](../../chat/legacy/client-side-chat-modules.md).
-### Command modules
+### Command Modules
**Command Modules** work very similarly to modules on the server that register [Command Functions](#command-functions). These modules define functions that will fire after the user has entered in text. That text can be read and the command can either let the message through to the server or stop the progress of the message. Commands that are evaluated at the end of the message are tagged with `COMPLETED_MESSAGE_PROCESSOR` while commands that are evaluated after each character are tagged with `IN_PROGRESS_MESSAGE_PROCESSOR`.
@@ -205,7 +205,7 @@ return {
Note that the `KEY_COMMAND_PROCESSOR_TYPE` enum is defined in the **Util** `Class.ModuleScript` inside of the **CommandModules** folder.
-#### Completed message commands
+#### Completed Message Commands
**Completed Message Commands** are evaluated when the user has finished typing and has hit Enter. The function of the processor is passed the [ChatMessage](../../chat/legacy/server-side-chat-modules.md#chatmessage) object, the client's [ChatWindow](../../chat/legacy/client-side-chat-modules.md#chatwindow) , and the [ChatSettings](../../chat/legacy/client-side-chat-modules.md#chatsettings) table. If the function returns true, then the message stops being processed and will not be sent to the server. Otherwise it will be sent through all of the other processors and eventually to the server if none of the other processors stop it.
@@ -231,7 +231,7 @@ return {
}
```
-#### In-progress commands
+#### In-Progress Commands
**In-progress Commands** are evaluated every time a user types a character into the chat input. For example, the following code plays a clack after every keypress to make it sound like the user is typing on a typewriter:
@@ -382,7 +382,7 @@ return {
As mentioned before, once a message has been sent any custom state is removed and the chat is restored to normal. If it is needed to reset a custom state before sending the message, the state can be reset with `ChatBar:ResetCustomState()`. Note that this will remove focus from the chat bar's text box as well.
-### Message creator modules
+### Message Creator Modules
Another type of module that can be used in the client component is a **Message Creator** module. This type of module is used to create the GUI elements in the chat window to display the message. Each type of message creator defines a new message type, so different messages can be created with different formatting. Moreover, GUI elements can be added to the display of messages this way which allows for images, buttons, and more.
diff --git a/content/en-us/chat/legacy/server-side-chat-modules.md b/content/en-us/chat/legacy/server-side-chat-modules.md
index 8abe7a156..bccf1a3c1 100644
--- a/content/en-us/chat/legacy/server-side-chat-modules.md
+++ b/content/en-us/chat/legacy/server-side-chat-modules.md
@@ -1,15 +1,15 @@
---
-title: Server-side chat modules
+title: Server-Side Chat Modules
description: Server-side chat modules allow you to extend and customize the deprecated legacy chat.
comments: |
1. This guide is intentionally not available in the nav list, but still searchable for users who want to use the legacy chat system.
---
- This guide covers server-side chat modules of the legacy chat system, which is deprecated and no longer onboarding new users in favor of `Class.TextChatService` with easier and more modern chat settings. If you are using the default chat system powered by `Class.TextChatService` , see In-experience text chat.
+ This guide covers server-side chat modules of the legacy chat system, which is deprecated and no longer onboarding new users in favor of `Class.TextChatService` with easier and more modern chat settings. If you are using the default chat system powered by `Class.TextChatService` , see In-Experience Text Chat.
-You can use the following chat modules to support server-side behaviors of the [Legacy chat system](../../chat/legacy/legacy-chat-system.md#message-creator-modules) including:
+You can use the following chat modules to support server-side behaviors of the [Legacy Chat System](../../chat/legacy/legacy-chat-system.md#message-creator-modules) including:
- [ChatService](#chatservice): A singleton that manages all other chat modules.
- [ChatSpeaker](#chatspeaker): An entity that may create messages in a ChatChannel; each `Player` will automatically have a ChatSpeaker and bots may chat by creating ChatSpeakers.
diff --git a/content/en-us/chat/voice-chat.md b/content/en-us/chat/voice-chat.md
index f3029758c..77801bd5f 100644
--- a/content/en-us/chat/voice-chat.md
+++ b/content/en-us/chat/voice-chat.md
@@ -1,10 +1,10 @@
---
-title: Voice chat
+title: Voice Chat
description: Explains how to use the proximity-based voice chat feature.
---
-Voice chat is currently available to all 13+ [phone number verified](../production/publishing/account-verification.md#verify-through-phone-number) users in these countries: US, CA, GB, IE, AU, NZ, ES, MX, CL, CR, PR, FR, IT, AT, CHE, DE, JP, KR, CH, AR, COL, PE, DO, GT, UY, SV, HN, PY, NI, EC, BO, VE, PA, PT, and BR. Users **not** in these countries should use [ID verification](https://en.help.roblox.com/hc/en-us/articles/4407282410644) to enable chat with voice. Once verified, eligible 13+ phone verified users can opt‑in to use this feature by visiting their account **Settings** page or from within a voice enabled experience, allowing them to chat with voice in any Roblox experience that supports it. Experiences with voice often see an uplift in engagement, DAU, and spending.
+Voice chat is currently available to all 13+ [phone number verified](../production/publishing/account-verification.md#verifying-through-phone-number) users in these countries: US, CA, GB, IE, AU, NZ, ES, MX, CL, CR, PR, FR, IT, AT, CHE, DE, JP, KR, CH, AR, COL, PE, DO, GT, UY, SV, HN, PY, NI, EC, BO, VE, PA, PT, and BR. Users **not** in these countries should use [ID verification](https://en.help.roblox.com/hc/en-us/articles/4407282410644) to enable chat with voice. Once verified, eligible 13+ phone verified users can opt‑in to use this feature by visiting their account **Settings** page or from within a voice enabled experience, allowing them to chat with voice in any Roblox experience that supports it. Experiences with voice often see an uplift in engagement, DAU, and spending.
**Voice chat** is a proximity-based chat feature that simulates realistic communication based on how close you are to other users who are speaking. The closer you are to another user's avatar, the louder their voice; conversely, the farther away you are, the softer their voice.
@@ -13,9 +13,9 @@ Voice chat is only available for places that support a maximum of 50 users.
-## Enable voice chat
+## Enabling Voice Chat
-Before you can enable voice chat in an experience, you must first [publish](../production/publishing/publish-experiences-and-places.md) it to enable the [Game Settings](../studio/game-settings.md) menu within Studio.
+Before you can enable voice chat in an experience, you must first [publish](../production/publishing/publishing-experiences-and-places.md) it to enable the [Game Settings](../studio/game-settings.md) menu within Studio.
1. Open your experience in Studio.
1. Open [Game Settings](../studio/game-settings.md) from the [Home](../studio/home-tab.md) tab.
@@ -25,22 +25,22 @@ Before you can enable voice chat in an experience, you must first [publish](../p
1. Navigate to the **Communication** tab on the left side of the window.
1. Toggle **Enable Microphone** so the selector turns from gray to green.
1. **(Optional)** For greater communication among users within your experience, toggle on **Enable Camera** to allow eligible users to animate their avatar with their movement.
-1. [Publish](../production/publishing/publish-experiences-and-places.md) the place to save the changes.
+1. [Publish](../production/publishing/publishing-experiences-and-places.md) the place to save the changes.
Voice chat will now be available to verified 13+ users who opt‑in to the feature, in every place within the experience that's set to a maximum of 50 users.
-### Set maximum users
+### Setting Maximum Users
If you previously set the maximum number of users in a place to more than 50, you'll need to reduce it to support voice chat.
1. In the left-hand navigation of the [Game Settings](../studio/game-settings.md) dialog, select **Places**. Every place within your experience displays.
1. Click the **⋯** button next to the place with more than 50 players, then select **Configure Place**.
1. In the **Max Players** field, enter any number less than or equal to 50.
-1. Click the **Save** button and then [publish](../production/publishing/publish-experiences-and-places.md) to save the changes.
+1. Click the **Save** button and then [publish](../production/publishing/publishing-experiences-and-places.md) to save the changes.
-When you update the maximum number of users in a place to fewer than 50, there may be servers already configured to a different, higher number. Since those servers won't support voice chat, it's recommended to [restart servers](../production/publishing/publish-experiences-and-places.md#update-experiences).
+When you update the maximum number of users in a place to fewer than 50, there may be servers already configured to a different, higher number. Since those servers won't support voice chat, it's recommended to [restart servers](../production/publishing/publishing-experiences-and-places.md#updating-experiences).
-### Disable per place
+### Disabling Per Place
If you don't want to enable voice chat for every place within your experience, you can disable it within specific places that would otherwise be voice‑eligible through the `Class.VoiceChatService.EnableDefaultVoice|EnableDefaultVoice` property.
@@ -61,9 +61,9 @@ To disable voice chat for a specific place within an experience:
1. In the [Properties](../studio/properties.md) window, disable the **EnableDefaultVoice** property.
-1. Publish the place to save the changes and [restart servers](../production/publishing/publish-experiences-and-places.md#update-experiences) to ensure the change takes effect for all servers currently running your experience.
+1. Publish the place to save the changes and [restart servers](../production/publishing/publishing-experiences-and-places.md#updating-experiences) to ensure the change takes effect for all servers currently running your experience.
-## Check voice chat status
+## Checking Voice Chat Status
You can check if a user has enabled voice chat by calling `Class.VoiceChatService:IsVoiceEnabledForUserIdAsync()|IsVoiceEnabledForUserIdAsync()` in a `Class.LocalScript`, or in a `Class.Script` with `Class.BaseScript.RunContext|RunContext` set to `Enum.RunContext.Client`.
diff --git a/content/en-us/cloud-services/cross-server-messaging.md b/content/en-us/cloud-services/cross-server-messaging.md
index d62436774..a573fb9d4 100644
--- a/content/en-us/cloud-services/cross-server-messaging.md
+++ b/content/en-us/cloud-services/cross-server-messaging.md
@@ -1,5 +1,5 @@
---
-title: Cross-server messaging
+title: Cross-Server Messaging
description: Cross-server messaging enables you to communicate with other servers or client instances of your experience.
---
@@ -10,11 +10,11 @@ Normally, the code within an experience can only affect the server or clients th
You can support cross-server messaging in your experience using `Class.MessagingService`. You can also use the [Teleportation Playground](https://www.roblox.com/games/3112653247/Teleportation-Playground) sample experience to see how cross‑server messaging works before you implement it. Lastly, see [here](../cloud/open-cloud/usage-messaging.md) to explore cross‑server communication using external tools.
-## Cross-server messaging setup
+## Cross-Server Messaging Setup
-To enable cross-server messaging, you must set up a **topic** which is a customized message channel that's accessible from multiple servers. After you create a topic, you can [subscribe users](#subscribe-users-to-receive-messages) to the topic to receive messages and enable [publishing messages](#publish-messages) to the topic.
+To enable cross-server messaging, you must set up a **topic** which is a customized message channel that's accessible from multiple servers. After you create a topic, you can [subscribe users](#subscribing-users-to-receive-messages) to the topic to receive messages and enable [publishing messages](#publishing-messages) to the topic.
-### Subscribe users to receive messages
+### Subscribing Users to Receive Messages
Use `Class.MessagingService:SubscribeAsync()` to subscribe users to a topic and specify a callback function that detects messages publishing to that topic. For example, the following code sample subscribes all users to a **FriendServerEvent** topic that receives messages when any user is teleported to a different server.
@@ -40,7 +40,7 @@ Players.PlayerAdded:Connect(function(player)
end)
```
-### Publish messages
+### Publishing Messages
Use `Class.MessagingService:PublishAsync()` to match a specific topic and publish a message to it. For example, the following code sample uses `Class.MessagingService:PublishAsync()|PublishAsync()` to notify all users when a user joins a new server, including the `Class.Player.Name` representing the user's display name and the `Class.DataModel.JobId|JobId`, a unique identifier for the running experience server instance.
diff --git a/content/en-us/cloud-services/data-stores-vs-memory-stores.md b/content/en-us/cloud-services/data-stores-vs-memory-stores.md
index cfd7e6a8a..49a03b1e2 100644
--- a/content/en-us/cloud-services/data-stores-vs-memory-stores.md
+++ b/content/en-us/cloud-services/data-stores-vs-memory-stores.md
@@ -1,5 +1,5 @@
---
-title: Data stores vs memory stores
+title: Data Stores vs Memory Stores
description: When to use standard data stores, ordered data stores, and memory stores.
---
@@ -7,13 +7,13 @@ To store data, you can use [data stores](./data-stores/index.md) with the `Class
Alternatively, you can also use Lua types and variables to [store data in-memory in Lua](#when-to-use-in-memory-storage-in-lua), without using the data or memory store services.
-## When to use data stores
+## When to Use Data Stores
The `Class.DataStoreService` stores long-term data that needs to last between sessions, such as user progress or inventory items. Data stores are consistent per experience, so every server for every place within an experience can access and change the same data. There are two types of data stores: standard and ordered.
**Standard data stores** can store data like numbers, strings, and tables that don't need to be ranked or sorted. This data is stored as key-value pairs, where each entry is stored under a key that is unique within its data store and that you can retrieve, update, or delete.
-**Ordered data stores** can only store numbers. Each entry is stored under a key that is unique within its data store and that you can retrieve, update, or delete. You can rank and sort this data numerically and retrieve it in ascending or descending order based on stored numerical values. For more information, see [Ordered data stores](./data-stores/index.md#ordered-data-stores).
+**Ordered data stores** can only store numbers. Each entry is stored under a key that is unique within its data store and that you can retrieve, update, or delete. You can rank and sort this data numerically and retrieve it in ascending or descending order based on stored numerical values. For more information, see [Ordered Data Stores](./data-stores/index.md#ordered-data-stores).
@@ -48,7 +48,7 @@ The `Class.DataStoreService` stores long-term data that needs to last between se
If you want to add granular permission control to your data stores and access them outside of Studio or Roblox servers, you can use [Open Cloud APIs for data stores](/cloud/reference/DataStore).
-## When to use memory stores
+## When to Use Memory Stores
The `Class.MemoryStoreService` is a high throughput and low latency service that stores temporary data that needs to be updated or accessed frequently, such as global leaderboards or matchmaking queues. With memory stores, every server for every place within an experience can access and change the same data quickly and frequently. Data in a memory store expires after a certain period of time, lasting up to 45 days.
@@ -71,7 +71,7 @@ Although memory stores store temporary data, they also support permanent feature
-## When to use in-memory storage in Lua
+## When to Use In-Memory Storage in Lua
You can use in-memory storage in Lua to store temporary data that needs to be accessed with minimal latency and without the cost of making external service calls to data stores or memory stores. There are no extra steps required to set up in-memory storage as it's already built in by default in Lua.
diff --git a/content/en-us/cloud-services/data-stores/best-practices.md b/content/en-us/cloud-services/data-stores/best-practices.md
index ef63232dd..c71373c66 100644
--- a/content/en-us/cloud-services/data-stores/best-practices.md
+++ b/content/en-us/cloud-services/data-stores/best-practices.md
@@ -1,20 +1,20 @@
---
-title: Best practices for data stores
+title: Best Practices for Data Stores
description: Guidelines that help you manage your data more efficiently.
---
Best practices are guidelines that help you manage your data more efficiently.
-### Create fewer data stores
+### Create Fewer Data Stores
Data stores have similar behavior to tables in databases. When you minimize the number of data stores in an experience and put related data in the same data store, you're able to configure each data store individually and improve the service's efficiency to operate the data.
-### Use a single object for related data
+### Use a Single Object for Related Data
To use the maximum [4 MB object size limit](../../cloud-services/data-stores/error-codes-and-limits.md#throughput-limits) more efficiently, fetch all relevant data in one call. `Class.GlobalDataStore:SetAsync()|SetAsync()` updates all data so that all data for the same user is always in sync.
The versioning system versions individual objects instead of the entire data store. This means self-contained objects are consistent when you restore data stores to older versions.
-### Use key prefixes to organize your data
+### Use Key Prefixes to Organize Your Data
-Filter keys with a specific [prefix](./manage-data-stores.md#listing-and-prefixes) when calling `Class.DataStore:ListKeysAsync()|ListKeysAsync()`. For example, you can save keys with a prefix like `/User_1234/profiles/warrior` and `/User_1234/profiles/mage` in experiences that support users with multiple character profiles. You can then use a prefix search with `/User_1234/profiles` to get a list of all profiles belonging to that user.
+Filter keys with a specific [prefix](./managing-data-stores.md#listing-and-prefixes) when calling `Class.DataStore:ListKeysAsync()|ListKeysAsync()`. For example, you can save keys with a prefix like `/User_1234/profiles/warrior` and `/User_1234/profiles/mage` in experiences that support users with multiple character profiles. You can then use a prefix search with `/User_1234/profiles` to get a list of all profiles belonging to that user.
diff --git a/content/en-us/cloud-services/data-stores/error-codes-and-limits.md b/content/en-us/cloud-services/data-stores/error-codes-and-limits.md
index aaaf900c5..3c7659d61 100644
--- a/content/en-us/cloud-services/data-stores/error-codes-and-limits.md
+++ b/content/en-us/cloud-services/data-stores/error-codes-and-limits.md
@@ -1,18 +1,18 @@
---
-title: Error codes and limits
+title: Error Codes and Limits
description: Error codes you might come across and limits you might hit when using data stores to store data.
---
Requests you make to data stores can fail due to poor connectivity or other issues. To handle errors and return messages with an error code, wrap data store functions in `Global.LuaGlobals.pcall()`.
-## Error code reference
+## Error Code Reference
-
Error code
-
Error name
-
Error message
+
Error Code
+
Error Name
+
Error Message
Notes
@@ -250,13 +250,13 @@ Requests you make to data stores can fail due to poor connectivity or other issu
-### Server error codes
+### Server Error Codes
-
Error name
-
Error message
+
Error Name
+
Error Message
Notes
@@ -322,16 +322,16 @@ Requests in a queue are handled in the order they are received. The called funct
Each queue has a limit of 30 requests. When the limit of a queue is reached, requests fail with an error code in the 301-306 range, indicating that the requests have been dropped entirely.
-### Server limits
+### Server Limits
Each server is allowed a certain number of data store requests based on the request type and number of users. Use `Class.DataStoreService:GetRequestBudgetForRequestType()|GetRequestBudgetForRequestType()` to confirm the number of data store requests that the current place can make.
-
Request type
+
Request Type
Functions
-
Requests per minute
+
Requests per Minute
@@ -368,11 +368,11 @@ Each server is allowed a certain number of data store requests based on the requ
-### Data limits
+### Data Limits
Data stores limit how much data can be used per entry.
-The data store name, key name, and [scope](../../cloud-services/data-stores/manage-data-stores.md#scopes) must all be under a certain character length. Use `Library.string.len()` to check their length.
+The data store name, key name, and [scope](../../cloud-services/data-stores/managing-data-stores.md#scopes) must all be under a certain character length. Use `Library.string.len()` to check their length.
The data (key value) is also stored as a string, regardless of its initial type. You can check the size of the data with the `Class.HttpService:JSONEncode()|JSONEncode()` function, which converts Lua data into a serialized JSON table.
@@ -380,16 +380,16 @@ The data (key value) is also stored as a string, regardless of its initial type.
Component
-
Maximum number of characters
+
Maximum Number of Characters
-
Data store name
+
Data Store Name
50
-
Key name
+
Key Name
50
@@ -397,13 +397,13 @@ The data (key value) is also stored as a string, regardless of its initial type.
50
-
Data (key value)
+
Data (Key Value)
4,194,304 per key
-### Metadata limits
+### Metadata Limits
Limits to the number of characters in user-defined metadata.
@@ -411,12 +411,12 @@ Limits to the number of characters in user-defined metadata.
Component
-
Maximum number of characters
+
Maximum Number of Characters
-
Key name
+
Key Name
50
@@ -424,7 +424,7 @@ Limits to the number of characters in user-defined metadata.
250
-
Key-value pairs
+
Key-value Pairs
300
@@ -434,7 +434,7 @@ Limits to the number of characters in user-defined metadata.
There's no limit to the total number of key-value pairs, but the total size can't exceed 300 characters.
-### Throughput limits
+### Throughput Limits
Per-key throughput limits ensure that performance is optimal on Roblox servers. Each limit applies to every single key across all servers in an experience and refreshes over time.
@@ -443,7 +443,7 @@ Roblox examines the usage of quota associated with the key over the last 60 seco
-
Request type
+
Request Type
Limit
diff --git a/content/en-us/cloud-services/data-stores/index.md b/content/en-us/cloud-services/data-stores/index.md
index 5a8b8c0cd..fb186597a 100644
--- a/content/en-us/cloud-services/data-stores/index.md
+++ b/content/en-us/cloud-services/data-stores/index.md
@@ -1,5 +1,5 @@
---
-title: Data stores
+title: Data Stores
description: How to implement data stores to store persistent data.
comments: The Creator Hub links to some of the anchors on this page, so if you move any of the headers, the team might need to update the links.
---
@@ -10,17 +10,17 @@ If you want to add granular permission control to your data stores and access th
For temporary data that you need to update or access frequently, use [memory stores](./../memory-stores/index.md).
-## Enable Studio access
+## Enabling Studio Access
By default, experiences tested in Studio can't access data stores, so you must first enable them. Accessing data stores in Studio can be dangerous for live experiences because Studio accesses the same data stores as the client application. To avoid overwriting production data, do not enable this setting for live experiences. Instead, enable it for a separate test version of the experience.
-To enable Studio access in a [published](../../production/publishing/publish-experiences-and-places.md) experience:
+To enable Studio access in a [published](../../production/publishing/publishing-experiences-and-places.md) experience:
1. Go to **Home** > **Game Settings** > **Security**.
2. Enable the **Enable Studio Access to API Services** toggle.
3. Click **Save**.
-## Access data stores
+## Accessing Data Stores
To access a data store inside an experience:
@@ -37,14 +37,14 @@ local experienceStore = DataStoreService:GetDataStore("PlayerExperience")
The server can only access data stores through `Class.Script|Scripts`. Attempting client-side access in a `Class.LocalScript` causes an error.
-## Create data
+## Creating Data
A data store is essentially a dictionary, similar to a Lua table. A unique **key** indexes each value in the data store, like a user's unique `Class.Player.UserId` or a named string for an experience promo.
-
**User data key**
+
**User Data Key**
**Value**
@@ -64,7 +64,7 @@ A data store is essentially a dictionary, similar to a Lua table. A unique **key
-
**Promo data key**
+
**Promo Data Key**
**Value**
@@ -103,7 +103,7 @@ end
Functions like `Class.GlobalDataStore:SetAsync()|SetAsync()` that access a data store's contents are network calls that might occasionally fail. To catch and handle errors, make sure to wrap these calls in `Global.LuaGlobals.pcall()`.
-## Update data
+## Updating Data
To change any stored value in a data store, call `Class.GlobalDataStore:UpdateAsync()|UpdateAsync()` with the entry's key name and a callback function that defines how you want to update the entry. This callback takes the current value and returns a new value based on the logic you define. If the callback returns `nil`, the write operation is cancelled and the value isn't updated.
@@ -129,7 +129,7 @@ if success then
end
```
-### Set vs update
+### Set vs Update
Use set to quickly update a specific key. The `Class.GlobalDataStore:SetAsync()|SetAsync()` function:
@@ -142,7 +142,7 @@ Use update to handle multi-server attempts. The `Class.GlobalDataStore:UpdateAsy
- Is slower because it reads before it writes
- Counts against both the read and write limits
-## Read data
+## Reading Data
To read the value of a data store entry, call `Class.GlobalDataStore:GetAsync()|GetAsync()` with the entry's key name.
@@ -160,10 +160,10 @@ end
```
- The values you retrieve using `Class.GlobalDataStore:GetAsync()|GetAsync()` sometimes can be out of sync with the backend due to the [caching](../../cloud-services/data-stores/manage-data-stores.md#caching) behavior. For more information, see [Disabling Caching](../../cloud-services/data-stores/manage-data-stores.md#disable-caching).
+ The values you retrieve using `Class.GlobalDataStore:GetAsync()|GetAsync()` sometimes can be out of sync with the backend due to the [caching](../../cloud-services/data-stores/managing-data-stores.md#caching) behavior. For more information, see [Disabling Caching](../../cloud-services/data-stores/managing-data-stores.md#disabling-caching).
-## Increment data
+## Incrementing Data
To increment an integer in a data store, call `Class.GlobalDataStore:IncrementAsync()|IncrementAsync()` with the entry's key name and a number for how much to change the value. `Class.GlobalDataStore:IncrementAsync()|IncrementAsync()` is a convenience function that lets you avoid calling `Class.GlobalDataStore:UpdateAsync()|UpdateAsync()` and manually incrementing the integer.
@@ -180,7 +180,7 @@ if success then
end
```
-## Remove data
+## Removing Data
To remove an entry and return the value associated with the key, call `Class.GlobalDataStore:RemoveAsync()|RemoveAsync()`.
@@ -288,9 +288,9 @@ To manage metadata, expand the `Class.GlobalDataStore:SetAsync()|SetAsync()`, `C
When calling `Class.GlobalDataStore:SetAsync()|SetAsync()`, `Class.GlobalDataStore:IncrementAsync()|IncrementAsync()`, and `Class.GlobalDataStore:UpdateAsync()|UpdateAsync()`, you must always update metadata definitions with a value, even when there are no changes to the current value. If you don't, you lose the current value.
-For limits when defining metadata, see the [metadata limits](../../cloud-services/data-stores/error-codes-and-limits.md#metadata-limits).
+For limits when defining metadata, see [Metadata Limits](../../cloud-services/data-stores/error-codes-and-limits.md#metadata-limits).
-## Ordered data stores
+## Ordered Data Stores
By default, data stores don't sort their content. If you need to get data in an ordered way, like in persistent leaderboard stats, call `Class.DataStoreService:GetOrderedDataStore()|GetOrderedDataStore()` instead of `Class.DataStoreService:GetDataStore()|GetDataStore()`.
diff --git a/content/en-us/cloud-services/data-stores/manage-data-stores.md b/content/en-us/cloud-services/data-stores/managing-data-stores.md
similarity index 95%
rename from content/en-us/cloud-services/data-stores/manage-data-stores.md
rename to content/en-us/cloud-services/data-stores/managing-data-stores.md
index 251eb0a1b..8b4042bd8 100644
--- a/content/en-us/cloud-services/data-stores/manage-data-stores.md
+++ b/content/en-us/cloud-services/data-stores/managing-data-stores.md
@@ -1,5 +1,5 @@
---
-title: Manage data stores
+title: Managing Data Stores
description: How to manage data stores through versioning, listing, and caching.
---
@@ -7,7 +7,7 @@ Manage your data using versioning, listing, and caching.
## Versioning
-Versioning happens when you [set](./index.md#create-data), [update](./index.md#update-data), and [increment](./index.md#increment-data) data. The functions `Class.GlobalDataStore:SetAsync()|SetAsync()`, `Class.GlobalDataStore:UpdateAsync()|UpdateAsync()`, and `Class.GlobalDataStore:IncrementAsync()|IncrementAsync()` create versioned backups of your data using the first write to each key in each UTC hour. Successive writes to a key in the same UTC hour permanently overwrite the previous data.
+Versioning happens when you [set](./index.md#creating-data), [update](./index.md#updating-data), and [increment](./index.md#incrementing-data) data. The functions `Class.GlobalDataStore:SetAsync()|SetAsync()`, `Class.GlobalDataStore:UpdateAsync()|UpdateAsync()`, and `Class.GlobalDataStore:IncrementAsync()|IncrementAsync()` create versioned backups of your data using the first write to each key in each UTC hour. Successive writes to a key in the same UTC hour permanently overwrite the previous data.
Versioned backups expire 30 days after a new write overwrites them. The latest version never expires.
@@ -92,7 +92,7 @@ The [Snapshot Data Stores Open Cloud API](/cloud/reference/DataStore#Snapshot-Da
For example, without a snapshot, if you publish an update at 3:30 UTC that causes data corruption, the corrupted data overwrites any data written between 3:00-3:30 UTC. If you take a snapshot at 3:29 UTC, though, the corrupted data doesn't overwrite anything written before 3:29 UTC, and the latest data for all keys written between 3:00-3:29 UTC is preserved.
-## Listing and prefixes
+## Listing and Prefixes
Data stores let you list by prefix. For example, listing by the first **n** characters of a name, like "d" , "do", or "dog" for any key or data store with a prefix of "dog".
@@ -168,7 +168,7 @@ local success, currentGold = pcall(function()
end)
```
-### AllScopes property
+### AllScopes Property
`Class.DataStoreOptions` contains an `Class.DataStoreOptions.AllScopes|AllScopes` property that lets you return keys from all [scopes](#scopes) in a list. You can then use the `Class.DataStoreKey.KeyName|KeyName` property of a list item for common data store operations like [reading data](./index.md#reading-data) with `Class.GlobalDataStore:GetAsync()|GetAsync()` and [removing data](./index.md#removing-data) with `Class.GlobalDataStore:RemoveAsync()|RemoveAsync()`.
@@ -228,7 +228,7 @@ All `Class.GlobalDataStore:GetAsync()|GetAsync()` calls that retrieve a value no
Caching is local to a particular data store instance, so different data stores can have their caches in different states. For example, if you access a key twice through two different data store instances, like getting one data store with a specified scope and another through having the `Class.DataStoreOptions.AllScopes|AllScopes` property enabled, each data store instance has its own cache. If you change the value of that key in one data store instance and not the other, you end up with inconsistent data.
-### Disable caching
+### Disabling Caching
To disable caching and opt out of using the cache to retrieve the most up-to-date value from the servers, add the `Class.DataStoreGetOptions` parameter to your `Class.GlobalDataStore:GetAsync()|GetAsync()` call and set the `Class.DataStoreGetOptions.UseCache|UseCache` property to `false` to make your request ignore any keys in the cache.
diff --git a/content/en-us/cloud-services/data-stores/observability.md b/content/en-us/cloud-services/data-stores/observability.md
index b8d5d3aa5..5f12553b4 100644
--- a/content/en-us/cloud-services/data-stores/observability.md
+++ b/content/en-us/cloud-services/data-stores/observability.md
@@ -1,5 +1,5 @@
---
-title: Data store observability
+title: Data Store Observability
description: Explains how to use the observability dashboard for data stores.
---
@@ -7,16 +7,16 @@ The data stores observability dashboard provides real-time charts on your reques

-## Access the dashboard
+## Accessing the Dashboard
-The data stores dashboard is available for any experience that uses `Class.DataStoreService`, but you must either be the experience owner or have [analytics group permissions](../../production/analytics/analytics-dashboard.md#grant-group-permission) to access the dashboard.
+The data stores dashboard is available for any experience that uses `Class.DataStoreService`, but you must either be the experience owner or have [analytics group permissions](../../production/analytics/analytics-dashboard.md#granting-group-permission) to access the dashboard.
1. Navigate to the [Creations](https://create.roblox.com/dashboard/creations) page on the **Creator Hub**.
2. Under the **Creator Hub** dropdown, select your account or the group owning the target experience.
3. Select the experience.
4. In the **Monitoring** dropdown, select **Data Stores**.
-## Available charts
+## Available Charts
- **Request Count by API** on API request count per minute by API method, such as `Class.DataStore:SetAsync()` or `Class.OrderedDataStore:GetSortedAsync()`.
- **Request Count by Status** on API request count by [response status](#response-status-codes).
@@ -28,8 +28,8 @@ Each chart contains data for the past 30 days, and you can select to view a cust
Data from the most recent three minutes might be incomplete, so it's normal to see a drop at the end of the charts.
-## Response status codes
+## Response Status Codes
-The dashboard's **Request Count by Status** and **Requests by API x Status** charts include status codes of API responses that you can use to understand usage and troubleshoot errors. For a table that lists and describes all of these status codes (aside from `200 OK`), see [Error codes](index.md#error-codes).
+The dashboard's **Request Count by Status** and **Requests by API x Status** charts include status codes of API responses that you can use to understand usage and troubleshoot errors. For a table that lists and describes all of these status codes (aside from `200 OK`), see [Error Codes](index.md#error-codes).
For information on limits and usage quotas, see [Limits](index.md#limits).
diff --git a/content/en-us/cloud-services/data-stores/player-data-purchasing.md b/content/en-us/cloud-services/data-stores/player-data-purchasing.md
index 7a8d3629c..bf0245fa8 100644
--- a/content/en-us/cloud-services/data-stores/player-data-purchasing.md
+++ b/content/en-us/cloud-services/data-stores/player-data-purchasing.md
@@ -1,5 +1,5 @@
---
-title: Implement player data and purchasing systems
+title: Implementing Player Data and Purchasing Systems
description: Guide for implementing player data and purchase handling systems.
---
@@ -9,7 +9,7 @@ Roblox provides a set of APIs to interface with data stores via `Class.DataStore
Most experiences on Roblox use these APIs to implement some form of a player data system. These implementations differ in their approach, but generally seek to solve the same set of issues.
-## Common problems
+## Common Problems
Below are some of the most common problems player data systems attempt to solve:
@@ -34,7 +34,7 @@ Below are some of the most common problems player data systems attempt to solve:
- **Atomic Purchase Handling:** Verify, award, and record purchases atomically to prevent items from being lost or awarded multiple times.
-## Sample code
+## Sample Code
This code is provided for reference purposes only and has not proven itself over a long period of time in a popular experience. It exists so that you can examine its approach to solving various problems and apply them to your own player data systems. Don't use this code in your experience as-is without extensive testing.
@@ -126,7 +126,7 @@ These methods, when called:
Ultimately, our view is that the simple approach (processing every request) is preferable here and creates a clearer environment to navigate in when approaching complex issues like session locking. The only exception to this is during `Class.DataModel:BindToClose()`, where clearing the queue becomes necessary to save all users' data in time and the value individual function calls return is no longer an ongoing concern. To account for this, we expose a `skipAllQueuesToLastEnqueued` method. For more context, see [Player Data](#player-data).
-## Session locking
+## Session Locking
**Class:** [`SessionLockedDataStoreWrapper`](#sample-code)
@@ -190,7 +190,7 @@ To maintain the lock on a key, you must regularly access it for as long as it is
If the lock expiry time has been exceeded without the lock being updated, then any server is free to take over the lock. If a different server takes the lock, attempts by the current server to read or write the key fail unless it establishes a new lock.
-## Developer product processing
+## Developer Product Processing
**Singleton:** [`ReceiptHandler`](#sample-code)
@@ -248,7 +248,7 @@ The comments in `ReceiptProcessor` outline the approach:
If this save request is not successful, a later request to save the player's in-memory session data could still succeed. During the next `ProcessReceipt` call, step 2 handles this situation and returns `PurchaseGranted`.
-## Player data
+## Player Data
**Singletons:** [`PlayerData.Server`](#sample-code), [`PlayerData.Client`](#sample-code)
@@ -266,7 +266,7 @@ Modules that provide an interface for game code to synchronously read and write
4. Replicating loading and/or saving errors to the client so that it can show error dialogs
5. Saving the player's data periodically, when the player leaves, and when the server shuts down
-#### Load player data
+#### Loading Player Data
@@ -280,7 +280,7 @@ Modules that provide an interface for game code to synchronously read and write
1. Any threads yielded using `waitForDataLoadAsync` for the player are resumed.
-#### Provide an interface for server code
+#### Providing an Interface for Server Code
- `PlayerDataServer` is a singleton that can be required and accessed by any server code running in the same environment.
- Player data is organized into a dictionary of keys and values. You can manipulate these values on the server using the `setValue`, `getValue`, `updateValue` and `removeValue` methods. These methods all operate synchronously without yielding.
@@ -288,14 +288,14 @@ Modules that provide an interface for game code to synchronously read and write
- A `hasErrored` method can query if the player's initial load failed, causing them to use default data. Check this method before allowing the player to make any purchases, as purchases cannot be saved to data without a successful load.
- A `playerDataUpdated` signal fires with the `player`, `key`, and `value` whenever a player's data is changed. Individual systems can subscribe to this.
-#### Replicate changes to the client
+#### Replicating Changes to the Client
- Any change to player data in `PlayerDataServer` is replicated to `PlayerDataClient`, unless that key was marked as private using setValueAsPrivate
- `setValueAsPrivate` is used to denote keys that should not be sent to the client
- `PlayerDataClient` includes a method to get the value of a key (get) and a signal that fires when it is updated (updated). A `hasLoaded` method and a `loaded` signal are also included, so the client can wait for data to load & replicate before starting its systems
- `PlayerDataClient` is a singleton that can be required and accessed by any client code running in the same environment
-#### Replicate errors to the client
+#### Replicating Errors to the Client
- Error statuses encountered when saving or loading player data are replicated to `PlayerDataClient`.
- Access this information with the `getLoadError` and `getSaveError` methods, along with the `loaded` and `saved` signals.
@@ -304,7 +304,7 @@ Modules that provide an interface for game code to synchronously read and write
-#### Save player data
+#### Saving Player Data
diff --git a/content/en-us/cloud-services/memory-stores/best-practices.md b/content/en-us/cloud-services/memory-stores/best-practices.md
index 0717e048b..15ecbdc84 100644
--- a/content/en-us/cloud-services/memory-stores/best-practices.md
+++ b/content/en-us/cloud-services/memory-stores/best-practices.md
@@ -1,5 +1,5 @@
---
-title: Best practices when designing MemoryStore data structures
+title: Best Practices when designing MemoryStore Data Structures
description: Explains how to best design data structures to reduce the chance of experiencing throttling.
---
@@ -7,7 +7,7 @@ Depending on the data structure type, MemoryStoreService enforces [limits](../..
Each Roblox experience has the [Memory Store Observability Dashboard](../../cloud-services/memory-stores/observability.md), which includes a set of charts that you can use to monitor memory store usage.
-## Sorted maps and queues
+## Sorted Maps and Queues
Sorted maps and queues both have limits on the maximum number of items and maximum total memory. Additionally, the items in one of these data structures always reside on a single partition. Every request to one of those data structures is a request to the same partition.
@@ -21,7 +21,7 @@ Sharding is the process of storing a set of related data across multiple data st
The key challenge to sharding is finding a way to spread the data across multiple data structures in a way that maintains the same functionality as the original.
-### Sharding a sorted map
+### Sharding a Sorted Map
To shard a sorted map, consider splitting your data into alphabetic subsections with character ranges. For example, assume that you only have keys with the first letter from A-Z, and you believe four sorted maps is sufficient for your current use case and future growth:
@@ -68,7 +68,7 @@ local playerScore = bucket:GetAsync(player)
print(playerScore)
```
-### Sharding a queue
+### Sharding a Queue
Sharding a queue is tricker than sharding a sorted map. Although you want to spread the request throughput across multiple queues, adds, reads, and removes only ever occur at the front or back of the queue.
@@ -159,7 +159,7 @@ local players, ids = readFromQueue(20, true, -1)
removeFromQueue(ids)
```
-## Hash maps
+## Hash Maps
Hash maps do not have individual memory or item count limits and are automatically sharded, but you can still encounter throttling if you use them poorly.
diff --git a/content/en-us/cloud-services/memory-stores/hash-map.md b/content/en-us/cloud-services/memory-stores/hash-map.md
index 145b162fd..834c31988 100644
--- a/content/en-us/cloud-services/memory-stores/hash-map.md
+++ b/content/en-us/cloud-services/memory-stores/hash-map.md
@@ -1,5 +1,5 @@
---
-title: Memory store hash map
+title: Memory Store Hash Map
description: Explains how to implement the hash map data structure for memory stores.
---
@@ -11,7 +11,7 @@ Hash maps have a key size limit of 128 characters and a value size limit of 32 K
Otherwise, hash maps use the same [API request](../../cloud-services/memory-stores/index.md#api-requests-limits) and [memory quota](../../cloud-services/memory-stores/index.md#memory-size-quota) limits as the other memory store data structures.
-## Get a hash map
+## Getting a Hash Map
To get a hash map, call `Class.MemoryStoreService:GetHashMap()` with a name for the hash map. The name is global within the experience, so you can access the same hash map on any script using this name.
@@ -33,23 +33,23 @@ After you get a hash map, call any of the following functions to read or write d
`Class.MemoryStoreHashMap:SetAsync()`
-
[Add](#add-or-overwrite-data) a new key or overwrite the value if the key already exists.
+
[Add](#adding-or-overwriting-data) a new key or overwrite the value if the key already exists.
`Class.MemoryStoreHashMap:GetAsync()`
-
[Read](#get-data) a particular key.
+
[Read](#getting-data) a particular key.
`Class.MemoryStoreHashMap:ListItemsAsync()`
-
[List](#get-data) items in a hash map.
+
[List](#getting-data) items in a hash map.
`Class.MemoryStoreHashMap:UpdateAsync()`
-
[Update](#update-data) the value of a key after retrieving it from a hash map.
+
[Update](#updating-data) the value of a key after retrieving it from a hash map.
`Class.MemoryStoreHashMap:RemoveAsync()`
-
[Remove](#remove-data) a key from the hash map.
+
[Remove](#removing-data) a key from the hash map.
@@ -60,7 +60,7 @@ For in-depth documentation about each function, see `Class.MemoryStoreHashMap`.
All functions accessing data structures in memory stores are asynchronous network calls that might occasionally fail. You should wrap these calls in `Global.LuaGlobals.pcall()` to catch and handle errors, as shown in the code samples.
-## Add or overwrite data
+## Adding or Overwriting Data
To add a new key or overwrite the value of a key in the hash map, call `Class.MemoryStoreHashMap:SetAsync()` with the key **name**, its **value**, and an **expiration time** in seconds. The memory automatically cleans up once the key expires. The maximum expiration time is 3,888,000 seconds (45 days).
@@ -81,11 +81,11 @@ if setSuccess then
end
```
-## Get data
+## Getting Data
You can either get a value associated with a specific key or get multiple key-value pairs in the hash map.
-### Get data with one key
+### Getting Data with One Key
To get a value associated with one key from the hash map, call `Class.MemoryStoreHashMap:GetAsync()` with the key **name**.
@@ -112,7 +112,7 @@ else
end
```
-### Get data with multiple key-value pairs
+### Getting Data with Multiple Key-Value pairs
To get all the key-value pairs from the hash map as a single operation, call `Class.MemoryStoreHashMap:ListItemsAsync()` with the desired page size. This function lists all existing keys in a paginated manner. For example, the following code sample retrieves up to 32 items from the hash map.
@@ -145,7 +145,7 @@ if success then
end
```
-## Update data
+## Updating Data
To retrieve the value of a key from a hash map and update it, call `Class.MemoryStoreHashMap:UpdateAsync()` with the key **name**, a **callback function** to update the key, and an **expiration time** in seconds.
@@ -181,11 +181,11 @@ The latency for `Class.MemoryStoreHashMap:UpdateAsync()|UpdateAsync()` is simila
When contention occurs, the system automatically retries the operation until one of these three happens: the operation succeeds, the callback function returns nil, or the maximum number of retries is reached. If the system reaches the maximum number of retries, it returns a conflict.
-## Remove data
+## Removing Data
You can use `Class.MemoryStoreHashMap:RemoveAsync()` for both removing one key from the hash map and deleting all data in a memory store hash map.
-### Remove a key
+### Removing a Key
To remove a key from the hash map, call `Class.MemoryStoreHashMap:RemoveAsync()` with a key **name**.
@@ -209,7 +209,7 @@ if not removeSuccess then
end
```
-### Delete all data
+### Deleting All Data
To delete all data in a hash map, list all your items with `Class.MemoryStoreHashMap:ListItemsAsync()`, then remove them with `Class.MemoryStoreHashMap:RemoveAsync()`.
diff --git a/content/en-us/cloud-services/memory-stores/index.md b/content/en-us/cloud-services/memory-stores/index.md
index 6684cd619..5a3702586 100644
--- a/content/en-us/cloud-services/memory-stores/index.md
+++ b/content/en-us/cloud-services/memory-stores/index.md
@@ -1,11 +1,11 @@
---
-title: Memory stores
+title: Memory Stores
description: Explains how to implement memory store data structures to store frequent in-memory data.
---
-`Class.MemoryStoreService` is a high throughput and low latency data service that provides fast in-memory data storage accessible from all servers in a live session. **Memory Stores** are suitable for frequent and ephemeral data that change rapidly and don't need to be durable, because they are faster to access and vanish when reaching the maximum lifetime. For data that needs to persist across sessions, use [data stores](../../cloud-services/data-stores).
+`Class.MemoryStoreService` is a high throughput and low latency data service that provides fast in-memory data storage accessible from all servers in a live session. **Memory Stores** are suitable for frequent and ephemeral data that change rapidly and don't need to be durable, because they are faster to access and vanish when reaching the maximum lifetime. For data that needs to persist across sessions, use [Data Stores](../../cloud-services/data-stores).
-## Data structures
+## Data Structures
Instead of directly accessing raw data, memory stores have three primitive data structures shared across servers for quick processing: [sorted map](../../cloud-services/memory-stores/sorted-map.md), [queue](../../cloud-services/memory-stores/queue.md), and [hash map](../../cloud-services/memory-stores/hash-map.md). Each data structure is a good fit for certain use cases:
@@ -19,13 +19,13 @@ Instead of directly accessing raw data, memory stores have three primitive data
In general, if you need to access data based on a specific key, use a hash map. If you need that data to be ordered, use a sorted map. If you need to process your data in a specific order, use a queue.
-## Limits and quotas
+## Limits and Quotas
To maintain the scalability and system performance, memory stores have data usage quotas for the memory size, API requests, and the data structure size.
Memory stores have an eviction policy based on expiration time, also known as time to live (TTL). Items are evicted after they expire, and memory quota is freed up for new entries. When you hit the memory limit, all subsequent write requests fail until items expire or you manually delete them.
-### Memory size quota
+### Memory Size Quota
The memory quota limits the total amount of memory that an experience can consume. It's not a fixed value. Instead, it changes over time depending on the number of users in the experience according to the following formula: **64KB + 1KB \* [number of users]**. The quota applies on the experience level instead of the server level.
@@ -35,7 +35,7 @@ After your experience hits the memory size quota, any API requests that increase
With the [observability](../../cloud-services/memory-stores/observability.md) dashboard, you can view the memory size quota of your experience in real-time using the **Memory Usage** chart.
-### API request limits
+### API Request Limits
For API request limits, there's a **request unit** quota that applies for all `Class.MemoryStoreService` API calls. The quota is **1000 + 100 \* [number of concurrent users]** request units per minute.
@@ -61,18 +61,18 @@ The requests quota is also applied on the experience level instead of the server
With the [observability](../../cloud-services/memory-stores/observability.md) feature available, you can view the request unit quota of your experience in real-time.
-### Data structure size limits
+### Data Structure Size Limits
For a single sorted map or queue, the following size and item count limits apply:
- Maximum number of items: 1,000,000
- Maximum total size (including keys for sorted map): 100 MB
-### Per-partition limits
+### Per-Partition Limits
-See [per-partition limits](per-partition-limits.md).
+See [Per-Partition Limits](per-partition-limits.md).
-## Best practices
+## Best Practices
To keep your memory usage pattern optimal and avoid hitting the [limits](#limits-and-quotas), follow these best practices:
@@ -109,7 +109,7 @@ The following table lists and describes all status codes of API responses availa
-
Status code
+
Status Code
Description
@@ -174,7 +174,7 @@ The following table lists states codes from client side, which are currently not
-
Status code
+
Status Code
Description
@@ -330,7 +330,7 @@ The following table lists and describes the recommended solution for each respon
-## Test and debug in Studio
+## Testing and Debugging in Studio
The data in `Class.MemoryStoreService` is isolated between Studio and production, so changing the data in Studio doesn't affect production behavior. This means that your API calls from Studio don't access production data, allowing you to safely test memory stores and new features before going to production.
diff --git a/content/en-us/cloud-services/memory-stores/observability.md b/content/en-us/cloud-services/memory-stores/observability.md
index b3c65aa9a..d6971590c 100644
--- a/content/en-us/cloud-services/memory-stores/observability.md
+++ b/content/en-us/cloud-services/memory-stores/observability.md
@@ -1,13 +1,13 @@
---
-title: Memory store observability
+title: Memory Store Observability
description: Explains how to use the observability dashboard for memory stores.
---
The memory stores observability dashboard provides real-time charts on your memory usage and API requests. It also has a built-in alert system that notifies you by email when an issue arises to help you troubleshoot in sync. For further information about specific errors, you can view your [Error Report](../../production/analytics/error-report.md) to find the error logs.
-## Access the dashboard
+## Accessing the Dashboard
-The memory stores observability dashboard is available for any experience using `Class.MemoryStoreService`, but you must either be the experience owner or have [analytics group permissions](../../production/analytics/analytics-dashboard.md#grant-group-permission) to access the dashboard.
+The memory stores observability dashboard is available for any experience using `Class.MemoryStoreService`, but you must either be the experience owner or have [analytics group permissions](../../production/analytics/analytics-dashboard.md#granting-group-permission) to access the dashboard.
To access the dashboard:
@@ -16,7 +16,7 @@ To access the dashboard:
3. Select the experience.
4. In the **Monitoring** dropdown, select **Memory Stores**.
-## Available charts
+## Available Charts
The dashboard includes two categories of line graphs:
@@ -30,11 +30,11 @@ The dashboard includes two categories of line graphs:
The chart contains data for the past 30 days, and you can select to view a custom time range with the selector at the top of the page. If you select a time range earlier than 30 days, the system returns a **Request Failed** error.
-## Response status codes
+## Response Status Codes
The Observability Dashboard's **Request Count by Status** and **Requests by API x Status** charts include status codes of API responses that you can use to understand and troubleshoot errors. For a table that lists and describes all of these status codes, see [Observability](index.md#observability). In addition, for information on how to resolve these errors, or the specific quota or limit that an error relates to, see [Troubleshooting](index.md#troubleshooting) and [Limits and Quotas](index.md#limits-and-quotas), respectively.
-## Notification alerts
+## Notification Alerts
The email alert system automatically detects and sends you alerts of memory store usage issues that can harm the performance of your experience. There are two types of alerts:
@@ -45,7 +45,7 @@ When your experience triggers two types of alerts at the same time, the dashboar
Currently, the system has four built-in alerts for memory usage and API requests. If your experience exceeds an alerting threshold, the system notifies you at most once a day for each alert. When receiving an email alert, you should view the dashboard and take actions to prevent degraded performance.
-### Memory usage alerts
+### Memory Usage Alerts
The system sends the following memory usage alerts:
@@ -60,7 +60,7 @@ These issues usually occur when you overpopulate a memory store data structure w
To prevent and resolve these issues, apply [best practices](../../cloud-services/memory-stores/index.md#best-practices) to keep track of data structures you're actively using and set up a mechanism for cleaning up processed data.
-### API request alerts
+### API Request Alerts
The system sends the following API request alerts:
diff --git a/content/en-us/cloud-services/memory-stores/per-partition-limits.md b/content/en-us/cloud-services/memory-stores/per-partition-limits.md
index f8d97b72e..e4316d310 100644
--- a/content/en-us/cloud-services/memory-stores/per-partition-limits.md
+++ b/content/en-us/cloud-services/memory-stores/per-partition-limits.md
@@ -1,5 +1,5 @@
---
-title: Partitions and data distribution
+title: Partitions and Data Distribution
description: Explains the concept of a partition and per-partition limits.
---
@@ -9,7 +9,7 @@ With the release of the `Class.MemoryStoreHashMap` data structure, Roblox remove
The MemoryStores API stores data on _partitions_, which are just subdivisions of storage. Whenever you write an item to a memory store, that item is stored on exactly one partition. Partitions are fully managed by the MemoryStores API; you do not need to manage them yourself.
-## Partition assignment
+## Partition Assignment
Partition storage is different according to the data structure an item is being stored on. For sorted maps and queues, each data structure is assigned a single partition.
@@ -34,4 +34,4 @@ For example, consider a per-partition limit of 150,000 requests per minute (RPM)
-For this reason, if you don't need sorting or "first in, first out" functionality, hash maps are usually the best choice for a memory store data structure. For more information, see the [best practices](../../cloud-services/memory-stores/best-practices.md).
+For this reason, if you don't need sorting or "first in, first out" functionality, hash maps are usually the best choice for a memory store data structure. For more information, see [Best Practices](../../cloud-services/memory-stores/best-practices.md).
diff --git a/content/en-us/cloud-services/memory-stores/queue.md b/content/en-us/cloud-services/memory-stores/queue.md
index 78a9588a8..583f749a5 100644
--- a/content/en-us/cloud-services/memory-stores/queue.md
+++ b/content/en-us/cloud-services/memory-stores/queue.md
@@ -1,5 +1,5 @@
---
-title: Memory store queue
+title: Memory Store Queue
description: Explains how to implement the queue data structure for memory stores.
---
@@ -7,7 +7,7 @@ A **queue** is a linear data structure with a collection of items that either fo
Memory store queues are useful for order-based processing and storing user information, such as skill levels, to facilitate matchmaking based on your desired criteria. For example, you can add a lobby place as the start place of your experience, use memory store queues as a centralized user information storage system accessible by multiple servers, manage the placement order of users using the queues, and teleport user who have completed the matchmaking to the main place of your experience.
-## Get a queue
+## Getting a Queue
To get a queue, call `Class.MemoryStoreService:GetQueue()` with a **name**, which is global within the experience for any script to access, and an optional **invisibility timeout** in seconds, which prevents duplicated processing of the same queue item. Invisibility timeout is 30 seconds by default if you leave it empty like the following code sample.
@@ -31,15 +31,15 @@ After you get a queue, call any of the following functions to read or write data
`Class.MemoryStoreQueue:AddAsync()`
-
[Add](#add-data) a new item to the queue.
+
[Add](#adding-data) a new item to the queue.
`Class.MemoryStoreQueue:ReadAsync()`
-
[Read](#read-and-remove-data) one or more items from the queue as a single operation.
+
[Read](#reading-and-removing-data) one or more items from the queue as a single operation.
`Class.MemoryStoreQueue:RemoveAsync()`
-
[Remove](#read-and-remove-data) one or more items previously read from the queue.
+
[Remove](#reading-and-removing-data) one or more items previously read from the queue.
@@ -48,7 +48,7 @@ After you get a queue, call any of the following functions to read or write data
All functions accessing data structures in memory stores are asynchronous network calls that might occasionally fail. You should wrap these calls in `Global.LuaGlobals.pcall()` to catch and handle errors, like the code sample in each section shows.
-## Add data
+## Adding Data
To add a new item to the queue, call `Class.MemoryStoreQueue:AddAsync()` with the item value, an expiration time in seconds, and an optional priority of the item. If you want to keep your queue in the FIFO sequence, you can leave the priority empty or pass `0`.
@@ -65,7 +65,7 @@ if not addSuccess then
end
```
-## Read and remove data
+## Reading and Removing Data
To read one or more items from the queue at once, call `Class.MemoryStoreQueue:ReadAsync()`, which returns an `id` representing the read item. When you finish processing items, immediately call `Class.MemoryStoreQueue:RemoveAsync()` to delete them from the queue with its `id`. This ensures that you never process an item more than once. To capture and respond to all items that are continuously being added to a queue, include a [loop](../../luau/control-structures.md) like the following code sample:
diff --git a/content/en-us/cloud-services/memory-stores/sorted-map.md b/content/en-us/cloud-services/memory-stores/sorted-map.md
index 4e4ef4461..212c5d26b 100644
--- a/content/en-us/cloud-services/memory-stores/sorted-map.md
+++ b/content/en-us/cloud-services/memory-stores/sorted-map.md
@@ -1,5 +1,5 @@
---
-title: Memory store sorted map
+title: Memory Store Sorted Map
description: Explains how to implement the sorted map data structure for memory stores.
---
@@ -11,7 +11,7 @@ In addition to the [data structure size limits](../../cloud-services/memory-stor
If you need to store data that surpasses this limit for your experience, you can adopt the sharding technique to split and distribute them through **key prefix** into multiple data structures. Sharding memory stores can also help improve the scalability of your system.
-## Get a sorted map
+## Getting a Sorted Map
To get a sorted map, call `Class.MemoryStoreService:GetSortedMap()` with a **name** you want to define for the map. The name is global within the experience, so you can access the same sorted map on any script using the name.
@@ -33,23 +33,23 @@ After you get a sorted map, call any of the following functions to read or write
`Class.MemoryStoreSortedMap:SetAsync()`
-
[Add](#add-or-overwrite-data) a new key or overwrite the value and/or sort key if the key already exists.
+
[Add](#adding-or-overwriting-data) a new key or overwrite the value and/or sort key if the key already exists.
`Class.MemoryStoreSortedMap:GetAsync()`
-
[Read](#get-data) a particular key.
+
[Read](#getting-data) a particular key.
`Class.MemoryStoreSortedMap:GetRangeAsync()`
-
[Read](#get-data) all existing keys or a specific range of them.
+
[Read](#getting-data) all existing keys or a specific range of them.
`Class.MemoryStoreSortedMap:UpdateAsync()`
-
[Update](#update-data) the value of a key and/or sort key after retrieving it from a sorted map.
+
[Update](#updating-data) the value of a key and/or sort key after retrieving it from a sorted map.
`Class.MemoryStoreSortedMap:RemoveAsync()`
-
[Remove](#remove-data) a key from the sorted map.
+
[Remove](#removing-data) a key from the sorted map.
@@ -58,7 +58,7 @@ After you get a sorted map, call any of the following functions to read or write
All functions accessing data structures in memory stores are asynchronous network calls that might occasionally fail. You should wrap these calls in `Global.LuaGlobals.pcall()` to catch and handle errors, like the code sample in each section does.
-## Add or overwrite data
+## Adding or Overwriting Data
To add a new key or overwrite the value or sort key of a key in the sorted map, call `Class.MemoryStoreSortedMap:SetAsync()` with the key **name**, its **value**, an **expiration time** in seconds and an **optional sort key**. The memory automatically cleans up once the key expires. The maximum expiration time is 3,888,000 seconds (45 days). The sort key, if provided, must be a valid number (integer or floating point) or a string.
@@ -96,11 +96,11 @@ if setSuccess then
end
```
-## Get data
+## Getting Data
You can either get a data value and sort key associated with a specific key or get multiple values and sort keys for keys within a range.
-### Get data with one key
+### Getting Data with One Key
To get a value and sort key associated with one key from the sorted map, call `Class.MemoryStoreSortedMap:GetAsync()` with the key **name**.
@@ -127,7 +127,7 @@ else
end
```
-### Get data with multiple keys
+### Getting Data with Multiple Keys
To get data for multiple keys from the sorted map as a single operation, call `Class.MemoryStoreSortedMap:GetRangeAsync()`. This function lists all existing keys by default, but you can set the upper and lower bounds for the key range. For example, the following code sample retrieves up to 20 items starting from the beginning of the sorted map, with keys greater than or equal to `10`, sort keys greater than or equal to `100` and keys less than or equal to `50`, sort keys less than or equal to `500`.
@@ -156,7 +156,7 @@ if getSuccess then
end
```
-## Update data
+## Updating Data
To retrieve the value and sort key of a key from a sorted map and update it, call `Class.MemoryStoreSortedMap:UpdateAsync()` with the key **name**, a **callback function** to update the value and sort key for this key, and an **expiration time** in seconds. The maximum expiration time is 3,888,000 seconds (45 days).
@@ -194,11 +194,11 @@ The latency for `Class.MemoryStoreSortedMap:UpdateAsync()|UpdateAsync()` is simi
When contention occurs, the system automatically retries the operation until one of these three happens: the operation succeeds, the callback function returns nil, or the maximum number of retries is reached. If the system reaches the maximum number of retries, it returns a conflict.
-## Remove data
+## Removing Data
You can use `Class.MemoryStoreSortedMap:RemoveAsync()` for both removing one key from the sorted map and deleting all data in a memory store sorted map.
-### Remove a key
+### Removing a Key
To remove a key from the sorted map, call `Class.MemoryStoreSortedMap:RemoveAsync()` with a key **name**.
@@ -222,7 +222,7 @@ if not removeSuccess then
end
```
-### Delete all data
+### Deleting All Data
To delete memory in sorted maps, list all your keys with `Class.MemoryStoreSortedMap:GetRangeAsync()`, then remove them with `Class.MemoryStoreSortedMap:RemoveAsync()`.
diff --git a/content/en-us/cloud/legacy.md b/content/en-us/cloud/legacy.md
index 94274c0ee..d65889038 100644
--- a/content/en-us/cloud/legacy.md
+++ b/content/en-us/cloud/legacy.md
@@ -1,5 +1,5 @@
---
-title: Legacy overview
+title: Legacy Overview
description: Lists legacy REST APIs for Open Cloud.
---
diff --git a/content/en-us/cloud/open-cloud/api-keys.md b/content/en-us/cloud/open-cloud/api-keys.md
index 712f1859f..c34c603b4 100644
--- a/content/en-us/cloud/open-cloud/api-keys.md
+++ b/content/en-us/cloud/open-cloud/api-keys.md
@@ -1,5 +1,5 @@
---
-title: Manage API keys
+title: Managing API Keys
description: Explains how to create API keys and add permissions to use Open Cloud web APIs for your experience.
---
@@ -12,7 +12,7 @@ All Open Cloud APIs require you to create an API key with valid permissions and
include an `x-api-key` header in your request, which allows the application to
authenticate to Open Cloud on your behalf.
-## Create API keys
+## Creating API Keys
You can create and configure API keys for your individually-owned
experiences or group-owned experiences (A Roblox
@@ -69,7 +69,7 @@ To create an API key:
your application. Never share it with untrusted parties, such as anyone outside
of your development team.
-## Group-owned API key permissions
+## Group-Owned API Key Permissions
Group owners can manage group-owned API key permissions for group members to
have different levels of control of API keys based on the [roles and
@@ -77,7 +77,7 @@ permissions](../../projects/groups.md#roles-and-permissions) within the group.
There are also situations that automatically revoke API key management
permissions for group members.
-### Permissions granting
+### Permissions Granting
As a group owner, you can grant the **Manage all API keys** permission
to roles within your group. Members with this permission have all the
@@ -88,7 +88,7 @@ You can also grant the **Manage own API keys** permission to roles within your
group. This allows members to only create and view keys owned by them rather
than being able to manage others' keys.
-### Permissions invalidation
+### Permissions Invalidation
There are multiple situations that automatically revoke a group member's
permission to manage group API keys:
@@ -103,10 +103,10 @@ In any of these cases, API keys generated by that user are given the **Revoked**
[status](#api-key-status). To use these keys again, the group owner or a member
with the **Manage all API keys** permission must regenerate the keys.
-## CIDR format
+## CIDR Format
To further protect your resources, when [creating an API
-key](#create-api-keys), specify IP addresses that can access the API key with
+key](#creating-api-keys), specify IP addresses that can access the API key with
either normal IP addresses or using the [CIDR
notation](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation).
A CIDR IP address looks like a normal IP address except it ends with a slash and
@@ -122,7 +122,7 @@ counting the bits of 1s in binary format. In the previous example, **24** means
**192.168.0.255**. Understanding CIDR format is particularly useful if you plan
to run your applications on a server.
-## API key status
+## API Key Status
API keys initially have an active status, but they can become inactive over
their lifetime. To learn why an API key has changed status and how to return the
diff --git a/content/en-us/cloud/open-cloud/data-store-api-handling.md b/content/en-us/cloud/open-cloud/data-store-api-handling.md
index 38fe4c317..35918b53c 100644
--- a/content/en-us/cloud/open-cloud/data-store-api-handling.md
+++ b/content/en-us/cloud/open-cloud/data-store-api-handling.md
@@ -1,5 +1,5 @@
---
-title: Handling API requests for data stores
+title: Handling API Requests for Data Stores
description: Explains how to properly handle parameters of Open Cloud API requests for data stores.
---
@@ -7,7 +7,7 @@ Before sending requests to Open Cloud APIs for [standard data stores](../../refe
## Authorization
-Like all Open Cloud APIs, data store endpoints require all requests to include the `x-api-key` header, which contains an API key with enough permissions for the request. This requires you to apply the key to the experience and the data store, and the endpoint operation is permitted. If the key is invalid, `403 Unauthorized` is returned. For more information on API keys, see [Manage API keys](api-keys.md).
+Like all Open Cloud APIs, data store endpoints require all requests to include the `x-api-key` header, which contains an API key with enough permissions for the request. This requires you to apply the key to the experience and the data store, and the endpoint operation is permitted. If the key is invalid, `403 Unauthorized` is returned. For more information on API keys, see [Managing API Keys](api-keys.md).
## Throttling
@@ -15,14 +15,14 @@ All endpoints have two types of universe level throttling: **request-per-minute
Unlike the Lua API, these limits currently do not scale based on user counts. Exceeding these limits causes the endpoint to return `429 Too Many Requests`.
-### Standard data stores throttling limits
+### Standard Data Stores Throttling Limits
-
Request type
+
Request Type
Method
-
Throttle limits
+
Throttle Limits
Write
@@ -63,14 +63,14 @@ Unlike the Lua API, these limits currently do not scale based on user counts. Ex
-### Ordered data stores throttling limits
+### Ordered Data Stores Throttling Limits
-
Request type
+
Request Type
Method
-
Throttle limits
+
Throttle Limits
Write
@@ -107,7 +107,7 @@ Unlike the Lua API, these limits currently do not scale based on user counts. Ex
-## Input validation
+## Input Validation
Before sending your request, make sure to validate endpoint parameters on formatting requirements and constraints based on the following table. Individual endpoints can have additional requirements beyond these. If a parameter doesn't satisfy the following restrictions, the endpoint returns a `400 Bad Request`.
@@ -332,7 +332,7 @@ The following examples are incorrect `filter` values that can fail your requests
- `10 <= entry` - `entry` and the comparison value are on the wrong side.
- `entry <= 10 && entry <= 50` - `&&` can only be used to specify a range with both two comparison operators for the min and max value.
-### Allow missing flags
+### Allow Missing Flags
When sending requests to the [`Update`](../../reference/cloud/datastores-api/ordered-v1.json#update) method to update an existing ordered data store entry, you can add an optional `allow_missing` flag to allow the creation of an entry even if the entry doesn't exist.
diff --git a/content/en-us/cloud/open-cloud/experience-notifications.md b/content/en-us/cloud/open-cloud/experience-notifications.md
index c8e163caf..e6f1a697a 100644
--- a/content/en-us/cloud/open-cloud/experience-notifications.md
+++ b/content/en-us/cloud/open-cloud/experience-notifications.md
@@ -1,5 +1,5 @@
---
-title: Experience notifications
+title: Experience Notifications
description: Experience Notifications are a way for users to keep up with their favorite experiences through timely, personalized notifications.
---
@@ -14,29 +14,29 @@ import Guidelines from '../../includes/experience-notifications/guidelines.md'
-## Eligibility requirements
+## Eligibility Requirements
-## Usage guidelines
+## Usage Guidelines
## Implementation
-Implementing Experience Notifications begins with [creating a notification string](#create-a-notification-string). Once a notification string is set up, you can [send notifications](#send-an-experience-notification) with optional [custom parameters](#customize-notifications-using-parameters).
+Implementing Experience Notifications begins with [creating a notification string](#creating-a-notification-string). Once a notification string is set up, you can [send notifications](#sending-an-experience-notification) with optional [custom parameters](#customizing-notifications-using-parameters).
Alternatively, you can use the [Engine API](../../production/promotion/experience-notifications.md) to trigger notifications through server-side scripts.
-### Create a notification string
+### Creating a Notification String
-### Send an experience notification
+### Sending an Experience Notification
The [UserNotification](../../cloud/reference/UserNotification) API lets you send Experience Notifications to users. Before using it, you must [generate an API key](../../cloud/open-cloud/api-keys.md) or [configure OAuth 2.0](../../cloud/open-cloud/oauth2-overview.md) for your app. The examples on this page use API keys.
-Notifications will be delivered to [opted-in](https://en.help.roblox.com/hc/en-us/articles/24769602332692-Out-of-Experience-Notifications) users age 13+ through their Roblox notification stream, at which point they can join the experience directly via the **Join** button on the notification and spawn according to your [launch data](#include-launch-and-analytics-data).
+Notifications will be delivered to [opted-in](https://en.help.roblox.com/hc/en-us/articles/24769602332692-Out-of-Experience-Notifications) users age 13+ through their Roblox notification stream, at which point they can join the experience directly via the **Join** button on the notification and spawn according to your [launch data](#including-launch-and-analytics-data).
@@ -73,9 +73,9 @@ Example response which returns the notification ID in the `id` field:
}
```
-### Customize notifications using parameters
+### Customizing Notifications Using Parameters
-To customize the notification for each recipient, you can include **parameters** in the [notification string](#create-a-notification-string), then customize the parameters when calling the API. For example, you can define the notification string as:
+To customize the notification for each recipient, you can include **parameters** in the [notification string](#creating-a-notification-string), then customize the parameters when calling the API. For example, you can define the notification string as:
@@ -100,7 +100,7 @@ curl --location 'https://apis.roblox.com/cloud/v2/users/${UserId}/notifications'
}'
```
-### Include launch and analytics data
+### Including Launch and Analytics Data
To further improve user experience, you can include **launch data** in the notification, useful for scenarios such as routing users to a coordinate location or personalizing the joining experience. Additionally, you can include [analytics](#analytics) data to segment the performance of different categories of notifications.
@@ -125,7 +125,7 @@ curl --location 'https://apis.roblox.com/cloud/v2/users/${UserId}/notifications'
}'
```
-## Delivery system
+## Delivery System
@@ -133,10 +133,10 @@ curl --location 'https://apis.roblox.com/cloud/v2/users/${UserId}/notifications'
-### Notifications summary
+### Notifications Summary
-### Itemized stats
+### Itemized Stats
diff --git a/content/en-us/cloud/open-cloud/index.md b/content/en-us/cloud/open-cloud/index.md
index e9dc9df53..281de3816 100644
--- a/content/en-us/cloud/open-cloud/index.md
+++ b/content/en-us/cloud/open-cloud/index.md
@@ -22,7 +22,7 @@ Whenever possible, use the Open Cloud v2 API. This API has the strongest stabili
The legacy APIs, no matter which types of authentication they support, can incorporate breaking changes without notice and have minimal stability guarantees. They are not part of the Open Cloud v1 or v2 APIs, and we don't recommend them for production applications.
-## Get started with Open Cloud
+## Getting Started with Open Cloud
1. Set up authentication for your application.
diff --git a/content/en-us/cloud/open-cloud/instance.md b/content/en-us/cloud/open-cloud/instance.md
index 68aa07200..6fb4b9171 100644
--- a/content/en-us/cloud/open-cloud/instance.md
+++ b/content/en-us/cloud/open-cloud/instance.md
@@ -1,11 +1,11 @@
---
-title: Engine instances
+title: Engine Instances
description: Explains how to use Open Cloud APIs to access the Roblox Engine Instances.
---
The Engine Open Cloud APIs let you manage `Class.Instance` objects in your Roblox experiences from the web.
-## Beta restrictions
+## Beta Restrictions
These APIs are currently in beta and have the following restrictions:
@@ -27,7 +27,7 @@ These APIs are currently in beta and have the following restrictions:
- Request bodies, such as to [Update Instance](/cloud/reference/Instance#Update-Instance), are limited to 200 KB.
-## List children
+## Listing Children
List all children of a specific instance by specifying an instance ID and
calling the [List Instance Children](/cloud/reference/Instance#List-Instance-Children)
@@ -181,7 +181,7 @@ else:
Scripts contain some additional information in the `Details` object, such as the script type, source, and whether they're enabled.
-## Get an instance
+## Getting an Instance
This method returns a single [Instance](/cloud/reference/Instance).
@@ -229,12 +229,12 @@ curl --include --location --request GET "https://apis.roblox.com/cloud/v2/univer
Just like the List Instance Children method, the response includes an
`Operation` object that you poll to retrieve the actual instance. See
-[Poll for results](#poll-for-results) for more information.
+[Polling for Results](#polling-for-results) for more information.
-## Update instances
+## Updating Instances
After you obtain the appropriate instance ID, you can update it.
-[Poll for results](#poll-for-results) after making the initial update
+[Poll for results](#polling-for-results) after making the initial update
request.
@@ -301,7 +301,7 @@ curl --include --location --request PATCH "https://apis.roblox.com/cloud/v2/univ
If you receive a `TypeError` when attempting to update a script, verify that the script isn't open in Roblox Studio. If it is, close its Script Editor tab. You can also check the Studio output for additional errors, such as `Engine_OC_API: Processing Error - Live scripting session is active`.
-## Poll for results
+## Polling for Results
All current [Instance](/cloud/reference/Instance) methods return an
`Operation` object instead of the resource you requested. This object lets you
@@ -366,7 +366,7 @@ curl --include --location --request GET "https://apis.roblox.com/cloud/v2/univer
-## Potion Shop demo
+## Potion Shop Demo
The Potion Shop Google Sheets demo shows you to update an experience's script
from the web. The demo consists of the following:
@@ -379,7 +379,7 @@ from the web. The demo consists of the following:
updates the **ReplicatedStorage > ItemList** script in the Potion Shop
experience.
-### Set up the demo
+### Setting up the Demo
1. Go to the [Potion Shop Demo](https://www.roblox.com/games/14215142052/Potion-Shop-Demo)
Discover page. Click on the overflow menu, and then **Edit in Studio**.
@@ -391,7 +391,7 @@ from the web. The demo consists of the following:
the name, cost, and colors of the potions. You'll change them later using
Open Cloud!
-### Set up the sheet
+### Setting up the Sheet
1. [Download](../../assets/open-cloud/open-cloud-potion-shop-demo.ods) the
Potion Shop spreadsheet file.
@@ -408,7 +408,7 @@ from the web. The demo consists of the following:
**Update Script** button, click the overflow menu, and select **Assign script**.
1. In the **Assign script** window, enter `UpdateScript` and click **OK**.
-### Create an API key
+### Creating an API Key
1. Go to the [Creator Hub Open Cloud API Keys](https://create.roblox.com/dashboard/credentials?activeTab=ApiKeysTab) page and click **Create API Key**.
1. Fill out the form with the following information.
@@ -421,7 +421,7 @@ from the web. The demo consists of the following:
1. Paste the API key to the API Key cell (D2) on the Intro tab of your Google
Sheet.
-### Obtain the universe and place ID
+### Obtaining the Universe and Place ID
1. Go to the [Creator Hub Creations](https://create.roblox.com/dashboard/creations) page, hover over
the Potion Shop's experience tile, and click the overflow menu.
@@ -430,7 +430,7 @@ from the web. The demo consists of the following:
1. Select **Copy Start Place ID** and paste it into the **Place ID** cell
(F2) on the Intro tab of your Google Sheet.
-### Update the script values
+### Updating the Script Values
1. In the **Update Potion Shop** tab of the sheet, modify any values you'd
like and click the **Update Script** button.
diff --git a/content/en-us/cloud/open-cloud/inventory.md b/content/en-us/cloud/open-cloud/inventory.md
index 12aceddab..f8b111fbf 100644
--- a/content/en-us/cloud/open-cloud/inventory.md
+++ b/content/en-us/cloud/open-cloud/inventory.md
@@ -1,5 +1,5 @@
---
-title: User inventories
+title: User Inventories
description: Covers core use cases for the Inventory API, such as verifying that a user owns a particular item and filtering return values for categories of items.
---
@@ -13,7 +13,7 @@ Responses from the [Inventory API][1] include items from the following categorie
Before using the [Inventory API][1], you must [generate an API key](api-keys.md) or [configure OAuth 2](oauth2-overview.md) for your app. The examples on this page use API keys.
-## Check item ownership
+## Checking Item Ownership
If you want to check whether a user owns a particular item (for example, a limited, badge, pass, or private server), use the `filter` parameter to check for a comma-separated list of one or more IDs. This code sample checks for three asset IDs:
@@ -103,7 +103,7 @@ The following response indicates that the user owns one of the three items:
}
```
-## Filter items
+## Filtering Items
If you want to display, for example, only the collectibles that a user owns, use the same code as above, just with a different `filter` parameter.
@@ -138,7 +138,7 @@ filter=gamePasses=true;badges=true
Most calls to the API do not require any specific permissions, but several filters require Inventory read permissions. For more information, see [Filtering](../reference/patterns.md#list-inventory-items).
-## Paginate results
+## Paginating Results
If a response includes a value for `nextPageToken`, use that value in the
`pageToken` parameter of the subsequent request to retrieve the next page. For
diff --git a/content/en-us/cloud/open-cloud/oauth2-develop.md b/content/en-us/cloud/open-cloud/oauth2-develop.md
index e0bbb1c27..1c134cf74 100644
--- a/content/en-us/cloud/open-cloud/oauth2-develop.md
+++ b/content/en-us/cloud/open-cloud/oauth2-develop.md
@@ -1,5 +1,5 @@
---
-title: OAuth 2.0 app implementation
+title: OAuth 2.0 App Implementation
description: Introduces OAuth 2.0 authentication implementation.
---
@@ -38,7 +38,7 @@ To implement the authorization code flow, your app performs the following steps:
The following sections describe each step in greater depth.
-## Generate a code challenge (for PKCE only)
+## Generating a Code Challenge (For PKCE only)
Before initiating the authorization process, you need to generate a code
challenge from a code verifier. You can use libraries or built-in functions in
@@ -76,7 +76,7 @@ var code_challenge = base64URLEncode(sha256(code_verifier));
For PKCE, you need both the code verifier and challenge values in later steps.
-## Construct the authorization URL
+## Constructing the Authorization URL
See the [authorization endpoint reference documentation](/cloud/reference/oauth2#get-v1authorize)
@@ -121,7 +121,7 @@ https://apis.roblox.com/oauth/v1/authorize?client_id=7290610391231237934964
When users visit the URL, they are taken through the authorization flow. If
successful, Roblox redirects the user to the specified `redirect_uri`.
-## Handle authorization callbacks
+## Handling Authorization Callbacks
When an authorization flow is successful, your app receives a `GET` request from
the Roblox authorization server at the `redirect_uri` that you specified. In the
@@ -155,7 +155,7 @@ parameters.
- The `state` parameter helps your app maintain state in the case of a
failure.
-## Exchange an authorization code for access tokens
+## Exchanging an authorization code for access tokens
When you have parsed the authorization `code`, exchange it for
tokens to access desired Roblox resources:
@@ -179,7 +179,7 @@ tokens to access desired Roblox resources:
}
```
-## Make a call to a resource method
+## Making a call to a resource method
Now that you have the required access token, you can use it to make
authenticated calls to resource methods. Include the access token in the header of all API requests to
diff --git a/content/en-us/cloud/open-cloud/oauth2-overview.md b/content/en-us/cloud/open-cloud/oauth2-overview.md
index b98da70a3..f2b832490 100644
--- a/content/en-us/cloud/open-cloud/oauth2-overview.md
+++ b/content/en-us/cloud/open-cloud/oauth2-overview.md
@@ -1,5 +1,5 @@
---
-title: OAuth 2.0 overview
+title: OAuth 2.0 Overview
description: Introduces the 3rd-party app creation support with OAuth 2.0 authorization framework.
---
@@ -28,7 +28,7 @@ defines the roles involved in the authorization process, the protocol of how
roles interact with each other, and the authorization flows that you need to
follow to develop secure and compatible apps.
- You must be [ID verified](../../production/publishing/account-verification.md#verify-through-government-id)
+ You must be [ID verified](../../production/publishing/account-verification.md#verifying-through-government-id)
to register and publish OAuth 2.0 apps.
@@ -54,7 +54,7 @@ another in authorization flows.
- **Authorization server**: The Roblox server that authenticates the identity of
the resource owner and issues access tokens to the client.
-## Grant types
+## Grant Types
Authorization flows, or grant types, are the steps of actions that roles perform
during the authorization process. Roblox supports the OAuth 2.0 authorization
@@ -62,7 +62,7 @@ code flow and its Proof Key for Code Exchange (PKCE) extension, with different
implementation requirements for apps that are capable or incapable of storing
client secrets.
-### Authorization code flow
+### Authorization Code Flow
Through the authorization code flow, a client exchanges an authorization code
for an access token and a refresh token to complete the authorization process in
@@ -91,7 +91,7 @@ authorization code flow that you'll read in the following sections:
-### Authorization code flow with PKCE
+### Authorization Code Flow with PKCE
The [PKCE extension](https://www.rfc-editor.org/rfc/rfc7636) of the
authorization code flow helps reduce risk of leaking the authorization code and
@@ -136,7 +136,7 @@ process with the following steps:
1. The client retrieves the permitted resources after getting the access token.
-## OpenID Connect support
+## OpenID Connect Support
Roblox uses [OpenID Connect (OIDC)](https://openid.net/connect/) as an
identity layer on top of the OAuth 2.0 protocol for authentication to protect
@@ -145,13 +145,13 @@ of users and obtain their basic public profile information, such as user ID,
usernames, display names, and profile links.
-When [adding permission scopes](oauth2-registration.md#register-an-app) to your app on
+When [adding permission scopes](oauth2-registration.md#registering-an-app) to your app on
**Creator Dashboard**, make sure to select the `openid` identity scope for
receiving an ID token in the token response as part of the authentication
process.
-## Registration and implementation
+## Registration and Implementation
To implement a web or mobile app that uses authorization code flow, you need to:
@@ -163,5 +163,5 @@ To implement a web or mobile app that uses authorization code flow, you need to:
flow. For a complete reference of the OAuth 2.0 endpoints that you need to
call, see the [Authentication](../../cloud/reference/oauth2.md) reference.
-1. Go through the [review process](oauth2-registration.md#submit-for-review)
+1. Go through the [review process](oauth2-registration.md#submitting-for-review)
to get more user quota.
diff --git a/content/en-us/cloud/open-cloud/oauth2-registration.md b/content/en-us/cloud/open-cloud/oauth2-registration.md
index e997223d5..6976d59a1 100644
--- a/content/en-us/cloud/open-cloud/oauth2-registration.md
+++ b/content/en-us/cloud/open-cloud/oauth2-registration.md
@@ -1,5 +1,5 @@
---
-title: OAuth 2.0 app registration
+title: OAuth 2.0 App Registration
description: Explains how to register an app and how the review workflow works.
---
@@ -12,11 +12,11 @@ resources.
You can only register apps for individual accounts or groups that you own.
-## Register your app
+## Registering Your App
To register an app:
-1. In the [Creator Dashboard](https://create.roblox.com/dashboard/creations), go to the [OAuth 2.0 apps](https://create.roblox.com/dashboard/credentials?activeTab=OAuthTab) page.
+1. In the [Creator Dashboard](https://create.roblox.com/dashboard/creations), go to the [OAuth 2.0 Apps](https://create.roblox.com/dashboard/credentials?activeTab=OAuthTab) page.
1. Click the **Create OAuth 2.0 App** button.
1. Enter a valid and globally unique **Application Name**.
1. Read and agree to the **Roblox Terms of Service** and click **Create**.
@@ -27,9 +27,9 @@ To register an app:
1. Click **Continue to Edit** to configure your app, which is described in the
following sections.
-## Configure general information
+## Configuring General Information
-Once you've [registered](#register-your-app) your app, you should configure its general information, including:
+Once you've [registered](#registering-your-app) your app, you should configure its general information, including:
- A description, which is visible to everyone in the Roblox community.
- A thumbnail image for your app. The recommended file size is at least 150x150
@@ -45,7 +45,7 @@ Once you've [registered](#register-your-app) your app, you should configure its
complete it during the review process to publish your app to users.
-## Add permissions
+## Adding Permissions
To ensure proper access control and security within your app, you must add
**Permission Scopes**. There are two types of permission scopes available:
@@ -57,7 +57,7 @@ To ensure proper access control and security within your app, you must add
permission of assets. Select only the minimum number of scopes that you need
for your app.
-## Add redirect URLs
+## Adding Redirect URLs
**Redirect URLs** are the reentry points of your app that users are redirected
to when they finish authorizing your app. Ensure your
@@ -83,7 +83,7 @@ redirect URLs meet the following requirements:
when you have a testable version of your app.
-## Submit for review
+## Submitting for Review
To minimize the chances of malicious apps harming the community, registering an
app doesn't make it broadly accessible. Instead, it remains in **private mode**
@@ -93,7 +93,7 @@ debugging within your team.
If you want to extend the user base for your app, you need to publish it in
public mode by submitting it for review:
-1. Go to the [OAuth 2.0 apps](https://create.roblox.com/dashboard/credentials?activeTab=OAuthTab) page.
+1. Go to the [OAuth 2.0 Apps](https://create.roblox.com/dashboard/credentials?activeTab=OAuthTab) page.
1. Click the **Edit and Publish** button for the app that you want to publish.
1. Fill in all the required information and click the **Review and Publish**
button. A message with limits on your app permissions during the pending
@@ -108,16 +108,16 @@ public mode, and you can't revert it back to private mode.
Regardless of whether your app is approved or rejected, you receive an email
notification of the result when the review is completed.
-## Edit and delet your app
+## Editing and Deleting Your App
You can edit or delete your app with the following steps if it's not under
review:
-1. Go to the [OAuth 2.0 apps](https://create.roblox.com/dashboard/credentials?activeTab=OAuthTab) page.
+1. Go to the [OAuth 2.0 Apps](https://create.roblox.com/dashboard/credentials?activeTab=OAuthTab) page.
1. Click **Edit** or **Delete** for the desired app.
- If you chose to edit an app, follow the same steps and requirements of
- [registration](#register-your-app).
+ [registration](#registering-your-app).
- If you chose to delete an app, click **Yes, Delete** to confirm deletion.
After you delete an app, you can't recover it.
@@ -130,11 +130,11 @@ scopes.
For apps in private mode, the system automatically updates your edits with your
users. For apps in public mode, you must
-[submit the app for review](#submit-for-review) again to reflect these changes.
+[submit the app for review](#submitting-for-review) again to reflect these changes.
Otherwise, the system saves the unpublished changes for you without releasing it
to the community.
You can clone a copy of your public app and keep it in
private mode for iterative testing and debugging. This allows for a controlled
environment where you can safely make changes and resolve any issues before
-submitting the app for review.
+submitting the app for review.
diff --git a/content/en-us/cloud/open-cloud/oauth2-sample.md b/content/en-us/cloud/open-cloud/oauth2-sample.md
index 5738805a1..8c9542c47 100644
--- a/content/en-us/cloud/open-cloud/oauth2-sample.md
+++ b/content/en-us/cloud/open-cloud/oauth2-sample.md
@@ -1,5 +1,5 @@
---
-title: OAuth 2.0 sample app
+title: OAuth 2.0 Sample App
description: Provides a working OAuth 2.0 sample application.
---
@@ -13,14 +13,14 @@ Roblox provides a Node.js sample app that shows how to use OAuth 2.0 to let user
After downloading the `.zip` file, extract it to its own folder.
-## Register the app
+## Registering the App
The first step to setting up the app is to [register it on the Roblox website](oauth2-registration.md) and copy the client ID and secret somewhere safe. Then follow the standard registration steps with these settings:
1. Under **Permissions**, add the `openid`, `profile`, and `universe-messaging-service:publish` scopes.
1. Under **Redirect URLs**, add the `http://localhost:3000/oauth/callback` redirect. If you want to use a non-default port for your app, specify it here.
-## Set environment variables
+## Setting Environment Variables
Rather than storing them in code (not recommended), the app uses environment variables for your client ID and secret. The process for adding environment variables differs by operating system.
@@ -46,7 +46,7 @@ If you specified a non-default port in the redirect URL when registering your ap
These commands only set environment variables for the duration of your terminal session. If you want to load these variables every time you open a new terminal window, add the commands to your shell configuration file, such as `.zshrc` or `.bashrc`. Many hosting services have features to help you add environment variables to your servers.
-## Install dependencies
+## Installing Dependencies
The app has a handful of dependencies, visible in `package.json`. To install them, run:
@@ -54,7 +54,7 @@ The app has a handful of dependencies, visible in `package.json`. To install the
npm ci
```
-## Run the app
+## Running the App
To start the app, run:
@@ -68,12 +68,12 @@ The app immediately redirects you to the Roblox login screen, at which point you
Roblox then redirects you back to `localhost`, where you can see that the app now displays some minimal user information, a link back to your profile on Roblox, and fields that you can use to broadcast messages across your experiences.
-### About the app
+### About the App
In broad strokes, `index.js` performs the following operations:
1. Starts a new web server using `express`.
-1. Retrieves the Roblox OpenID Connect (OIDC) configuration, which includes endpoints for authorization, user information, etc. For more information about these endpoints, see [OAuth 2.0 authentication](../reference/oauth2.md).
+1. Retrieves the Roblox OpenID Connect (OIDC) configuration, which includes endpoints for authorization, user information, etc. For more information about these endpoints, see [OAuth 2.0 Authentication](../reference/oauth2.md).
1. Creates a new Open ID client using `openid-client` and your stored credentials. This client dramatically simplifies the process of properly forming and sending HTTP requests to the OAuth 2.0 endpoints.
1. Defines the routes for the app, including redirects for the login and logout flows and the OAuth 2.0 callback.
1. After a successful login, stores the various tokens as cookies, along with some minimal user information that it displays as HTML with help from `getHomeHtml.js`.
diff --git a/content/en-us/cloud/open-cloud/open-cloud-data-types.md b/content/en-us/cloud/open-cloud/open-cloud-data-types.md
index 5d326a3ce..277456bb1 100644
--- a/content/en-us/cloud/open-cloud/open-cloud-data-types.md
+++ b/content/en-us/cloud/open-cloud/open-cloud-data-types.md
@@ -1,5 +1,5 @@
---
-title: Open Cloud data types
+title: Open Cloud Data Types
description: Explains the different data types of Open Cloud web APIs.
---
diff --git a/content/en-us/cloud/open-cloud/open-cloud-error-handling.md b/content/en-us/cloud/open-cloud/open-cloud-error-handling.md
index e931c7b10..333d5c6d2 100644
--- a/content/en-us/cloud/open-cloud/open-cloud-error-handling.md
+++ b/content/en-us/cloud/open-cloud/open-cloud-error-handling.md
@@ -1,11 +1,11 @@
---
-title: Open Cloud error handling
+title: Open Cloud Error Handling
description: Explains the error model of Open Cloud web APIs.
---
To handle error responses properly, you need to understand the error model shared by all Open Cloud endpoints.
-## Error model
+## Error Model
All standard data stores error responses have the same format, which includes:
@@ -41,14 +41,14 @@ All ordered data stores error responses have the same format, which includes:
The `code` will contain a string of the high-level error while the `message` will contain specific details related to the error
-## Error codes
+## Error Codes
Reference the following table for a summary of all high-level Open Cloud errors.
-
HTTP status code
+
HTTP Status Code
Error
Descriptions
diff --git a/content/en-us/cloud/open-cloud/usage-assets.md b/content/en-us/cloud/open-cloud/usage-assets.md
index 98133c33e..4e57e21ce 100644
--- a/content/en-us/cloud/open-cloud/usage-assets.md
+++ b/content/en-us/cloud/open-cloud/usage-assets.md
@@ -1,5 +1,5 @@
---
-title: Usage guide for assets
+title: Usage Guide for Assets
description: Explains how to use Open Cloud Web APIs for assets to support usage such as uploading and updating.
---
@@ -15,7 +15,7 @@ The [Assets API](../../reference/cloud/assets/v1.json) of Open Cloud allows you
This API contains beta endpoints that might be subject to changes for future releases.
-## Supported asset types and limits
+## Supported Asset Types and Limits
For endpoints that don't create a new asset or update the content of existing assets, there are no restrictions and limits. However, the asset content uploading functionality powered by the **Create Asset** and **Update Asset** endpoints only supports limited types of assets with restrictions. For each call, you can only create or update one asset with the file size up to 20 MB with the following limits:
@@ -26,9 +26,9 @@ Updating asset metadata using the **Update Asset** endpoint is not subject to th
-
Asset type
+
Asset Type
Format
-
Content type
+
Content Type
Restrictions
@@ -127,18 +127,18 @@ Updating asset metadata using the **Update Asset** endpoint is not subject to th
-## Security permissions
+## Security Permissions
The API supports both first-party use with [API key authorization](./api-keys.md) and third-party use in [OAuth 2 applications](./oauth2-overview.md). Each way requires different security permission settings.
-### API keys
+### API Keys
-To use the API in your own scripts or tools, you need to [create an API key](./api-keys.md#create-api-keys) for authorization and security. To manage assets that you own individually, create the API key under your account. To manage group-owned assets, create the API key under the target group. For more information on group-owned API keys, see [Group-owned API key permissions](./api-keys.md#group-owned-api-key-permissions).
+To use the API in your own scripts or tools, you need to [Create an API key](./api-keys.md#creating-api-keys) for authorization and security. To manage assets that you own individually, create the API key under your account. To manage group-owned assets, create the API key under the target group. For more information on group-owned API keys, see [Group-Owned API Key Permissions](./api-keys.md#group-owned-api-key-permissions).
Once you create an API key, you can't switch its ownership between individuals or groups, so if you create an API key under your own account, you can't use it for managing group assets.
-To create an API key for a group or create a group asset, you must have the corresponding permissions. For more information on granting group permissions, see [Group roles and permissions](../../projects/groups.md#roles-and-permissions).
+To create an API key for a group or create a group asset, you must have the corresponding permissions. For more information on granting group permissions, see [Group Roles and Permissions](../../projects/groups.md#roles-and-permissions).
Regardless of whether you are creating the API key for yourself or your group, make sure to add the following permissions:
@@ -152,11 +152,11 @@ Once you have the API key, copy it to the `x-api-key` request header. All endpoi
--header 'x-api-key: ${ApiKey}' \
```
-### OAuth 2.0 apps
+### OAuth 2.0 Apps
-To use the API for a third-party OAuth 2.0 application, add the `asset:read` and `asset:write` permission scopes when [registering your app](./oauth2-registration.md#add-permissions). Choose these scopes based on the requirements of the endpoints you plan to use.
+To use the API for a third-party OAuth 2.0 application, add the `asset:read` and `asset:write` permission scopes when [registering your app](./oauth2-registration.md#adding-permissions). Choose these scopes based on the requirements of the endpoints you plan to use.
-## Create a new asset
+## Creating a New Asset
To upload a new asset by an HTTP request:
@@ -187,7 +187,7 @@ To upload a new asset by an HTTP request:
```
-## Update an existing asset
+## Updating an Existing Asset
Asset updating is powered by beta endpoints that might be subject to changes for future releases.
@@ -267,7 +267,7 @@ curl --location --request PATCH 'https://apis.roblox.com/assets/v1/assets/{asset
-## Retrieve asset operation status
+## Retrieving Asset Operation Status
If your request for creating a new asset or updating an existing asset succeeds, it returns an **Operation ID** in the format of `{ "path": "operations/${operationId}" }`. You can use it to check the status and result of your upload with the following steps:
@@ -311,7 +311,7 @@ If your request for creating a new asset or updating an existing asset succeeds,
2. Select the **Category** of the asset that you want to check.
3. Find the target asset and click its thumbnail to view the asset.
-## Add assets API to OAuth 2.0 apps
+## Adding Assets API to OAuth 2.0 Apps
You can create [OAuth 2.0 applications](../../cloud/open-cloud/oauth2-overview.md) supporting Assets API to allow your users to upload and update assets to Roblox.
@@ -321,9 +321,9 @@ Third-Party app support through OAuth 2.0 is a Beta feature that might be subjec
To use Assets API for your application and request permissions from your users, perform the following settings:
-1. When [registering your application](./oauth2-registration.md#register-an-app), under **Permissions**, select **asset:read** and **asset:write** scopes.
+1. When [registering your application](./oauth2-registration.md#registering-an-app), under **Permissions**, select **asset:read** and **asset:write** scopes.
-1. When [implementing the authorization flow](../../cloud/open-cloud/oauth2-overview.md#implement-authorization-flows), include `asset:read` and `asset:write` as the scope parameters of the authorization URL that redirects users back to your application, like the following example:
+1. When [implementing the authorization flow](../../cloud/open-cloud/oauth2-overview.md#implementing-authorization-flows), include `asset:read` and `asset:write` as the scope parameters of the authorization URL that redirects users back to your application, like the following example:
```plain
https://www.authorize.roblox.com?client_id=819547628404595165403873012&redirect_uri=https://my-app.com/redirect&scope=asset:read+asset:write&response_type=Code&prompts=login+consent&nonce=12345&state=6789
diff --git a/content/en-us/cloud/open-cloud/usage-data-stores.md b/content/en-us/cloud/open-cloud/usage-data-stores.md
index e144ddd78..9c727dd74 100644
--- a/content/en-us/cloud/open-cloud/usage-data-stores.md
+++ b/content/en-us/cloud/open-cloud/usage-data-stores.md
@@ -1,5 +1,5 @@
---
-title: Usage guide for data stores
+title: Usage Guide for Data Stores
description: Explains how to use Open Cloud Web APIs to access and modify data stores by HTTP calls.
---
@@ -31,17 +31,17 @@ Although Open Cloud APIs are similar to the Lua `Class.DataStoreService`, there
- **Data serialization**: All Open Cloud endpoints require you to serialize all data before network transportation. Serialization means to convert an object into that string, and deserialization is its inverse operation (convert a string to an object). The Lua API serializes and deserializes entry content automatically, but for Open Cloud you need to generate or parse your entry data with JSON on your own.
-## Security permissions
+## Security Permissions
Data stores usually store sensitive information, such as user profiles and virtual currency. To maintain security, each Open Cloud API has corresponding required permissions that you must add to your API key, such as the `List Keys` permission for the listing API. If you don't add the required permissions, your API call returns an error. For the specific permissions that are required for each operation, see the API reference of [standard](../../reference/cloud/datastores-api/v1.json) and [ordered data stores](../../reference/cloud/datastores-api/ordered-v1.json).
-When [configuring your API keys](./api-keys.md#create-an-api-key), you can set granular permissions, such as read, write, and list entry, for each data store within a specific experience, or you can give a key to read or write all data stores within an experience. You can also limit access to a subset of data stores needed for your tool instead of exposing all data stores. This mitigates the impact in case your key gets leaked.
+When [configuring your API keys](./api-keys.md#creating-an-api-key), you can set granular permissions, such as read, write, and list entry, for each data store within a specific experience, or you can give a key to read or write all data stores within an experience. You can also limit access to a subset of data stores needed for your tool instead of exposing all data stores. This mitigates the impact in case your key gets leaked.
-## Build tools
+## Building Tools
-You can use the language of your choice to build tools with [Open Cloud APIs for data stores](../../reference/cloud/datastores-api/v1.json) to fulfill your operation needs. The following examples walk through the processes of building a [user inventory support portal](#user-inventory-support-portal) in Python with standard data stores and an [external persistent leaderboard](#external-persistent-leaderboard) using ordered data stores.
+You can use the language of your choice to build tools with [Open Cloud APIs for data stores](../../reference/cloud/datastores-api/v1.json) to fulfill your operation needs. The following examples walk through the processes of building a [user inventory support portal](#user-inventory-support-portal) in Python with standard data stores and an [External Persistent Leaderboard](#external-persistent-leaderboard) using ordered data stores.
-### User inventory support portal
+### User Inventory Support Portal
This section provides a concrete example of building a user inventory support portal in Python, in which you can list and read a subset of your users' inventory, make edits, and then update back to an experience's data store.
@@ -55,7 +55,7 @@ For this example, assume the following:
From a high level, you can build your Python app by adding API key permissions and then adding scripts.
-#### Add API key permissions for data stores
+#### Adding API Key Permissions for Data Stores
When [creating an API Key](./api-keys.md) for this example, make sure you perform the following settings:
@@ -76,7 +76,7 @@ When [creating an API Key](./api-keys.md) for this example, make sure you perfor
1. In the **Security** section, explicitly set IP access to the key using [CIDR notation](./api-keys.md#cidr-format), and set an explicit expiration date so your key automatically stops working after that date. For this example, if you plan to do local testing first, you can remove the IP restriction by setting it to **0.0.0.0/0** and let it expire in **30 days**.
-#### Add scripts for the user inventory support portal
+#### Adding Scripts for the User Inventory Support Portal
After creating the API key with permissions required for the example app, you need to add Python scripts to perform app functionalities. The `data_stores_methods.py` file shows how to define [`List Entries`](../../reference/cloud/datastores-api/v1.json#list-entries), [`Get Entry`](../../reference/cloud/datastores-api/v1.json#get-entry), and [`Increment Entry`](../../reference/cloud/datastores-api/v1.json#increment-entry) methods. The `update_inventory` file uses the defined methods to list a subset of user inventories, increase the virtual currency for each user, and update the data.
@@ -187,7 +187,7 @@ export API_KEY=... \
python update_inventory
```
-### External persistent leaderboard
+### External Persistent Leaderboard
This section walks through a concrete example of creating an external persistent leaderboard in Python, in which you can list and read your users information stored in ordered data stores, make edits, and then publish to an external website for promotion.
@@ -199,7 +199,7 @@ For this example, assume the following:
From a high level, you can build your Python app by adding API key permissions and then adding scripts.
-#### Add API key permissions for ordered data stores
+#### Adding API Key Permissions for Ordered Data Stores
The example app requires four methods to achieve its functionalities: [`List`](../../reference/cloud/datastores-api/ordered-v1.json#list), [`Create`](../../reference/cloud/datastores-api/ordered-v1.json#create), [`Update`](../../reference/cloud/datastores-api/ordered-v1.json#update) and [`Increment`](../../reference/cloud/datastores-api/ordered-v1.json#increment), so you need to add the following API key permissions:
@@ -217,7 +217,7 @@ When [creating an API Key](./api-keys.md) for this example, make sure you perfor
1. In the **Security** section, explicitly set IP access to the key using [CIDR notation](./api-keys.md#cidr-format), and set an explicit expiration date so your key automatically stops working after that date. For this example, if you plan to do local testing first, you can remove the IP restriction by setting it to **0.0.0.0/0** and let it expire in **30 days**.
-#### Add scripts for the leaderboard
+#### Adding Scripts for the Leaderboard
After creating the API key with permissions required for the example app, you need to add Python scripts to perform app functionalities.
diff --git a/content/en-us/cloud/open-cloud/usage-messaging.md b/content/en-us/cloud/open-cloud/usage-messaging.md
index dc979980a..b03d6e76c 100644
--- a/content/en-us/cloud/open-cloud/usage-messaging.md
+++ b/content/en-us/cloud/open-cloud/usage-messaging.md
@@ -1,5 +1,5 @@
---
-title: Messaging usage guide
+title: Messaging Usage Guide
description: Explains how to use Open Cloud Messaging Service API to support cross-server messaging.
---
@@ -27,7 +27,7 @@ Limit | Description
**Topic size** | 80 characters
**Message size** | 1,024 characters (1 KB)
-## Set up a topic for messaging
+## Setting up a Topic for Messaging
Before you can publish a message to all of your experience's live servers, you need to set up a **topic**, which is a customized message channel that is accessible from multiple servers. After defining a **topic**, you need to subscribe users to the **topic** for receiving your incoming messages.
@@ -53,11 +53,11 @@ end
Players.PlayerAdded:Connect(onPlayerAdded)
```
-## Publish messages to live servers
+## Publishing Messages to Live Servers
-After [setting up](#set-up-a-topic-for-messaging) a **topic**, you can publish a message to all of your experience's live servers with the following steps:
+After [setting up](#setting-up-a-topic-for-messaging) a **topic**, you can publish a message to all of your experience's live servers with the following steps:
-1. [Create an API key](./api-keys.md#create-an-API-key) on [Creator Dashboard](https://create.roblox.com/credentials). Make sure you perform the following settings:
+1. [Create an API key](./api-keys.md#creating-an-API-key) on [Creator Dashboard](https://create.roblox.com/credentials). Make sure you perform the following settings:
1. Add **messaging-service** to **Access Permissions**.
2. Add **Publish** operation to your selected experience.
@@ -88,7 +88,7 @@ After [setting up](#set-up-a-topic-for-messaging) a **topic**, you can publish a
4. Call the API to send the message out.
-## Add Messaging Service API to OAuth 2.0 apps
+## Adding Messaging Service API to OAuth 2.0 Apps
You can create [OAuth 2.0 applications](../../cloud/open-cloud/oauth2-overview.md) supporting Messaging Service API to allow your users to publish messages to live servers through your OAuth 2.0 application.
@@ -98,14 +98,14 @@ Third-party app support through OAuth 2.0 is a beta feature that might be subjec
To use Messaging Service API for your application and request permissions from your users, perform the following settings:
-1. When [registering your application](./oauth2-registration.md#register-an-app), under **Permissions**, select the **universe-messaging-service:publish** scope.
-2. When [implementing the authorization flow](../../cloud/open-cloud/oauth2-overview.md#implement-authorization-flows), include `universe-messaging-service:publish` in the `scope` parameter of the authorization URL that redirects users back to your application, like the following example:
+1. When [registering your application](./oauth2-registration.md#registering-an-app), under **Permissions**, select the **universe-messaging-service:publish** scope.
+2. When [implementing the authorization flow](../../cloud/open-cloud/oauth2-overview.md#implementing-authorization-flows), include `universe-messaging-service:publish` in the `scope` parameter of the authorization URL that redirects users back to your application, like the following example:
```plain
https://www.authorize.roblox.com?client_id=816547628409595165403873012&redirect_uri=https://my-app.com/redirect&scope=openid+universe-messaging-service:publish&response_type=Code&prompts=login+consent&nonce=12345&state=6789
```
-3. Request access to the `universeId` of the experience that the user wants to publish their messages to. Your application can send a `POST` request to the [token resources endpoint](../reference/oauth2.md#token-exchange) with the access token, client ID and secret or the `code challenge`, depending on your [implementation of your authorization flow](../../cloud/open-cloud/oauth2-overview.md#implement-authorization-flows), as request parameters to get a list of `universeIds` of experiences that the user granted permission to:
+3. Request access to the `universeId` of the experience that the user wants to publish their messages to. Your application can send a `POST` request to the [token resources endpoint](../reference/oauth2.md#token-exchange) with the access token, client ID and secret or the `code challenge`, depending on your [implementation of your authorization flow](../../cloud/open-cloud/oauth2-overview.md#implementing-authorization-flows), as request parameters to get a list of `universeIds` of experiences that the user granted permission to:
```bash title="Example Request"
curl --location --request POST 'https://apis.roblox.com/oauth/v1/token/resources' \
diff --git a/content/en-us/cloud/open-cloud/usage-place-publishing.md b/content/en-us/cloud/open-cloud/usage-place-publishing.md
index 52496cc2a..ff5de7bf4 100644
--- a/content/en-us/cloud/open-cloud/usage-place-publishing.md
+++ b/content/en-us/cloud/open-cloud/usage-place-publishing.md
@@ -1,9 +1,9 @@
---
-title: Usage guide for Place Publishing
+title: Usage Guide for Place Publishing
description: Explains how to use Open Cloud Place Publishing API to publish places programmatically with version control.
---
-[Place Publishing API](../../reference/cloud/universes-api/v1.json) fulfills the same functionality as [publishing to Roblox](../../production/publishing/publish-experiences-and-places.md) in Studio plus extra permission control and automation in continuous release workflow. You can use this API to update existing places of an experience to a new version, making it useful to automate your publishing workflow. For example, you can call this API from a GitHub action, and it automatically pushes a binary place file to Roblox Cloud after successful integration testing.
+[Place Publishing API](../../reference/cloud/universes-api/v1.json) fulfills the same functionality as [Publish to Roblox](../../production/publishing/publishing-experiences-and-places.md) in Studio plus extra permission control and automation in continuous release workflow. You can use this API to update existing places of an experience to a new version, making it useful to automate your publishing workflow. For example, you can call this API from a GitHub action, and it automatically pushes a binary place file to Roblox Cloud after successful integration testing.
This API only supports HTTPS requests.
@@ -11,15 +11,15 @@ This API only supports HTTPS requests.
## Places on Roblox
-Experiences on Roblox can have multiple places, with one **starting place** as the user entry point of your experience and optional other places that you can [teleport users between](../../projects/teleport.md). You can use the API to publish either the starting place or other places of your experience with version control.
+Experiences on Roblox can have multiple places, with one **starting place** as the user entry point of your experience and optional other places that you can [teleport users between](../../projects/teleporting.md). You can use the API to publish either the starting place or other places of your experience with version control.
Before you can update an existing place of an experience, you need the place's **Place ID** and the experience's **Universe ID**. The **Place ID** identifies the place and the **Universe ID** identifies the experience. Each is unique even if your experience has only one place.
-## Publish a place
+## Publishing a Place
To publish an existing place of an experience with [Place Publishing API](../../reference/cloud/universes-api/v1.json):
-1. [Create an API key](./api-keys.md#create-an-API-key) on the **Creator Dashboard**. Make sure you perform the following settings:
+1. [Create an API key](./api-keys.md#creating-an-API-key) on the **Creator Dashboard**. Make sure you perform the following settings:
1. Add **universe-places** to **Access Permissions**.
1. Add **Write** operation to your selected experience.
diff --git a/content/en-us/cloud/reference/errors.md b/content/en-us/cloud/reference/errors.md
index cdb925980..3fcfe1e57 100644
--- a/content/en-us/cloud/reference/errors.md
+++ b/content/en-us/cloud/reference/errors.md
@@ -6,7 +6,7 @@ description: Defines the errors that are returned by Open Cloud APIs
The following sections describe the error model for v2 and v1 resource methods,
respectively.
-## v2 resource error model
+## v2 Resource Error Model
By default, resource methods respond with a 200 OK status. When requests are
unsuccessful, Open Cloud returns standard error codes. All error responses have
@@ -89,7 +89,7 @@ The following table describes possible values for `code`.
-## v1 resource error model
+## v1 Resource Error Model
All error responses have the same, standard format, which includes:
diff --git a/content/en-us/cloud/reference/index.md b/content/en-us/cloud/reference/index.md
index dbd89ba9e..dadd5cf0f 100644
--- a/content/en-us/cloud/reference/index.md
+++ b/content/en-us/cloud/reference/index.md
@@ -1,5 +1,5 @@
---
-title: Open Cloud API reference
+title: Open Cloud API Reference
description: Get comprehensive API reference documentation for the entire Open Cloud platform.
---
@@ -11,6 +11,6 @@ The **Common Components** section of the reference documentation includes concep
- [Patterns](../../cloud/reference/patterns.md) - Special considerations and patterns for making requests and handling responses.
- [Types](../../cloud/reference/types.md) - How to handle common types used by Open Cloud in requests and responses.
- [Errors](../../cloud/reference/errors.md) - Handling errors when working with resources.
-- [OpenAPI descriptions](../../cloud/reference/openapi.md) - Streamline development with OpenAPI descriptions of Open Cloud APIs.
+- [OpenAPI Descriptions](../../cloud/reference/openapi.md) - Streamline development with OpenAPI descriptions of Open Cloud APIs.
Each page in the **Resources** section represents a resource and includes all available operations for that resource.
diff --git a/content/en-us/cloud/reference/oauth2.md b/content/en-us/cloud/reference/oauth2.md
index d7f049008..b656aeb5a 100644
--- a/content/en-us/cloud/reference/oauth2.md
+++ b/content/en-us/cloud/reference/oauth2.md
@@ -1,5 +1,5 @@
---
-title: OAuth 2.0 authentication
+title: OAuth 2.0 Authentication
description: Describes how to make authenticated calls to Open Cloud with API keys and OAuth 2.0
---
@@ -70,7 +70,7 @@ The authorization code:
- Can only be redeemed once.
- Is invalid after one use.
-## Token exchange
+## Token Exchange
To obtain tokens to access APIs, exchange an **authorization code** for a set of
confidential tokens. All token endpoints support two types of client
@@ -83,7 +83,7 @@ authentication:
The following list describes the various tokens you receive from this
endpoint.
-- **Access token** - Represents the authorization from a creator or user for a
+- **Access Token** - Represents the authorization from a creator or user for a
third-party app to access their protected Roblox resources. It's a string
denoting a specific scope, lifetime, and other access attributes. Once the
Roblox authorization server issues an access token to an app, the token:
@@ -92,7 +92,7 @@ endpoint.
- Can be used multiple times before it expires.
- Can be invalidated before it expires if an app user revokes the authorization.
-- **Refresh token** - Refreshes an authorization session. An app can use
+- **Refresh Token** - Refreshes an authorization session. An app can use
the refresh token to obtain a new set of tokens, which includes an access token,
a refresh token, and an ID token. A refresh token:
@@ -100,7 +100,7 @@ endpoint.
- Can only be used once before it expires to refresh tokens.
- Can be invalidated before it expires if an app user revokes the authorization.
-- **ID token** - Provides proof that a user's identity has been authenticated. Its
+- **ID Token** - Provides proof that a user's identity has been authenticated. Its
content depends on the scopes requested and can contain basic user information,
including a user's Roblox display name and username. The ID token is only for
identity authentication purposes and doesn't provide access to any Roblox
diff --git a/content/en-us/cloud/reference/openapi.md b/content/en-us/cloud/reference/openapi.md
index 736246c15..9ade6b44b 100644
--- a/content/en-us/cloud/reference/openapi.md
+++ b/content/en-us/cloud/reference/openapi.md
@@ -1,5 +1,5 @@
---
-title: OpenAPI descriptions
+title: OpenAPI Descriptions
description: Provides links to the Open Cloud JSON files that are compliant to the OpenAPI Specification, explains their use cases, and outlines additional information.
---
@@ -9,7 +9,7 @@ These files are open source and can be used with tools like the [Swagger Editor]
These OpenAPI descriptions are still under active development and may contain issues. The pages under the **Resources** section are the official reference.
-## OpenAPI description files
+## OpenAPI Description Files
OpenAPI description files are available at the following locations within the [creator-docs](https://github.com/Roblox/creator-docs/tree/main/content/en-us/reference/cloud) repository:
@@ -33,7 +33,7 @@ https://github.com/Roblox/creator-docs/blob/main/content/en-us/reference/cloud/m
https://github.com/Roblox/creator-docs/blob/main/content/en-us/reference/cloud/universes-api/v1.json
```
-### Vendor extensions
+### Vendor Extensions
Roblox uses [specification extensions](https://spec.openapis.org/oas/v3.0.4#specification-extensions) to extend the OpenAPI specification. These extensions represent information that the specification doesn't capture by default. Extensions may appear throughout the file where allowed by the OpenAPI specification.
@@ -43,7 +43,7 @@ The majority of these specification extensions are experimental. The extensions
The OpenAPI descriptions for V1 and V2 resources utilitize distinct specification extensions due to underlying implementation differences.
-**V1 resource specification extensions**
+**V1 Resource Specification Extensions**
| Extension | Location | Description |
|------------------------------------------------- |------------------ |------------------------------------------------------------------------------------------------- |
@@ -52,7 +52,7 @@ The OpenAPI descriptions for V1 and V2 resources utilitize distinct specificatio
| `x-roblox-cloud-api-operation-code-samples` | Operation Object | Object. A list of code samples, an object with the language/title and the corresponding script. |
| `x-roblox-cloud-api-operation-throttling-limit` | Operation Object | Object. The throttling limits for the operation. |
-**V2 resource specification extensions**
+**V2 Resource Specification Extensions**
| Extension | Location | Description |
|--------------------------------------- |------------------ |--------------------------------------------------------------------------------------------------------------- |
diff --git a/content/en-us/cloud/reference/patterns.md b/content/en-us/cloud/reference/patterns.md
index 4489faa7e..7741642f5 100644
--- a/content/en-us/cloud/reference/patterns.md
+++ b/content/en-us/cloud/reference/patterns.md
@@ -24,7 +24,7 @@ You can probably infer the difference between the two: some user restrictions ap
Many APIs return a path as part of their response, which you can use to make further requests. If an API needs more than a few seconds to fulfill a request, it often returns an [operation](#long-running-operations) rather than the resource or response itself.
-## Content length and type
+## Content Length and Type
Many API calls, particularly those that create or update resources, require a JSON request body. If your request has a body, be sure to include the `Content-Length` and `Content-Type` headers. Most HTTP clients add these headers automatically.
@@ -62,7 +62,7 @@ GET /cloud/v2/users/{userId}/inventory-items?maxPageSize=25&pageToken=aaaBBB
Aside from the `pageToken`, you must use the same query for pagination to work
properly. Altering any filter parameter results in a 400 error.
-## Long running operations
+## Long Running Operations
Some methods return an `Operation` object that represents a long-running request
that returns an asynchronous response later. The object contains the following
@@ -115,7 +115,7 @@ def PollForResults(operationPath):
currentRetries += 1
```
-For a more complete code sample that uses a fixed retry interval rather than exponential backoff, see [Polling for Results](../open-cloud/instance.md#poll-for-results).
+For a more complete code sample that uses a fixed retry interval rather than exponential backoff, see [Polling for Results](../open-cloud/instance.md#polling-for-results).
## Filtering
@@ -123,7 +123,7 @@ Some methods let you filter the response by including a `filter` parameter in
the request. The following sections describe filter syntax and guidelines for
the specified endpoints.
-### List group memberships
+### List Group Memberships
The wildcard character `-` can be used in place of group ID in order to list
memberships across all groups: `groups/-/memberships`.
@@ -145,7 +145,7 @@ memberships by user (up to 50) in the following format:
- **User filter**: `filter="user in ['users/1', 'users/156', 'users/9876543210', ...]"`
-### List inventory items
+### List Inventory Items
You can filter by collectible status, inventory item type, and inventory
item ID. If you don't provide a filter, the user's entire inventory is returned.
@@ -163,7 +163,7 @@ The filter format is a semicolon-separated list:
You can't combine type and ID fields in the same filter.
-#### Type fields
+#### Type Fields
| Filter | Type | Description |
| :------------------------ | :------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -173,7 +173,7 @@ You can't combine type and ID fields in the same filter.
| `onlyCollectibles` | boolean | Include **only** collectibles in the response. Default is false. This field must be used with the `inventoryItemAssetTypes` field in order to return items and only returns non-UGC limited items. |
| `privateServers` | boolean | Include private servers in the response. Default is false. Must have Inventory read scope to filter by this field. |
-#### ID fields
+#### ID Fields
| Filter | Type | Description |
| :----------------- | :----- | :--------------------------------------------------------------------------------------------------------------------- |
diff --git a/content/en-us/cloud/webhooks/automate-right-to-erasure.md b/content/en-us/cloud/webhooks/automate-right-to-erasure.md
index 0b0611703..4551d18b4 100644
--- a/content/en-us/cloud/webhooks/automate-right-to-erasure.md
+++ b/content/en-us/cloud/webhooks/automate-right-to-erasure.md
@@ -1,5 +1,5 @@
---
-title: Automate right to erasure requests
+title: Automating Right to Erasure Requests
description: Explains how to automate Right to Erasure requests with webhooks and Open Cloud APIs for data stores.
---
@@ -21,11 +21,11 @@ Upon completing this tutorial, you should be able to create a locally-running cu
-## Configure a webhook with third-party integration
+## Configuring a Webhook with Third-Party Integration
Before creating a bot, set up a server with webhook integration on the third-party messaging application. Then use the server to configure a webhook on Creator Dashboard.
-### Set up a server
+### Setting Up a Server
The following steps show how to set up the server using Guilded or Discord.
@@ -50,23 +50,23 @@ The following steps show how to set up the server using Guilded or Discord.
-### Configure a webhook on Roblox
+### Configuring a Webhook on Roblox
-After obtaining the third-party server URL, use it to [configure a webhook](../../cloud/webhooks/webhook-notifications.md#configure-webhooks-on-creator-dashboard) on Creator Dashboard. make sure you perform the following settings:
+After obtaining the third-party server URL, use it to [configure a webhook](../../cloud/webhooks/webhook-notifications.md#configuring-webhooks-on-creator-dashboard) on Creator Dashboard. make sure you perform the following settings:
Currently, only group owners can receive Right to Erasure requests for group-owned experiences. To implement the automation solution for a group-owned experience, make sure that the group owner configures the webhook.
- Add the Guilded or Discord server URL as the **Webhook URL**.
-- Include a custom **Secret**. Though a secret is optional for completing the configuration, you should include one to prevent bad actors from impersonating Roblox and deleting your data. For more information on the usage of a secret, see [Verify webhook security](../../cloud/webhooks/webhook-notifications.md#verifying-webhook-security).
+- Include a custom **Secret**. Though a secret is optional for completing the configuration, you should include one to prevent bad actors from impersonating Roblox and deleting your data. For more information on the usage of a secret, see [Verifying Webhook Security](../../cloud/webhooks/webhook-notifications.md#verifying-webhook-security).
- Select **Right to Erasure Request** under **Triggers**.
You can test the webhook using the **Test Response** button to see if you receive a notification in your server's **#general** channel from Roblox. If you don't receive the notification, try again or check your server settings to troubleshoot the error.
-## Configure a bot
+## Configuring a Bot
After you add the webhook, use it to configure the bot with the following steps:
@@ -106,11 +106,11 @@ After you add the webhook, use it to configure the bot with the following steps:
-## Create an Open Cloud API key
+## Creating an Open Cloud API Key
-To allow your third-party bot to access your data stores for storing PII data of users, [create an Open Cloud API key](https://create.roblox.com/docs/reference/cloud/manage-api-keys) that can access your experiences and add the **Delete Entry** permission of data stores for data deletion. If you use ordered data stores for storing PII, you also need to add the **Write** permission of ordered data stores. After completion, copy and save the API key in a secure location to use it in later steps.
+To allow your third-party bot to access your data stores for storing PII data of users, [create an Open Cloud API key](https://create.roblox.com/docs/reference/cloud/managing-api-keys) that can access your experiences and add the **Delete Entry** permission of data stores for data deletion. If you use ordered data stores for storing PII, you also need to add the **Write** permission of ordered data stores. After completion, copy and save the API key in a secure location to use it in later steps.
-## Obtain identifiers of experiences and places
+## Obtaining Identifiers of Experiences and Places
For the bot to locate the PII data requested by users for deletion, obtain the following identifiers of all experiences that you intend to use the bot for:
@@ -121,7 +121,7 @@ To obtain these identifiers, open the [Creations](https://create.roblox.com/dash
-## Add scripts
+## Adding Scripts
After you finish setting up the webhook, bot, and API key for data stores, add them to the scripts that implement the bot's automation logic. The following example uses Python 3:
@@ -465,7 +465,7 @@ After you finish setting up the webhook, bot, and API key for data stores, add t
To ensure constant and secure execution of the scripts, save and run them locally only. Keep your local device or virtual machine running the scripts turned on at all times. In the event that your device goes offline, you need to manually manage any missed messages during the offline period and handle delivery failures according to the [retry policy](../../cloud/webhooks/webhook-notifications.md#delivery-failure-retry-policy).
-## Test
+## Testing
You can create and run a test message to verify that your custom program can properly handle right to erasure requests and delete PII data:
diff --git a/content/en-us/cloud/webhooks/webhook-notifications.md b/content/en-us/cloud/webhooks/webhook-notifications.md
index cbe816f85..6e7523b10 100644
--- a/content/en-us/cloud/webhooks/webhook-notifications.md
+++ b/content/en-us/cloud/webhooks/webhook-notifications.md
@@ -1,5 +1,5 @@
---
-title: Webhook notifications
+title: Webhook Notifications
description: Explains how to set up webhooks to automate your notification management workflow.
---
@@ -9,13 +9,13 @@ Instead of manually monitoring all events in your experience and requests from u
Currently, Roblox fully supports webhook notifications for Discord, Guilded, and Slack. Using webhooks with other third-party tools carries the risk of not receiving all notifications.
-## Webhook workflow
+## Webhook Workflow
Webhooks send real-time notifications or data between two different applications or services, such as Roblox and a third-party messaging tool. Unlike traditional APIs, which require you to set up a client application to send requests to a server to receive data, webhooks send data to your client endpoint as soon as an event occurs. They're useful for automating workflows between Roblox and third-party applications that you use for collaborating with your team, as they allow for real-time data sharing and processing.
Once you set up a webhook, whenever a target event occurs, Roblox sends a request to the webhook URL you provide. The webhook URL then redirects the request to your receiving application or custom endpoint, which can take action based on the data included in the webhook payload. This could include erasing data for GDPR, sending a confirmation to the user, or triggering another event.
-## Supported triggers
+## Supported Triggers
Roblox currently supports the following event triggers for notifications:
@@ -26,10 +26,9 @@ Roblox currently supports the following event triggers for notifications:
- **Subscription Resubscribed** - When a user resubscribes to a subscription, a message is sent containing the subscription and subscriber.
- ["Right to be forgotten"](https://gdpr.eu/right-to-be-forgotten/) data deletion requests under the General Data Protection Regulation (**GDPR**).
-For more information on subscription events and their fields, see the [Cloud API Subscription](../../cloud/reference)
-(../../cloud/reference/Subscription) reference.
+For more information on subscription events and their fields, see the [Cloud API Subscription](../../cloud/reference/Subscription) reference.
-## Configure webhooks on Creator Dashboard
+## Configuring Webhooks on Creator Dashboard
To receive notifications through webhooks, you need to configure a webhook that subscribes to certain events for triggering notifications. For group-owned experiences, only group owners can configure and receive webhook notifications.
@@ -42,9 +41,9 @@ To set up a webhook:
1. Navigate to the [Webhooks](https://create.roblox.com/settings/webhooks) section of the [Creator Dashboard](https://create.roblox.com/settings/webhooks).
1. Click the **Add Webhook** button.
1. Complete the configuration fields:
- 1. **Webhook URL** — Specify the URL where you want to receive notifications and accept incoming webhook URLs from third-party entities. For more information on the requirements, see [Set up webhook URLs](#set-up-webhook-urls).
+ 1. **Webhook URL** — Specify the URL where you want to receive notifications and accept incoming webhook URLs from third-party entities. For more information on the requirements, see [Setting up Webhook URLs](#setting-up-webhook-urls).
2. **Name** — Use a custom name to differentiate your configuration from others. By default the value is the same as the Webhook URL.
- 3. **Secret** (optional) — Supply a secret if you want to verify that notifications you receive are coming from Roblox. For more information, see [Verify webhook security](#verify-webhook-security).
+ 3. **Secret** (optional) — Supply a secret if you want to verify that notifications you receive are coming from Roblox. For more information, see [Verifying Webhook Security](#verifying-webhook-security).
4. **Triggers** — Choose one or more options from the list of [supported triggers](#supported-triggers) of events for which you want to receive notifications.
1. Click the **Save Changes** button.
@@ -52,7 +51,7 @@ To set up a webhook:
Currently, you can configure up to 5 webhooks in total.
-## Set up webhook URLs
+## Setting up Webhook URLs
You can set up a custom HTTP service endpoint as your webhook URL, provided it fulfills the following requirements:
@@ -68,11 +67,11 @@ When your endpoint receives a POST request, it must be able to:
For more information of the schema of POST requests to handle, see the [Payload Schema](#payload-schema).
-### Delivery failure retry policy
+### Delivery Failure Retry Policy
-When a webhook notification fails to reach your specified URL due to errors such as endpoint unavailability, Roblox retries sending the message to the configured URL 5 times using a fixed window size. If the notification still fails to be delivered after 5 attempts, Roblox stops trying to send the notification and assumes that the URL is no longer valid. In this situation, you need to update your webhook configuration with a new URL that is reachable and able to receive notifications. To troubleshoot and confirm that your webhook URL can successfully receive notifications, see [Test webhooks](#test-webhooks).
+When a webhook notification fails to reach your specified URL due to errors such as endpoint unavailability, Roblox retries sending the message to the configured URL 5 times using a fixed window size. If the notification still fails to be delivered after 5 attempts, Roblox stops trying to send the notification and assumes that the URL is no longer valid. In this situation, you need to update your webhook configuration with a new URL that is reachable and able to receive notifications. To troubleshoot and confirm that your webhook URL can successfully receive notifications, see [Testing Webhooks](#testing-webhooks).
-### Third-party requirements
+### Third-Party Requirements
Third-party tools usually have their own requirements for webhooks that you need to follow when setting up your webhook URL. You can find these requirements by searching for the keyword "webhook" on the support or documentation site of the target tool. For the three supported third-party tools, see the following:
@@ -80,7 +79,7 @@ Third-party tools usually have their own requirements for webhooks that you need
- [Guilded Support](https://support.guilded.gg/hc/en-us)
- [Slack API Reference](https://api.slack.com/)
-## Test webhooks
+## Testing Webhooks
You can test whether the webhook you've configured can successfully receive notifications on the [Creator Dashboard](https://create.roblox.com/dashboard/creations):
@@ -107,7 +106,7 @@ Body: {
If you are integrating your webhook with a third-party service, you can test it using the third-party URL to confirm that the service can successfully receive notifications from your webhook. If you provide a secret when configuring the webhook, it also generates a `roblox-signature` that you can use to test the `roblox-signature` logic.
-## Verify webhook security
+## Verifying Webhook Security
Once you configure your server to receive payloads, it starts to listen for any payload sent to the endpoint. If you set a secret when configuring your webhook, Roblox sends a `roblox-signature` along with every webhook notification to help protect your data security. This way, you can use the it to verify that the notification is from Roblox and limit your server to only receive requests originating from Roblox. The signature is in the payload header for custom endpoints and in the footer for third-party servers.
@@ -128,7 +127,7 @@ If you don't have a secret for your webhook, the signature you receive only cont
To verify a signature:
-
+
1. Extract the timestamp and signature values. All signatures for webhooks with secrets share the same format as a CSV string with these two values following by the prefixes:
@@ -149,7 +148,7 @@ To verify a signature:
-
+
1. Extract the timestamp value from the `Timestamp` footer of the notification.
@@ -176,7 +175,7 @@ To verify a signature:
-## Payload schema
+## Payload Schema
When the target event of your webhook is triggered, it sends a request to your webhook URL, including information about the event in the payload. All payloads of requests share the same schema that consists of fixed and variable fields. This ensures that the data transmitted in the payload is structured and consistent, making it easier for the receiving application to process and use the data.
@@ -217,7 +216,7 @@ Body:{
}
```
-## Handle notifications
+## Handling Notifications
If you store any **Personally Identifiable Information (PII)** of your users, such as their User IDs, you must delete this information when a user submits such a request to comply with the GDPR [right to erasure](https://gdpr-info.eu/art-17-gdpr/) compliance requirements. You can create a bot to handle webhook notifications and help automate data deletion, provided you're storing PII in a data store. See [Automating Right to Erasure Requests Deletion](../../cloud/webhooks/automate-right-to-erasure.md) for an example on how to create a bot within Guilded or Discord that uses the [Open Cloud API for data stores](../../cloud/open-cloud/usage-data-stores.md) to delete PII data as an automation solution. This example can be adapted for handling other notifications, such as subscription events.
diff --git a/content/en-us/creation.md b/content/en-us/creation.md
index 3440edf78..1a5a30b11 100644
--- a/content/en-us/creation.md
+++ b/content/en-us/creation.md
@@ -1,5 +1,5 @@
---
-title: Creation overview
+title: Creation Overview
description: Learn everything you need to know about creating on Roblox.
next: /tutorials/first-experience
prev: /platform
@@ -10,7 +10,7 @@ prev: /platform
If you're new to developing Roblox experiences, read these guides for a tour of
Roblox creation before diving into the product documentation and tutorials.
-## The Roblox platform
+## The Roblox Platform
Roblox is free-to-use for both users and creators and spans a broad
demographic with different user behaviors than other social platforms. Learn
@@ -24,7 +24,7 @@ what makes Roblox unique and what to think about before creating.
Overview
Learn about our unique platform and values.
-
+
@@ -32,18 +32,18 @@ what makes Roblox unique and what to think about before creating.
-
The Roblox user base
+
The Roblox User Base
Learn what characterizes
the Roblox audience, and what social and cultural factors you should consider when developing on the platform.
-
+
Designing for Roblox
Discover some common practices from successful experiences and find out how to tailor your designs to the unique characteristics of Roblox.
-
+
@@ -57,19 +57,19 @@ possible for your users.
-
Roblox projects
+
Roblox Projects
Understand how to
build projects in Roblox Studio and publish them as experiences on Roblox.
-
+
-
Work with assets
+
Working with Assets
Understand how to upload assets to the
Roblox cloud and how to use them in your projects.
-
+
@@ -77,18 +77,18 @@ Roblox cloud and how to use them in your projects.
-
The data model
+
The Data Model
Understand the data model, the underlying definition
of how places in your 3D experiences look and function.
-
+
-
Client-server runtime
+
Client-Server Runtime
Understand how your experiences run in the Roblox Cloud.
-
+
@@ -96,17 +96,17 @@ of how places in your 3D experiences look and function.
-
3D workspace
-The 3D workspace is where you define all objects that are rendered by Roblox.
+
3D Workspace
+The 3D Workspace is where you define all objects that are rendered by Roblox.
-
+
Scripting
Learn how to script logic for your Roblox experiences.
-
+
@@ -117,12 +117,12 @@ of how places in your 3D experiences look and function.
Characters
Understand how character models work for NPCs and Players in Roblox.
-
+
-
Learn about the Studio UI and all the features and tools that are available.
-
+
-## Discovery and monetization
+## Discovery and Monetization
With tens of millions daily active users, there's many ways to monetize
and grow your creations.
@@ -167,15 +167,15 @@ and grow your creations.
Promoting on Roblox
Discover how experiences are commonly promoted on Roblox and how you can spend your budget most appropriately.
-
+
Earning on Roblox
Learn about monetization options and strategies on the platform along with associated considerations for developers.
-
-
+
+
diff --git a/content/en-us/creator-fund.md b/content/en-us/creator-fund.md
index 3a796805a..ec1e691e4 100644
--- a/content/en-us/creator-fund.md
+++ b/content/en-us/creator-fund.md
@@ -15,7 +15,7 @@ With the launch of the Creator Fund, we want new and existing developers to have
variant="filled"/>
-## Eligible projects
+## Eligible Projects
We are looking for ambitious, innovative projects that enable creative ideas that are unlike anything else on the platform.
@@ -29,7 +29,7 @@ We prioritize projects that encompass:
If you are accepted into the program, we partner with you to define key deliverables for your project and provide funding based off of your progress towards these milestones.
-## Application requirements
+## Application Requirements
- 18+ age requirement.
- Details about you and/or your team.
diff --git a/content/en-us/creator-programs/brand-developer-directory.md b/content/en-us/creator-programs/brand-developer-directory.md
index 41f3c8747..5fcbc2034 100644
--- a/content/en-us/creator-programs/brand-developer-directory.md
+++ b/content/en-us/creator-programs/brand-developer-directory.md
@@ -29,6 +29,6 @@ A member of our team will reach out to you with the next steps via the contact i
-## Contact info
+## Contact Info
PartnerProgram@roblox.com
diff --git a/content/en-us/creator-programs/creator-affiliate.md b/content/en-us/creator-programs/creator-affiliate.md
index beeddcefa..53a7d8532 100644
--- a/content/en-us/creator-programs/creator-affiliate.md
+++ b/content/en-us/creator-programs/creator-affiliate.md
@@ -24,7 +24,7 @@ We are looking for creators, influencers, and studios with one or more of the fo
- **The ability to reach [new audiences](https://corp.roblox.com/newsroom/2024/07/roblox-genre-insights-what-will-you-create-next) and meet their needs in growing genres and markets.** Growing genres include open world action, sports, driving, and social cooperation, and growing markets include Japan, India, Germany, Brazil, and South Korea.
- **Marketing expertise.** You can demonstrate this through previous creative and successful marketing campaigns, as well as through the quality of your Creator Affiliate Pilot Program application.
-## How it works
+## How it Works
You can add your affiliate link to:
@@ -42,7 +42,7 @@ You must also provide an FTC disclosure that mentions you might earn a commissio
- Meet our [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards)
- Be based in countries supporting [DevEx](https://en.help.roblox.com/hc/en-us/articles/203314100-Developer-Exchange-DevEx-Overview-How-to-Submit-Requirements)
-## How to apply
+## How to Apply
You can apply to the Creator Affiliate Pilot Program using the link below.
diff --git a/content/en-us/creator-programs/creator-events.md b/content/en-us/creator-programs/creator-events.md
index 5d9943276..c8ada25bd 100644
--- a/content/en-us/creator-programs/creator-events.md
+++ b/content/en-us/creator-programs/creator-events.md
@@ -21,7 +21,7 @@ To preview events hosted by our community creators, visit our [past events](http
- You are comfortable with public speaking.
-### Nice to have (not required)
+### Nice to Have (Not Required)
- Previous experience in hosting events, either in-person or virtual.
@@ -33,13 +33,13 @@ To preview events hosted by our community creators, visit our [past events](http
- Experience with presentation tools, such as PowerPoint and Google Slides.
-## Application process
+## Application Process
Fill out the application carefully to start the process. After we receive your application, you should hear from us within 2–3 weeks. Large volumes of applications might cause delays.
-### After initial acceptance
+### After Initial Acceptance
You need to prepare the following materials if your application passes the initial screening:
@@ -56,7 +56,7 @@ You need to prepare the following materials if your application passes the initi
We have created a **handbook** for our voluntary Event Organizers to help you gain insights and support on hosting events. We also have a **Guilded server** for Event Organizers to communicate with each other to exchange useful tips and advice.
-## Program membership details
+## Program Membership Details
As a voluntary Event Organizer, you can:
diff --git a/content/en-us/creator-programs/developer-awards.md b/content/en-us/creator-programs/developer-awards.md
index 7db2eab99..868948876 100644
--- a/content/en-us/creator-programs/developer-awards.md
+++ b/content/en-us/creator-programs/developer-awards.md
@@ -13,7 +13,7 @@ Developer Awards is a data-driven program designed to reward developers for reac
variant="filled" />
-## Award categories
+## Award Categories
- Virtual Items
@@ -58,10 +58,10 @@ Developer Awards is a data-driven program designed to reward developers for reac
- Must be at least 13 years old
- Must be the owner of your experience
-## Receiving an award
+## Receiving an Award
There is no application. Roblox will reach out regarding swag bags and trophies.
-## Contact info
+## Contact Info
devawards@roblox.com
diff --git a/content/en-us/creator-programs/feedback.md b/content/en-us/creator-programs/feedback.md
index 6307a4ddd..ccd6ca953 100644
--- a/content/en-us/creator-programs/feedback.md
+++ b/content/en-us/creator-programs/feedback.md
@@ -32,7 +32,7 @@ Eligibility can include, but is not limited to:
- Created a community resource that has helped many
- Designed avatar assets that have grown into a popular Roblox clothing line
-## How to apply
+## How to Apply
Fill out the application below. Roblox staff reviews applications every three months and will reach out if you have been selected.
diff --git a/content/en-us/creator-programs/index.md b/content/en-us/creator-programs/index.md
index c70fc7962..c541c1521 100644
--- a/content/en-us/creator-programs/index.md
+++ b/content/en-us/creator-programs/index.md
@@ -1,5 +1,5 @@
---
-title: Creator programs
+title: Creator Programs
description: Roblox offers various programs for creators on the platform to provide additional support and exposure. This page includes programs that are available publicly for creators. Check them out and see what you qualify for.
hideInPageNavigation: true
---
diff --git a/content/en-us/creator-programs/inspire.md b/content/en-us/creator-programs/inspire.md
index e3d0eabfd..cb3b6c200 100644
--- a/content/en-us/creator-programs/inspire.md
+++ b/content/en-us/creator-programs/inspire.md
@@ -21,13 +21,13 @@ See [Roblox Level Up](https://www.youtube.com/@RobloxLevelUp) for content from I
- Comfortable with public speaking
- Meet our [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards)
-## How to participate
+## How to Participate
- Fill out an application
- Submit a workshop proposal
- If picked, join a Zoom call where a DevRel team member can further assess expertise on your chosen topic, alongside your public speaking skills
- Prepare workshop and present at Inspire
-## Contact info
+## Contact Info
devrel-inspire@roblox.com
diff --git a/content/en-us/creator-programs/learn-explore-sort.md b/content/en-us/creator-programs/learn-explore-sort.md
index ffb25b7c1..bef74f3ea 100644
--- a/content/en-us/creator-programs/learn-explore-sort.md
+++ b/content/en-us/creator-programs/learn-explore-sort.md
@@ -14,14 +14,14 @@ Through this sort, you can receive recognition as a credible educational develop
variant="filled" />
-## Experience eligibility
+## Experience Eligibility
- Explores a subject matter, such as science, history, or math, or have educational value that is clear to an educator
- Doesn't allow users to encounter aggressive monetization as a part of their first time user experience. Monetization should not detract from learning or gameplay (i.e. users must pay to access large portions of content or gain an unfair advantage in gameplay due to monetization.)
- Remains appropriate for a classroom for students of all ages, even if it contains advanced subject matter
- Like ratio above 50% and maintains at least 15 concurrent users
-## How to apply
+## How to Apply
Submit through the form below. Due to the high volume of applicants, only those considered for the Learn & Explore sort will be contacted. Applications are reviewed by the Education team at Roblox every 1-2 months.
diff --git a/content/en-us/creator-programs/notable-translators.md b/content/en-us/creator-programs/notable-translators.md
index 0eccf07ff..b87f4bba8 100644
--- a/content/en-us/creator-programs/notable-translators.md
+++ b/content/en-us/creator-programs/notable-translators.md
@@ -20,7 +20,7 @@ The Notable Translators Program (Pilot) aims to give more visibility to dedicate
- Have a Roblox account that is at least 2 months old
- Have native or near-native language proficiency in the language you're testing for
-## How to participate
+## How to Participate
Please use one of the links below to take the translation test. Only one submission per candidate.
diff --git a/content/en-us/creator-programs/research-panel.md b/content/en-us/creator-programs/research-panel.md
index d19e5811e..c7689a14b 100644
--- a/content/en-us/creator-programs/research-panel.md
+++ b/content/en-us/creator-programs/research-panel.md
@@ -13,7 +13,7 @@ The [Roblox Research Panel](https://robloxresearchpanel.com/) is an exclusive pr
variant="filled" />
-## Why participate?
+## Why Participate?
As a valued member of the Roblox community, your feedback is essential. By joining the Roblox Research Panel, you can:
@@ -21,14 +21,14 @@ As a valued member of the Roblox community, your feedback is essential. By joini
- Earn Rewards: Participate in activities to earn points, redeemable for a variety of gift cards.
- Be Heard: Engage in meaningful discussions with fellow members and provide feedback that matters.
-## Types of research
+## Types of Research
- Surveys: Share your thoughts through detailed surveys on various topics.
- Polls: Give your quick opinions on specific subjects via short polls.
- Discussions: Join in-depth discussions and provide valuable feedback on new ideas and features.
- Testing: Try new Roblox features.
-## How to join
+## How to Join
Joining the Roblox Research Panel is by invitation only.
diff --git a/content/en-us/creator-programs/spotlights.md b/content/en-us/creator-programs/spotlights.md
index 10a8f6f15..76b3c2e54 100644
--- a/content/en-us/creator-programs/spotlights.md
+++ b/content/en-us/creator-programs/spotlights.md
@@ -19,7 +19,7 @@ Creator Spotlights are in-depth DevForum articles that celebrate the awesome thi
- Have developed on Roblox for at least 1 year and have contributed to engaging content
- Meet our [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards)
-## How to participate
+## How to Participate
1. Fill out the nomination form below (nominate yourself or another creator). Nominations are reviewed weekly.
2. Receive follow up from DevRel team. Due to the high volume of applicants, only those considered for a spotlight will be contacted. If you haven't heard back within a month, we encourage you to reapply in 6-12 months. Be sure to focus your application on your domain expertise and what other creators will learn from you.
@@ -28,7 +28,7 @@ Creator Spotlights are in-depth DevForum articles that celebrate the awesome thi
-## Past examples
+## Past Examples
- [Behind The Games: Midnight Racing: Tokyo, Dress to Impress, and Michael's Zombies](https://devforum.roblox.com/t/behind-the-games-midnight-racing-tokyo-dress-to-impress-and-michael%E2%80%99s-zombies/3131289)
- [Creator Spotlight: BelowNatural's Journey Building Paradoxum Games](https://devforum.roblox.com/t/creator-spotlight-belownatural%E2%80%99s-journey-building-paradoxum-games/3027035)
diff --git a/content/en-us/creator-programs/todays-picks-home.md b/content/en-us/creator-programs/todays-picks-home.md
index aac007398..5e2ba0c29 100644
--- a/content/en-us/creator-programs/todays-picks-home.md
+++ b/content/en-us/creator-programs/todays-picks-home.md
@@ -13,13 +13,13 @@ description: Today's Picks on Home is a curation of the best experiences on a da
variant="filled" />
-## Why apply?
+## Why Apply?
Your amazing creations are what makes Roblox special, and we are thrilled to feature more of them on Home, providing you with additional exposure on our platform.
-## How to apply
+## How to Apply
If you wish to nominate your experience to be featured for Today's Picks, please complete the survey below. Our editorial team reviews nominations on an ongoing basis. Due to the high volume of applicants, only those selected for Today's Picks on Home will be notified. If you haven't heard back, we encourage you to fill out the form each time your experience has a notable update.
diff --git a/content/en-us/creator-programs/todays-picks-marketplace.md b/content/en-us/creator-programs/todays-picks-marketplace.md
index ce072ed47..69b7e16d1 100644
--- a/content/en-us/creator-programs/todays-picks-marketplace.md
+++ b/content/en-us/creator-programs/todays-picks-marketplace.md
@@ -16,14 +16,14 @@ description: Today's Picks on Marketplace is a curated sort with items selected
-
Why apply?
+
Why Apply?
Using the combined efforts of our team of Roblox editors and our Marketplace recommendation system, Today's Picks on Marketplace will give us more ways to feature the work and creativity you bring to Roblox.
Eligibility
Be 17+ and ID-verified
Meet our [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards) and [Marketplace Policy](../marketplace/marketplace-policy.md)
-
How to apply
+
How to Apply
Fill out the survey below to nominate your item. We review new submissions every week. Due to the high volume of applicants, only those selected for Today's Picks on Marketplace will be contacted. If you don't hear back, we encourage you to reapply when you have new items to submit.
diff --git a/content/en-us/discovery.md b/content/en-us/discovery.md
index a3b770ca8..d11bb9b0a 100644
--- a/content/en-us/discovery.md
+++ b/content/en-us/discovery.md
@@ -6,7 +6,7 @@ description: Explains how users discover experiences on the Roblox platform.
Roblox's [mission](https://devforum.roblox.com/t/discovery-on-roblox-past-present-and-future-vision/2859111) for discovery is to connect every user with the best creation and community for them. This guide outlines how discovery works and how you can help your experience get discovered.
-## How recommendation works
+## How Recommendation Works
On Home, our **Recommended for You** algorithm decides what experiences to show each user in two stages:
@@ -16,8 +16,8 @@ On Home, our **Recommended for You** algorithm decides what experiences to show
**Ranking (stage 2)**: Roblox ranks the selected experiences based on 3 main signals:
-1. **Engagement (playtime)** tracks how users engage in your experience. Metrics that contribute to playtime include [session time](./production/analytics/engagement.md#improve-average-session-time), sessions, [retention](./production/analytics/retention.md), and [qualified play through rate](./production/analytics/acquisition.md#improve-acquisition). This is the main signal that we optimize for.
-2. **Monetization (revenue)** tracks how users invest in your experience. Metrics that contribute to revenue include [payer conversion](./production/analytics/monetization.md#improve-payer-conversion-rate) and [average revenue per paying user](./production/analytics/monetization.md#improve-average-revenue-per-paying-user-arppu).
+1. **Engagement (playtime)** tracks how users engage in your experience. Metrics that contribute to playtime include [session time](./production/analytics/engagement.md#improving-average-session-time), sessions, [retention](./production/analytics/retention.md), and [qualified play through rate](./production/analytics/acquisition.md#improving-acquisition). This is the main signal that we optimize for.
+2. **Monetization (revenue)** tracks how users invest in your experience. Metrics that contribute to revenue include [payer conversion](./production/analytics/monetization.md#improving-payer-conversion-rate) and [average revenue per paying user](./production/analytics/monetization.md#improving-average-revenue-per-paying-user-arppu).
3. **Ecosystem health** ensures that Roblox continues building a vibrant platform. We want to reward creations that bring new users to Roblox and that creators continue to invest in with updates, events, and more.
Roblox's recommendation system uses **explore and expand** phases to understand the signals above. For example, you might see a spike in new users from recommendations (explore) after a content update. If that new user cohort has good engagement and monetization, Roblox is more likely to continue to recommend your experience to those user cohorts (expand).
@@ -28,12 +28,12 @@ When ranking experiences for recommendations, Roblox only considers engagement,
For a detailed overview, please see our [discovery vision post](https://devforum.roblox.com/t/discovery-on-roblox-past-present-and-future-vision/2859111) and [RDC talk](https://www.youtube-nocookie.com/embed/V1uFFUUCLpo).
-## How you can get discovered via recommendations
+## How You Can Get Discovered via Recommendations
The best way to get discovered via recommendations is to continue to invest in engagement, monetization, and ecosystem health for your experience:
-1. **Engagement (playtime)**: [Session time](./production/analytics/engagement.md#improve-average-session-time), [retention](./production/analytics/retention.md), and [qualified play through rate](./production/analytics/acquisition.md#improve-acquisition)
-2. **Monetization (revenue)**: [Payer conversion](./production/analytics/monetization.md#improve-payer-conversion-rate), [revenue per paying user](./production/analytics/monetization.md#improve-average-revenue-per-paying-user-arppu)
+1. **Engagement (playtime)**: [Session time](./production/analytics/engagement.md#improving-average-session-time), [retention](./production/analytics/retention.md), and [qualified play through rate](./production/analytics/acquisition.md#improving-acquisition)
+2. **Monetization (revenue)**: [Payer conversion](./production/analytics/monetization.md#improving-payer-conversion-rate), [revenue per paying user](./production/analytics/monetization.md#improving-average-revenue-per-paying-user-arppu)
3. **Ecosystem health**: Continue to invest in regular content and events updates
On your experience overview page, use the **Daily Benchmarks** section to compare your experience metrics with similar games that your users also play:
@@ -43,14 +43,14 @@ On your experience overview page, use the **Daily Benchmarks** section to compar
Your similar experience benchmarks are updated daily. Roblox does not use these benchmarks as a direct signal in the discovery algorithm. These benchmarks are designed to give you a point of comparison as you work on improving your engagement, monetization, and acquisition.
-
Frequently asked questions
+
Frequently Asked Questions
**What metric should I focus on to get discovered via recommendations?**
You should focus on metrics that are below benchmark in your Daily Benchmark section and related graphs. For example, the experience in the image above is below benchmark on **average session time** and **D1 retention**. To address this, consider focusing on:
1. Tracking and improving your [onboarding funnel](./production/analytics/funnel-events.md).
-2. Optimizing your onboarding funnel will likely improve [session time](./production/analytics/engagement.md#improve-average-session-time) and [retention](./production/analytics/retention.md), which both contribute to your experience's engagement (playtime).
+2. Optimizing your onboarding funnel will likely improve [session time](./production/analytics/engagement.md#improving-average-session-time) and [retention](./production/analytics/retention.md), which both contribute to your experience's engagement (playtime).
**Why did my daily active users increase or decline?**
@@ -69,16 +69,16 @@ If you have a brand new experience, you may not have enough users for recommenda
Consider driving new users to your experience with [social media links](./production/promotion/social-media-links.md), [sponsored ads](./production/promotion/ads-manager.md#sponsored-experiences), and other channels so that recommendations can get enough signal. Roblox continues to add recommendations improvements to be better at discovering new experiences.
-## Best practices for discovery
+## Best Practices for Discovery
Your content must always adhere to our [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards). To increase your reach and help your experience get discovered, make sure to also follow the best practices for discovery:
-- **Be accurate.** Avoid using irrelevant keywords in your metadata and follow the [metadata best practices](./production/publishing/publish-experiences-and-places.md#metadata-best-practices).
+- **Be accurate.** Avoid using irrelevant keywords in your metadata and follow the [metadata best practices](./production/publishing/publishing-experiences-and-places.md#metadata-best-practices).
- **Build trust.** You should not rely on promotional monetary rewards to drive engagement. Instead, your metadata should reflect what your experience is about.
- **Use unique metadata.** Focus on using original imagery and naming that you or your teammates created to help your experience stand out. Avoid publishing content with repetitive titles and images that have been previously published. When using [thumbnail personalization](./production/publishing/thumbnails.md#thumbnail-personalization-for-the-home-page), make sure all thumbnails accurately reflect your experience.
- **Add your own spin to existing trends** in the title, images, description, and in-experience content when you follow trends. Unique updates add value and differentiate your experience from other experiences following the same trend.
-### Issues that limit exposure
+### Issues that Limit Exposure
The level of exposure your content receives on the homepage and in search is directly influenced by its quality. Certain issues can reduce visibility or prevent your content from being recommended, including:
@@ -89,7 +89,7 @@ The level of exposure your content receives on the homepage and in search is dir
- **Non-unique experiences**: Experiences with metadata and place files that closely resemble existing experiences on Roblox are no longer prioritized for recommendations and might rank lower in search results.
- Example: An experience with the same title and visuals as a previously published experience.
-### Track and improve content quality
+### Tracking and Improving Content Quality
Roblox continually reclassifies content quality with every update, giving all experiences the opportunity to improve their reach. To be reassessed and improve your reach, make sure to align your experience with our [best practices](#best-practices-for-discovery).
@@ -97,11 +97,11 @@ To check if your experience is affected by quality issues, go to the **Creator D
If you come across any issues, go to [Support](https://www.roblox.com/support), select **Bug Report**, and provide the Universe ID of your experience along with a description of your issue.
-## Discovery for other surfaces
+## Discovery for Other Surfaces
Home's **Recommended For You** is not the only discovery surface that Roblox offers. Below is a primer on our other surfaces:
-## Other Home sorts
+## Other Home Sorts
Home is a user's personalized view of Roblox. Outside of Recommended for You, Home also includes **Continue Playing**, **Friends List**, **Sponsored**, **Curated Sorts**, and more. For a deeper dive on some of these sections:
@@ -109,7 +109,7 @@ Home is a user's personalized view of Roblox. Outside of Recommended for You, Ho
- **Live Events** has experiences that are part of a limited time event that you can complete quests for to unlock rewards. You can see past events from Roblox [here](https://www.roblox.com/groups/4111519/Roblox-Presents#!/about).
- **Sponsored** lets you invest directly in getting your experiences discovered by a specific audience segment. For more information, see [Ads Manager](./production/promotion/ads-manager.md#sponsored-experiences).
-### Experience details page
+### Experience Details Page
The Experience Details Page aims to offer users comprehensive insights about the experience, enhancing their understanding and aiding in decision-making. This, in turn, drives high-intent users to your experiences. You can leverage the Experience Details Page to improve user onboarding and attract returning users by:
@@ -119,7 +119,7 @@ The Experience Details Page aims to offer users comprehensive insights about the
The Experience Details Page also provides additional recommendation opportunities by highlighting similar experiences, helping users discover more relevant content.
-#### Experience events
+#### Experience Events
**Experience events** are key to keeping a community engaged. These moments are where all your users can come together and engage for unique events and scenarios. [Experience events](./production/promotion/experience-events.md) are a way for you to tell your users about upcoming events within your experience, and for them to opt in and be notified when that event starts. We are continuing to build on that foundation offering deeper event details customization. You can add up to 5 thumbnails to promote your event with users and include a primary event type. This additional metadata will also give you a chance to be featured in **Today's Picks**.
@@ -129,7 +129,7 @@ The Experience Details Page also provides additional recommendation opportunitie
Historically, Search has primarily focused on relevance based on exact search queries and limited metadata such as titles. Roblox is constantly improving Search to better understand user intent. For example, you can now use semantic search for all of our officially supported languages to find experiences through natural language queries, such as "food games" or "avatar editors".
-### Discover (top charts and trending sorts)
+### Discover (Top Charts and Trending Sorts)
The [Discover](https://www.roblox.com/discover#/) page is designed to reflect the many constantly changing high-quality experiences available on the platform and showcasing the best-performing content on Roblox.
diff --git a/content/en-us/education/battle-royale-series/coding-the-game-loop.md b/content/en-us/education/battle-royale-series/coding-the-game-loop.md
index e9e35ad37..d9479b630 100644
--- a/content/en-us/education/battle-royale-series/coding-the-game-loop.md
+++ b/content/en-us/education/battle-royale-series/coding-the-game-loop.md
@@ -206,7 +206,7 @@ Once there are enough players, have them wait a short transition time. Then, sen
Keep the code within the scope of the while loop (between `do` and `end`). If code is outside, parts of your game loop might not repeat and players will just be stuck in the intermission phase.
-2. After the wait, call the `prepareGame()` from the MatchManager module. When the code runs, this will just print text to the Output Window. Wait until the next section to test this code.
+2. After the wait, call the `prepareGame()` from the MatchManager module. When the code runs, this will just print text to the output window. Wait until the next section to test this code.
```lua
while true do
diff --git a/content/en-us/education/battle-royale-series/ending-matches.md b/content/en-us/education/battle-royale-series/ending-matches.md
index 2fd1bfd17..ac72315ea 100644
--- a/content/en-us/education/battle-royale-series/ending-matches.md
+++ b/content/en-us/education/battle-royale-series/ending-matches.md
@@ -319,7 +319,7 @@ To use the function just created, call it from within the anonymous function con
end)
```
-2. To see if a winning player is found, start a **test server**. When there is only one player left you should see FoundWinner in the Output Window.
+2. To see if a winning player is found, start a **test server**. When there is only one player left you should see FoundWinner in the output window.
diff --git a/content/en-us/effects/beams.md b/content/en-us/effects/beams.md
index 020f29aab..6941b27be 100644
--- a/content/en-us/effects/beams.md
+++ b/content/en-us/effects/beams.md
@@ -13,7 +13,7 @@ A `Class.Beam` is an object that renders a `Class.Texture` between two `Class.At
-## Create beams
+## Creating a Beam
Before you begin to create a beam, it's useful to toggle on visibility of attachments so you can see where the beam starts and ends.
@@ -54,7 +54,7 @@ To create a beam:
Beams require attachments to function properly. If you remove either attachment object from step 4, the beam stops rendering its texture.
-## Customize beams
+## Customizing Beams
By experimenting with the following properties, you can customize a beam's visual appearance to make unique gameplay elements like force fields, waterfalls, and pathway obstacles.
@@ -177,7 +177,7 @@ The beam below has a `Class.Beam.Width0|Width0` value of **0.5** and a
-### Texture length/mode
+### Texture Length/Mode
A beam's `Class.Beam.TextureLength|TextureLength` and `Class.Beam.TextureMode|TextureMode` determine how its [texture](#texture) repeats across its length.
diff --git a/content/en-us/effects/highlighting.md b/content/en-us/effects/highlighting.md
index aff48a5e2..6ff62b0d6 100644
--- a/content/en-us/effects/highlighting.md
+++ b/content/en-us/effects/highlighting.md
@@ -1,5 +1,5 @@
---
-title: Highlighting objects
+title: Highlighting Objects
description: Highlighting objects lets you call attention to specific objects within your experience.
---
@@ -27,26 +27,26 @@ Useful applications of the highlight effect include:
- Making distant objects visible through objects that are closer to the user.
- Indicating the current position and status of other characters.
-## Add highlights
+## Adding Highlights
As a performance limit, Studio only displays 31 simultaneous `Class.Highlight` instances on the client-side at a time. If you add more than this limit, the additional `Class.Highlight` instances are silently ignored.
Note also that highlights on low-end devices may be more pixelated but will otherwise look the same as on other devices with any combination of settings.
-### Parent to objects
+### Parenting to Objects
To add a highlight effect to an object, you can parent a new `Class.Highlight` directly to the object.
-1. In the **Explorer** window, hover over either a `Class.Model` or a `Class.BasePart`, then click the ⊕ button. A contextual menu displays.
+1. In the [Explorer](../studio/explorer.md) window, hover over either a `Class.Model` or a `Class.BasePart`, then click the ⊕ button. A contextual menu displays.
2. From the menu, insert a **Highlight**. The highlight displays on the object with its default property values that create a white outline and a red tint overlay.
-### Set the adornee
+### Setting the Adornee
Alternatively, you can place the `Class.Highlight` instance outside of a child/parent relationship either within the workspace, `Class.StarterPlayer`, `Class.StarterGui`, `Class.StarterPack`, or `Class.ReplicatedStorage`, then set its `Class.Highlight.Adornee|Adornee` property to the `Class.Model` or `Class.BasePart` that you want to highlight.
-## Customize highlights
+## Customizing Highlights
You can change the properties of a `Class.Highlight` instance to create interesting visual effects that properly highlight objects in theme with your experience.
@@ -147,7 +147,7 @@ The `Class.Highlight.Enabled|Enabled` property allows you to quickly enable or d
While a disabled `Class.Highlight` doesn't display, it still takes one of the 31 available `Class.Highlight` slots. If you plan to permanently disable a `Class.Highlight` instance, it's best to delete the highlight rather than disable it.
-## Performance tips
+## Performance Tips
While you have a lot of options to customize `Class.Highlight` instances, the following tips are recommended to increase your experience's performance on all devices:
diff --git a/content/en-us/effects/index.md b/content/en-us/effects/index.md
index cb211a57d..26c01c003 100644
--- a/content/en-us/effects/index.md
+++ b/content/en-us/effects/index.md
@@ -6,7 +6,7 @@ description: Learn how to add visual effects to your experiences.
You can create special effects by parenting special effect objects to other
objects or attachments.
-## Light sources
+## Light Sources
Light sources let you attach lighting effects to objects or attachments. There
are three types of light sources:
@@ -24,7 +24,7 @@ are three types of light sources:
- Point lights
+ Point Lights
@@ -32,11 +32,11 @@ are three types of light sources:
- Surface lights
+ Surface Lights
-## Particle emitters
+## Particle Emitters
A [particle emitter](../effects/particle-emitters.md) is an object that emits customizable 2D images (particles) into the world, useful for simulating special effects like fire, smoke, and sparks.
diff --git a/content/en-us/effects/light-sources.md b/content/en-us/effects/light-sources.md
index e3cb52615..12c2d6750 100644
--- a/content/en-us/effects/light-sources.md
+++ b/content/en-us/effects/light-sources.md
@@ -1,5 +1,5 @@
---
-title: Light sources
+title: Light Sources
description: Light sources simulate realistic lighting from objects such as torches, spotlights, and screens.
---
@@ -19,11 +19,11 @@ The `Class.Lighting.Technology|Technology` property, modifiable only in the [Pro
To view **light guides** that indicate the color and field of effect from light sources, such as the angle of light emission from the cone's apex of a `Class.SpotLight`, open **File** 〉 **Studio Settings** and toggle on **Show Light Guides**.
-## Light types
+## Light Types
Light types include [Point Light](#point-light), [Spotlight](#spotlight), and [Surface Light](#surface-light). Each shares various properties from the `Class.Light` class, including `Class.Light.Color|Color`, `Class.Light.Brightness|Brightness`, and `Class.Light.Shadows|Shadows`.
-### Point light
+### Point Light
A `Class.PointLight` emits light spherically from a single point. This object is ideal for **non-directional** lights like bulbs, torches, and fireballs.
@@ -84,7 +84,7 @@ To create a `Class.SpotLight` in Studio:
1. Set the light's `Class.SpotLight.Face|Face` property to specify which direction light emits from.
1. Adjust the light's `Class.SpotLight.Angle|Angle` and `Class.SpotLight.Range|Range`, as well as [shared properties](#shared-properties) like `Class.SpotLight.Brightness|Brightness` and `Class.SpotLight.Color|Color`.
-### Surface light
+### Surface Light
A `Class.SurfaceLight` emits light from the face of a `Class.BasePart`. This object is ideal for lighting from TV or computer screens, billboards, and fluorescent panels.
@@ -121,7 +121,7 @@ To create a `Class.SurfaceLight` in Studio:
1. Set the light's `Class.SurfaceLight.Face|Face` property to specify which surface light emits from.
1. Adjust the light's `Class.SurfaceLight.Angle|Angle` and `Class.SurfaceLight.Range|Range`, as well as [shared properties](#shared-properties) like `Class.SurfaceLight.Brightness|Brightness` and `Class.SurfaceLight.Color|Color`.
-## Shared properties
+## Shared Properties
All light sources share various properties from the `Class.Light` class, including [color](#color), [brightness](#brightness), and [shadows](#shadows).
diff --git a/content/en-us/effects/particle-emitters.md b/content/en-us/effects/particle-emitters.md
index e8c1bfba8..af6a0dbb8 100644
--- a/content/en-us/effects/particle-emitters.md
+++ b/content/en-us/effects/particle-emitters.md
@@ -1,5 +1,5 @@
---
-title: Particle emitters
+title: Particle Emitters
description: Particle emitters emit 2D images to simulate special effects like fire, smoke, and sparks.
---
@@ -7,7 +7,7 @@ A `Class.ParticleEmitter` is an object that emits customizable 2D images (partic
-## Create particle emitters
+## Creating a Particle Emitter
You can parent a `Class.ParticleEmitter` to an `Class.Attachment` or an object of the `Class.BasePart` class. When parented to a `Class.BasePart`, particles spawn randomly within the part's bounding box or [shape](#shape); when parented to an `Class.Attachment`, particles spawn from the attachment's position.
@@ -22,14 +22,14 @@ itself instead of using `Class.ParticleEmitter.EmissionDirection|EmissionDirecti
-To create a particle emitter on a part or attachment:
+To create a particle emitter on a given `Class.BasePart` or `Class.Attachment`:
1. In the **Explorer** window, hover over the part or attachment and click the ⊕ button. A contextual menu displays.
2. From the menu, insert a **ParticleEmitter**. The particle emitter immediately emits particles within the part's area or from the attachment's position.
-## Customize particles
+## Customizing Particles
By experimenting with the following properties, you can customize a particle's visual appearance to make unique gameplay elements like bursting volcanos, magical dust, and dust motes.
@@ -53,7 +53,7 @@ If you're creating an image to use as a particle texture, it's best to use `.png
For steps on how to import an image for use as a particle texture,
-see [Import assets](../projects/assets/manager.md#import-assets).
+see [Importing Assets](../projects/assets/manager.md#importing-assets).
To insert an image into a particle emitter:
@@ -222,7 +222,7 @@ orientation mode to use for an emitter's particle geometry.
Orientation
-
Particle behavior
+
Particle Behavior
@@ -250,19 +250,19 @@ orientation mode to use for an emitter's particle geometry.
Expected outcome of particle orientation
-### Light emission
+### Light Emission
The `Class.ParticleEmitter.LightEmission|LightEmission` property determines the blending of particle `Class.ParticleEmitter.Texture|Texture` colors with the colors behind them. A value of 0 uses normal blending mode while a value of 1 uses additive blending. Higher values can make particles glow even in environments with low lighting.
-### Spread angle
+### Spread Angle
The `Class.ParticleEmitter.SpreadAngle|SpreadAngle` property has an **X** and a **Y** value which determine the range of angles from which a particle can emit. The range is calculated from both sides around the axes; for example, a value of `(45, 0)` emits particles in a range of 0° to 45° away from the `Class.ParticleEmitter.EmissionDirection|EmissionDirection` across the **X** axis.
-### Wind influence
+### Wind Influence
If you've enabled [global wind](../environment/global-wind.md) in an experience, particles will follow the global wind vector as long as the emitter's `Class.ParticleEmitter.WindAffectsDrag|WindAffectsDrag` property is enabled and its `Class.ParticleEmitter.Drag|Drag` property is greater than 0.
@@ -436,7 +436,7 @@ The `Class.ParticleEmitter.FlipbookStartRandom|FlipbookStartRandom` property det
-### Other properties
+### Other Properties
To further customize particles, consider the following emitter properties, and click through to the `Class.ParticleEmitter` reference page for more details.
diff --git a/content/en-us/effects/trails.md b/content/en-us/effects/trails.md
index 39df1f9bf..cef898e72 100644
--- a/content/en-us/effects/trails.md
+++ b/content/en-us/effects/trails.md
@@ -7,14 +7,14 @@ A `Class.Trail` is an object that creates a trail between and behind two `Class.
-After you [create a trail](#create-trails), you can:
+After you [create a trail](#creating-a-trail), you can:
- Add a [texture](#texture) to create interesting visuals.
- Set a constant or gradient [color](#color) and/or [transparency](#transparency).
- Modify a trail's [lifetime](#lifetime).
- Specify the texture's [length and mode](#texture-lengthmode) to affect how it scales, repeats, and moves along with the trail's attachments.
-## Create trails
+## Creating a Trail
Before you begin to create a trail, it's useful to toggle on visibility of attachments so you can more easily discern how their spacing affects the trail's width.
@@ -43,14 +43,14 @@ To create a trail on a part:
3. Back in the **Properties** window, select the **Attachment1** property. Your cursor changes.
4. In the **Explorer** window, select the second attachment you created.
-3. Using the [Move](../parts/index.md#move) tool, position both attachments within the part according to how wide you want the trail to be.
+3. Using the [Move](../parts/index.md#moving) tool, position both attachments within the part according to how wide you want the trail to be.
4. To see the trail, move the part in any direction and the trail follows.
Trails require attachments to function properly. If you remove either `Class.Attachment` object from step 2, the trail stops rendering its texture.
-## Customize trails
+## Customizing Trails
By experimenting with the following properties, you can customize a trail's visual appearance to make unique gameplay elements like wind gusts, sword slashes, and tire marks from fast cars.
@@ -60,7 +60,7 @@ The visual quality of your trails can change depending on the graphics settings
### Texture
-The `Class.Trail.Texture|Texture` property renders a texture across the length of the trail. You can set a trail's `Class.Trail.Texture|Texture` property to any asset ID. For more information, including how to add or import your own textures, see [Import assets](../projects/assets/manager.md#import-assets).
+The `Class.Trail.Texture|Texture` property renders a texture across the length of the trail. You can set a trail's `Class.Trail.Texture|Texture` property to any asset ID. For more information, including how to add or import your own textures, see [Importing Assets](../projects/assets/manager.md#importing-assets).
@@ -161,7 +161,7 @@ appearance.
Trail with lifetime of 0.5 (left) vs. trail with lifetime of 3.0 (right)
-### Texture length/mode
+### Texture Length/Mode
A trail's `Class.Trail.TextureLength|TextureLength` and `Class.Trail.TextureMode|TextureMode` determine how its [texture](#texture) scales, repeats, and moves along with the trail's attachments.
diff --git a/content/en-us/environment/atmosphere.md b/content/en-us/environment/atmosphere.md
index 0edd30637..a89b1a0ca 100644
--- a/content/en-us/environment/atmosphere.md
+++ b/content/en-us/environment/atmosphere.md
@@ -1,19 +1,19 @@
---
-title: Atmospheric effects
+title: Atmospheric Effects
description: Atmospheric effects simulate realistic environments by scattering sunlight in unique ways.
---
**Atmospheric effects** simulate realistic environments by scattering sunlight
-in unique ways based on properties that control air particles. Using the `Class.Atmosphere` object, you can:
+in unique ways based on [properties](#atmosphere-properties) that control air particles. Using the `Class.Atmosphere` object, you can:
-- Control particle density.
-- Create a silhouette or blend distant objects with an offset.
-- Simulate a haze or glare.
-- Set an atmosphere's color or decay.
+- Control particle [density](#density).
+- Create a silhouette or blend distant objects ([offset](#offset)).
+- Simulate a [haze](#haze) or [glare](#glare).
+- Set an atmosphere's [color](#color) or [decay](#decay).
-## Atmosphere properties
+## Atmosphere Properties
Every property of the `Class.Atmosphere` object inside the `Class.Lighting` service works together to support the overall vision, themes, and mood of your experience.
diff --git a/content/en-us/environment/clouds.md b/content/en-us/environment/clouds.md
index b97478a95..008ceca83 100644
--- a/content/en-us/environment/clouds.md
+++ b/content/en-us/environment/clouds.md
@@ -1,5 +1,5 @@
---
-title: Dynamic clouds
+title: Dynamic Clouds
description: Dynamic Clouds render realistic, customizable clouds that drift slowly across the sky.
---
@@ -7,23 +7,22 @@ Roblox's **dynamic clouds** are realistic clouds that drift slowly across the sk
-## Enable clouds
+## Enabling Clouds
You can manage dynamic clouds in an experience through the `Class.Clouds` object. While you can place this object anywhere for organization or replication purposes, clouds only render if you parent the object under the `Class.Terrain` class.
To enable dynamic clouds:
-1. In the **Explorer** window, hover over **Terrain** and click the ⊕ button. A contextual menu displays.
+1. In the [Explorer](../studio/explorer.md) window, hover over **Terrain** and click the ⊕ button. A contextual menu displays.
1. From the menu, insert **Clouds**.
-1. Adjust the appearance of clouds through the new object's properties.
-1. Set the clouds in motion through [global wind](../environment/global-wind.md).
+1. Adjust the appearance of clouds through the new object's [properties](#cloud-properties) and, if desired, set the clouds in motion through [global wind](../environment/global-wind.md).
-## Cloud properties
+## Cloud Properties
-From the `Class.Clouds` object under `Class.Terrain`, you can adjust the appearance of clouds through the Properties window.
+From the `Class.Clouds` object under `Class.Terrain`, you can adjust the appearance of clouds through the [Properties](../studio/properties.md) window.
### Cover
diff --git a/content/en-us/environment/global-wind.md b/content/en-us/environment/global-wind.md
index 6402866fd..b7badb327 100644
--- a/content/en-us/environment/global-wind.md
+++ b/content/en-us/environment/global-wind.md
@@ -1,27 +1,27 @@
---
-title: Global wind
+title: Global Wind
description: The global wind vector sets the direction and strength that wind blows through an experience, affecting terrain grass, dynamic clouds, and particles.
---
-The `Class.Workspace.GlobalWind|GlobalWind` vector sets the direction and strength that wind blows through an experience, affecting terrain grass and dynamic clouds. You can set it as a [constant vector](#global-wind-vector), or adjust it through [scripting](#scripted-effects) to create cyclical gusts of wind. Additionally, you can influence [particles](#particle-influence) to follow the global wind vector.
+The `Class.Workspace.GlobalWind|GlobalWind` vector sets the direction and strength that wind blows through an experience, affecting [terrain grass](../parts/terrain.md#animated-grass) and [dynamic clouds](../environment/clouds.md). You can set it as a [constant vector](#global-wind-vector), or adjust it through [scripting](#scripted-effects) to create cyclical gusts of wind. Additionally, you can influence [particles](#particle-influence) to follow the global wind vector.
-To see the effects of global wind in an experience, you'll need to enable [animated terrain grass](../parts/terrain.md#grass-animation) and/or [dynamic clouds](../environment/clouds.md).
+To see the effects of global wind in an experience, you'll need to enable [animated terrain grass](../parts/terrain.md#animated-grass) and/or [dynamic clouds](../environment/clouds.md).
-## Global wind vector
+## Global Wind Vector
Global wind is controlled through The `Class.Workspace.GlobalWind|GlobalWind` vector is a property of `Class.Workspace` and you can edit it directly in Studio, or set it through [scripting](#scripted-effects).
To set the global wind vector in Studio:
-1. In the **Explorer** window, select the top-level **Workspace** service.
+1. Select the top-level **Workspace** object in the [Explorer](../studio/explorer.md) window.
-1. In the **Properties** window, locate the **GlobalWind** property and set an **X**, **Y**, and **Z** value for its direction and strength.
+1. In the [Properties](../studio/properties.md) window, locate the **GlobalWind** property and set an **X**, **Y**, and **Z** value for its direction and strength.
@@ -33,7 +33,7 @@ Particles emitted by a `Class.ParticleEmitter` will follow the global wind vecto
-## Wind direction widget
+## Wind Direction Widget
To make it easier to tune global wind, you can use the **Wind Direction** widget, accessible from the [View](../studio/view-tab.md) tab. The widget lets you visualize how wind is blowing using a "wind sock" model, and you can dynamically set the wind's **Speed**, **Yaw**, and **Pitch** by clicking the desired aspect name and sliding the slider along the bottom, or you can adjust yaw or pitch by manipulating the green ring and blue arrow on the animated portion. You can also click and drag the widget to reposition it anywhere in the 3D viewport.
@@ -41,7 +41,7 @@ To make it easier to tune global wind, you can use the **Wind Direction** w
-## Scripted effects
+## Scripted Effects
Scripting of the `Class.Workspace.GlobalWind|GlobalWind` property opens up a whole range of possibilities. For example, you can use the following code sample to cause cyclical gusts of wind that ease in and out using the `Library.math.sin()` function.
diff --git a/content/en-us/environment/index.md b/content/en-us/environment/index.md
index 641d3bea2..413cca603 100644
--- a/content/en-us/environment/index.md
+++ b/content/en-us/environment/index.md
@@ -1,11 +1,11 @@
---
-title: Lighting and effects
+title: Lighting and Effects
description: Create more immersive environments through lighting, atmospheres, and special effects.
---
The `Class.Lighting` container services let you control and customize an experience's environment such as [lighting](#global-lighting), [atmosphere](#atmospheric-effects), and [clouds](#clouds-and-skies). You can also apply [post-processing effects](#post-processing-effects) to adjust how the experience appears on the screen.
-## Global lighting
+## Global Lighting
The `Class.Lighting` service contains properties that you can adjust to update the global lighting in an experience, such as the `Class.Lighting.ClockTime|ClockTime` and `Class.Lighting.Brightness|Brightness`.
@@ -28,7 +28,7 @@ The `Class.Lighting` service contains properties that you can adjust to update t
In addition to global lighting, you can create and attach [light sources](../effects/light-sources.md) to parts or attachments to simulate objects like lamps, torches, spotlights, or TV screens.
-## Atmospheric effects
+## Atmospheric Effects
[Atmospheric effects](../environment/atmosphere.md) simulate realistic environments by scattering sunlight in unique ways. Using the `Class.Atmosphere` object in the `Class.Lighting` service, you can control air particle [density](../environment/atmosphere.md#density), simulate [haze](../environment/atmosphere.md#haze) or [glare](../environment/atmosphere.md#glare), set an atmosphere's [color](../environment/atmosphere.md#color), and more.
@@ -37,7 +37,7 @@ In addition to global lighting, you can create and attach [light sources](../eff
Atmospheric effects used to render a brilliant sunset scene
-## Clouds and skies
+## Clouds and Skies
By default, the `Class.Sky` object forms a [skybox](../environment/skybox.md) with celestial bodies such as a sun, moon, and stars. In addition, you can adjust the cloud cover, density, and color properties of the `Class.Clouds` object to render realistic, [dynamic clouds](../environment/clouds.md) that drift slowly across the sky through [global wind](../environment/global-wind.md).
@@ -46,16 +46,17 @@ By default, the `Class.Sky` object forms a [skybox](../environment/skybox.md) wi
Wind blowing dynamic clouds across the sky
-## Post-processing effects
+## Post-Processing Effects
-**Post-processing effects** are customizable filters that allow you to quickly
+Post-processing effects are customizable filters that allow you to quickly
enrich the visuals of your experience. Using the post-processing effect objects
-in the `Class.Lighting` service or `Class.Camera`, you can:
+in the `Class.Lighting` service or
+`Class.Camera`, you can:
-- Simulate a camera viewing a bright light and exaggerate its glow.
-- Apply a Gaussian blur to the entirety of your experience or add a blur to parts of your experience that aren't in focus.
-- Enhance an environment's appearance to create a specific mood through hue.
-- Render a halo of light that moves with the sun.
+- Simulate a camera viewing a bright light and exaggerate its glow ([bloom](../environment/post-processing-effects.md#bloom)).
+- Apply a Gaussian [blur](../environment/post-processing-effects.md#blur) to the entirety of your experience or add a blur to parts of your experience that aren't in focus ([depth‑of‑field](../environment/post-processing-effects.md#depth-of-field)).
+- Enhance an environment's appearance to create a specific mood through hue ([color correction](../environment/post-processing-effects.md#color-correction)).
+- Render a halo of light that moves with the sun ([sun rays](../environment/post-processing-effects.md#sun-rays)).
diff --git a/content/en-us/environment/lighting.md b/content/en-us/environment/lighting.md
index 80b271af5..38d388122 100644
--- a/content/en-us/environment/lighting.md
+++ b/content/en-us/environment/lighting.md
@@ -1,5 +1,5 @@
---
-title: Global lighting
+title: Global Lighting
description: Explains how to customize the global lighting with the Lighting service.
---
@@ -7,11 +7,11 @@ The `Class.Lighting` service contains properties that you can adjust to update
and customize the global lighting in an experience. There are five categories of
lighting properties:
-- **Color** — Configures hue within the experience.
-- **Intensity** — Configures the intensity or amount of light hitting the camera.
-- **Shadows** — Configures how a user experiences shadows within the experience.
-- **Environment** — Configures the conditions of the experience's world, such as the time of day and geographic latitude.
-- **Technology** — Configures the lighting technology Studio uses to render lighting and shadows.
+- [Color](#color) — Configures hue within the experience.
+- [Intensity](#intensity) — Configures the intensity or amount of light hitting the camera.
+- [Shadows](#shadows) — Configures how a user experiences shadows within the experience.
+- [Environment](#environment) — Configures the conditions of the experience's world, such as the time of day and geographic latitude.
+- [Technology](#technology) — Configures the lighting technology Studio uses to render lighting and shadows.
## Color
diff --git a/content/en-us/environment/post-processing-effects.md b/content/en-us/environment/post-processing-effects.md
index f23b15480..4eddb2801 100644
--- a/content/en-us/environment/post-processing-effects.md
+++ b/content/en-us/environment/post-processing-effects.md
@@ -1,5 +1,5 @@
---
-title: Post-processing effects
+title: Post-Processing Effects
description: Post-processing effects are customizable filters that quickly enrich the visuals of an experience.
---
@@ -15,7 +15,7 @@ description: Post-processing effects are customizable filters that quickly enric
Landscape with depth-of-field effect applied, simulating distance blur
-## Add post-processing effects
+## Adding Post-Processing Effects
When you add post-processing effects to the `Class.Lighting` service, they display to **all players** who enter the experience. This is useful for effects
that affect the global environment, such as [sun rays](#sun-rays).
@@ -24,16 +24,17 @@ When you add post-processing effects to the `Class.Camera` object, they only dis
To add post-processing effects to either the `Class.Lighting` service or `Class.Camera`:
-1. In the **Explorer** window, hover over the `Class.Lighting` service or `Class.Camera`,
+1. Navigate to the [Explorer](../studio/explorer.md) window.
+1. Hover over the `Class.Lighting` service or `Class.Camera`,
then click the ⊕ button. A contextual menu displays.
-1. From the menu, insert one or more of the following post-processing effects:
+1. From the menu, insert one of the following post-processing effects:
- - **BloomEffect**
- - **BlurEffect**
- - **ColorCorrectionEffect**
- - **DepthOfFieldEffect**
- - **SunRaysEffect**
- - **ColorGradingEffect**
+ - [**BloomEffect**](#bloom)
+ - [**BlurEffect**](#blur)
+ - [**ColorCorrectionEffect**](#color-correction)
+ - [**DepthOfFieldEffect**](#depth-of-field)
+ - [**SunRaysEffect**](#sun-rays)
+ - [**ColorGradingEffect**](#color-grading)
1. Depending on your Studio settings, some effects may not appear. To increase
your rendering quality level:
@@ -68,7 +69,7 @@ The `Class.BlurEffect` effect applies a Gaussian blur to the entirety of the 3D
-## Color correction
+## Color Correction
The `Class.ColorCorrectionEffect` effect adjusts color properties to enhance an environment's appearance. You can also use this effect to provide player feedback, such as tinting the screen red when their character's health is low.
@@ -88,7 +89,7 @@ The following list describes the primary `Class.ColorCorrectionEffect` propertie
-## Depth-of-field
+## Depth-of-Field
The `Class.DepthOfFieldEffect` effect blurs parts of your experience that aren't in focus. You can use this effect to blur distant objects or to focus a player on specific parts of your experience, such as an item in a shop.
@@ -103,14 +104,14 @@ The `Class.DepthOfFieldEffect` effect blurs parts of your experience that aren't
-## Sun rays
+## Sun Rays
The `Class.SunRaysEffect` effect creates a halo of light with rays around the sun that move based on the `Class.Lighting.ClockTime|ClockTime`
or `Class.Lighting.TimeOfDay|TimeOfDay` property. Objects between the player's camera and the sun shape this effect, allowing for realistic visuals of light and shadow.
-## Color grading
+## Color Grading
The `Class.ColorGradingEffect` effect modifies how color values calculated by the renderer should be converted to the screen's color range, impacting the mood and appearance of your place.
diff --git a/content/en-us/environment/skybox.md b/content/en-us/environment/skybox.md
index 6d292cdeb..99cdd20d2 100644
--- a/content/en-us/environment/skybox.md
+++ b/content/en-us/environment/skybox.md
@@ -3,16 +3,16 @@ title: Skyboxes
description: Skyboxes are cubes made up of six individual images that create an immersive background.
---
-A **skybox** is a cube made up of six individual images that create an immersive sky background in an experience. When the images are designed to be perfectly aligned with each other, the skybox appears to be panoramic without the impression of being inside a cube. This makes experiences feel larger than they really are, and it adds depth to your atmosphere, such as simulating deep space or underwater environments.
+A **skybox** (`Class.Sky`) is a cube made up of six individual images that create an immersive background in an experience. When the images are designed to be perfectly aligned with each other, the skybox appears to be panoramic without the impression of being inside a cube. This makes experiences feel larger than they really are, and it adds depth to your atmosphere, such as simulating deep space or underwater environments.
-Additionally, the `Class.Sky` object includes celestial bodies such as a sun, moon, and stars which dynamically appear, rise, and set based on the
+Additionally, the `Class.Sky` object includes [celestial bodies](#celestial-bodies) such as a sun, moon, and stars which dynamically appear, rise, and set based on the
`Class.Lighting.TimeOfDay|TimeOfDay` or `Class.Lighting.ClockTime|ClockTime`.
Finally, the `Class.Sky` object can be used as a cubemap for reflections in `Class.ViewportFrame|ViewportFrames`. For details, see [Frames](../ui/frames.md#viewportframe).
-## Create skyboxes
+## Creating a Skybox
-If you've created your own skybox images, you must first [import](../projects/assets/manager.md#import-assets) them to Roblox before you can use them in a skybox. Each image must be seamless along **all edges** of neighboring images when "folded" into a cube.
+If you've created your own skybox images, you must first [import](../projects/assets/manager.md#importing-assets) them to Roblox before you can use them in a skybox. Each image must be seamless along **all edges** of neighboring images when "folded" into a cube.
@@ -26,11 +26,12 @@ If you've created your own skybox images, you must first [import](../projects/as
To create a skybox:
-1. In the **Explorer** window, insert a `Class.Sky` object into the `Class.Lighting` service.
+1. In the [Explorer](../studio/explorer.md) window, insert a `Class.Sky` object into the `Class.Lighting` container.
-1. Select the new **Sky** object, then in the **Properties** window, assign a texture to each of the following sky properties:
+1. Select the new **Sky** object.
+1. In the [Properties](../studio/properties.md) window, assign a texture to each of the following sky properties:
- **SkyboxBk** — The **back** square of the skybox.
- **SkyboxDn** — The **down** square of the skybox.
@@ -41,7 +42,7 @@ To create a skybox:
-## Celestial bodies
+## Celestial Bodies
By default, the `Class.Sky` object includes celestial bodies such as a sun, moon, and stars. These bodies dynamically appear, rise, and set based on the
`Class.Lighting.TimeOfDay|TimeOfDay` or `Class.Lighting.ClockTime|ClockTime` property values.
diff --git a/content/en-us/get-started.md b/content/en-us/get-started.md
index 8a944ac8a..11a64c86c 100644
--- a/content/en-us/get-started.md
+++ b/content/en-us/get-started.md
@@ -1,11 +1,11 @@
---
-title: Get started with experiences on Roblox
+title: Get Started with Experiences on Roblox
description: Learn how to create Roblox experiences with guides, tutorials, and code samples.
hideInPageNavigation: true
---
Roblox is a 3D creation platform that provides an all-in-one IDE that includes
-the Roblox Engine, a client emulator, and all the tools and APIs you need to
+the Roblox engine, a client emulator, and all the tools and APIs you need to
start creating Roblox experiences.
@@ -16,7 +16,7 @@ start creating Roblox experiences.
style={{position: "relative", paddingBottom: "56.25%", height: 0, marginBottom: 12}}>
- Get Studio and take the tour
+ Get Studio and Take the TourGet acclimated with Studio by downloading and
launching the onboarding tour.
@@ -30,7 +30,7 @@ start creating Roblox experiences.
style={{position: "relative", paddingBottom: "56.25%", height: 0, marginBottom: 12}}>
- Create your first experience
+ Create Your First ExperienceCreate a catapult that launches spheres into blocks while learning important Roblox concepts.
- Learn about the platform
+ Learn about the PlatformRoblox is designed for mega-scale, 3D worlds. Learn about how it works!OverviewFor Unity Developers
@@ -57,7 +57,7 @@ start creating Roblox experiences.
-
Play and create with templates
+
Play and Create with Templates
Roblox Studio has a variety of templates that you can edit and play without prior
knowledge. Give them a try and add on to them when you're ready!
@@ -87,7 +87,7 @@ knowledge. Give them a try and add on to them when you're ready!
style={{position: "relative", paddingBottom: "56.25%", height: 0, marginBottom: 12}}>
- Laser tag
+ Laser TagBuild your own **first-person shooter** with customizable blasters, round systems, and modular building assets to reconfigure a high-quality arena!
- On forums
- Staff announcements
- Staff articles
- Community tutorials
- Community help and feedback
+ On Forums
+ Staff Announcements
+ Staff Articles
+ Community Tutorials
+ Community Help and Feedback
@@ -201,9 +201,9 @@ Learn, share, and interact with the Roblox community in the following places.
style={{position: "relative", paddingBottom: "56.25%", height: 0, marginBottom: 12}}>
- On social video channels
- YouTube channel
- Content and events platform
+ On Social Video Channels
+ YouTube Channel
+ Content and Events Platform
diff --git a/content/en-us/includes/beta-features/beta-alert.md b/content/en-us/includes/beta-features/beta-alert.md
index 00d5b88e0..c594c7bc6 100644
--- a/content/en-us/includes/beta-features/beta-alert.md
+++ b/content/en-us/includes/beta-features/beta-alert.md
@@ -1,5 +1,5 @@
---
-title: Beta alert box
+title: Beta Alert Box
---
{props.leadIn}**File** 〉 **Beta Features** 〉 **{props.betaName}**{props.leadOut}
diff --git a/content/en-us/includes/developer-console/opening-developer-console.md b/content/en-us/includes/developer-console/opening-developer-console.md
index c58f59c44..e0ead97fd 100644
--- a/content/en-us/includes/developer-console/opening-developer-console.md
+++ b/content/en-us/includes/developer-console/opening-developer-console.md
@@ -1,8 +1,8 @@
---
-title: Open the Developer Console
+title: Opening Developer Console
---
-You can open the console during a testing or live experience session using any of the following ways:
+You can open **Developer Console** during a testing or live experience session using any of the following ways:
- Press F9.
- Type `/console` into the chat.
diff --git a/content/en-us/includes/experience-notifications/analytics-itemized-stats.md b/content/en-us/includes/experience-notifications/analytics-itemized-stats.md
index 3ee7cfdd7..461f1937e 100644
--- a/content/en-us/includes/experience-notifications/analytics-itemized-stats.md
+++ b/content/en-us/includes/experience-notifications/analytics-itemized-stats.md
@@ -6,7 +6,7 @@ The **Experience Notifications** table displays detailed performance statistics
-The **Name** column is the key identifier for the notification. By default, the name matches the identifier name you specified when [creating the notification string](#create-a-notification-string), but you can override it through the `category` field in your API calls, in which case `category` overrides the name. Changing the string name in the [Creator Dashboard](https://create.roblox.com/dashboard/creations) or changing the string your message ID references in the API call will generate a new row in the table.
+The **Name** column is the key identifier for the notification. By default, the name matches the identifier name you specified when [creating the notification string](#creating-a-notification-string), but you can override it through the `category` field in your API calls, in which case `category` overrides the name. Changing the string name in the [Creator Dashboard](https://create.roblox.com/dashboard/creations) or changing the string your message ID references in the API call will generate a new row in the table.
If you'd like to A/B test the performance of different strings, it's recommended that you create an entirely new notification string with a similar name, for example:
diff --git a/content/en-us/includes/experience-notifications/analytics-notification-summary.md b/content/en-us/includes/experience-notifications/analytics-notification-summary.md
index 1bb05aefa..48abac875 100644
--- a/content/en-us/includes/experience-notifications/analytics-notification-summary.md
+++ b/content/en-us/includes/experience-notifications/analytics-notification-summary.md
@@ -16,7 +16,7 @@ The summary section serves as a snapshot of the aggregate performance of your no
**Opted-in Users**
-
The total number of users that have turned on notifications for your experience. Please note that this does include users under the age of 13 who are only able to receive notification of [experience updates](../../production/promotion/experience-events.md#announce-experience-updates), not personalized [experience notifications](../../production/promotion/experience-notifications.md).
+
The total number of users that have turned on notifications for your experience. Please note that this does include users under the age of 13 who are only able to receive notification of [experience updates](../../production/promotion/experience-events.md#announcing-updates), not personalized [experience notifications](../../production/promotion/experience-notifications.md).
**Impressions**
diff --git a/content/en-us/includes/experience-notifications/analytics-overview.md b/content/en-us/includes/experience-notifications/analytics-overview.md
index a4783c057..78598699e 100644
--- a/content/en-us/includes/experience-notifications/analytics-overview.md
+++ b/content/en-us/includes/experience-notifications/analytics-overview.md
@@ -2,7 +2,7 @@
title: include
---
-Performance of your notifications and notifiable audience are displayed in the **Analytics** tab of the **Notifications** page where you [configure notification strings](#create-a-notification-string) (simply tab from **Creations** to **Analytics**).
+Performance of your notifications and notifiable audience are displayed in the **Analytics** tab of the **Notifications** page where you [configure notification strings](#creating-a-notification-string) (simply tab from **Creations** to **Analytics**).
1. Navigate to the [Creator Dashboard](https://create.roblox.com/dashboard/creations).
1. Similar to [badges](../../production/publishing/badges.md), notification strings are tied to a **specific experience**. Locate that experience's thumbnail and click on it.
diff --git a/content/en-us/includes/experience-notifications/guidelines.md b/content/en-us/includes/experience-notifications/guidelines.md
index a47c814ea..6922c28bb 100644
--- a/content/en-us/includes/experience-notifications/guidelines.md
+++ b/content/en-us/includes/experience-notifications/guidelines.md
@@ -4,7 +4,7 @@ title: include
-Best practices
+Best Practices
Notifications should be **personalized** to the receiver and should be based on in‑experience activity that's specifically relevant to the user. Inversely, notifications should not be of a generic, advertising nature.
@@ -31,7 +31,7 @@ Ideally, notifications should also alert users of something they can take **imme
-Respect community standards
+Respect Community Standards
All notification content and behaviors are subject to Roblox's [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards) and platform‑wide [text filtering](../../ui/text-filtering.md), regardless of your experience's [age guidelines](../../production/promotion/experience-guidelines.md). This means that if your experience is a 17+ experience, your notifications are still subject to the platform‑wide standards, **not** the [17+ Policy Standards](https://en.help.roblox.com/hc/en-us/articles/15869919570708).
@@ -40,7 +40,7 @@ All notification content and behaviors are subject to Roblox's [Community Standa
-Avoid deceptive nudge tactics
+Avoid Deceptive Nudge Tactics
Notification content is **not** permitted to incorporate dark patterns or other tactics that manipulate or deceive users into making choices they don't intend, or which may be counter to their best interests. This could include the following:
@@ -74,7 +74,7 @@ Notification content is **not** permitted to incorporate dark patterns or other
-Do not gate gameplay
+Do Not Gate Gameplay
Experiences should **not** require users to turn on notifications in order to participate or advance in gameplay.
diff --git a/content/en-us/includes/experience-notifications/implementation-create-notification-string.md b/content/en-us/includes/experience-notifications/implementation-create-notification-string.md
index 9ba4b0cdb..730a356ff 100644
--- a/content/en-us/includes/experience-notifications/implementation-create-notification-string.md
+++ b/content/en-us/includes/experience-notifications/implementation-create-notification-string.md
@@ -11,7 +11,7 @@ As with [Player Invite Prompts](../../production/promotion/invite-prompts.md), y
1. In the center region, click the **Create a Notification String** button.
-1. Fill in an identifier name (only visible to you) and the custom notification string; this is limited to 99 characters and can include unlimited [custom parameters](#customize-notifications-using-parameters). Notifications will automatically use the title of your experience as the notification title, but you can additionally use **\{experienceName\}** to reference your experience in the notification body text.
+1. Fill in an identifier name (only visible to you) and the custom notification string; this is limited to 99 characters and can include unlimited [custom parameters](#customizing-notifications-using-parameters). Notifications will automatically use the title of your experience as the notification title, but you can additionally use **\{experienceName\}** to reference your experience in the notification body text.
Example notification strings:
@@ -29,4 +29,4 @@ As with [Player Invite Prompts](../../production/promotion/invite-prompts.md), y
-4. Use the copied ID for the `messageId` key value in the `payload` table as demonstrated in the [example script](#send-an-experience-notification).
+4. Use the copied ID for the `messageId` key value in the `payload` table as demonstrated in the [example script](#sending-an-experience-notification).
diff --git a/content/en-us/includes/experience-notifications/intro.md b/content/en-us/includes/experience-notifications/intro.md
index a812997fe..eb21e9b0f 100644
--- a/content/en-us/includes/experience-notifications/intro.md
+++ b/content/en-us/includes/experience-notifications/intro.md
@@ -2,7 +2,7 @@
title: include
---
-**Experience notifications** are a way for [opted-in](https://en.help.roblox.com/hc/en-us/articles/24769602332692-Out-of-Experience-Notifications) users age 13+ to keep up with their favorite experiences through timely, personalized notifications. As the developer, you can determine what kinds of in‑experience activities are most important to notify your users about, as well as define the notification content.
+**Experience Notifications** are a way for [opted-in](https://en.help.roblox.com/hc/en-us/articles/24769602332692-Out-of-Experience-Notifications) users age 13+ to keep up with their favorite experiences through timely, personalized notifications. As the developer, you can determine what kinds of in‑experience activities are most important to notify your users about, as well as define the notification content.
@@ -43,13 +43,13 @@ title: include
-The experience notification system features the following:
+The Experience Notification system features the following:
-- **Customizable notifications with parameters** — Full flexibility to customize the [notification message](#creating-a-notification-string) with parameters, for example:
+- **Customizable Notifications with Parameters** — Full flexibility to customize the [notification message](#creating-a-notification-string) with parameters, for example:
-- **Launch Data** — Include optional [launch data](#include-launch-and-analytics-data) that can be read through `Class.Player:GetJoinData()` when the notification recipient joins. This could involve routing a user to a coordinate location or personalizing their joining experience.
+- **Launch Data** — Include optional [launch data](#including-launch-and-analytics-data) that can be read through `Class.Player:GetJoinData()` when the notification recipient joins. This could involve routing a user to a coordinate location or personalizing their joining experience.
- **Analytics Support** — Track your reachable audience and the performance of your notifications in the [Creator Dashboard](https://create.roblox.com/dashboard/creations).
diff --git a/content/en-us/includes/studio/device-emulator.md b/content/en-us/includes/studio/device-emulator.md
index d9e818601..7f5b20232 100644
--- a/content/en-us/includes/studio/device-emulator.md
+++ b/content/en-us/includes/studio/device-emulator.md
@@ -2,7 +2,7 @@
title: include
---
-The **Device Emulator** lets you emulate various devices directly in Studio, providing insight on how controls operate on a mobile device or how [on-screen UI](../../ui/on-screen-containers.md) displays on different screens and aspect ratios.
+The **Device** emulator lets you emulate various devices directly in Studio, providing insight on how controls operate on a mobile device or how [on-screen UI](../../ui/on-screen-containers.md) displays on different screens and aspect ratios.
diff --git a/content/en-us/includes/studio/testing-modes.md b/content/en-us/includes/studio/testing-modes.md
index 1648f97ba..a4e49e460 100644
--- a/content/en-us/includes/studio/testing-modes.md
+++ b/content/en-us/includes/studio/testing-modes.md
@@ -54,7 +54,7 @@ Once a playtest is running, the following options become available:
**Pause Physics** / **Resume Physics**
-
Lets you [pause and resume physics](#pause--resume-physics) without disabling rendering.
+
Lets you [pause and resume physics](#pausing--resuming-physics) without disabling rendering.
**Stop**
diff --git a/content/en-us/includes/ui/default-ui.md b/content/en-us/includes/ui/default-ui.md
index fd037622e..514200bfa 100644
--- a/content/en-us/includes/ui/default-ui.md
+++ b/content/en-us/includes/ui/default-ui.md
@@ -8,7 +8,7 @@ All Roblox experiences include several UI elements that are enabled by default.
Default UI
-
Associated enum
+
Associated Enum
diff --git a/content/en-us/input/gamepad.md b/content/en-us/input/gamepad.md
index 5e800c112..5f2739661 100644
--- a/content/en-us/input/gamepad.md
+++ b/content/en-us/input/gamepad.md
@@ -1,5 +1,5 @@
---
-title: Gamepad input
+title: Gamepad Input
description: Explains how to accept input from USB gamepads, such as Xbox and PlayStation controllers.
---
@@ -8,11 +8,11 @@ import BetaAlert from '../includes/beta-features/beta-alert.md'
Roblox accepts input from USB gamepads such as Xbox and PlayStation controllers. Since gamepads come in different varieties, you need to follow additional setup to verify that a player's gamepad inputs are usable in your experience.
-To set up gamepad inputs, you can use `Class.ContextActionService` or `Class.UserInputService` to [detect connected gamepads](#detect-gamepads) for a player's device, [verify supported inputs](#verify-supported-inputs) that are compatible with Roblox, [receive input](#receive-input), and more.
+To set up gamepad inputs, you can use `Class.ContextActionService` or `Class.UserInputService` to [detect connected gamepads](#detecting-gamepads) for a player's device, [verify supported inputs](#verifying-supported-inputs) that are compatible with Roblox, [receive input](#receiving-input), and more.
When binding gamepad inputs, see [common control schemas](#common-control-schemas) to create a consistent gamepad experience for players. After inputs are set, you can enhance the player's experience by including [haptic feedback](#haptic-feedback) on supported controllers.
-## Detect gamepads
+## Detecting Gamepads
You can detect whether a player's device currently has a gamepad active using the `Class.UserInputService.GamepadEnabled` property.
@@ -50,7 +50,7 @@ elseif UserInputService:GetGamepadConnected(Enum.UserInputType.Gamepad2) then
end
```
-## Verify supported inputs
+## Verifying Supported Inputs
Since gamepads can have different sets of inputs, you should check which inputs are supported with `Class.UserInputService:GetSupportedGamepadKeyCodes()`. This method takes a `Enum.UserInputType` as an argument and returns a table with a list of all available inputs for the specified controller.
@@ -65,7 +65,7 @@ for _, control in availableInputs do
end
```
-## Receive input
+## Receiving Input
`Class.ContextActionService` is useful for binding controls to both gamepads and other input sources such as [mouse and keyboard](./mouse-and-keyboard.md) inputs or [mobile](../input/mobile.md) touchscreen buttons, or for binding multiple functions to a single button input on any device. For example, the following code sample binds an `OpenSpellBook` action to the gamepad's `Enum.KeyCode.ButtonR2|ButtonR2` button and the keyboard's `Enum.KeyCode.B|B` key.
@@ -99,7 +99,7 @@ UserInputService.InputBegan:Connect(function(input)
end)
```
-### Gamepad state
+### Gamepad State
You can detect the current state of all buttons and sticks on a gamepad with the `Class.UserInputService:GetGamepadState()` method. This is useful if you need to check the current gamepad inputs when a distinct event occurs in your experience, such as checking if specific buttons are being pressed when a character touches an object.
@@ -124,7 +124,7 @@ leftFoot.Touched:Connect(function(hit)
end)
```
-### Trigger pressure
+### Trigger Pressure
You can detect how much pressure is being placed on gamepad triggers by checking the `Class.InputObject.Position|Position.Z` value of the input trigger.
@@ -142,7 +142,7 @@ UserInputService.InputChanged:Connect(function(input)
end)
```
-## Common control schemas
+## Common Control Schemas
Gamepads come in a variety of shapes and sizes. As with any method of player input, it's best to create some consistency across different games and experiences.
@@ -161,7 +161,7 @@ The following are common input binds that will help players immediately feel fam
Input
-
Common use cases
+
Common Use Cases
@@ -192,11 +192,11 @@ The following are common input binds that will help players immediately feel fam
-## Haptic feedback
+## Haptic Feedback
-Many gamepad controllers have motors built in to provide haptic feedback. Adding rumbles and vibrations can greatly enhance a player's experience and provide subtle feedback beyond visuals or audio. You can use the `Class.HapticService` to [verify vibration support](#vibration-support) before [turning on the motors](#activate-motors).
+Many gamepad controllers have motors built in to provide haptic feedback. Adding rumbles and vibrations can greatly enhance a player's experience and provide subtle feedback beyond visuals or audio. You can use the `Class.HapticService` to [verify vibration support](#vibration-support) before [turning on the motors](#activating-motors).
-### Vibration support
+### Vibration Support
Not all controllers have motors so it is important to check for support before attempting to use the haptic motors. To query if a given controller has vibration support, call `Class.HapticService:IsVibrationSupported()`.
@@ -260,7 +260,7 @@ end
-### Activate motors
+### Activating Motors
Once you've confirmed that a player's gamepad [supports vibration](#vibration-support), you can turn on a specific motor with `Class.HapticService:SetMotor()`. This method takes the gamepad and the amplitude of the vibration as arguments. Amplitude can be any value between 0 and 1.
@@ -278,7 +278,7 @@ if isVibrationSupported then
end
```
-## Controller emulation
+## Controller Emulation
diff --git a/content/en-us/input/index.md b/content/en-us/input/index.md
index 8b2ee05ed..10f75b8ea 100644
--- a/content/en-us/input/index.md
+++ b/content/en-us/input/index.md
@@ -1,5 +1,5 @@
---
-title: Input and camera
+title: Input and Camera
description: Explains how Roblox supports various input devices and camera configurations.
---
@@ -11,7 +11,7 @@ Inputs also include user camera controls, and you can customize various camera
settings using built-in settings or custom scripts to achieve a certain look and
feel for your users.
-## Mouse and keyboard
+## Mouse and Keyboard
The most common mouse and keyboard inputs are already set in an experience as
Roblox default keybinds. You can set up additional inputs or replace existing
@@ -21,7 +21,7 @@ Once you're comfortable with testing and developing your inputs on mouse and
keyboard, make your experience compatible with multiple platforms by setting up
mobile and gamepad inputs.
-See [Mouse and keyboard input](../input/mouse-and-keyboard.md) for more
+See [Mouse and Keyboard Input](../input/mouse-and-keyboard.md) for more
information on setting up your first custom inputs.
## Mobile
@@ -34,7 +34,7 @@ You can bind a single action to a traditional PC input and create an on-screen
button for touchscreen devices. You can also dynamically update input behavior
so that inputs trigger certain actions only in certain contexts.
-See [Mobile input](../input/mobile.md) for more information on creating
+See [Mobile Input](../input/mobile.md) for more information on creating
setting up cross-platform and dynamic inputs.
## Gamepad
@@ -43,14 +43,14 @@ Roblox accepts input from USB gamepads such as Xbox and Playstation controllers.
Gamepads require additional steps to detect and verify connected gamepads before
binding controller inputs to actions.
-See [Gamepad input](../input/gamepad.md) for more information on setting up
+See [Gamepad Input](../input/gamepad.md) for more information on setting up
gamepad inputs for your experience.
-## Customize the camera
+## Customizing the Camera
Roblox experiences include a default user-friendly camera configuration. You can
edit the camera settings to create a more immersive and unique experience for
your users.
-See [Customize the camera](../workspace/camera.md) for more
+See [Customizing the Camera](../workspace/camera.md) for more
information on customizing the properties of your camera system.
diff --git a/content/en-us/input/mobile.md b/content/en-us/input/mobile.md
index 32640a22a..0aaab22a8 100644
--- a/content/en-us/input/mobile.md
+++ b/content/en-us/input/mobile.md
@@ -1,5 +1,5 @@
---
-title: Mobile input
+title: Mobile Input
description: Explains Roblox support for mobile devices.
---
@@ -9,27 +9,27 @@ When designing a mobile experience, consider the [device orientation](#device-or
- [Create on-screen buttons](#custom-mobile-buttons) visible only on mobile devices.
- [Setup context dependent inputs](#context-dependent-inputs) that allows the same button or input to perform a different action depending on the situation.
-- [Detect other input devices](#detect-other-devices), such as a mouse or keyboard connected to a mobile tablet, to provide the correct on-screen prompts to the user.
+- [Detect other input devices](#detecting-other-devices), such as a mouse or keyboard connected to a mobile tablet, to provide the correct on-screen prompts to the user.
-## Device orientation
+## Device Orientation
On phones and tablets, the device orientation majorly affects the user experience and interaction. For example, landscape mode is best operated with two thumbs while portrait mode may lend itself to one-finger interface.
By default, Roblox experiences run in landscape mode, allowing the experience to switch between landscape "left" and landscape "right" as the user's device rotates. However, experiences can be locked to a particular orientation if desired.
-### Orientation modes
+### Orientation Modes
There are five different orientation modes, including two sensor-based modes and three locked modes.
-
Sensor modes
+
Sensor Modes
-
Landscape sensor
+
Landscape Sensor
The default Roblox setting in which the experience always appears in landscape mode (no portrait mode) and the device detects its physical orientation to ensure the experience view is always oriented upward.
@@ -42,16 +42,16 @@ There are five different orientation modes, including two sensor-based modes and
-
Locked modes
+
Locked Modes
-
Landscape left
+
Landscape Left
On devices with a physical home button, the home button is to the left of the display. On devices with a virtual home/nav bar, its touch region is at the bottom of the display.
-
Landscape right
+
Landscape Right
On devices with a physical home button, the home button is to the right of the display. On devices with a virtual home/nav bar, its touch region is at the bottom of the display.
@@ -65,11 +65,11 @@ There are five different orientation modes, including two sensor-based modes and
Roblox does not include a "portrait upside-down" mode since many devices do not natively support that orientation.
-### Orientation properties
+### Orientation Properties
-When setting an orientation, you can set the [starting orientation](#starting-orientation), the [in-experience orientation](#in-experience-orientation), and the [current orientation](#current-orientation).
+When setting an orientation, you can set the [Starting Orientation](#starting-orientation), the [In-Experience Orientation](#in-experience-orientation), and the [Current Orientation](#current-orientation).
-#### Starting orientation
+#### Starting Orientation
`Class.StarterGui.ScreenOrientation` sets the default orientation for a place. Acceptable values include:
@@ -81,7 +81,7 @@ When setting an orientation, you can set the [starting orientation](#starting-or
Because this property affects all new users who join the experience, you can set its value in `Class.StarterGui` → `Enum.ScreenOrientation` within Studio.
-#### In-experience orientation
+#### In-Experience Orientation
`Class.PlayerGui.ScreenOrientation` explicitly changes the experience's orientation for a user. When this property is set to one of the `Enum.ScreenOrientation` enums in a `Class.LocalScript`, the experience will immediately orient itself to match the setting. This can be useful when an experience needs to provide a particular experience like locking the view to portrait for a minigame.
@@ -96,7 +96,7 @@ task.wait(2)
playerGUI.ScreenOrientation = Enum.ScreenOrientation.Portrait
```
-#### Current orientation
+#### Current Orientation
`Class.PlayerGui.CurrentScreenOrientation` gets the current device orientation. Possible values include:
@@ -113,7 +113,7 @@ local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")
print(playerGUI.CurrentScreenOrientation)
```
-## Character movement modes
+## Character Movement Modes
Roblox offers several `Class.StarterPlayer` properties you can set to change how users on mobile devices can move through your experience.
@@ -158,7 +158,7 @@ You can set mobile movement control schemes for Roblox experiences by changing t
-### Automatic jumping
+### Automatic Jumping
When `Class.StarterPlayer.AutoJumpEnabled` is enabled, the user's character automatically jumps across gaps when approaching the edge of a platform. `Class.StarterPlayer.AutoJumpEnabled` is enabled by default for mobile devices.
@@ -264,7 +264,7 @@ ContextActionService:BindAction("Interact", talkToNPC, true, Enum.KeyCode.T, Enu
ContextActionService:SetTitle("Interact", "Talk")
```
-## Detect other devices
+## Detecting Other Devices
In cross-platform experiences, it's important to reference the user's preferred input options by displaying input options for the actively used device. For example, a mobile device can have a [mouse and keyboard](./mouse-and-keyboard.md) or [gamepad](./gamepad.md) connected, or it's possible that a desktop has a touchscreen enabled. If multiple input sources are enabled, you can use `Class.UserInputService:GetLastInputType()|GetLastInputType()` to get the user's last used input device.
diff --git a/content/en-us/input/mouse-and-keyboard.md b/content/en-us/input/mouse-and-keyboard.md
index 4d4ea8225..48e45d55e 100644
--- a/content/en-us/input/mouse-and-keyboard.md
+++ b/content/en-us/input/mouse-and-keyboard.md
@@ -1,5 +1,5 @@
---
-title: Mouse and keyboard input
+title: Mouse and Keyboard Input
description: Explains Roblox support for computer mice and keyboards.
---
@@ -7,7 +7,7 @@ A large percentage of Roblox sessions are played on devices with a mouse and key
For convenience, Roblox sets the most common mouse and keyboard inputs as [default bindings](#roblox-default-bindings) which, except for the reserved bindings, you can overwrite.
-## Generic mouse input
+## Generic Mouse Input
Like all device inputs, you can capture mouse inputs using `Class.UserInputService`. This service provides a scalable way to capture input changes and device input states for multiple devices at once. Roblox also supports legacy mouse input detection with `Class.PlayerMouse` and `Class.ClickDetector|ClickDetectors`.
@@ -34,7 +34,7 @@ end
UserInputService.InputEnded:Connect(onInputEnded)
```
-## Generic keyboard input
+## Generic Keyboard Input
To access keyboard events, use the `Class.UserInputService.InputEnded` event to track whenever any keystroke or other input ends. Similar to [mouse](#generic-mouse-input) events, this event only works within a `Class.LocalScript`.
@@ -57,13 +57,13 @@ end
UserInputService.InputEnded:Connect(onInputEnded)
```
-## UI input
+## UI Input
Mouse and keyboard input automatically works with interactive UI elements such as `Class.TextButton|TextButtons` and `Class.ImageButton|ImageButtons`, as well as `Class.TextBox|TextBoxes` which capture text input like a field in a form.
For more information on creating buttons and text input objects, see [Buttons](../ui/buttons.md) and [Text Input](../ui/text-input.md).
-## Character movement modes
+## Character Movement Modes
You can set mouse and keyboard movement controls schemes for Roblox experiences by changing the values of `Class.StarterPlayer.DevComputerMovementMode` to one of the following:
@@ -94,11 +94,11 @@ You can set mouse and keyboard movement controls schemes for Roblox experiences
-## Mouse icons
+## Mouse Icons
You can customize the appearance and behavior of a user's mouse icon within your experience to create a cohesive style across all of your UI elements. This includes temporarily changing the user's mouse icon in specific circumstances, such as hovering over a button.
-### Change the icon
+### Changing the Icon
You can change the user's mouse icon in a `Class.LocalScript` by setting the `Class.UserInputService.MouseIcon|MouseIcon` property in `Class.UserInputService` to a custom Roblox asset ID. For example, the following `Class.LocalScript` changes the user's default mouse icon to a circle with a blue dot in the middle:
@@ -108,7 +108,7 @@ local UserInputService = game:GetService("UserInputService")
UserInputService.MouseIcon = "rbxassetid://3400146391"
```
-### Hide the icon
+### Hiding the Icon
You can hide the user's mouse icon by setting the `Class.UserInputService.MouseIconEnabled` to `false` in a `Class.LocalScript`. For example, the following code switches the mouse icon from visible to invisible and back every two seconds:
@@ -123,7 +123,7 @@ while true do
end
```
-### Lock the icon
+### Locking the Icon
You can lock the mouse icon's position to the screen using `Class.UserInputService.MouseBehavior` with a `Enum.MouseBehavior` value of `Enum.MouseBehavior|LockCurrentPosition` or `Enum.MouseBehavior|LockCenter`, then unlock it again with a value of `Enum.MouseBehavior|Default`.
@@ -143,9 +143,9 @@ UserInputService.InputChanged:Connect(function(inputObject)
end)
```
-## Roblox default bindings
+## Roblox Default Bindings
-Roblox provides default key bindings for all experiences. These are the most common inputs used for movement, camera control, and basic environment interaction. Excluding the reserved bindings, you can use `Class.ContextActionService` to create cross‑platform binds that prioritize multiple bindings to a single action, as described in [context-dependent inputs](../input/mobile.md#context-dependent-inputs).
+Roblox provides default key bindings for all experiences. These are the most common inputs used for movement, camera control, and basic environment interaction. Excluding the reserved bindings, you can use `Class.ContextActionService` to create cross‑platform binds that prioritize multiple bindings to a single action, as described in [Context-Dependent Inputs](../input/mobile.md#context-dependent-inputs).
`Enum.CoreGuiType` features, such as the **Backpack** or **Chat**, have a list of additional default inputs. You can't overwrite reserved inputs such as Esc (Roblox menu) or F9 (Developer Console).
diff --git a/content/en-us/luau/comments.md b/content/en-us/luau/comments.md
index e290f5c08..c350824c1 100644
--- a/content/en-us/luau/comments.md
+++ b/content/en-us/luau/comments.md
@@ -5,7 +5,7 @@ description: Comments are text that the Luau parser ignores at runtime.
A **comment** is text that the Luau parser ignores at runtime.
-## Single-line comments
+## Single-line Comments
You can define single-line comments with a double hyphen (`--`) anywhere outside a string. Single-line comments extend to the end of the line.
@@ -21,7 +21,7 @@ if not foo then
end
```
-## Block comments
+## Block Comments
You can define multiline block comments with double hyphens and double brackets (`--[[]]`). Use block comments for documenting items:
@@ -47,7 +47,7 @@ If necessary, you can nest multiple brackets inside a block comment using the sa
]=]
```
-## To-do comments
+## TODO Comments
Roblox Studio supports special `TODO` comments. Studio bolds any text following `TODO` (until broken by a space):
diff --git a/content/en-us/luau/control-structures.md b/content/en-us/luau/control-structures.md
index 55e74dd88..dfe73a5f9 100644
--- a/content/en-us/luau/control-structures.md
+++ b/content/en-us/luau/control-structures.md
@@ -1,5 +1,5 @@
---
-title: Control structures
+title: Control Structures
description: Control structures are statements that manage the flow of Luau code execution.
---
@@ -12,7 +12,7 @@ description: Control structures are statements that manage the flow of Luau code
The condition for `if` statements, `while` loops, and `repeat` loops can be any Luau expression or value. If a value isn't `false` or `nil`, then Luau evaluates it as `true` in conditional statements. Unlike other scripting languages, Luau considers both zero and the empty string as `true`.
-## If statements
+## If Statements
The basic `if` statement tests its condition. If the condition is true, then Luau executes the code between `then` and `end`.
@@ -30,7 +30,7 @@ else
end
```
-## While loops
+## While Loops
A `while`—`do` loop evaluates if a specified condition is true or false. If the condition is `false` or `nil`, then the loop ends, and Luau skips the code in the loop. If the condition is `true`, then Luau executes the code in the loop and repeats the process.
@@ -59,7 +59,7 @@ Timer reached zero!
]]
```
-### Infinite loops
+### Infinite Loops
You can use a `while`—`do` loop to write infinite game loops by setting `true` as the condition.
@@ -82,7 +82,7 @@ Looping...
Always include a delay such as task.wait() in an infinite loop. Omitting it freezes the experience and crashes Studio.
-## Repeat loops
+## Repeat Loops
The `repeat`—`until` loop repeats until a condition is true. The conditional test evaluates **after** the code block runs, so the code block always runs at least once. Unlike other languages, the Luau scope of a local variable declared inside a `repeat`—`until` loop includes the condition.
@@ -110,11 +110,11 @@ Goblins repopulated!
]]
```
-## For loops
+## For Loops
A for loop executes code a set number of times, either based on a [numerical counter](#numeric-for-loops) or the number of [items in a collection](#generic-for-loops).
-### Numeric for loops
+### Numeric For Loops
A `for`—`do` loop determines the number of times to execute the loop using a counter. The loop is declared with a start value, end value, and optional increment.
@@ -156,13 +156,13 @@ end
]]
```
-### Generic for loops
+### Generic For Loops
The generic `for` loop iterates over items in a collection rather than a sequence of numbers. With generic `for` loops, you can execute code for each item in the collection, and can easily use each item in the code.
For loops need a function, or iterator, to iterate over different types of collections. The global `ipairs()` returns an iterator for arrays, and the global `pairs()` returns an iterator for dictionaries. The `Library.string` library provides `Library.string.gmatch()` to iterate over strings.
-### Generalized iteration
+### Generalized Iteration
In Luau, you can iterate over a table using the `in` keyword directly on the table, instead of using an iterator function such as `ipairs()`:
@@ -252,7 +252,9 @@ World f
]]
```
-## Break loops
+## Control Keywords
+
+### Breaking Loops
To force a loop to end, use the `break` keyword. The following code sample shows how to break an infinite `while`—`do` loop.
@@ -282,7 +284,7 @@ Five seconds elapsed. Time to move on!
]]
```
-## Continue loops
+### Continuing Loops
To force a loop to iterate and start again, use the `continue` keyword. A `for` loop will iterate the counter; `while` and `repeat`—`until` will check the loop condition before continuing. The following code sample gets all children of an `Class.Instance` of a specific `Class.Instance.ClassName|ClassName`.
diff --git a/content/en-us/luau/enums.md b/content/en-us/luau/enums.md
index cfeaaabe1..24a40801b 100644
--- a/content/en-us/luau/enums.md
+++ b/content/en-us/luau/enums.md
@@ -5,7 +5,7 @@ description: A fixed list of items (enumeration).
The **enumeration** data type, or `Datatype.Enum`, is a fixed list of items. You can access enums through the global object called `Datatype.Enum`. For a full list of Enums and their items, see [Enums](/reference/engine/enums) in the API Reference.
-## Get enum items
+## Getting Items of Enums
To get all items of an Enum, call the `GetEnumItems()` method on the enum. The following code sample demonstrates how to call `GetEnumItems()` on the `Enum.PartType` enum.
@@ -22,7 +22,7 @@ end
]]
```
-## Data type
+## Enum Items
The `Datatype.EnumItem` is the data type for items in enums. An `Datatype.EnumItem` has three properties:
@@ -39,7 +39,7 @@ print(Enum.PartType.Cylinder.Value) -- 2
print(Enum.PartType.Cylinder.EnumType) -- PartType
```
-## Assign enum items
+## Assigning Enum Items
To assign an `Datatype.EnumItem` as the value of a property, use the full `Datatype.Enum` declaration. You can also use its `Value` or `EnumType`.
diff --git a/content/en-us/luau/functions.md b/content/en-us/luau/functions.md
index 52815e962..f56c59fbe 100644
--- a/content/en-us/luau/functions.md
+++ b/content/en-us/luau/functions.md
@@ -5,7 +5,7 @@ description: Functions are blocks of code that can execute multiple times on com
**Functions** are [blocks of code](./scope.md) that you can execute multiple times on command. You can also connect them to [events](#event-handlers) or assign them as [callbacks](#callbacks).
-## Basic functions
+## Basic Functions
A function definition includes:
@@ -97,7 +97,7 @@ print(secondPart.Parent) -- nil
The statement `table:Method()` is functionally identical to `table.Method(table)`, and when defining a method, `function table:Method()` is identical to `function table.Method(self)`. This behavior extends to `Class.Instance` methods, since they are also derived from tables.
-### Define methods
+### Defining Methods
To create a method in a table, use the name of the method as the key and the method function as the value. In the definition of the method, the `self` parameter refers to the method's parent table. When you call a method using colon notation, you pass the table itself as the first argument. You can define parameters for a method, but you need to list them after the `self` parameter.
@@ -121,7 +121,7 @@ testButton:changeEnabled(false) -- false
Callbacks are functions that execute in response to another function or process.
-### Basic callbacks
+### Basic Callbacks
Functions can be passed into other functions, for example, an [anonymous](#anonymous-functions) function can be used to implement a callback that `Library.table.sort()` then uses to sort a list of `Class.Player|Players` from `Class.Players.GetPlayers()`.
@@ -154,9 +154,9 @@ end
print(bindableFunction:Invoke(42)) -- 84
```
-## Function techniques
+## Function Techniques
-### Event handlers
+### Event Handlers
You can assign a function, known as an **event handler**, to execute when an event fires. For example, you can create a function called `onPlayerAdded()` to the `Class.Players.PlayerAdded` event to print the name of whatever player joins. For more information, see [Events](../scripting/events/index.md).
@@ -170,7 +170,7 @@ end
Players.PlayerAdded:Connect(onPlayerAdded)
```
-### Anonymous functions
+### Anonymous Functions
You can create functions without names, known as **anonymous functions**, to use as [callbacks](#callbacks) and [event handlers](#event-handlers). Like named functions, anonymous functions need to start and end with the `function` and `end` keywords, but you don't need the `local` keyword to indicate local scope because they always have local scope.
@@ -189,11 +189,11 @@ Players.PlayerAdded:Connect(function(player)
end)
```
-### Functions in module scripts
+### Functions in ModuleScripts
You can reuse functions across multiple scripts by storing them in `Class.ModuleScript|ModuleScripts`. Functions are a Luau data type, so you can store them in tables with other data.
-### Variadic functions
+### Variadic Functions
A variadic function accepts any number of arguments. For example, `Globals.LuaGlobals.print()` is a variadic function.
@@ -203,7 +203,7 @@ print(string.format("The %s is a %s!", "cake", "lie")) -- The cake is a lie!
print(string.char(115, 101, 99, 114, 101, 116)) -- secret
```
-#### Define variadic functions
+#### Defining Variadic Functions
To define a variadic function, you use the `...` token as the last or only parameter (not to be confused with `..`, the concatenation [operator](./operators.md)). You can put the `...` values in a table for ease of use.
@@ -231,7 +231,7 @@ Input No. 3 = Variadic Function
]]
```
-#### Forward arguments
+#### Argument Forwarding
You can define variadic functions as wrappers around other functions to pass, or forward, arguments from the wrapper to the other functions.
@@ -256,7 +256,7 @@ After
]]
```
-#### Call a variadic function with arrays
+#### Calling a Variadic Function with Arrays
If you want to pass a table array of values to a global variadic function, such as `print()`, you can use the global `unpack()` function to pass the values of the table instead of the table itself.
diff --git a/content/en-us/luau/index.md b/content/en-us/luau/index.md
index 90b31a275..d9a52c8b1 100644
--- a/content/en-us/luau/index.md
+++ b/content/en-us/luau/index.md
@@ -26,7 +26,7 @@ Luau includes the following data types:
Luau is dynamically typed by default. Variables, function parameters, and return values can be any data type. This helps you write code faster because you don't need to provide types for each piece of data. You can still declare explicit types for variables in Luau and enable [strict type checking](type-checking.md) to make type issues obvious and easy to locate.
-## Data structures
+## Data Structures
You can also implement the following data structures using primitive data types:
diff --git a/content/en-us/luau/luau-csharp-comparison.md b/content/en-us/luau/luau-csharp-comparison.md
index 5e105c7f9..60d366ac2 100644
--- a/content/en-us/luau/luau-csharp-comparison.md
+++ b/content/en-us/luau/luau-csharp-comparison.md
@@ -1,15 +1,15 @@
---
-title: Luau and C# comparison
+title: Luau and C# Comparison
description: Explains the similarities and differences between the C# and Luau programming languages.
---
Roblox uses the Luau programming language. The following code samples and tables indicate some of the differences between syntaxes for C# and Luau.
-## Line endings
+## Line Endings
You don't need semicolons in Luau, but they don't break the syntax.
-## Reserved keywords
+## Reserved Keywords
The following table has Luau's reserved keywords mapped to their C# equivalent. Note it doesn't show all C# keywords.
@@ -158,7 +158,7 @@ string endString = s1 + s2;
To learn more about tables in Luau, see [Tables](./tables.md).
-### Dictionary tables
+### Dictionary Tables
You can use tables in Luau as dictionaries just like in C#.
@@ -189,7 +189,7 @@ dictionary["val3"] = "a dictionary"; // Overwrites 'val3' or sets new key-value
dictionary.Add("val3", "a dictionary"); // Creates a new key-value pair
```
-### Numerically-indexed tables
+### Numerically-Indexed Tables
You can use tables in Luau as arrays just like in C#. Indices start at `1` in Luau and `0` in C#.
@@ -231,7 +231,7 @@ npcAttributes.Remove(2);
## Operators
-### Conditional operators
+### Conditional Operators
@@ -389,7 +389,7 @@ Console.WriteLine("3: " + outerVar); // prints "3: "Inner scope modified text"
// Attempting to print 'innerVar' here would fail
```
-## Conditional statements
+## Conditional Statements
```lua title='Conditional Statements in Luau'
-- One condition
@@ -426,7 +426,7 @@ else {
}
```
-### Conditional operator
+### Conditional Operator
```lua title='Conditional Operator in Luau'
local max = if x > y then x else y
@@ -440,7 +440,7 @@ int max = (x > y) ? x : y;
To learn more about loops in Luau, see [Control Structures](./control-structures.md).
-### While and repeat loops
+### While and Repeat Loops
```lua title='While and Repeat Loops in Luau'
while boolExpression do
@@ -462,7 +462,7 @@ do {
} while (boolExpression)
```
-### For loops
+### For Loops
```lua title='Generic For Loops in Luau'
-- Forward loop
@@ -524,7 +524,7 @@ Luau also supports [generalized iteration](./control-structures.md#generalized-i
To learn more about functions in Luau, see [Functions](./functions.md).
-### Generic functions
+### Generic Functions
```lua title='Generic Functions in Luau'
-- Generic function
@@ -540,7 +540,7 @@ int increment(int number) {
}
```
-### Variable argument number
+### Variable Argument Number
```lua title='Variable Argument Number in Luau'
-- Variable argument number
@@ -558,7 +558,7 @@ void variableArguments(params string[] inventoryItems) {
}
```
-### Named arguments
+### Named Arguments
```lua title='Named Arguments in Luau'
-- Named arguments
@@ -578,7 +578,7 @@ string namedArguments(string name, string dob) {
namedArguments(name: "Bob", dob: "4/1/2000");
```
-## Try-catch structures
+## Try-Catch Structures
```lua title='Try/Catch Structures in Luau'
local function fireWeapon()
diff --git a/content/en-us/luau/metatables.md b/content/en-us/luau/metatables.md
index f353a2abf..7817cb3c8 100644
--- a/content/en-us/luau/metatables.md
+++ b/content/en-us/luau/metatables.md
@@ -14,7 +14,7 @@ print(list[3])
You might expect this code to search through the list for the third index in list, find nothing, and return nil. That's not correct, though. What actually happens is the code searches through the list for the third index, finds nothing, and then checks if there's a metatable attached to the table, returning nil if there isn't one.
-## Manipulate metatables
+## Manipulating Metatables
The two primary functions for adding and finding a table's metatable, are `setmetatable` and `getmetatable`
@@ -188,7 +188,7 @@ print(2 / a) -- 0.2, 0.4
print(a / 2) -- 5, 2.5
```
-### Use metatables
+### Using Metatables
There are many ways to use metatables, for example the `__unm` metamethod (to make a table negative):
@@ -285,7 +285,7 @@ for k, v in table1 + table2 do
end
```
-### Use cases
+### Use Cases
Now, all of these examples can be implemented as a simple function, but you can do a lot more than that. Let's try a simple program that will memorize a number when a possibly laggy math problem is put into it.
@@ -317,7 +317,7 @@ print(t[2]) -- will be slow because it's the first time using this number.
print(t[1]) -- will be fast because it's just grabbing the number from the table.
```
-#### Rawset, rawget, rawequal
+#### Rawset, Rawget, Rawequal
When playing with metatables, you may run into some problems. What happens if you need to use the `__index` metamethod to create new values in a table, but that table's metatable also has a `__newindex` metamethod in it? You'll want to use the Lua built-in function rawset to set the value without invoking any metamethods. Take the following code as an example of what happens if you don't use these functions.
@@ -351,11 +351,11 @@ local t = setmetatable({}, {
print(t[1]) -- prints 10
```
-## Use the set datatype
+## Using the Set Datatype
A **set** is a collection of items with no order and no duplicate elements. An item either **is** or **is not** contained within a set. Using metatables, you can construct and manipulate sets within Lua scripts.
-### Basic methods
+### Basic Methods
The following code includes basic set functionality, letting you construct new
sets, add and remove an item, check if a set contains an item, and output the
@@ -399,7 +399,7 @@ function Set:output()
end
```
-#### Create set
+#### Create Set
A new set can be constructed by calling `Set.new()` with an optional array of items to add.
@@ -409,7 +409,7 @@ local fruits = Set.new({"Apple", "Lemon", "Orange", "Cherry", "Lime", "Peach"})
Note that by definition, a set has no concept of ordering.
-#### Add item
+#### Add Item
Adding an item to an existing set can be done via the `Set:add()` method.
@@ -418,7 +418,7 @@ local fruits = Set.new({"Apple", "Lemon", "Orange", "Cherry", "Lime", "Peach"})
fruits:add("Mango")
```
-#### Remove item
+#### Remove Item
To remove an item from a set, call `Set:remove()` with the item name.
@@ -427,7 +427,7 @@ local fruits = Set.new({"Apple", "Lemon", "Orange", "Cherry", "Lime", "Peach"})
fruits:remove("Orange")
```
-#### Check for item
+#### Check for Item
To check if a set contains a specific item, use `Set:contains()`.
@@ -441,7 +441,7 @@ local result2 = fruits:contains("Watermelon")
print(result2) -- false
```
-### Additional methods
+### Additional Methods
Other useful operations can be implemented for sets, letting you compare items between sets, combine sets, or subtract one set from another.
diff --git a/content/en-us/luau/native-code-gen.md b/content/en-us/luau/native-code-gen.md
index d8f6cc791..a1a2b699e 100644
--- a/content/en-us/luau/native-code-gen.md
+++ b/content/en-us/luau/native-code-gen.md
@@ -1,5 +1,5 @@
---
-title: Native code generation
+title: Native Code Generation
description: Luau Native Code Generation allows Luau code to be translated directly to CPU machine code.
---
@@ -7,7 +7,7 @@ With Luau support for native code generation, server-side scripts in your experi
-## Enable native code generation
+## Enabling Native
To enable native code generation for a `Class.Script`, add the `--!native` comment at the top:¹
@@ -30,7 +30,7 @@ end
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
+## Best Practices
The following tips will help you benefit most from native code generation:
@@ -48,17 +48,17 @@ The following tips will help you benefit most from native code generation:
These problems can be addressed by a judicious use of the `@native` attribute.
-## Code to avoid
+## 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](#use-type-annotations).
+- 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 inside a `--!native` script or marked with `@native` doesn't appear to be natively executing, one or more factors from the list above may be triggering de‑optimization.
-## Use type annotations
+## 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.
@@ -80,7 +80,7 @@ local function sumComponentsFast(v: Vector3)
end
```
-## Studio tooling
+## Studio Tooling
The following Studio tooling is supported for `--!native` scripts and `@native` functions.
@@ -88,7 +88,7 @@ The following Studio tooling is supported for `--!native`
-If a function marked `@native` or inside a `--!native` script doesn't show the `` annotation, that function may not be executing natively due to [breakpoint](../studio/debugging.md#insert-breakpoints) placement, use of [discouraged code](#code-to-avoid), or mismatched [type annotations](#use-type-annotations).
+If a function marked `@native` or inside a `--!native` script 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
+### 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.
+In the [Luau Heap](../studio/optimization/memory-usage.md#luau-heap) profiler, memory taken by native functions displays as `[native]` elements in the graph.
-### Size analysis
+### Size Analysis
Every natively-compiled script consumes memory. When the size of compiled code reaches a predefined limit, native compilation stops and the remaining code is run non‑natively. This makes it essential to choose scripts carefully for native compilation.
@@ -119,7 +119,7 @@ In the [Output](../studio/output.md) window, you'll see the total number of scri
For each script, the output displays the number of functions compiled and the native code memory consumption. Each function is then listed in descending order of native code size, with anonymous functions shown as `[anonymous]` and entire scripts shown as `[top level]`. In the final column, the percentage is computed with respect to the native code size limit. Note that native code size of functions is reported precisely but the memory consumption for scripts is rounded up to the nearest page size.
-## Limits and troubleshooting
+## 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:
diff --git a/content/en-us/luau/numbers.md b/content/en-us/luau/numbers.md
index 65c6af486..9d25ac8bb 100644
--- a/content/en-us/luau/numbers.md
+++ b/content/en-us/luau/numbers.md
@@ -5,7 +5,7 @@ description: A double-precision floating-point number.
The **number** data type, or `double`, represents a [double-precision (64-bit) floating-point](https://wikipedia.org/wiki/Double-precision_floating-point_format) number. Numbers can range from -1.7 \* 10308 to 1.7 \* 10308 (around 15 digits of precision, positive or negative).
-## Signed and unsigned
+## Signed and Unsigned
The sign of the number indicates whether it's positive or negative. For example, `1` is positive and `-1` is negative. In Luau, the number `-0` is equivalent to `0`.
@@ -17,7 +17,7 @@ print(-0 > -1) --> true
print(-0 < -1) --> false
```
-## Number classifications
+## Number Classifications
Luau doesn't distinguish between integers and numbers, but the API reference sometimes distinguishes between them to be more specific about how to use each API.
@@ -50,7 +50,7 @@ To aid in the readability of long numbers, you can include underscores anywhere
You can use logical and relational [operators](./operators.md) to manipulate and compare numbers. You can also use mathematical functions such as `Library.math.sqrt()` and `Library.math.exp()` in the `Library.math` library and bitwise operations in the `Library.bit32` library.
-## Type introspection
+## Type Introspection
You can determine if a value `x` is a number by using `type(x)` or `typeof(x)`. Both return the string `number` if `x` is a number.
@@ -68,7 +68,7 @@ print(typeof(testDecimal)) --> number
print(typeof(testString)) --> string
```
-## Round functions
+## Rounding Functions
You can round numbers using `Library.math.floor()`, `Library.math.ceil()`, or `Library.math.modf()`. These functions return an integer result if Luau can represent it as an integer. If the number is too large, Luau returns it as a float.
diff --git a/content/en-us/luau/operators.md b/content/en-us/luau/operators.md
index 39d47504e..25f2dbef3 100644
--- a/content/en-us/luau/operators.md
+++ b/content/en-us/luau/operators.md
@@ -253,7 +253,7 @@ Lua supports the usual binary operators along with exponentiation, modulus, and
-## Compound assignment
+## Compound Assignment
You can use compound assignment operators to set a variable equal to the result of an operation where the first parameter is the variable's current value.
diff --git a/content/en-us/luau/queues.md b/content/en-us/luau/queues.md
index fd9b3e39c..1e95b66b6 100644
--- a/content/en-us/luau/queues.md
+++ b/content/en-us/luau/queues.md
@@ -7,7 +7,7 @@ A queue is a linear data structure with a collection of items. There are two typ
Queue is a built-in data structure of the [non-persistent data storage](../cloud-services/memory-stores/queue.md) service named `Class.MemoryStoreService`, for which you can directly call the built-in functions to get a queue and add, read, or remove data from the queue. For any other usage, such as scheduling tasks and handling requests in your experience, you can use tables to implement queues on your own.
-## Regular queues
+## Regular Queues
Regular queues are maintained in the FIFO sequence, in which all items are added to the back of the queue and read or removed in the same order as they are added, from the front to the end.
@@ -16,7 +16,7 @@ Regular queues are maintained in the FIFO sequence, in which all items are added
The order of how a regular queue adds, reads, and removes items
-## Priority queues
+## Priority Queues
Priority queues are not following the FIFO rule, in which each item can be added with a priority number that indicates its order being read or removed. The item at the back of a priority queue has the default priority of 0, and the item at the front of the queue has the highest set priority, which is 5 in the following example.
@@ -29,7 +29,7 @@ For this example, an item with a set priority of 3 is being added to a queue. Th
Priority queues are useful for situations where you want to read or access data based on the order of importance instead of the order of being added. You can set a priority as an integer when adding an item, and the queue processes items with higher priority before items with lower priorities. For example, you can use priority queues for matchmaking by assigning higher priorities to users who have been waiting for a long time.
-## Implement queues
+## Implementing Queues
You can use built-in queues of `Class.MemoryStoreService` or use [tables](../luau/tables.md) to implement queues for all other usage. The following code sample shows the implementation a **regular queue**. To use this implementation for your experience, you should save it as a `Class.ModuleScript` and store it in `Class.ReplicatedStorage`, so your queue is accessible for both client and server.
diff --git a/content/en-us/luau/scope.md b/content/en-us/luau/scope.md
index e3da8b6c9..39f1ce776 100644
--- a/content/en-us/luau/scope.md
+++ b/content/en-us/luau/scope.md
@@ -24,7 +24,7 @@ printHelloWorld() -- Hello World!
- Block A **cannot** access the local variables and functions in blocks B or C.
- Block B **cannot** access the local variable in block C.
-## Global scope
+## Global Scope
After you declare a global variable or function, any block of code in the same [script](../scripting/index.md) can access it. Variables and functions have global scope unless you declare them with the `local` keyword.
@@ -65,9 +65,9 @@ It's easier to declare global variables and functions because you don't need to
- Luau accesses global variables and functions with a hash lookup, so it's expensive to use in terms of performance. Using a global variable in a time-critical loop can make it perform more than 10% slower than using a local variable in the same loop.
- Luau disposes of local variables after their scope ends, reducing memory usage.
-- You can access global variables and functions within the same script, but not between multiple scripts. Therefore, a global variable or function doesn't provide any benefit over an in-scope local equivalent, an [upvalue](#capture), or a [shadow](#shadow).
+- You can access global variables and functions within the same script, but not between multiple scripts. Therefore, a global variable or function doesn't provide any benefit over an in-scope local equivalent, an [upvalue](#capturing), or a [shadow](#shadowing).
-## Local scope
+## Local Scope
Luau can only access a local variable or function in the block of code where you declare it. Creating a variable with local scope gives you tighter control over when and where its value changes.
@@ -105,7 +105,7 @@ Initial 'x' = 0
]]
```
-### Capture
+### Capturing
After you declare and assign a local variable, you can read it in its scope level and functions whose scopes is enclosed by the same scope containing the local variable. This technique is known as **capturing**.
@@ -122,7 +122,7 @@ f() -- 5
print(x) -- 5
```
-### Shadow
+### Shadowing
After you declare and assign a local variable, you can read it in its scope level and descendant scope levels. If you redeclare and reassign the variable in a descendant scope level, then you create a new local variable with the same name but different value from the most previous assignment. The new local variable doesn't affect the local variable from the previous assignment. This technique, known as **shadowing**, helps you reuse the name of a variable without reusing its value.
diff --git a/content/en-us/luau/stacks.md b/content/en-us/luau/stacks.md
index 0abd8f424..99b582a62 100644
--- a/content/en-us/luau/stacks.md
+++ b/content/en-us/luau/stacks.md
@@ -9,7 +9,7 @@ You can think of the stack data structure as a stack of dinner plates: you start
Stacks have two main operations: **push** for adding an element to the top of the stack and **pop** for removing the element from the top of the stack. A Stack can either have a fixed size or be dynamically resized. Stacks are helpful for design usage such as backtracking algorithms.
-## Implement stacks
+## Implementing Stacks
Though Luau doesn't have stacks as a built-in data structure, you can use [tables](../luau/tables.md) to implement stacks. The following code sample shows how to create a stack, `push` an object to a stack, and `pop` an object from the stack. To use this implementation for your experience, you should save it as a `Class.ModuleScript` and store it in `Class.ReplicatedStorage`, so your stack is accessible for both client and server.
diff --git a/content/en-us/luau/strings.md b/content/en-us/luau/strings.md
index 490bc6ac1..ec5216377 100644
--- a/content/en-us/luau/strings.md
+++ b/content/en-us/luau/strings.md
@@ -5,9 +5,9 @@ description: A sequence of characters, such as letters, numbers, and symbols.
The **string** data type is a sequence of characters, such as letters, numbers, and symbols. It's the data type for storing most text-based information.
-## Declare strings
+## Declaring Strings
-To declare a string variable, put quotes around the characters. It's more common to use double quotes (`"`), but single quotes (`'`) also work. If you want to include a single or double quote in your string, wrap your string around the other type of quote, or use an [escaped quote](#escape-strings).
+To declare a string variable, put quotes around the characters. It's more common to use double quotes (`"`), but single quotes (`'`) also work. If you want to include a single or double quote in your string, wrap your string around the other type of quote, or use an [escaped quote](#escaping-strings).
```lua
local string1 = "Hello world!"
@@ -44,7 +44,7 @@ print(string1)
--> [[world!]]
```
-## Combine strings
+## Combining Strings
To combine strings, **concatenate** them with two dots (`..`). Concatenating strings doesn't insert a space between them, so you'll need to include space(s) at the end/beginning of a preceding/subsequent string, or concatenate a space between the two strings.
@@ -74,7 +74,7 @@ print(hello, world .. exclamationMark) --> Hello world!
print(hello, world, exclamationMark) --> Hello world !
```
-## Convert strings
+## Converting Strings
To convert a string to a number, use the `Global.LuaGlobals.tonumber()` function. If the string doesn't have a number representation, `Global.LuaGlobals.tonumber()` returns `nil`.
@@ -86,7 +86,7 @@ local alphanumericString = "Hello123"
print(tonumber(alphanumericString)) --> nil
```
-## Escape strings
+## Escaping Strings
To escape a double- or single-quote string declaration and embed almost any character, put a backslash (`\`) before the character. For example:
@@ -116,7 +116,7 @@ local string2 = "Hello\tworld!"
print(string2) --> Hello world!
```
-## String interpolation
+## String Interpolation
Luau supports **string interpolation**, a feature that lets you insert expressions into strings. Use backticks (`` ` ``) to declare an interpolated string, then add expressions inside of curly brackets:
@@ -150,7 +150,7 @@ local string1 = `Hello \`\{world\}\`!`
print(string1) --> Hello `{world}`!
```
-## Math conversion
+## Math Conversion
If you perform math operations on a string, Luau automatically converts the string to a number. If the string doesn't have a number representation, it throws an error.
@@ -174,13 +174,13 @@ print("Banana" < "apple") --> true (B is before a in ASCII)
print("number100" < "number20") --> true
```
-## String pattern reference
+## String Pattern Reference
A **string pattern** is a combination of characters that you can use with
`Library.string.match()`, `Library.string.gmatch()`, and other functions to
find a piece, or substring, of a longer string.
-### Direct matches
+### Direct Matches
You can use direct matches in a Luau function like `Library.string.match()`,
except for [magic characters](#magic-characters). For example, these commands
@@ -193,7 +193,7 @@ print(match1) --> Roblox
print(match2) --> nil
```
-### Character classes
+### Character Classes
Character classes are essential for more advanced string searches. You can use
them to search for something that isn't necessarily character-specific but
@@ -273,7 +273,7 @@ uppercase letter represents the "opposite" of the class. For instance, `%p`
represents a punctuation character while `%P` represents all characters except
punctuation.
-### Magic characters
+### Magic Characters
There are 12 "magic characters" which are reserved for special purposes in
patterns:
@@ -347,7 +347,7 @@ local match3 = string.match("I play Roblox", "Roblox") -- Matches because "Robl
print(match3) --> Roblox
```
-### Class modifiers
+### Class Modifiers
By itself, a character class only matches **one** character in a string. For
instance, the following pattern (`"%d"`) starts reading the string from left
@@ -404,7 +404,7 @@ local match2 = string.match("The Cloud Kingdom has 25 power gems", "%d+")
print(match2) --> 25
```
-### Class sets
+### Class Sets
**Sets** should be used when a single character class can't do the whole job.
For instance, you might want to match both lowercase letters (`%l`) **and**
@@ -440,7 +440,7 @@ between a starting and ending character. This is an advanced feature which is
outlined in more detail on the
[Lua 5.1 Manual](https://www.lua.org/manual/5.1/manual.html#5.4.1).
-### String captures
+### String Captures
String **captures** are sub-patterns within a pattern. These are enclosed in
parentheses `()` and are used to get (capture) matching substrings and save
diff --git a/content/en-us/luau/tables.md b/content/en-us/luau/tables.md
index 0db7eaad6..6acd31b5c 100644
--- a/content/en-us/luau/tables.md
+++ b/content/en-us/luau/tables.md
@@ -19,7 +19,7 @@ For more information on built-in functions for working with tables, see the `Lib
An **array** is an ordered list of values. Arrays are useful for storing collections of data, such as a group of players with special permissions.
-### Create arrays
+### Creating Arrays
To create an array using a Luau table, declare the values in sequential order, separated by commas.
@@ -29,7 +29,7 @@ local testArray = {"A string", 3.14159, workspace.Camera}
print(testArray)
```
-### Read from arrays
+### Reading from Arrays
To read from an array, add a pair of square brackets after its reference and specify the index number of the element inside (`[pos]`):
@@ -46,7 +46,7 @@ print(testArray[3]) -- Camera
Unlike some languages, Luau uses 1-based indexing for arrays, so the first item in the array is [1], not [0].
-### Write to arrays
+### Writing to Arrays
To define or rewrite the value of an array at an index, declare the index number in square brackets (`[index]`) followed by `=` and the value:
@@ -60,7 +60,7 @@ print(testArray[2]) --12345
print(testArray[4]) -- New string
```
-### Iterate over arrays
+### Iterating over Arrays
To iterate over an array, you can use a `for` loop. Because the arrays have numerical indices, you can also use a numeric `for` loop from **1** to the length of the array (`#array`).
@@ -89,7 +89,7 @@ end
]]
```
-### Insert items
+### Inserting Items
There are two built-in ways to insert an item to the **end** of an array:
@@ -118,7 +118,7 @@ print(testArray[2]) -- NEW ITEM #2
print(testArray[3]) -- Next item
```
-### Remove items
+### Removing Items
To remove an item from an array, use `Library.table.remove()`. This removes the item at the specified position and moves any following items back one index position.
@@ -135,7 +135,7 @@ print(testArray[2]) -- Last item
Dictionaries are an extension of arrays. Dictionaries store a set of key-value pairs, where the keys can be any number, string, or object.
-### Create dictionaries
+### Creating Dictionaries
To create a dictionary table, define each **key** followed by `=` and the **value**. Separate each key-value pair with a comma:
@@ -158,7 +158,7 @@ local testDictionary = {
}
```
-### Read from dictionaries
+### Reading from Dictionaries
To read from a dictionary, add a pair of brackets after its reference and specify the key name. Directly reference a string key using quotes (`["key"]`) or use a variable value (`[key]`).
@@ -175,7 +175,7 @@ print(testDictionary["PartType"]) -- Block
print(testDictionary[part]) -- true
```
-### Write to dictionaries
+### Writing to Dictionaries
To define or rewrite the value of a new or existing dictionary key, declare the key name in brackets (`[key]`) followed by `=` and the value:
@@ -197,7 +197,7 @@ print(testDictionary["Sour"]) -- false
print(testDictionary["FruitCount"]) -- 10
```
-### Iterate over dictionaries
+### Iterating over Dictionaries
To iterate over a dictionary, use the global `pairs()` function in a `for` loop:
@@ -223,7 +223,7 @@ FruitColor Yellow
Unlike using ipairs() on an array, using pairs() on a dictionary doesn't necessarily return items in the same order that they're in the dictionary.
-### Remove key-value pairs
+### Removing Key-value Pairs
To remove or erase a key-value pair from a dictionary, set its value for a key to `nil`.
@@ -245,7 +245,7 @@ FruitColor Yellow
]]
```
-## Tables as references
+## Tables as References
If you store a table in a new variable, Luau doesn't create a copy of that table. Instead, the variable becomes a **reference**, or pointer, to the original table. Any reference to a table reflects any changes to the original table:
@@ -270,9 +270,9 @@ Reference: 1000 2000
]]
```
-## Clone tables
+## Cloning Tables
-### Shallow clones
+### Shallow Clones
To copy a table without any nested tables, Luau offers the `Library.table.clone()` method.
@@ -286,7 +286,7 @@ local original = {
local clone = table.clone(original)
```
-### Deep clones
+### Deep Clones
To copy a more complex table with nested tables inside it, you'll need to use a recursive function similar to the following:
@@ -327,11 +327,11 @@ local original = {
local clone = deepCopy(original)
```
-## Freeze tables
+## Freezing Tables
Freezing a table makes it read-only, which is useful for creating constant values that you don't want to change. Freezing is permanent; there's no "unfreeze" or "thaw" method. To check if a table is frozen, use `Library.table.isfrozen()`.
-### Shallow freezes
+### Shallow Freezes
To freeze a table without any nested tables, Luau offers the `Library.table.freeze()` method.
@@ -346,7 +346,7 @@ table.freeze(target)
target.playerID = 1 --> attempt to modify a readonly table
```
-### Deep freezes
+### Deep Freezes
To freeze a more complex table with nested tables inside it, use a recursive function similar to the following:
diff --git a/content/en-us/luau/type-checking.md b/content/en-us/luau/type-checking.md
index 49cf65e91..7ba8444a9 100644
--- a/content/en-us/luau/type-checking.md
+++ b/content/en-us/luau/type-checking.md
@@ -1,11 +1,11 @@
---
-title: Type checking
+title: Type Checking
description: Luau uses gradual typing through the use of type annotations and inference.
---
Luau supports a gradual type system through the use of type annotations and type inference. These types are used to provide better warnings, errors, and suggestions in the [Script Editor](../studio/script-editor.md).
-## Define a type
+## Defining a Type
Use the `type` keyword to define your own types:
@@ -13,7 +13,7 @@ Use the `type` keyword to define your own types:
type Vector2 = {x: number, y: number}
```
-## Inference modes
+## Inference Modes
There are three Luau type inference modes that can be set on the first line of a `Class.Script`:
@@ -55,7 +55,7 @@ local foo: string? = nil
This will allow the variable to be either the specified type (in this case `string`) or `nil`.
-### Literal types
+### Literal Types
You can also cast strings and booleans to literal values instead of using `string` and `boolean`:
@@ -66,7 +66,7 @@ alwaysHelloWorld = "Just hello!" -- Type error: Type '"Just hello!"' could not
local alwaysTrue: true = false -- Type error: Type 'false' could not be converted into 'true'
```
-### Type casts
+### Type Casts
Sometimes, you might need to assist the typechecker by explicitly casting a value to a different type with the `::` operator:
@@ -79,7 +79,7 @@ myString = myNumber :: any -- OK; all expressions can be cast to 'any'
local myFlag = myNumber :: boolean -- Not OK; types are unrelated
```
-## Function typing
+## Function Typing
Consider the following function:
@@ -118,7 +118,7 @@ local function FindSource(script: BaseScript, pattern: string): (string, number)
end
```
-### Define a functional type
+### Defining a Functional Type
A functional type can be defined by using the syntax `(in) -> out`. Using the functions from the previous examples, the types of the functions are:
@@ -127,7 +127,7 @@ type add = (x: number, y: number) -> number
type FindSource = (script: BaseScript, pattern: string) -> (string, number)
```
-## Table types
+## Table Types
Luau does not have a `table` type; instead, table types are defined using `{}` syntax. One way of defining tables is using the `{type}` syntax, which defines a list type.
@@ -211,7 +211,7 @@ Instead, use the syntax `...type` to define a variadic type.
type addLotsOfNumbers = (...number) -> number
```
-## Unions and intersections
+## Unions and Intersections
You can even define a type as two or more types using a union or intersection:
@@ -225,7 +225,7 @@ local numString1: numberOrString = true -- Type error
local numString2: type1and2 = {foo = "hello", bar = 1}
```
-## Define an inferred type
+## Defining an Inferred Type
You can use the `typeof` function in a type definition for inferred types:
@@ -299,7 +299,7 @@ type State = {
}
```
-### Function generics
+### Function Generics
Functions can also use generics. The `State` example infers the value of `T` from the function's incoming arguments.
@@ -317,7 +317,7 @@ local Activated = State("Activated", false) -- State
local TimesClicked = State("TimesClicked", 0) -- State
```
-## Type exports
+## Type Exports
To make it so a type can be used outside of a `Class.ModuleScript`, use the `export` keyword:
diff --git a/content/en-us/luau/type-coercion.md b/content/en-us/luau/type-coercion.md
index 6fe5e0c32..00a4fe33a 100644
--- a/content/en-us/luau/type-coercion.md
+++ b/content/en-us/luau/type-coercion.md
@@ -1,5 +1,5 @@
---
-title: Type coercion
+title: Type Coercion
description: Type coercion in Luau allows for arithmetic, concatenation, and assignment of differently typed values.
---
@@ -55,7 +55,7 @@ part3.Parent = workspace
print(part3.Material) -- Enum.Material.Concrete
```
-### Time of day
+### TimeOfDay
The `Class.Lighting.TimeOfDay` property, which defines whether it is night, day, or any other time, is a string representation of the `Datatype.DateTime` data type. If you assign a number to `Class.Lighting.TimeOfDay`, Luau converts it to the string representation of `Datatype.DateTime`.
diff --git a/content/en-us/luau/variables.md b/content/en-us/luau/variables.md
index cdac43121..fcf1ceb10 100644
--- a/content/en-us/luau/variables.md
+++ b/content/en-us/luau/variables.md
@@ -5,7 +5,7 @@ description: A name that holds a value.
A **variable** is a name that holds a value. Variable values can be [numbers](./numbers.md), [strings](./strings.md), [booleans](./booleans.md), [data types](/reference/engine/datatypes), and more.
-## Name variables
+## Naming Variables
Variable names can be any non-reserved string of letters, digits, and underscores that don't start with a digit.
@@ -21,17 +21,17 @@ if -- NOT valid
Variable names are **case-sensitive**, so `TestVar` and `TESTVAR` are different names. Avoid naming variables with an underscore and all uppercase letters, such as `_VERSION`, because Luau may reserve them for internal global variables.
-### Best practices
+### Best Practices
It's best practice to spell out words fully. Abbreviations generally make code easier to write, but harder to read. Following common naming practices when naming your variables can help you and others understand their meaning or purpose:
- Use `PascalCase` names for class and enum-like objects.
- Use `PascalCase` names for all Roblox APIs. `camelCase` APIs are mostly deprecated.
- Use `camelCase` names for local variables, member values, and [functions](./functions.md).
-- Use `LOUD_SNAKE_CASE` names for local constants (variables with values that you don't expect to [change](#change-values)).
+- Use `LOUD_SNAKE_CASE` names for local constants (variables with values that you don't expect to [change](#changing-values)).
- Don't capitalize entire acronyms within names. For example, write `aJsonVariable` or `MakeHttpCall`.
-### Reserved names
+### Reserved Names
Luau reserves the following keywords, so you can't use them to name variables or [functions](./functions.md):
@@ -57,7 +57,7 @@ Luau reserves the following keywords, so you can't use them to name variables or
- `not`
- `while`
-## Assign values
+## Assigning Values
To create a variable and assign a value to it, use the `=` operator. Put the variable on the left of the `=` and the value on the right. If you don't put a value, the value is `nil`.
@@ -75,7 +75,7 @@ print(word) -- Hello
print(reference) -- Camera
```
-### Assign values to multiple variables
+### Assigning Values to Multiple Variables
You can assign values to multiple variables in one line by separating each variable-value pair with a comma. If you have more variables than values, then Luau assigns `nil` to the extra variables. If you have more values than variables, Luau doesn't assign the extra values to any variables.
@@ -89,7 +89,7 @@ print(d, e, f) -- 4, 5, nil
print(g, h) -- 7, 8
```
-## Change values
+## Changing Values
To change a value of a variable, assign another value to it.
diff --git a/content/en-us/marketplace/custom-thumbnails.md b/content/en-us/marketplace/custom-thumbnails.md
index 04b0dfc65..6c388bc06 100644
--- a/content/en-us/marketplace/custom-thumbnails.md
+++ b/content/en-us/marketplace/custom-thumbnails.md
@@ -1,9 +1,9 @@
---
-title: Custom thumbnails
+title: Custom Thumbnails
description: Explains how to create your own custom thumbnail for marketplace items.
---
-Thumbnail images provide a preview of the 3D asset in the [Marketplace](https://www.roblox.com/catalog), user inventories, and avatar editors. Before [uploading an asset to the Marketplace](../marketplace/publish-to-marketplace.md), you can create your own thumbnails to customize the exact look and feel of your item preview thumbnails. This step is optional, but can help ensure that the thumbnail accurately portrays your item.
+Thumbnail images provide a preview of the 3D asset in the [Marketplace](https://www.roblox.com/catalog), user inventories, and avatar editors. Before [uploading an asset to the Marketplace](../marketplace/publishing-to-marketplace.md), you can create your own thumbnails to customize the exact look and feel of your item preview thumbnails. This step is optional, but can help ensure that the thumbnail accurately portrays your item.
@@ -20,9 +20,9 @@ Thumbnail images provide a preview of the 3D asset in the [Marketplace](https://
-### Create thumbnails
+### Creating Thumbnails
-You must create thumbnails before [publishing your asset on the Marketplace](../marketplace/publish-to-marketplace.md). You can quickly create these thumbnail configuration instances with the [Custom Thumbnail Tool](https://www.roblox.com/library/11628621048/UGC-Custom-Thumbnail-Tool). Roblox stores custom thumbnail information in a child `ThumbnailConfiguration` object that parents a `CameraTarget` and `CameraValue`.
+You must create thumbnails before [publishing your asset on the Marketplace](../marketplace/publishing-to-marketplace.md). You can quickly create these thumbnail configuration instances with the [Custom Thumbnail Tool](https://www.roblox.com/library/11628621048/UGC-Custom-Thumbnail-Tool). Roblox stores custom thumbnail information in a child `ThumbnailConfiguration` object that parents a `CameraTarget` and `CameraValue`.
@@ -50,7 +50,7 @@ If your thumbnail does not look correct, **repeat steps 2-5** to overwrite the e
Once you upload an asset, you can't modify or change an asset's thumbnail.
-### Troubleshooting thumbnails
+### Troubleshooting Thumbnails
If your thumbnails don't look the way you expect, you might need to manually resolve these issues or attempt to use the Custom Thumbnail tool again. See the following for common issues and fixes:
diff --git a/content/en-us/marketplace/frequently-asked-questions.md b/content/en-us/marketplace/frequently-asked-questions.md
index 904794111..afe5bc4a4 100644
--- a/content/en-us/marketplace/frequently-asked-questions.md
+++ b/content/en-us/marketplace/frequently-asked-questions.md
@@ -1,5 +1,5 @@
---
-title: Frequently asked questions
+title: Frequently Asked Questions
description: Marketplace FAQ providing answers and resources for common questions.
---
diff --git a/content/en-us/marketplace/homestore.md b/content/en-us/marketplace/homestore.md
index b93d6168c..aea8b1f62 100644
--- a/content/en-us/marketplace/homestore.md
+++ b/content/en-us/marketplace/homestore.md
@@ -15,7 +15,7 @@ The homestore template provides the following features that you can quickly cust
You can find the UGC Homestore Template in Roblox Studio's start screen. To access Studio's provided templates at any time, select **File** > **Open from Roblox** and select **Templates**.
-## Customize Homestore
+## Customizing Homestore
You can modify the features of the homestore to showcase and sell your assets as well as add your own distinct theme and design. If the place is unpublished, the homestore showcases Roblox-created assets on the mannequins and shop as reference.
@@ -57,9 +57,9 @@ By default, the catalog applies the following behavior:
- If the place is unpublished, such as during initial playtesting, the catalog displays Roblox's marketplace items as reference.
- If the place is published, the catalog automatically displays the current experience owner's available marketplace items.
- If the current experience owner doesn't have any available marketplace items, the catalog doesn't display any items.
- - You can [set a different creator's catalog](#specify-another-creators-catalog) as the default by modifying `ReplicatedStorage.Settings`.
+ - You can [set a different creator's catalog](#specifying-another-creators-catalog) as the default by modifying `ReplicatedStorage.Settings`.
-#### Specify another creator's catalog
+#### Specifying Another Creator's Catalog
To set the catalog to use another creator's marketplace items:
@@ -67,7 +67,7 @@ To set the catalog to use another creator's marketplace items:
-2. Ensure that the marketplace items have their sale location set to `Marketplace and All Experiences` or have specified this specific experience as a valid [sale location](../marketplace/publish-to-marketplace.md#sale-location).
+2. Ensure that the marketplace items have their sale location set to `Marketplace and All Experiences` or have specified this specific experience as a valid [sale location](../marketplace/publishing-to-marketplace.md#sale-location).
1. If the experience is added as a unique sale location, the experience owner [must enable the specific asset for sale using the Creator Dashboard](../production/monetization/avatar-items.md#adding-items-to-experience).
@@ -85,9 +85,9 @@ To set the catalog to use another creator's marketplace items:
### Building
-Each building component is designed to be modular and extendible. You can quickly duplicate pieces, rotate, and rearrange them to create larger and more intricate structures. For more information on working with modular environments, see [Assembling Modular Environments](../tutorials/use-case-tutorials/modeling/assemble-modular-environments.md).
+Each building component is designed to be modular and extendible. You can quickly duplicate pieces, rotate, and rearrange them to create larger and more intricate structures. For more information on working with modular environments, see [Assembling Modular Environments](../tutorials/use-case-tutorials/modeling/assembling-modular-environments.md).
-### Advanced customizations
+### Advanced Customizations
For an advanced technical breakdown of the template project, including descriptions of various scripts, components, and behaviors, navigate to `ServerScriptService` and open the `README` ModuleScript. This content is intended for creators who intend to modify the underlying scripts and behaviors of the template project.
diff --git a/content/en-us/marketplace/index.md b/content/en-us/marketplace/index.md
index 232feb36e..c4f662fd9 100644
--- a/content/en-us/marketplace/index.md
+++ b/content/en-us/marketplace/index.md
@@ -1,5 +1,5 @@
---
-title: Marketplace overview
+title: Marketplace Overview
description: Understand how to create and sell items on the Marketplace, including policies, fees and commissions, and managing IP.
---
@@ -13,12 +13,12 @@ Users can access the Marketplace [through the web](https://www.roblox.com/catalo
The Marketplace is not the same as the [Creator Store](../production/creator-store.md). The Creator Store provides assets for creators to use for the development of their experiences, such as models, images, and plugins.
-## Sell on the Marketplace
+## Selling on the Marketplace
Creators can sell 3D accessories, clothing, and character bodies on the Marketplace. To ensure that assets you create meet Roblox's technical and community standards, make sure to review the following important policies and guidelines:
-- [Marketplace policy](../marketplace/marketplace-policy.md) — covers the rules and policies for Marketplace creators and their assets.
-- [Intellectual property](../marketplace/intellectual-property.md) — provides an overview of how intellectual property works on the Marketplace.
+- [Marketplace Policy](../marketplace/marketplace-policy.md) — covers the rules and policies for Marketplace creators and their assets.
+- [Intellectual Property](../marketplace/intellectual-property.md) — provides an overview of how intellectual property works on the Marketplace.
- [Moderation](../marketplace/moderation.md) — describes the process in which assets are moderated, including instructions on filing appeals and submitting DMCA requests.
-If you have an asset ready to sell, and both you and your asset meets Roblox's policies and guidelines, you can begin [uploading and publishing](../marketplace/publish-to-marketplace.md) your assets to the Marketplace. Depending on the type of item sold, various fees and commissions can apply. For more information, see [Fees and Commissions](../marketplace/marketplace-fees-and-commissions.md).
+If you have an asset ready to sell, and both you and your asset meets Roblox's policies and guidelines, you can begin [uploading and publishing](../marketplace/publishing-to-marketplace.md) your assets to the Marketplace. Depending on the type of item sold, various fees and commissions can apply. For more information, [Fees and Commissions](../marketplace/marketplace-fees-and-commissions.md).
diff --git a/content/en-us/marketplace/intellectual-property.md b/content/en-us/marketplace/intellectual-property.md
index de884e32a..4687792d7 100644
--- a/content/en-us/marketplace/intellectual-property.md
+++ b/content/en-us/marketplace/intellectual-property.md
@@ -1,5 +1,5 @@
---
-title: Intellectual property
+title: Intellectual Property
description: Explains protected intellectual property, both for individual and Roblox creations.
---
@@ -32,7 +32,7 @@ Other examples where you may not have IP ownership:
- If you give credit to the copyright owner, you don't automatically have the rights to use their copyrighted work.
- If you want to create a hat on Roblox inspired by a well-known style of hat, such as a top hat, you may not be able to stop other users from uploading similar hats.
-## Protect your own IP
+## Protecting Your Own IP
In order to protect your IP, it's important that your creations are unique. For example, the creation below takes a well-established concept (a Trojan helmet) and adds intricate details that make the design an original expression of the idea, such as the shape and orientation of the gold adornments and the shape of the facial opening.
@@ -81,7 +81,7 @@ To protect the creativity of others, the Roblox [Terms of Use](https://www.roblo
- This means you should not upload content you do not own or did not get the owner's permission to use.
- Infringing on someone's intellectual property is not only a violation of Roblox's Terms of Use, but it's also a violation of the law.
-## Roblox protecting your IP
+## Roblox Protecting Your IP
Roblox complies with the [Digital Millennium Copyright Act (DMCA)](https://www.copyright.gov/dmca/) and has a designated process for receiving and handling copyright takedown reports from the owner of the original work.
diff --git a/content/en-us/marketplace/marketplace-fees-and-commissions.md b/content/en-us/marketplace/marketplace-fees-and-commissions.md
index e7d029f7d..dbbc84bd7 100644
--- a/content/en-us/marketplace/marketplace-fees-and-commissions.md
+++ b/content/en-us/marketplace/marketplace-fees-and-commissions.md
@@ -1,5 +1,5 @@
---
-title: Marketplace fees and commissions
+title: Marketplace Fees and Commissions
description: Explains upload fees and commission from selling accessories and clothes on the Marketplace.
comments: Updates to this page require careful internal review. We generally don't accept pull requests on it.
---
@@ -8,11 +8,11 @@ You can create and sell bodies, heads, accessories, and clothes on the [Marketpl
You receive a commission every time users purchase your item. If users purchase your item within an experience using the [Avatar Inspect Menu](../players/avatar-inspect-menu.md) or the [Avatar Editor Service](../players/avatar-editor.md), the experience owner also receives a commission. For information on viewing your sales data, see [Sales Data analytics](../production/analytics/analytics-dashboard.md#sales-data).
-## Upload fees
+## Upload Fees
When uploading, accessories, clothing, bodies, and heads require an upload fee of **750 Robux** per submission. In general, fees are not refunded if an item is rejected through moderation. If your asset clears the uploading process, your asset is ready to publish to the Marketplace.
-## Publishing advance
+## Publishing Advance
A publishing advance is a refundable upfront fee that you pay at the time of publishing an item. The publishing advance does not apply for **free Limited items** which require a [per-unit fee](#per-unit-fee). Items taken off-sale and put back on-sale do not require another publishing advance.
@@ -21,9 +21,9 @@ This publishing advance is dependent on the type of Marketplace item being sold:
-
Asset type
-
Non-limited publishing advance
-
Paid limited publishing advance
+
Asset Type
+
Non-Limited Publishing Advance
+
Paid Limited Publishing Advance
@@ -116,7 +116,7 @@ This publishing advance is dependent on the type of Marketplace item being sold:
-Publishing advance example scenario
+Publishing Advance Example Scenario
For an example of how the publishing advance is recouped, the following table represents a hypothetical situation where the **publishing advance is 1000 Robux**, and the **item is sold in an experience at 400 Robux**:
@@ -253,11 +253,11 @@ Limited items that are sold for free follow a different per-unit payout structur
## Limiteds
-When setting assets on sale, you can [configure your creation](../marketplace/publish-to-marketplace.md#marketplace-settings) as a **Limited** item to set an available quantity for that asset.
+When setting assets on sale, you can [configure your creation](../marketplace/publishing-to-marketplace.md#marketplace-settings) as a **Limited** item to set an available quantity for that asset.
At this time, only Roblox-created Limiteds are tradeable, and bodies and heads are not eligible as Limiteds.
-### Per-unit fee
+### Per-unit Fee
When publishing free Limiteds, you must provide a per-unit fee depending on the quantity being published and other factors like the type of asset being uploaded. This payment depends on a range of market-based factors and may change over time.
@@ -290,7 +290,7 @@ Similar to other commission and payment breakdowns, a single party can receive o
Robux acquired from trading or selling items that you didn't create are not considered earned and are ineligible for the Developer Exchange program. For more information on earning Robux, see [Earned Robux & DevEx Rates](https://en.help.roblox.com/hc/en-us/articles/203314100-Developer-Exchange-DevEx-FAQs#h_01FTN4PJV8AS4JHD2YHS363TDE).
-### Rate limits
+### Rate Limits
To protect against automated purchases, Roblox sets purchase limits for Limiteds sold in-experience or in the Marketplace. For Limiteds, the following applies:
@@ -300,13 +300,13 @@ To protect against automated purchases, Roblox sets purchase limits for Limiteds
- A maximum of 3 successful purchases per user per item.
- For in-experience purchases, users must be in the experience for 60 seconds to successfully complete a purchase.
-## Price ranges
+## Price Ranges
Depending on the 3D asset type, you must set the price of the item within the marketplace price range. If you are selling a [Limited](#limiteds) item, you can set your item price as **0**, or any value after the **Limiteds Price Floor**.
[View Current Marketplace Ranges](https://create.roblox.com/dashboard/creations/pricing)
-## Classic clothing
+## Classic Clothing
You can upload and sell [classic clothing](../art/accessories/classic-clothing.md) through the Roblox website. It costs **10 Robux** to upload these assets.
diff --git a/content/en-us/marketplace/marketplace-policy.md b/content/en-us/marketplace/marketplace-policy.md
index 870f4decd..9c99a8200 100644
--- a/content/en-us/marketplace/marketplace-policy.md
+++ b/content/en-us/marketplace/marketplace-policy.md
@@ -1,13 +1,13 @@
---
-title: Marketplace policy
+title: Marketplace Policy
description: Marketplace Requirements lists the specific requirements for Marketplace Assets.
---
3D accessories and clothing assets you sell on the [Marketplace](https://www.roblox.com/catalog), such as clothing accessories, must follow specific requirements. Some requirements may require additional configuration on a third-party modeling software, such as Blender or Maya.
-If you are ready to sell an item and the item meets the requirements below, see [Publish Marketplace items](../marketplace/publish-to-marketplace.md) for details on publishing the asset.
+If you are ready to sell an item and the item meets the requirements below, see [Publishing Marketplace Items](../marketplace/publishing-to-marketplace.md) for details on publishing the asset.
-## Creator requirements
+## Creator Requirements
To upload, publish, and maintain existing content on-sale, Roblox requires users and groups to have [ID verification](https://en.help.roblox.com/hc/en-us/articles/4407282410644) and [Premium membership](https://www.roblox.com/premium/membership). Your ID-verified account must participate in an active Premium 1000/2200 membership to keep your Marketplace items on sale after uploading and publishing.
@@ -50,7 +50,7 @@ See the following breakdown of the user and group requirements:
-## General creation guidelines
+## General Creation Guidelines
When designing and creating your assets, follow these guidelines to ensure that your item passes moderation and allows Roblox users to express themselves with safety and civility. Failure to follow these guidelines may result in [moderation](../marketplace/moderation.md) and item removal.
@@ -73,7 +73,7 @@ Whether or not you are the original creator of the asset, you must ensure that y
- Do not include excessive text on items.
- Do not miscategorize your items, such as listing a pants asset in the Shirt category. See [Miscategorization](#miscategorization).
-## Accessory and clothing guidelines
+## Accessory and Clothing Guidelines
Submissions of accessory and clothing items to the Marketplace must follow additional guidelines, along with the [general guidelines](#general-creation-guidelines), [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards), and respective technical specifications for [Accessory](../art/accessories/specifications.md) or [Clothing](../art/accessories/clothing-specifications.md) items.
@@ -93,11 +93,11 @@ Do not miscategorize items when you upload them. Proper categorization includes
- Designs that combine Head items with hair designs (e.g. beanie with hair sticking out, mohawk with headphones) can be in the Head or Hair category.
- Designs that are components of facial anatomy (e.g. noses, mustache) or accessories that augment facial anatomy (e.g. eyeshadow, blush, wrinkles) must be in the Face category.
-## Avatar body guidelines
+## Avatar Body Guidelines
Submissions of avatar bodies to the Marketplace must follow additional guidelines, along with the [general guidelines](#general-creation-guidelines), [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards), and [Avatar technical specifications](../art/characters/specifications.md).
-### Body part requirements
+### Body Part Requirements
Each body can only include the following parts, and cannot have additional appendages:
@@ -118,7 +118,7 @@ Avatars must adhere to the [appropriate size requirements](../art/characters/spe
Roblox moderates avatars that do not follow the body part requirements under the [Misusing Roblox Systems Community Standard](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Rules).
-### Modesty layers
+### Modesty Layers
A _modesty layer_ is a layer of clothing that covers an avatar's upper torso and lower torso. In general, modesty layers are required if your character resembles a human. See the following for specific policies for when modesty layers are required:
@@ -333,11 +333,11 @@ For all modesty layers, the following applies:
Roblox moderates avatars that do not follow the modesty layers requirements under the [Romantic and Sexual Content Community Standard](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Rules).
-#### Lower torso
+#### Lower Torso
The **lower torso** modesty layer must provide full coverage from the avatar's hips to the bottom of the groin and buttocks. Lower torso modesty layers can include clothing styles such as briefs, high-waisted underwear, boxers, or boy shorts that fully cover the buttocks.
-#### Upper torso
+#### Upper Torso
You must add an **upper torso** modesty layer if your avatar uses a skin-like texture in the chest where the breasts protrude off the chest and have a rounded or oblong shape. Upper torso modesty layers are not required for characters with flat, muscle-shaped pectorals.
@@ -355,7 +355,7 @@ For upper torso modesty layers, the following applies:
Upper torso modesty layers can include strapless bras, racerback bras, balconette bras, tube tops, crop tops, or bandeau tops.
-### Age appropriate
+### Age Appropriate
Avatar bodies must not be sexually suggestive, or depict or suggest nudity in genital areas. This includes:
@@ -366,7 +366,7 @@ Avatar bodies must not be sexually suggestive, or depict or suggest nudity in ge
Roblox moderates avatars that do not follow the modesty layers requirements under the [Romantic and Sexual Content Community Standard](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Rules).
-### Accessories and clothing
+### Accessories and Clothing
Avatar bodies cannot include any accessories or clothing. Accessories are items that you can find separately in the Marketplace that are not part of the body part requirements, such as equipable tails, wings, extra limbs, glasses, clothing, [tattoos](#tattoos), and [makeup](#makeup). You must upload and sell these items separately. Heads can include hair, eyelashes, and eyebrows, but these must also be separate items.
@@ -554,6 +554,6 @@ Your avatar head cannot include any additional color, shading, or outlining not
-### Customizable skin tones
+### Customizable Skin Tones
Roblox recommends including customizable skin tones, or skin tone mutability, for avatars that resemble humans. Skin tone mutability is optional. Similarly, for avatars created through formal brand partnerships, skin tone mutability is optional. For more information on creating customizable skin tone textures, see [Custom Skin Tone](../art/characters/specifications.md#custom-skin-tone).
diff --git a/content/en-us/marketplace/moderation.md b/content/en-us/marketplace/moderation.md
index c5a42e746..a6b677e22 100644
--- a/content/en-us/marketplace/moderation.md
+++ b/content/en-us/marketplace/moderation.md
@@ -5,7 +5,7 @@ description: Provides information on the moderation policy and process for Marke
When uploading an asset to the Marketplace, the Moderation team reviews the item before you can sell the item. This process can take up to 24 hours. After approval, Roblox sets your item as "Ready To Sell" in the Creator Dashboard or within Studio.
-To ensure that your asset has the best chance of successfully clearing moderation, make sure your asset adheres to the [Marketplace Policy](../marketplace/marketplace-policy.md) and that the metadata, such as the title and description, follow [general best practices](../production/publishing/publish-experiences-and-places.md#metadata-best-practices).
+To ensure that your asset has the best chance of successfully clearing moderation, make sure your asset adheres to the [Marketplace Policy](../marketplace/marketplace-policy.md) and that the metadata, such as the title and description, follow [general best practices](../production/publishing/publishing-experiences-and-places.md#metadata-best-practices).
Moderations can happen after the item passes initial moderation. If Roblox removes an item with sales, Roblox refunds anyone who purchased the item and cancels any pending payments for that item.
@@ -15,7 +15,7 @@ If you believe your asset has been incorrectly moderated, you can [file an appea
If you believe an asset is infringing on your IP, or that one of your assets has been incorrectly removed due to IP, submit a [DMCA request](../production/publishing/dmca-guidelines.md).
-## Archive assets
+## Archiving Assets
Archiving an asset allows you to remove an asset from the Roblox platform. This process can be used to archive both 2D and 3D avatar items. At this time, archiving Limited items and Bundles are not supported.
diff --git a/content/en-us/marketplace/publish-to-marketplace.md b/content/en-us/marketplace/publishing-to-marketplace.md
similarity index 94%
rename from content/en-us/marketplace/publish-to-marketplace.md
rename to content/en-us/marketplace/publishing-to-marketplace.md
index 9806bf5fa..f8f494f65 100644
--- a/content/en-us/marketplace/publish-to-marketplace.md
+++ b/content/en-us/marketplace/publishing-to-marketplace.md
@@ -1,21 +1,21 @@
---
-title: Publish to Marketplace
+title: Publishing to Marketplace
description: Explains how to publish user-generated content to the Marketplace.
---
-In order to publish and sell assets on the Marketplace, your account or group must first meet [Roblox's Creator and Group requirements](../marketplace/marketplace-policy.md#creator-and-group-requirements). Users who satisfy the requirements and have not hit their [publishing limits](#upload-and-publish-limits), can upload and sell their assets in the following general steps:
+In order to publish and sell assets on the Marketplace, your account or group must first meet [Roblox's Creator and Group requirements](../marketplace/marketplace-policy.md#creator-and-group-requirements). Users who satisfy the requirements and have not hit their [publishing limits](#uploading-and-publishing-limits), can upload and sell their assets in the following general steps:
-1. [Upload the asset](#upload-an-asset) through Studio for validation and moderation.
-2. [Publish the asset](#publish-an-asset) to the Marketplace after configuring metadata and Marketplace settings.
+1. [Upload the asset](#uploading-an-asset) through Studio for validation and moderation.
+2. [Publish the asset](#publishing-an-asset) to the Marketplace after configuring metadata and Marketplace settings.
-The following publishing instructions apply to 3D accessories and clothing assets. See [Classic clothing](../art/accessories/classic-clothing.md) for information on uploading and selling classic 2D clothing.
+The following publishing instructions apply to 3D accessories and clothing assets. See [Classic Clothing](../art/accessories/classic-clothing.md) for information on uploading and selling classic 2D clothing.
-## Upload and publish limits
+## Uploading and Publishing Limits
There are limits on the number of assets you can upload to Roblox and enable for sale on the Marketplace:
@@ -46,7 +46,7 @@ There are limits on the number of assets you can upload to Roblox and enable for
†*For assets that can be taken off-sale, only the first time the asset is enabled for sale counts against this limit.*
-## Upload an asset
+## Uploading an Asset
When uploading your asset, Studio checks your asset for technical issues, such as an incorrect hierarchy or accessory structure. You can also add a [custom thumbnail](../marketplace/custom-thumbnails.md) to your asset before uploading to customize how the item displays on the Marketplace.
@@ -81,7 +81,7 @@ To upload your asset:
-5. Once validation completes successfully, an item description dialog displays. Fill out the following fields and follow [metadata best practices](../production/publishing/publish-experiences-and-places.md#metadata-best-practices) when possible.
+5. Once validation completes successfully, an item description dialog displays. Fill out the following fields and follow [metadata best practices](../production/publishing/publishing-experiences-and-places.md#metadata-best-practices) when possible.
- **Title** - The name of your asset in the Marketplace.
- **Description** - This description of your asset in the Marketplace.
@@ -122,7 +122,7 @@ For other validation issues, keep in mind the following common uploading conflic
- Your item uses an `AssetID` or `TextureID` that belongs to an existing asset in the Marketplace, or doesn't belong to you or an appropriate group.
- Your item uses an `AssetID` or `TextureID` that is still pending moderation.
-## Publish an asset
+## Publishing an Asset
You can access uploaded assets in your [Creator Dashboard](https://create.roblox.com/dashboard/creations). Each item has a **Manage Item** page where you can modify metadata, configure sale-related settings, and publish your asset to the Marketplace.
@@ -136,7 +136,7 @@ Before publishing your asset, it's important to consider if you want to sell you
### Metadata
-You can adjust the metadata for any of your creations at any time. Keep in mind that the metadata, such as the title and description, should follow [general best practices](../production/publishing/publish-experiences-and-places.md#metadata-best-practices) to avoid moderation and improve discoverability.
+You can adjust the metadata for any of your creations at any time. Keep in mind that the metadata, such as the title and description, should follow [general best practices](../production/publishing/publishing-experiences-and-places.md#metadata-best-practices) to avoid moderation and improve discoverability.
@@ -146,7 +146,7 @@ On the Manage Item page, you can update the following fields:
- **Description** - The description of your asset in the Marketplace.
- **Tags** - You can add up to 5 tags from a preset list to each of your items to aid in discovery. Roblox already includes implicit tags related to the accessory type, such as **Hair**, **Back**, or **Shoulder**.
-### Item attributes
+### Item Attributes
In **Item Attributes** you can set the **Availability** of your asset as a **Non-Limited** or a **Limited** item. Each availability type changes the available item attribute fields you can modify.
@@ -156,8 +156,8 @@ In **Item Attributes** you can set the **Availability** of your asset as a **Non
-
Item availability
-
Sale properties
+
Item Availability
+
Sale Properties
@@ -210,13 +210,13 @@ If you have Marketplace listing before the implementation of the dynamic price r
When setting a price, you can see the percentage breakdown of commissions in the dialog box. A similar breakdown on fees, when applicable, is provided at the bottom of the prompt. See [Marketplace Fees and Commissions](../marketplace/marketplace-fees-and-commissions.md) for more information on the fees and commissions for Marketplace items.
-#### Limit copies per user
+#### Limit Copies Per User
If you are selling a Limited item, you can enable **Limit Copies Per User** to set the number of times a user can purchase this asset. This only affects the purchases from the original listing and users can still purchase additional copies of the same Limited asset from resellers. You can't change this setting after publishing.
Copy limits are based on ownership. If a user owns the maximum limit of copies in their inventory, they can no longer purchase the asset from the original listing. If the user no longer owns the maximum number of copies, they can purchase the copies from the original listing.
-#### Sale location
+#### Sale Location
The **Sale Location** option sets where you can sell your asset beyond the Marketplace. In some cases, you may want to limit the availability of your asset to certain experiences, or only the Marketplace.
@@ -245,11 +245,11 @@ The following location options are available for all items:
-### Publish item
+### Publish Item
When first publishing your asset, select the **Publish Item** button at the end of the form to pay the [publishing fee](../marketplace/marketplace-fees-and-commissions.md#publishing-advance) and list your item on sale.
-### On sale toggle
+### On Sale Toggle
@@ -258,5 +258,5 @@ You can disable the sale of a published asset by disabling the **On Sale** at th
After enabling an item for sale, you can take the item off-sale by disabling the toggle. A publishing fee is not required to re-enable.
-To permanently archive your asset, see [Archiving Assets](./moderation.md#archive-assets).
+To permanently archive your asset, see [Archiving Assets](./moderation.md#archiving-assets).
diff --git a/content/en-us/parts/index.md b/content/en-us/parts/index.md
index e17588dd1..e0d929374 100644
--- a/content/en-us/parts/index.md
+++ b/content/en-us/parts/index.md
@@ -75,7 +75,7 @@ the group as a single assembly in the [Explorer](../studio/explorer.md). See
-## Part properties
+## Part Properties
Each part has a variety of properties that you can customize through the [Properties](../studio/properties.md) window.
@@ -92,23 +92,23 @@ The following are commonly utilized properties:
- `Class.BasePart|CanCollide` controls whether or not a part can collide with other parts. When this property is set to true, the part is impenetrable and the physics engine accounts for it within your experience. Conversely, when this property is set to false, the part can pass through anything, and the physics engine does **not** account for it.
- `Class.BasePart|Transparency` sets a part's visibility to any value between the default value of 0 (fully visible) and 1 (fully transparent). If you have many partially transparent parts, they can slow down performance. To alleviate this, merge them using [solid modeling](../parts/solid-modeling.md).
-## Insert parts
+## Inserting Parts
The **Part** button inserts a new part into the workspace. Clicking the small dropdown arrow on the button lets you select either **Block**, **Sphere**, **Wedge**, **Corner Wedge**, or **Cylinder**.
-To insert a `Class.TrussPart` (not available on the insertion menu), use the [Explorer](../studio/explorer.md) as outlined [here](../studio/explorer.md#insert-and-parent).
+To insert a `Class.TrussPart` (not available on the insertion menu), use the [Explorer](../studio/explorer.md) as outlined [here](../studio/explorer.md#inserting-and-parenting).
-## Select parts
+## Selecting Parts
-As you hover over parts in the viewport, they are outlined to indicate their potential selection. You can select an outlined part by clicking it, or you can select multiple parts by holding Shift, Ctrl, or ⌘ as you hover over and click them. See [here](../studio/ui-overview.md#object-selection) for advanced methods of selecting parts in the 3D viewport.
+As you hover over parts in the viewport, they are outlined to indicate their potential selection. You can select an outlined part by clicking it, or you can select multiple parts by holding Shift, Ctrl, or ⌘ as you hover over and click them. See [here](../studio/ui-overview.md#selecting-objects) for advanced methods of selecting parts in the 3D viewport.
-## Transform parts
+## Transforming Parts
You can move, scale, and rotate selected parts either through modeling tools or by setting a new position, size, or orientation in the [Properties](#part-properties) window.
@@ -124,7 +124,7 @@ the arrow axis indicators change to a part's local orientation, and an **L** ind
-### Move
+### Moving
You can move a selected part to a new position using the **Move** tool (default shortcut 2) or by **cursor dragging**. While moving a part, you can temporarily toggle [snapping](../studio/model-tab.md#transform-snapping) by holding Shift.
@@ -164,7 +164,7 @@ While cursor dragging, T and R can be used to quickly rota
-### Scale
+### Scaling
To scale (resize) a selected part along the **X**, **Y**, or **Z** axis, use the **Scale** tool (default shortcut 3) and click/drag a handle. While dragging, you can temporarily toggle [snapping](../studio/model-tab.md#transform-snapping) by holding Shift.
@@ -172,7 +172,7 @@ To scale (resize) a selected part along the **X**, **Y**, or **Z** axis, use the
-### Rotate
+### Rotating
To rotate a selected part around the **X**, **Y**, or **Z** axis, use the **Rotate** tool (default shortcut 4) and click/drag a rotation ring. While dragging, you can temporarily toggle [snapping](../studio/model-tab.md#transform-snapping) by holding Shift.
@@ -180,11 +180,11 @@ To rotate a selected part around the **X**, **Y**, or **Z** axis, use the **Rota
-## Color parts
+## Coloring Parts
While a part is gray by default, you can change it to any color through the following methods.
-### Hexagon map
+### Hexagon Map
Clicking the small dropdown arrow on the **Color** widget reveals a hexagonal color picker.
@@ -194,22 +194,22 @@ By default, clicking the overall **Color** button applies the chosen color to an
-### Colors popup
+### Colors Popup
The **Colors** popup allows you to set a color through your operating system's color picker widget. To access it, navigate to the [Properties](../studio/properties.md) window and click the small box to the left of the `Class.BasePart.Color|Color` property.
-### RGB value
+### RGB Value
To define a specific RGB color value for a part, enter an RGB value into the
`Class.BasePart.Color|Color` property field.
-## Apply materials
+## Applying Materials
-Similar to [color](#color-parts), you can customize a part's **material** to simulate real-world materials such as wood, glass, or fabric. When selecting a material, consider the following:
+Similar to [color](#coloring-parts), you can customize a part's **material** to simulate real-world materials such as wood, glass, or fabric. When selecting a material, consider the following:
- **Material affects the physical traits of a part, not just its appearance**. For example, the **Concrete** material is heavier than the **Plastic** material, so a concrete brick will have higher density than a plastic brick and sink in water faster.
diff --git a/content/en-us/parts/materials.md b/content/en-us/parts/materials.md
index 01bb57a19..06f7ee486 100644
--- a/content/en-us/parts/materials.md
+++ b/content/en-us/parts/materials.md
@@ -7,15 +7,15 @@ import BetaAlert from '../includes/beta-features/beta-alert.md'
Roblox's materials are unlike materials on other platforms, in that their visual appearance **and** their [physical properties](#physical-properties) reflect those of materials in the real world. For example, concrete is heavier than plastic and sinks faster in water. When you set the material of a part or terrain, Roblox simulates its physical material properties to make this behavior just work.
-The Roblox Engine offers a range of [base materials](#base-materials) suitable to build many experiences, including various categories of metal, rock, and organic materials.
+The Roblox engine offers a range of [base materials](#base-materials) suitable to build many experiences, including various categories of metal, rock, and organic materials.
You can also create your own [custom materials](#custom-materials) and apply them to parts or [terrain](../parts/terrain.md). Custom materials have an additional [adaptive materials](#adaptive-materials) behavior that lets you adapt any model to use your art style and custom materials, even if someone else created the model.
-## Apply materials
+## Applying Materials
You can quickly apply materials to [parts](../parts/index.md) through the [Material](#material-widget) widget. The [Material Manager](#material-manager) offers the same functionality and an additional "paint tool" application mode.
-### Material widget
+### Material Widget
The **Material** widget is accessible from either the [Home](../studio/home-tab.md) or [Model](../studio/model-tab.md) tabs. Clicking the small dropdown arrow reveals a material picker.
@@ -25,7 +25,7 @@ By default, clicking the overall **Material** button applies the chosen material
-### Material manager
+### Material Manager
If you've enabled the [Material Picker](#material-widget) beta, access the **Material Manager** from the picker window. If you have not enabled the beta, locate its dedicated button to the left of the **Color** button in the [Home](../studio/home-tab.md) or [Model](../studio/model-tab.md) tab.
@@ -57,7 +57,7 @@ You can also use a material as a painting tool that applies to parts:
-## Custom materials
+## Custom Materials
The [Material Manager](#material-manager) provides a user interface to interact with various aspects of `Class.MaterialService`, including creating new custom materials and applying them to parts and [terrain](../parts/terrain.md). Custom materials are represented by `Class.MaterialVariant` instances within `Class.MaterialService`.
@@ -69,7 +69,7 @@ You can apply custom materials per-part or globally to both parts and terrain, a
`Class.MaterialVariant` and `Class.SurfaceAppearance` instances both use [PBR](../art/modeling/surface-appearance.md) textures to customize the appearance of objects. The difference is that `Class.MaterialVariant` is for customizing the appearance of reusable tileable material, whereas `Class.SurfaceAppearance` is for customizing the visual appearance of a specific mesh with UV mapping. `Class.MaterialVariant` instances also have [physical properties](#physical-properties) that `Class.SurfaceAppearance` instances don't.
-### Create custom materials
+### Creating Custom Materials
You can edit all properties of a custom material in the [Material Manager](#material-manager) or through the properties of a `Class.MaterialVariant` instance. You can also generate custom materials through the prompt‑based [Material Generator](../studio/material-generator.md).
@@ -95,9 +95,9 @@ To create a custom material in the [Material Manager](#material-manager):
If necessary, you can delete a custom material from the [Material Manager](#material-manager) by selecting it and clicking the **Delete** button below its preview globe. Alternatively, you can delete its associated `Class.MaterialVariant` instance within **MaterialService** of the [Explorer](../studio/explorer.md).
-### Apply custom materials
+### Applying Custom Materials
-For [parts](../parts/index.md), you can use a custom material just like any other material, applying it to selected parts through the [Material](#apply-materials) widget or the [Material Manager](#material-manager).¹
+For [parts](../parts/index.md), you can use a custom material just like any other material, applying it to selected parts through the [Material](#applying-materials) widget or the [Material Manager](#material-manager).¹
You can also apply the new material to a part by setting its **MaterialVariant** property in the [Properties](../studio/properties.md) window. In this case, Studio automatically sets its **Material** property to the base material you chose when creating the material.
@@ -109,7 +109,7 @@ Note that if you rename a custom material **after** applying it to parts, those
¹ Unlike on parts, you cannot **directly** apply custom materials to [terrain](../parts/terrain.md), although you can set a custom material as a [material override](#material-overrides) to an existing base material for all terrain using that material.
-### Material overrides
+### Material Overrides
You can set a custom material as a **material override** to make its base material serve as a reference to the custom material. When you do so, Studio will use the custom material for both the textures and [physical properties](#physical-properties) of any part or [terrain](../parts/terrain.md) that uses the custom material.
@@ -117,7 +117,7 @@ You can set a custom material as a **material override** to make its base materi
Material overrides are the only way to apply custom materials to terrain. Note also that the materials for terrain are global per place, so you can't apply multiple variants of the same base material to the terrain in a single place.
-#### Set overrides
+#### Setting Overrides
To set a custom material as a material override in the [Material Manager](#material-manager):
@@ -130,7 +130,7 @@ To set a custom material as a material override in the [Material Manager](#mater
-#### Terrain details
+#### Terrain Details
By default, applying a custom material to parts or as an override applies that custom material as tiles across each face. For terrain, you can optionally configure `Class.TerrainDetail` instances to customize the **top**, **side**, and **bottom** of terrain voxels using that custom material.
@@ -149,7 +149,7 @@ To customize the faces of terrain using a custom material:
-#### Disable overrides
+#### Disabling Overrides
You can disable an entire material override and all base materials that it's currently overriding, or you can disable the override for a specific base material.
@@ -168,7 +168,7 @@ You can disable an entire material override and all base materials that it's cur
-## Physical properties
+## Physical Properties
All materials have built-in **physical properties** such as density, elasticity, and friction. Through the application of [custom materials](#custom-materials) with unique physical properties, you can affect global material behavior for all parts and [terrain](../parts/terrain.md) which use the custom material, such as creating an extremely slippery variant of the **Ice** material.
@@ -225,7 +225,7 @@ If you need to override a part's custom material properties and set physical pro
-## Adaptive materials
+## Adaptive Materials
When you apply a custom material to a part, the part's `Class.Part.MaterialVariant` property becomes the name of its `Class.MaterialVariant` rather than its specific instance. This means that when you reuse the part in the same or a different place, as in a model or package, it's easier for you to adapt different custom materials to adjust the part's look. The adaptive behavior of custom materials has the following effects:
@@ -244,9 +244,9 @@ The [Creator Store](../production/creator-store.md) has a category called Materi
To make the most of adaptive materials, use a consistent naming convention for your `Class.MaterialVariant` instances. For example, you can use `PascalCase` with the base material of the custom material as the first word, as in `GrassWet`, `GrassDry`, and `GrassBurned`.
-## Asset and property reference
+## Asset and Property Reference
-### Base materials
+### Base Materials
Shaders generate the look and feel of materials. The base material shaders work differently than the shader which `Class.MaterialVariant` instances use, so you can't create custom materials that look exactly like base materials, but you can still create custom materials that use their textures. The following tables list the asset IDs for material details such as `Class.SurfaceAppearance.ColorMap|ColorMap` and `Class.SurfaceAppearance.RoughnessMap|RoughnessMap`.
@@ -1221,9 +1221,9 @@ Shaders generate the look and feel of materials. The base material shaders work
The base materials were upgraded in 2022 to support custom materials. New places use the upgraded materials by default, but you may need to explicitly enable upgraded materials for older places by selecting **MaterialService** in the [Explorer](../studio/explorer.md) window and then, in the [Properties](../studio/properties.md) window, enabling its **Use2022Materials** property. Note that after upgrading, you might need to adjust terrain colors since terrain made with upgraded materials uses tint instead of hue shift.
-### Default colors
+### Default Colors
-The following table lists the default RGB values for each base material. For information on how to color parts and terrain, see [Parts](../parts/index.md#color-parts) and [Environmental Terrain](../parts/terrain.md#custom-terrain-colors).
+The following table lists the default RGB values for each base material. For information on how to color parts and terrain, see [Parts](../parts/index.md#coloring-parts) and [Environmental Terrain](../parts/terrain.md#custom-terrain-colors).
@@ -1452,9 +1452,9 @@ The following table lists the default RGB values for each base material. For inf
-### Default physical properties
+### Default Physical Properties
-The following table lists each material's default physical properties as detailed in the `Datatype.PhysicalProperties` reference. For information on customizing physical properties, see [Physical properties](#physical-properties).
+The following table lists each material's default physical properties as detailed in the `Datatype.PhysicalProperties` reference. For information on customizing physical properties, see [Physical Properties](#physical-properties).
diff --git a/content/en-us/parts/meshes.md b/content/en-us/parts/meshes.md
index f928cd559..e48564f3b 100644
--- a/content/en-us/parts/meshes.md
+++ b/content/en-us/parts/meshes.md
@@ -24,13 +24,13 @@ Roblox supports many types of meshes, as long as they adhere to the [general mes
-Studio also supports meshes with components for creating avatar character models or accessories, such as [rigging and skinning](#rigging-and-skinning) data.
+Studio also supports meshes with components for creating avatar character models or accessories, such as [rigging and skinning](#rigging-and-skinning-meshes) data.
You can sell `Class.MeshPart` assets as avatar bodies, accessories, and clothing on the Marketplace. See [Avatar](../avatar/index.md) for more information.
-## Import meshes
+## Importing Meshes
You can import meshes into Studio using the [3D Importer](../art/modeling/3d-importer.md). With this tool, you can preview and examine meshes before importing them into your workspace or Toolbox, such as verifying texture, rigging, skinning, and animation data. It also flags issues and rejects meshes with error.
@@ -43,13 +43,13 @@ If the mesh file you are importing contains objects using specific naming conven
If you want to bulk-import meshes along with non-3D assets, such as images and audio, you can use the [Asset Manager](../projects/assets/manager.md). However, the Asset Manager doesn't support importing meshes with rigging, skinning, and animation data, accessories, or characters with facial animations.
-## Customize meshes
+## Customizing Meshes
Unlike basic parts, meshes have more customization options that you can adjust for advanced rendering fidelity.
### Texture
-**Textures** determine the visual appearance of meshes. Studio allows you to either apply one texture using the `Class.MeshPart.TextureID` property, or apply up to four physically-based rendering (PBR) textures within a `Class.SurfaceAppearance` or `Class.MaterialVariant` child object of the mesh. PBR textures allow you to represent realistic shading and lighting by using multiple types of texture images, or maps, on a single object.
+**Textures** determine the visual appearance of meshes. Studio allows you to either apply one texture using the `Class.MeshPart.TextureID` property, or apply up to four Physically-Based Rendering (PBR) textures within a `Class.SurfaceAppearance` or `Class.MaterialVariant` child object of the mesh. PBR textures allow you to represent realistic shading and lighting by using multiple types of texture images, or maps, on a single object.
@@ -78,7 +78,7 @@ If you add both `Class.SurfaceAppearance` and `Class.MaterialVariant` as child o
If the mesh you import to Studio doesn't come with texture data, or you want to change the existing texture, use the following steps to add a single texture:
-1. [Import the texture file](../projects/assets/manager.md#import-assets) to Asset Manager. The file must follow the [texture specifications](../art/modeling/texture-specifications.md). Upon completion, Studio automatically assigns and prompts an asset ID.
+1. [Import the texture file](../projects/assets/manager.md#importing-assets) to Asset Manager. The file must follow the [texture specifications](../art/modeling/texture-specifications.md). Upon completion, Studio automatically assigns and prompts an asset ID.
2. Copy the asset ID.
3. In the **Explorer** window, select the **MeshPart** object.
4. In the **Properties** window, select the **TextureID** field and paste the asset ID of the texture.
@@ -90,15 +90,15 @@ If your mesh has existing PBR textures, setting a Texture ID can't override the
-### Level of detail
+### Level of Detail
You can dynamically control a mesh's level of detail using its `Enum.RenderFidelity` property. The default value is `Enum.RenderFidelity.Automatic|Automatic`, meaning the mesh's detail is based on its distance from the camera as outlined in the following table.
-
Distance from camera
-
Render fidelity
+
Distance From Camera
+
Render Fidelity
Example
@@ -121,7 +121,7 @@ You can dynamically control a mesh's level of detail using its `Enum.RenderFidel
-### Collision fidelity
+### Collision Fidelity
**Collision fidelity** determines how closely the visual representation of a mesh matches its physical bounds. The `Class.MeshPart.CollisionFidelity` property has the following options, in order of fidelity and performance impact from lowest to highest:
@@ -152,9 +152,9 @@ You can dynamically control a mesh's level of detail using its `Enum.RenderFidel
To view collision fidelity in Studio, toggle on **Collision fidelity** from the [Visualization Options](../studio/ui-overview.md#visualization-options) widget in the upper‑right corner of the 3D viewport.
-For more information on the performance impact of collision fidelity options and how to mitigate them, see [Improve performance](../performance-optimization/improve.md#physics-computation). For an in-depth walkthrough on how to choose a collision fidelity option that balances your precision and performance requirements, see [Set physics and rendering parameters](../tutorials/curriculums/environmental-art/optimize-your-experience.md#review-physics-and-rendering-parameters).
+For more information on the performance impact of collision fidelity options and how to mitigate them, see [Performance Optimization](../performance-optimization/improving.md#physics-computation). For an in-depth walkthrough on how to choose a collision fidelity option that balances your precision and performance requirements, see [Set Physics and Rendering Parameters](../tutorials/curriculums/environmental-art/optimize-your-experience.md#review-physics-and-rendering-parameters).
-## Rigging and Skinning
+## Rigging and Skinning Meshes
**Rigging** is the process of connecting a mesh with an internal poseable skeleton rig. Rigged meshes allow mesh surfaces to rotate and move using internal bones within a model, such as a character's knee or elbow. **Skinning** a rigged mesh allows the rigged mesh object to deform, stretch, and bend in a more realistic manner.
@@ -169,4 +169,4 @@ For more information on the performance impact of collision fidelity options and
-For more information on rigging and skinning, see [Rigging and skinning](../art/modeling/rigging.md). After rigging a mesh, you can add animation and poses to it using the Animation Editor. See [Create an animation](../animation/editor.md#create-an-animation) for more information. Marketplace 3D assets, such as avatar clothing and bodies, also require rigging and skinning. See [Avatar](../avatar/index.md) for more information on requirements for Marketplace assets.
+For more information on rigging and skinning, see [Rigging and Skinning](../art/modeling/rigging.md). After rigging a mesh, you can add animation and poses to it using the Animation Editor. See [Creating an Animation](../animation/editor.md#creating-an-animation) for more information. Marketplace 3D assets, such as avatar clothing and bodies, also require rigging and skinning. See [Avatar](../avatar/index.md) for more information on requirements for Marketplace assets.
diff --git a/content/en-us/parts/models.md b/content/en-us/parts/models.md
index 6ad9513df..e06261b76 100644
--- a/content/en-us/parts/models.md
+++ b/content/en-us/parts/models.md
@@ -18,11 +18,11 @@ Characters, such as avatars or NPCs, are a single `Class.Model` containing the a
-## Create models
+## Creating Models
When you **group** objects together, they automatically become a `Class.Model` object.
-1. In the 3D viewport or the **Explorer** window, select every object that you want to group into a model.
+1. In the 3D viewport or the [Explorer](../studio/explorer.md) window, select every object that you want to group into a model.
1. Right-click on one of the objects and select **Group**, or press CtrlG on Windows or ⌘G on Mac. A new `Class.Model` object displays with all of the objects that make up the model nested underneath.
@@ -31,17 +31,17 @@ When you **group** objects together, they automatically become a `Class.Model` o
To completely ungroup a model back to its original objects, right-click it and select **Ungroup**, or press CtrlU on Windows or ⌘U on Mac.
-### Set a primary part
+### Setting a Primary Part
If you have a model with parts that are joined together through physical joints like `Class.WeldConstraint|WeldConstraints` or `Class.Motor6D|Motor6Ds`, you should specify a `Class.BasePart` within the model to become a `Class.Model.PrimaryPart|PrimaryPart`. A model's `Class.Model.PrimaryPart|PrimaryPart` is the physical reference that specifies which `Class.BasePart` the pivot point and bounding box should move with when the model changes position or orientation.
To set a primary part:
-1. In the **Explorer** window, select a model.
-1. In the **Properties** window, select the **PrimaryPart** property. Your cursor changes.
-1. Back in the **Explorer** window, select the part that you want to become your primary part.
+1. In the [Explorer](../studio/explorer.md) window, select a model.
+1. In the [Properties](../studio/properties.md) window, select the **PrimaryPart** property. Your cursor changes.
+1. Back in the [Explorer](../studio/explorer.md) window, select the `Class.BasePart` that you want to become your primary part.
-## Select models
+## Selecting Models
As you hover over models in the viewport, they are outlined to indicate their potential selection. You can select an outlined model by clicking it, or you can select multiple models by holding Shift, Ctrl, or ⌘ as you hover over and click them.
@@ -54,9 +54,9 @@ As models typically contain multiple child [parts](../parts/index.md) or [meshes
Selection cycling
-## Transform models
+## Transforming Models
-You can move, scale, or rotate a model using the Studio transform tools within the [Home](../studio/home-tab.md) and [Model](../studio/model-tab.md) tabs. Unless you've set a [primary part](#set-a-primary-part), a model transforms based on the center of its bounding box.
+You can move, scale, or rotate a model using the Studio transform tools within the [Home](../studio/home-tab.md) and [Model](../studio/model-tab.md) tabs. Unless you've set a [primary part](#setting-a-primary-part), a model transforms based on the center of its bounding box.
@@ -86,21 +86,21 @@ Additionally, within a `Class.Script` or `Class.LocalScript`, you can move or ro
-## Model behaviors
+## Model Behaviors
While models act similarly to `Class.Folder` objects for most purposes in your experience, they also exhibit some unique behaviors.
-### Character models
+### Character Models
When a `Class.Humanoid` is present inside a model that contains a `Class.Part` named **Head**, Roblox displays a name and/or health bar above that part. For more information, see [Character Name/Health Display](../characters/name-health-display.md).
-### Destroy height
+### Destroy Height
To prevent parts that have fallen off of an experience's map from continuing to fall forever, Studio automatically destroys parts that fall below the `Class.Workspace.FallenPartsDestroyHeight` value. If a part destroyed due to this behavior is the last part in a model, then that model will also be destroyed.
-## Model streaming
+## Model Streaming
Instance [streaming](../workspace/streaming.md) dynamically loads and unloads `Class.Model|Models` on a player's device as their character explores the 3D world. With streaming enabled, you can specify the way each model should be treated under streaming behavior. For example, a model set to [Persistent](../workspace/streaming.md#persistent) will never stream out, or a model set to [Atomic](../workspace/streaming.md#atomic) will stream in and out as a single unit with all of its descendants.
@@ -108,15 +108,15 @@ Because 3D content that exists on the client changes dynamically in a streaming-
See [Model Streaming Controls](../workspace/streaming.md#model-streaming-controls) for more on model-level streaming controls.
-## Upload and distribute models
+## Uploading and Distributing Models
-You can distribute models to the [Creator Store](../production/creator-store.md) for other creators to use within their own experiences. As with any asset, all models must adhere to the [Community Rules](https://en.help.roblox.com/hc/articles/203313410), [Terms of Use](https://en.help.roblox.com/hc/articles/115004647846), the [DMCA Guidelines](../production/publishing/dmca-guidelines.md) regarding copyright and Creator Store [asset moderation](../production/creator-store.md#asset-moderation) rules.
+You can [distribute](../production/creator-store.md) models to the [Creator Store](../production/creator-store.md) for other creators to use within their own experiences. As with any asset, all models must adhere to the [Community Rules](https://en.help.roblox.com/hc/articles/203313410), [Terms of Use](https://en.help.roblox.com/hc/articles/115004647846), the [DMCA Guidelines](../production/publishing/dmca-guidelines.md) regarding copyright and Creator Store [asset moderation](../production/creator-store.md#asset-moderation) rules.
-You will soon be able to sell models on the Creator Store for **United States Dollars** (USD). For more information and to start onboarding, see [Selling on the Creator Store](../production/sell-on-creator-store.md).
+You will soon be able to sell models on the Creator Store for **United States Dollars** (USD). For more information and to start onboarding, see [Selling on the Creator Store](../production/selling-on-creator-store.md).
-### 3D model files
+### 3D Model Files
You can import `.gltf`, `.fbx` and `.obj` model files into Roblox Studio. See [Using Studio's 3D Importer](../art/accessories/creating-rigid/importing.md). To create content for the Creator Store, we recommend:
@@ -125,6 +125,6 @@ You can import `.gltf`, `.fbx` and `.obj` model files into Roblox Studio. See [U
- Read and address any warnings shown during the import process.
- Scale and orient your model appropriately during import so that it's usable out of the box when inserted from the Creator Store.
-### Existing Roblox instances
+### Existing Roblox Instances
-You can upload existing `Class.Model` instances created in Studio from the **Explorer** window. For more infromation, see [Distribute and sell assets through Studio](../production/creator-store.md#through-studio).
+You can upload existing `Class.Model` instances created in Studio from the [Explorer](../studio/explorer.md) window as outlined [here](../production/creator-store.md#through-studio).
diff --git a/content/en-us/parts/solid-modeling.md b/content/en-us/parts/solid-modeling.md
index ec0640b99..adcd6ed8e 100644
--- a/content/en-us/parts/solid-modeling.md
+++ b/content/en-us/parts/solid-modeling.md
@@ -1,5 +1,5 @@
---
-title: Solid modeling
+title: Solid Modeling
description: Solid modeling is the process of joining parts together to form complex shapes.
---
@@ -18,29 +18,29 @@ together in unique ways to form more complex shapes known as **unions** or **int
-
[Union](#union-parts)
+
[Union](#unioning-parts)
ShiftCtrlG (Windows) Shift⌘G (Mac)
Join two or more parts together to form a single solid union.
-
[Intersect](#intersect-parts)
+
[Intersect](#intersecting-parts)
ShiftCtrlI (Windows) Shift⌘I (Mac)
Intersect overlapping parts into a single solid intersection.
-
[Negate](#negate-parts)
+
[Negate](#negating-parts)
ShiftCtrlN (Windows) Shift⌘N (Mac)
Negate parts, useful for making holes and indentations.
-
[Separate](#separate-unions-or-intersections)
+
[Separate](#separating-unions-or-intersections)
ShiftCtrlU (Windows) Shift⌘U (Mac)
Separate the union or intersection back into its individual parts.
-## Union parts
+## Unioning Parts
The **Union** tool joins two or more parts together to form a single solid `Class.UnionOperation`. By default, a new union respects the `Class.BasePart.Color|Color` property of each of its parts, although you can enable its `Class.PartOperation.UsePartColor|UsePartColor` property to change the entire union to a specific color.
@@ -55,12 +55,12 @@ The **Union** tool joins two or more parts together to form a single solid `Clas
To combine parts together into a union:
-1. Select all parts that you want to join together.
+1. Select all parts to join together.
2. Click the **Union** button. All of the parts combine into one solid `Class.UnionOperation` with the name **Union**.
-## Intersect parts
+## Intersecting Parts
The **Intersect** tool intersects overlapping parts into a single solid `Class.IntersectOperation`. By default, the face colors of the resulting intersection are borrowed from the `Class.BasePart.Color|Color` property of the original parts, although you can enable its `Class.PartOperation.UsePartColor|UsePartColor` property to change the entire intersection to a specific color.
@@ -79,14 +79,14 @@ The **Intersect** tool intersects overlapping parts into a single solid `Class.I
To intersect overlapping parts together:
-1. Select all parts that you want to intersect.
+1. Select all parts to intersect.
2. Click the **Intersect** button. All of the parts combine into one solid `Class.IntersectOperation` with the name **Intersection**.
-## Negate parts
+## Negating Parts
-The **Negate** tool negates a part so that when it's [unioned with another part](#union-parts), the shape of the negated part is **subtracted** from the other part.
+The **Negate** tool negates a part so that when it's [unioned with another part](#unioning-parts), the shape of the negated part is **subtracted** from the other part.
@@ -103,7 +103,7 @@ The **Negate** tool negates a part so that when it's [unioned with another part]
To subtract a part from other overlapping parts:
-1. Select the part you want to negate from other parts.
+1. Select the part you would like to negate from other parts.
1. Click **Negate**. The part becomes a `Class.NegateOperation` with the name **NegativePart** and turns pink and translucent to indicate its state.
@@ -113,26 +113,26 @@ To subtract a part from other overlapping parts:
-## Separate unions or intersections
+## Separating Unions or Intersections
The **Separate** tool separates a `Class.UnionOperation` back into its individual parts, essentially serving as an "undo" tool for unions and intersections.
To separate a union or intersection back into individual parts:
-1. Select the union or intersection.
+1. Select a `Class.UnionOperation`.
1. Click **Separate**. The parts separate back into their original form.
-## Render fidelity
+## Render Fidelity
By default, new solid modeled operations will always be shown in `Enum.RenderFidelity.Automatic|Automatic` render fidelity, meaning the part's detail is based on its distance from the camera as outlined in the following table.
-
Distance from camera
-
Render fidelity
+
Distance From Camera
+
Render Fidelity
@@ -151,7 +151,7 @@ By default, new solid modeled operations will always be shown in `Enum.RenderFid
-## Smoothing angle
+## Smoothing Angle
A solid modeled part's `Class.PartOperation.SmoothingAngle|SmoothingAngle` property smooths angles between adjacent surfaces of the same color or material. A higher value produces a smoother appearance while a lower value produces a rougher appearance with more sharp edges.
@@ -168,7 +168,7 @@ While a value between 30 and 70 degrees usually produces a good result, values b
-## In-experience solid modeling
+## In-Experience Solid Modeling
In addition to the **Union**, **Intersect**, and **Negate** tools in Studio, you can allow players to use solid modeling operations while inside an experience through `Class.BasePart:UnionAsync()|UnionAsync()`, `Class.BasePart:IntersectAsync()|IntersectAsync()`, and `Class.BasePart:SubtractAsync()|SubtractAsync()`. All of these methods must be called on a `Class.BasePart` and they all require an array of one or more parts to union with, intersect with, or subtract from the calling part.
diff --git a/content/en-us/parts/terrain.md b/content/en-us/parts/terrain.md
index fd40c1584..a558209e6 100644
--- a/content/en-us/parts/terrain.md
+++ b/content/en-us/parts/terrain.md
@@ -1,19 +1,19 @@
---
-title: Environmental terrain
+title: Environmental Terrain
description: Explore how to generate and sculpt realistic terrain environments such as mountains, bodies of water, grass-covered hills, or a flat desert.
---
import BetaAlert from '../includes/beta-features/beta-alert.md'
-Studio's [Terrain Editor](../studio/terrain-editor.md) lets you generate and sculpt detailed and realistic terrain environments such as mountains, bodies of water, grass-covered hills, or a flat desert. Terrain is made up of grids of **voxels** which are 4×4×4 stud regions in the 3D world with a set material.
+Studio's [Terrain Editor](../studio/terrain-editor.md) lets you generate and sculpt detailed and realistic terrain environments such as mountains, bodies of water, [grass-covered hills](#animated-grass), or a flat desert. Terrain is made up of grids of **voxels** which are 4×4×4 stud regions in the 3D world with a set [material](#terrain-materials).
-Using the Terrain Editor, you can easily [generate](#generate-terrain) and edit terrain either at a [voxel](#detailed-editing) or [region](#large-scale-editing) level with the option of importing a [heightmap](#heightmaps-and-colormaps) and [colormap](#heightmaps-and-colormaps). For more precise, dynamic, or procedural terrain editing, you can also [script](#scripting) terrain creation.
+Using the [Terrain Editor](../studio/terrain-editor.md), you can easily [generate](#generating-terrain) and edit terrain either at a [voxel](#detailed-editing) or [region](#large-scale-editing) level with the option of importing a [heightmap](#heightmaps-and-colormaps) and [colormap](#heightmaps-and-colormaps). For more precise, dynamic, or procedural terrain editing, you can also [script](#scripting) terrain creation.
-## Terrain materials
+## Terrain Materials
-The following default materials are available for terrain, and you can also apply [custom materials](../parts/materials.md#custom-materials). Materials affect both the shape and appearance of terrain in the world; for example, [animated grass](#grass-animation) renders only on the **Grass** material and the **Water** material [ripples and shimmers](#water-appearance) with a subtle motion.
+The following default [materials](../parts/materials.md) are available for terrain, and you can also apply [custom materials](../parts/materials.md#custom-materials). Materials affect both the shape and appearance of terrain in the world; for example, [animated grass](#animated-grass) renders only on the **Grass** material and the **Water** material [ripples and shimmers](#water-appearance) with a subtle motion.
@@ -110,7 +110,7 @@ The following default materials are available for terrain, and you can also appl
-### Water appearance
+### Water Appearance
By default, terrain water ripples, oscillates, and shimmers with a subtle motion.
@@ -118,11 +118,11 @@ By default, terrain water ripples, oscillates, and shimmers with a subtle motion
To customize the color and motion of water:
-1. In the **Explorer** window, navigate to the **Workspace**, then select the **Terrain** object.
+1. Select the **Terrain** object under **Workspace** in the [Explorer](../studio/explorer.md) window.
-1. In the **Properties** window, customize the appearance of water through the following properties:
+1. Customize the appearance of water through the following properties in the [Properties](../studio/properties.md) window:
@@ -163,7 +163,7 @@ If you have a place with shoreline terrain (water meeting land), it's recommende
Some water properties are only visible while playtesting. To preview all properties while editing, open **Studio Settings**, search for **Editor Quality Level**, and set it to the highest level.
-### Grass animation
+### Animated Grass
While most materials are static, you can add animated blades of grass to the **Grass** terrain material. By default, grass sways gently in a simulated wind, and you can adjust the direction/strength of its animation through [global wind](../environment/global-wind.md).
@@ -171,23 +171,23 @@ While most materials are static, you can add animated blades of grass to the **G
To add animated grass to the **Grass** material:
-1. In the **Explorer** window, navigate to the **Workspace**, then select the **Terrain** object.
+1. Select the **Terrain** object under **Workspace** in the [Explorer](../studio/explorer.md) window.
-2. In the **Properties** window, toggle on the **Decoration** property.
+2. Toggle on the **Decoration** property in the [Properties](../studio/properties.md) window.
-3. Adjust the grass length by entering a value between `0.1` and `1` for the **GrassLength** property.
+3. Adjust the grass length by entering a value between 0.1 and 1 for the **GrassLength** property.
-4. Adjust the direction and strength of its animation through [global wind](../environment/global-wind.md).
+4. If desired, adjust the direction and strength of its animation through [global wind](../environment/global-wind.md).
-### Custom terrain colors
+### Custom Terrain Colors
Each terrain material is assigned a default color, but you can customize any material's color to better fit your experience.
@@ -205,26 +205,26 @@ Each terrain material is assigned a default color, but you can customize any mat
To customize any material color other than water:
-1. In the **Explorer** window, navigate to the **Workspace**, then select the **Terrain** object.
+1. Select the **Terrain** object under **Workspace** in the [Explorer](../studio/explorer.md) window.
-2. In the **Properties** window, expand **MaterialColors**. All materials display with their RGB code.
+2. Expand **MaterialColors** in the [Properties](../studio/properties.md) window. All materials display with their RGB code.
-3. For any material, either input a new RGB code or click the color box to open the [colors popup](../parts/index.md#colors-popup).
+3. For any given material, either input a new RGB code or click the color box to open the [colors popup](../parts/index.md#colors-popup).
-## Generate terrain
+## Generating Terrain
Using the following tools and methods, you can generate large
-areas of terrain procedurally with the Generate tool or scripting, or automatically based on a heightmap and colormap.
+areas of terrain procedurally with the [Generate](#generate-tool) tool or [scripting](#scripting), or automatically based on a [heightmap](#heightmaps-and-colormaps) and optional [colormap](#heightmaps-and-colormaps).
-### Generate tool
+### Generate Tool
-The **Generate** tool allows you to procedurally generate terrain in seconds. This is useful if you want to create a large map and fine-tune [terrain details](#detailed-editing).
+The [Generate](../studio/terrain-editor.md#generate) tool allows you to procedurally generate terrain in seconds. This is useful if you want to create a large map and then fine-tune [terrain details](#detailed-editing).
-1. In the **Terrain Editor**, navigate to the **Create** tab and select the **Generate** tool.
+1. Navigate to the [Create](../studio/terrain-editor.md#create-tab) tab of the [Terrain Editor](../studio/terrain-editor.md) and select the [Generate](../studio/terrain-editor.md#generate) tool.
@@ -256,11 +256,12 @@ The **Generate** tool allows you to procedurally generate terrain in seconds. Th
-4. Click the **Generate** button.
+4. Adjust any other desired settings as documented [here](../studio/terrain-editor.md#generate).
+5. Click the **Generate** button.
-### Heightmaps and colormaps
+### Heightmaps and Colormaps
A **heightmap** is a 2D representation of a 3D terrain map, as viewed directly from above. Brighter areas of a heightmap result in higher terrain, like mountains, while darker areas result in lower regions, like valleys.
@@ -285,7 +286,7 @@ An optional **colormap**, along with a heightmap, converts colors to terrain mat
To import a heightmap and optional colormap:
-1. In the **Terrain Editor**, navigate to the **Create** tab and select the **Import** tool.
+1. Navigate to the [Create](../studio/terrain-editor.md#create-tab) tab of the [Terrain Editor](../studio/terrain-editor.md) and select the [Import](../studio/terrain-editor.md#import) tool.
@@ -299,7 +300,7 @@ To import a heightmap and optional colormap:
To apply a colormap, click the **Colormap** tab, click its import button, and choose the file to import. Colors on the image should match the following RGB/hex values and use hard edges, since anti‑aliasing or edge smoothing may create pixel colors outside the expected value ranges.
- The following table describes color mapping to a corresponding material. If your colormap contains a color that's not in the table, Studio chooses the closest matching material; for this reason, it is best to download the `RobloxColorMapIndex` file and directly sample its colors, or type the exact RGB/hex values into the color picker of your image editing application.
+ The following table describes color mapping to a corresponding material. If your colormap contains a color that's not in the table, Studio chooses the closest matching material; for this reason, it is best to download the `RobloxColorMapIndex.png` file and directly sample its colors, or type the exact RGB/hex values into the color picker of your image editing application.
@@ -455,7 +456,7 @@ To import a heightmap and optional colormap:
-4. In the 3D viewport, move/resize the **selection region** in which to generate terrain. Alternatively, enter values into the **Select** tool fields to set a more specific position and size.
+4. In the 3D viewport, move/resize the **selection region** in which to generate terrain. Alternatively, enter values into the [Select](../studio/terrain-editor.md#select) tool fields to set a more specific position and size.
Minimum and maximum terrain heights depend on the darkest and lightest areas of the heightmap image in relation to the **Y** size (height) of the selection region. For instance, if you choose a height of 128, pure black areas are 64 studs below the center position and pure white areas are 64 studs above the center position.
@@ -473,13 +474,13 @@ You can script terrain generation using the `Class.Terrain` class. For example,
workspace.Terrain:FillBlock(CFrame.new(0, 0, 0), Vector3.new(4, 4, 4), Enum.Material.Grass)
```
-## Large-scale editing
+## Large-Scale Editing
-The Terrain Editor's **Edit** tab contains tools for large-scale editing.
+The terrain editor's [Edit](../studio/terrain-editor.md#edit-tab) tab contains tools for large-scale editing through region [selection](#selecting-regions), [transform](#transforming-regions), [fill](#filling-and-replacing), [replace](#filling-and-replacing), or setting [sea level](#setting-sea-level).
-### Select regions
+### Selecting Regions
-The **Select** tool is the universal tool for selecting rectangular regions of terrain.
+The [Select](../studio/terrain-editor.md#select) tool is the universal tool for selecting rectangular regions of terrain.
@@ -490,7 +491,7 @@ Select a region by clicking and dragging in the 3D viewport, reposition it with
Move draggers and scale handles on a selected region
-Studio also supports the following keyboard and mouse shortcuts, assuming the Select tool is active and nothing is selected in the Explorer window.
+Studio also supports the following keyboard and mouse shortcuts, assuming the [Select](../studio/terrain-editor.md#select) tool is active and nothing is selected in the [Explorer](../studio/explorer.md) hierarchy.
@@ -509,7 +510,7 @@ Studio also supports the following keyboard and mouse shortcuts, assuming the Se
CtrlV
⌘V
-
Paste terrain that has been copied to the clipboard and swap to the Transform tool so that the new terrain can be transformed.
+
Paste terrain that has been copied to the clipboard and swap to the [Transform](../studio/terrain-editor.md#transform) tool so that the new terrain can be [transformed](#transforming-regions).
CtrlX
@@ -519,7 +520,7 @@ Studio also supports the following keyboard and mouse shortcuts, assuming the Se
CtrlD
⌘D
-
Duplicate terrain within the selected region and swap to the Transform tool so that the new terrain can be transformed.
+
Duplicate terrain within the selected region and swap to the [Transform](../studio/terrain-editor.md#transform) tool so that the new terrain can be [transformed](#transforming-regions).
Delete
@@ -539,13 +540,13 @@ Studio also supports the following keyboard and mouse shortcuts, assuming the Se
-### Transform regions
+### Transforming Regions
-The **Transform** tool lets you manipulate entire selected regions to a new position, size, or orientation.
+The [Transform](../studio/terrain-editor.md#transform) tool lets you manipulate entire selected regions to a new position, size, or orientation.
To transform a region:
-1. Select a region and then activate the **Transform** tool. Note that the tool will be automatically activated if you paste or duplicate terrain.
+1. [Select](#selecting-regions) a region and then activate the [Transform](../studio/terrain-editor.md#transform) tool. Note that the tool will be automatically activated if you paste or duplicate terrain.
@@ -563,13 +564,13 @@ To transform a region:
By default, this tool uses **Live Edit** mode to constantly update terrain as you transform it. To view only a wireframe preview of the terrain as you transform it, disable live edit mode and then, while transforming, press Enter/Return or click the **Apply** button to apply the changes.
-### Fill and replace regions
+### Filling and Replacing
-The **Fill** tool lets you fill an entire selected region with a specific material, or replace all material within the region with another material.
+The [Fill](../studio/terrain-editor.md#fill) tool lets you fill an entire selected region with a specific material, or replace all material within the region with another material.
To fill or replace terrain:
-1. Select a region, then activate the **Fill** tool.
+1. [Select](#selecting-regions) a region and then activate the [Fill](../studio/terrain-editor.md#fill) tool.
@@ -583,13 +584,11 @@ To fill or replace terrain:
Selected region filled with Salt material
-### Set sea level
-
-The **Sea Level** tool lets you create a consistent water level or remove all water within a region.
+### Setting Sea Level
-To set the sea level:
+The [Sea Level](../studio/terrain-editor.md#sea-level) tool lets you create a consistent water level or remove all water within a region.
-1. Activate the **Sea Level** tool.
+1. Activate the [Sea Level](../studio/terrain-editor.md#sea-level) tool.
@@ -599,9 +598,9 @@ To set the sea level:
-## Detailed editing
+## Detailed Editing
-The Terrain Editor's **Edit** tab also contains tools for precision editing using a "brush" tool to draw, sculpt, smooth, flatten, or paint terrain.
+The terrain editor's [Edit](../studio/terrain-editor.md#edit-tab) tab also contains tools for precision editing using a "brush" tool to [draw](#drawing), [sculpt](#sculpting), [smooth](#smoothing), [flatten](#flattening), or [paint](#painting).
@@ -653,34 +652,34 @@ For tools which use the brush, Studio supports the following keyboard and mouse
-### Draw
+### Drawing
-The **Draw** tool **adds** or **subtracts** terrain using the brush. This tool functions in a dual mode where holding down Ctrl or ⌘ toggles on "subtract" mode instead of the default "add" mode. Additionally, holding down Shift temporarily activates the [Smooth](../studio/terrain-editor.md#smooth) tool.
+The [Draw](../studio/terrain-editor.md#draw) tool **adds** or **subtracts** terrain using the brush. This tool functions in a dual mode where holding down Ctrl or ⌘ toggles on "subtract" mode instead of the default "add" mode. Additionally, holding down Shift temporarily activates the [Smooth](../studio/terrain-editor.md#smooth) tool.
-### Sculpt
+### Sculpting
-The **Sculpt** tool **adds** or **subtracts** terrain using the brush. Unlike the Draw tool, this tool includes a **strength** slider to allow for more gentle manipulation of terrain.
+The [Sculpt](../studio/terrain-editor.md#sculpt) tool **adds** or **subtracts** terrain using the brush. Unlike the [Draw](../studio/terrain-editor.md#draw) tool, this tool includes a **strength** slider to allow for more gentle manipulation of terrain.
-Similar to the Draw tool, the Sculpt tool functions in a dual mode where holding down Ctrl or ⌘ toggles on "subtract" mode instead of the default "add" mode. Additionally, holding down Shift temporarily activates the Smooth tool.
+Similar to the [Draw](../studio/terrain-editor.md#draw) tool, the [Sculpt](../studio/terrain-editor.md#sculpt) tool functions in a dual mode where holding down Ctrl or ⌘ toggles on "subtract" mode instead of the default "add" mode. Additionally, holding down Shift temporarily activates the [Smooth](../studio/terrain-editor.md#smooth) tool.
-### Smooth
+### Smoothing
-The **Smooth** tool smoothes out abrupt edges in terrain using the brush. This tool can be used in standalone mode, or you can toggle it on by holding Shift while using the Draw or Sculpt tools.
+The [Smooth](../studio/terrain-editor.md#smooth) tool smoothes out abrupt edges in terrain using the brush. This tool can be used in standalone mode, or you can toggle it on by holding Shift while using the [Draw](../studio/terrain-editor.md#draw) or [Sculpt](../studio/terrain-editor.md#sculpt) tools.
-### Flatten
+### Flattening
-The **Flatten** tool flattens terrain to a consistent level across a visualized plane. By default, the tool lowers terrain above the plane **and** raises terrain below to the plane, but you can opt to selectively lower **or** raise through the tool's **Flatten Mode** option.
+The [Flatten](../studio/terrain-editor.md#flatten) tool flattens terrain to a consistent level across a visualized plane. By default, the tool lowers terrain above the plane **and** raises terrain below to the plane, but you can opt to selectively lower **or** raise through the tool's **Flatten Mode** option.
-### Paint
+### Painting
-The **Paint** tool, using the brush, **paints** a terrain material over an existing material or **replaces** one material with another material.
+The [Paint](../studio/terrain-editor.md#paint) tool, using the brush, **paints** a terrain [material](#terrain-materials) over an existing material or **replaces** one material with another material.
diff --git a/content/en-us/parts/textures-decals.md b/content/en-us/parts/textures-decals.md
index dc0cc8c45..e3754ec28 100644
--- a/content/en-us/parts/textures-decals.md
+++ b/content/en-us/parts/textures-decals.md
@@ -1,5 +1,5 @@
---
-title: Textures and decals
+title: Textures and Decals
description: Textures and decals are images you can place on object surfaces.
---
@@ -18,8 +18,8 @@ can:
property to a value between the default of **0**
(fully visible) and **1** (invisible).
-- For a texture, set its [scale](#scale-textures) and
- [offset](#offset-textures).
+- For a texture, set its [scale](#scaling-textures) and
+ [offset](#offsetting-textures).
@@ -43,9 +43,9 @@ can:
-## Create textures or decals
+## Creating Textures or Decals
-To create a texture or decal, you have to add either a `Class.Texture` or `Class.Decal` object to a part or union. You can [import](../projects/assets/manager.md#import-assets) images for textures and decals to Studio for use between experiences, and [distribute](../production/creator-store.md) them to the [Creator Store](../production/creator-store.md). Once you import the image, Studio assigns it a unique asset ID.
+To create a texture or decal, you have to add either a `Class.Texture` or `Class.Decal` object to a part or union. You can [import](../projects/assets/manager.md#importing-assets) images for textures and decals to Studio for use between experiences, and [distribute](../production/creator-store.md) them to the [Creator Store](../production/creator-store.md). Once you import the image, Studio assigns it a unique asset ID.
Every texture or decal image that you create and import to Roblox must adhere to the Community Rules and Terms of Use.
@@ -53,13 +53,13 @@ To create a texture or decal, you have to add either a `Class.Texture` or `Class
To add a texture or decal to a part or union:
-1. In the **Explorer** window, add a `Class.Texture` or `Class.Decal` to the part or union:
+1. In the [Explorer](../studio/explorer.md) window, add a `Class.Texture` or `Class.Decal` to the part or union:
1. Hover over the part or union and click the ⊕ button. A contextual menu displays.
2. From the menu, insert a **Texture** or **Decal**. An empty texture or decal object displays on the part or union with orange outlining.
-2. In the **Properties** window, navigate to the **Face** property and [choose a face](#choose-a-face) or keep the default face.
+2. In the [Properties](../studio/properties.md) window, navigate to the **Face** property and [choose a face](#choosing-a-face) or keep the default face.
3. Select the **Texture** property and apply an image through any of the following methods:
@@ -82,7 +82,7 @@ To add a texture or decal to a part or union:
-5. **(Optional)** Set the **Transparency** property to any value between the default value of `0` (fully visible) and `1` (invisible).
+5. **(Optional)** Set the **Transparency** property to any value between the default value of 0 (fully visible) and 1 (invisible).
@@ -95,7 +95,7 @@ To add a texture or decal to a part or union:
-### Choose a face
+### Choosing a Face
A **face** is a surface on a part/union that displays a texture or decal: **Top**, **Bottom**, **Front**, **Back**, **Left**, or **Right**. The direction of each face depends on the part or union's orientation. In the following example images, the camera faces the block's **Front** face, so the block's **Left** face is on the right from the camera's perspective.
@@ -120,11 +120,11 @@ To choose a face:
3. In the **Properties** window, click the **Face** property and choose a face.
-## Customize textures
+## Customizing Textures
Unlike decals, textures provide further functionality to scale, offset, and animate an image.
-### Scale textures
+### Scaling Textures
The size of the part doesn't affect the texture. Instead, scaling a part only increases or decreases the number of times the texture repeats.
@@ -151,14 +151,14 @@ To scale a texture:
2. In the **Properties** window, set **StudsPerTileU** and **StudsPerTileV** to the number of studs you'd like the texture to occupy horizontally and vertically. The larger the number, the larger the image.
-### Offset textures
+### Offsetting Textures
-If you want more control over a texture's position, offset the texture by adjusting the `Class.Texture.OffsetStudsU|OffsetStudsU` and `Class.Texture.OffsetStudsV|OffsetStudsV` properties. This is also helpful for [animation](#animate-textures).
+If you want more control over a texture's position, offset the texture by adjusting the `Class.Texture.OffsetStudsU|OffsetStudsU` and `Class.Texture.OffsetStudsV|OffsetStudsV` properties. This is also helpful for [animation](#animating-textures).
- Texture image
+ Texture Image
@@ -176,7 +176,7 @@ To offset a texture:
2. In the **Properties** window, set **OffsetStudsU** and **OffsetStudsV** to the number of studs you'd like to offset the texture horizontally and vertically.
-### Animate textures
+### Animating Textures
Using `Class.TweenService`, you can tween texture properties like `Class.Texture.OffsetStudsU|OffsetStudsU` and `Class.Texture.StudsPerTileV|StudsPerTileV` to achieve animated surfaces. For example, if you apply two fog textures to one container and animate them with the following script, you can achieve the appearance of a layered moving fog:
diff --git a/content/en-us/performance-optimization/design.md b/content/en-us/performance-optimization/designing.md
similarity index 92%
rename from content/en-us/performance-optimization/design.md
rename to content/en-us/performance-optimization/designing.md
index 3f37684a4..dee22b3b3 100644
--- a/content/en-us/performance-optimization/design.md
+++ b/content/en-us/performance-optimization/designing.md
@@ -1,11 +1,11 @@
---
-title: Design for performance
+title: Designing for Performance
description: Outlines performance best practices to follow as you build a new experience.
---
Designing for performance means following a handful of best practices **as you build** your experience. Compared to finding and fixing performance issues later in the development process, designing for performance early can save you a lot of time and effort.
-## Low-end devices
+## Low-End Devices
Lower-end devices, particularly mobile devices, have severe memory limitations and are succeptible to crashes due to out of memory (OOM) errors:
@@ -25,19 +25,19 @@ More generally, testing on a variety of devices can help you check that the expe
-## Streaming and teleportation
+## Streaming and Teleportation
-- [Instance streaming](../workspace/streaming.md) lets Roblox dynamically load and unload 3D content and is a great option for most experiences, especially larger ones. Streaming improves join times, reduces memory footprint, and increases frame rates. For more information, see [Improving performance](improve.md#instance-streaming).
+- [Instance streaming](../workspace/streaming.md) lets Roblox dynamically load and unload 3D content and is a great option for most experiences, especially larger ones. Streaming improves join times, reduces memory footprint, and increases frame rates. For more information, see [Improving Performance](improving.md#instance-streaming).
-- Break large places into more manageable ones and use [teleportation](../projects/teleport.md) to move players between them.
+- Break large places into more manageable ones and use [teleportation](../projects/teleporting.md) to move players between them.
-## Materials and duplication
+## Materials and Duplication
- Built-in materials use far less memory than custom textures, but might not match your artistic vision. Try to use materials whenever possible in order to conserve memory budget for the textures that are central to your experience.
- As you create assets, convert them into [packages](../projects/assets/packages.md). Making packages part of your workflow helps avoid the common issue of duplicate assets with different IDs, which can hurt performance.
-- When you add meshes and textures, use and reuse them rather than importing duplicate copies. By resizing, rotating, and overlapping, you can create rich, varied environments that require very few [draw calls](improve.md#draw-calls). For more information, see [Remove duplicate textures](../tutorials/environmental-art/optimize-your-experience.md#remove-duplicate-textures).
+- When you add meshes and textures, use and reuse them rather than importing duplicate copies. By resizing, rotating, and overlapping, you can create rich, varied environments that require very few [draw calls](improving.md#draw-calls). For more information, see [Remove Duplicate Textures](../tutorials/environmental-art/optimize-your-experience.md#remove-duplicate-textures).
## Transparency
diff --git a/content/en-us/performance-optimization/identify.md b/content/en-us/performance-optimization/identifying.md
similarity index 96%
rename from content/en-us/performance-optimization/identify.md
rename to content/en-us/performance-optimization/identifying.md
index 8af6658b3..4f127de02 100644
--- a/content/en-us/performance-optimization/identify.md
+++ b/content/en-us/performance-optimization/identifying.md
@@ -1,5 +1,5 @@
---
-title: Identify performance issues
+title: Identifying Performance Issues
description: Explains how to use Roblox tools to identify performance issues.
---
@@ -54,7 +54,7 @@ Roblox has a number of tools for identifying performance issues, some of which a
-## Server compute
+## Server Compute
Server heartbeat is capped at 60 FPS for all experiences, so lower values might indicate a performance issue. To check server heartbeat:
@@ -68,7 +68,7 @@ Server heartbeat is capped at 60 FPS for all experiences, so lower values might
Another symptom of degraded server heartbeat is increased latency (commonly known as ping). The longer the server takes to finish computing its tasks each frame, the longer it takes to process network data sent and received from clients. To check average ping for all players connected to a server, go to the **Server Stats** tab in the [Developer Console](../studio/developer-console.md).
-## Client compute
+## Client Compute
The default client frame rate cap is 60 FPS. However, users can raise their frame rate cap up to 240 FPS on Windows.
@@ -89,7 +89,7 @@ To check the frame rate of your experience:
When evaluating frame rate, it can help to set the graphics quality to its maximum value to remove the effect of the frame rate manager. In the client, open the menu, click **Settings**, change **Graphics Mode** to manual, and raise graphics quality.
-## Server memory
+## Server Memory
Try to keep server memory usage below 50%. Total server memory uses the following formula:
@@ -101,9 +101,9 @@ These numbers use powers of 2, so 1 GiB refers to 2^30 bytes and 1 MiB to 2^20 b
For example, a server with 30 connected players has approximately 9.18 GiB of total memory. Servers gain memory when players connect, but **don't** lose it when players disconnect. If 10 players leave, the server still has 9.18 GiB of memory rather than shrinking to 8.2 GiB.
-When servers shut down (for example, when they are empty or as part of the [update process](../production/publishing/publish-experiences-and-places.md#update-experiences)), their replacements start with the base amount of memory and begin scaling up as players connect.
+When servers shut down (for example, when they are empty or as part of the [update process](../production/publishing/publishing-experiences-and-places.md#updating-experiences)), their replacements start with the base amount of memory and begin scaling up as players connect.
-## Client memory
+## Client Memory
There are several ways to check memory usage for an experience:
@@ -120,7 +120,7 @@ A significant portion of an experience's memory consumption on the client are fr
- **GraphicsMeshParts** - Graphics memory consumed by meshes.
- **GraphicsTexture** - Graphics memory consumed by textures.
-## Load times
+## Load Times
There are no built-in tools for checking load times, but because they don't require millisecond-level precision, a stopwatch is usually all you need to understand your current baseline and check whether you made a substantive improvement. You can use a client script in `Class.ReplicatedFirst` to get some sense of how your changes impact load times, but this script doesn't provide a complete, end-to-end measurement:
diff --git a/content/en-us/performance-optimization/improve.md b/content/en-us/performance-optimization/improving.md
similarity index 97%
rename from content/en-us/performance-optimization/improve.md
rename to content/en-us/performance-optimization/improving.md
index 688f4f552..445099b21 100644
--- a/content/en-us/performance-optimization/improve.md
+++ b/content/en-us/performance-optimization/improving.md
@@ -1,15 +1,15 @@
---
-title: Improve performance
+title: Improving Performance
description: Lists common performance problems and steps to mitigate them.
---
This page describes common performance problems and best practices for mitigating them.
-## Script computation
+## Script Computation
Expensive operations in Lua code take longer to process and can thus impact frame rate. Unless it is being executed in parallel, Lua code runs synchronously and blocks the main thread until it encounters a function that yields the thread.
-### Common problems
+### Common Problems
- **Intensive operations on table structures** - Complex operations such as
serialization, deserialization, and deep cloning incur a high performance
@@ -37,14 +37,14 @@ Expensive operations in Lua code take longer to process and can thus impact fram
- Identify and optimize unnecessarily expensive operations and use
[multithreading](../scripting/multithreading.md) for computationally
expensive tasks that don't need to access the data model.
-- Certain server-side scripts can benefit from [native code generation](../luau/native-code-gen.md), a simple flag that compiles a script to machine code rather than bytecode.
+- Certain server-side scripts can benefit from [Native Code Generation](../luau/native-code-gen.md), a simple flag that compiles a script to machine code rather than bytecode.
-### MicroProfiler scopes
+### MicroProfiler Scopes
Scope
-
Associated computation
+
Associated Computation
RunService.PreRender
@@ -70,7 +70,7 @@ further increasing specificity, such as `Library.debug.profilebegin` and
`Library.debug.profileend`. Many Roblox API methods called by scripts also have
their own associated MicroProfiler tags that can provide useful signal.
-## Script memory usage
+## Script Memory Usage
Memory leaks can occur when you write scripts that consume memory that the
garbage collector can't properly release when its no longer in use. Leaks are
@@ -83,7 +83,7 @@ The following memory values in the **Developer Console** can indicate a problem
- **InstanceCount** - Consistently growing numbers of instances suggest references to some instances in your code are not being garbage collected.
- **PlaceScriptMemory** - Provides a script by script breakdown of memory usage.
-### Common problems
+### Common Problems
- **Leaving connections connected** - The engine never garbage collects events connected to an instance and any values referenced inside the connected callback. Therefore, active connections of events and code inside the connected instances, connected functions, and referenced values, are out of scope for the memory garbage collector, even after the events are fired.
@@ -135,12 +135,12 @@ To clean up all used values for preventing memory leaks:
end)
```
-## Physics computation
+## Physics Computation
Excessive physics simulation can be a key cause of increased computation time
per frame on both the server and the client.
-### Common problems
+### Common Problems
- **Excessive physics time step frequency** - By default, stepping behavior is
in [adaptive mode](../physics/adaptive-timestepping.md), where physics
@@ -192,12 +192,12 @@ per frame on both the server and the client.
- For an in-depth walkthrough on how to choose a collision fidelity option that balances your precision and performance requirements, see [Set Physics and Rendering Parameters](../tutorials/environmental-art/assemble-an-asset-library.md#collisionfidelity).
-### MicroProfiler scopes
+### MicroProfiler Scopes
Scope
-
Associated computation
+
Associated Computation
physicsStepped
@@ -209,17 +209,17 @@ per frame on both the server and the client.
-## Physics memory usage
+## Physics Memory Usage
Physics movement and collision detection consumes memory. Mesh parts have a `Class.MeshPart.CollisionFidelity|CollisionFidelity` property that determines the approach that's used to evaluate the collision bounds of the mesh.
-### Common problem
+### Common Problem
The default and precise collision detection modes consumes significantly more memory than the two other modes with lower fidelity collision shapes.
If you see high levels of memory consumption under **PhysicsParts**, you might need to explore reducing the [collision fidelity](../workspace/collisions.md#mesh-and-solid-model-collisions) of objects in your experience.
-### How to mitigate
+### How to Mitigate
To reduce memory used for collision fidelity:
@@ -234,7 +234,7 @@ To reduce memory used for collision fidelity:
player and non player characters (NPCs). Although powerful, a `Class.Humanoid`
comes with a significant computation cost.
-### Common problems
+### Common Problems
- **Leaving all HumanoidStateTypes enabled on NPCs** - There is a performance
cost to leaving certain `Enum.HumanoidStateType|HumanoidStateTypes`
@@ -280,12 +280,12 @@ comes with a significant computation cost.
- If you need to attach any `BasePart` objects to the avatar, do so outside of
the hierarchy of the avatar `Model`.
-### MicroProfiler scopes
+### MicroProfiler Scopes
Scope
-
Associated computation
+
Associated Computation
stepHumanoid
@@ -307,7 +307,7 @@ A significant portion of the time the client spends each frame is on rendering
the scene in the current frame. The server doesn't do any rendering, so this
section is exclusive to the client.
-### Draw calls
+### Draw Calls
A draw call is a set of instructions from the engine to the GPU to render
something. Draw calls have significant overhead. Generally, the fewer draw
@@ -316,7 +316,7 @@ calls per frame, the less computational time is spent rendering a frame.
You can see how many draw calls are currently occurring with the **Render Stats** > **Timing** item in Studio. You can view **Render Stats** in the client by pressing ShiftF2.
The more objects that need to be drawn in your scene in a given frame, the more
-draw calls are made to the GPU. However, the Roblox Engine utilizes a process
+draw calls are made to the GPU. However, the Roblox engine utilizes a process
called _instancing_ to collapse identical meshes with the same texture
characteristics into a single draw call. Specifically, multiple meshes with the
same `MeshId` are handled in a single draw call when:
@@ -327,7 +327,7 @@ same `MeshId` are handled in a single draw call when:
- Materials are identical when both `Class.SurfaceAppearance` and
`Class.MeshPart.TextureID` don't exist.
-### Other common problems
+### Other Common Problems
- **Excessive object density** - If a large number of objects are concentrated
with a high density, then rendering this area of the scene requires more
@@ -407,12 +407,12 @@ same `MeshId` are handled in a single draw call when:
- Limit the range and angle of light instances.
- Use fewer light instances.
-### MicroProfiler scopes
+### MicroProfiler Scopes
Scope
-
Associated computation
+
Associated Computation
Prepare and Perform
@@ -440,13 +440,13 @@ same `MeshId` are handled in a single draw call when:
-## Networking and replication
+## Networking and Replication
Networking and replication describes the process by which data is sent between the
server and connected clients. Information is sent between the client and server
every frame, but larger amounts of information require more compute time.
-### Common problems
+### Common Problems
- **Excessive remote traffic** - Sending a large amount of data through
`Class.RemoteEvent` or `Class.RemoteFunction` objects or invoking them very frequently
@@ -493,12 +493,12 @@ You can employ the following tactics to reduce unnecessary replication:
- First-person item view models.
- Tween objects on the client rather than the server.
-### MicroProfiler scopes
+### MicroProfiler Scopes
Scope
-
Associated computation
+
Associated Computation
ProcessPackets
@@ -510,11 +510,11 @@ You can employ the following tactics to reduce unnecessary replication:
-## Asset memory usage
+## Asset Memory Usage
The highest impact mechanism available to creators to improve client memory usage is to enable [Instance Streaming](../workspace/streaming.md).
-### Instance streaming
+### Instance Streaming
Instance streaming selectively loads out parts of the data model that are not required, which can lead to considerably reduced load time and increase the client's ability to prevent crashes when it comes under memory pressure.
@@ -527,7 +527,7 @@ If instance streaming is enabled, you can increase the aggressiveness of it. For
For more information on streaming options and their benefits, see [Streaming Properties](../workspace/streaming.md#streaming-properties).
-### Other common problems
+### Other Common Problems
- **Asset duplication** - A common mistake is to upload the same asset multiple times resulting in different asset IDs. This can lead to the same content being loaded into memory multiple times.
- **Excessive asset volume** - Even when assets are not identical, there are cases when opportunities to reuse the same asset and save memory are missed.
@@ -548,7 +548,7 @@ For more information on streaming options and their benefits, see [Streaming Pro
- **Limit the pixels of images** to no more than the necessary amount. Unless an image is occupying a large amount of physical space on the screen, it usually needs at most 512x512 pixels. Most minor images should be smaller than 256x256 pixels.
- **Use Trim Sheets** to ensure maximum texture reuse in 3D maps. For steps and examples on how to create trim sheets, see [Creating Trim Sheets](../resources/beyond-the-dark/building-architecture.md#creating-trim-sheets).
-## Load times
+## Load Times
Many experiences implement custom loading screens and use the `Class.ContentProvider:PreloadAsync()` method to request assets so that images, sounds, and meshes are downloaded in the background.
diff --git a/content/en-us/performance-optimization/index.md b/content/en-us/performance-optimization/index.md
index 628bd4f47..169394b40 100644
--- a/content/en-us/performance-optimization/index.md
+++ b/content/en-us/performance-optimization/index.md
@@ -1,11 +1,11 @@
---
-title: Performance optimization
+title: Performance Optimization
description: Introduces the performance optimization process.
---
Performance optimization is the process of building and iterating on an experience to improve frame rate, memory usage, and load times. Players expect games to perform well, so taking the time to understand and improve your experience's performance can be critical to its success.
-The first step in performance optimization is to [Design for Performance](design.md), which means following a set of best practices **as you build** a new experience. After you publish an experience, the optimization process follows a common cycle:
+The first step in performance optimization is to [Design for Performance](designing.md), which means following a set of best practices **as you build** a new experience. After you publish an experience, the optimization process follows a common cycle:
@@ -18,7 +18,7 @@ The first step in performance optimization is to [Design for Performance](design
-## Why performance matters
+## Why Performance Matters
To put it simply, performant games are more fun. When a game has a consistent, smooth frame rate, even basic actions like running and jumping feel more precise and enjoyable. Aiming can go from feeling impossible to feeling completely natural. A game with a small memory footprint and fast load times might always have plenty of other people to play with.
@@ -26,7 +26,7 @@ Performance optimization also lets you expand your ambitions. If your experience
From a business perspective, performant games often have higher user engagement, better user retention, and make more money.
-## Measure performance
+## Measuring Performance
- **Frame rate** is the number of unique frames that the client presents to the user, measured in frames per second (FPS). The cause of low frame rates is typically expensive computational operations—in other words, overtaxing the CPU, GPU, or both.
diff --git a/content/en-us/performance-optimization/monitor.md b/content/en-us/performance-optimization/monitoring.md
similarity index 98%
rename from content/en-us/performance-optimization/monitor.md
rename to content/en-us/performance-optimization/monitoring.md
index c02fb6a96..e0ad8ba3e 100644
--- a/content/en-us/performance-optimization/monitor.md
+++ b/content/en-us/performance-optimization/monitoring.md
@@ -1,5 +1,5 @@
---
-title: Monitor performance
+title: Monitoring Performance
description: Explains how to use the Performance Dashboard to monitor your experiences.
---
diff --git a/content/en-us/physics/adaptive-timestepping.md b/content/en-us/physics/adaptive-timestepping.md
index 0762d303b..55323bc23 100644
--- a/content/en-us/physics/adaptive-timestepping.md
+++ b/content/en-us/physics/adaptive-timestepping.md
@@ -1,5 +1,5 @@
---
-title: Adaptive timestepping
+title: Adaptive Timestepping
description: Adaptive timestepping automatically assigns physical parts to varying simulation timesteps.
---
@@ -11,7 +11,7 @@ By default, Roblox simulates physics at 240 Hz. Given cycles of approximate
Assignment criterions are subject to change, but parts assigned to the 240 Hz island include [assemblies](../physics/assemblies.md) with high velocity values, high acceleration values, and complex mechanisms that are hard to solve.
-## Enable adaptive mode
+## Enabling Adaptive Mode
To enable adaptive timestepping in Studio:
@@ -33,7 +33,7 @@ Hovering your cursor above **LDLPGSSolver::solve** will reveal the status of how
-## Debug visualization
+## Debugging Visualization
During testing, it may be useful to visualize frequencies for simulated parts. To enable this option:
@@ -51,10 +51,10 @@ Once enabled, simulated parts will be outlined by their current simulation rate.
Simulated parts outlined by the color representing their current simulation rate
-## Fixed-rate scenarios
+## Fixed-Rate Scenarios
Adaptive timestepping can improve physics performance by up to 2.5 times and it is recommended in most cases. However, some experiences should use **Fixed** mode (240 Hz), including:
Experiences that require highly accurate simulations and stability, such as racing games, "destruction" simulations, or games featuring complex mechanisms like tanks.
-Simulations where most parts default to the 240 Hz solver island (red outlines during [debugging](#debug-visualization)). When 240 Hz islands interact with islands of different frequencies (60–120 Hz), those islands are converted to 240 Hz with an overhead that may negate any performance gains resulting from adaptive timestepping.
+Simulations where most parts default to the 240 Hz solver island (red outlines during [debugging](#debugging-visualization)). When 240 Hz islands interact with islands of different frequencies (60–120 Hz), those islands are converted to 240 Hz with an overhead that may negate any performance gains resulting from adaptive timestepping.
diff --git a/content/en-us/physics/assemblies.md b/content/en-us/physics/assemblies.md
index 75a625bad..4f225767a 100644
--- a/content/en-us/physics/assemblies.md
+++ b/content/en-us/physics/assemblies.md
@@ -31,7 +31,7 @@ The joints that combine multiple parts into assemblies are only active in the `C
To view colored outlines around parts in order to visualize single rigid body assemblies, toggle on **Assemblies** from the [Visualization Options](../studio/ui-overview.md#visualization-options) widget in the upper‑right corner of the 3D viewport.
-## Assembly properties
+## Assembly Properties
The following `Class.BasePart` properties show data regarding its assembly. Their values will be the same for any part in the same assembly, so it doesn't matter which part you use.
@@ -66,7 +66,7 @@ The following `Class.BasePart` properties show data regarding its assembly. Thei
-## Assembly root part
+## Assembly Root Part
Every assembly has a **root part** indicated by its `Class.BasePart.AssemblyRootPart|AssemblyRootPart` property. This is the part that doesn't move when `Class.Motor6D` transforms are updated, as well as the part used to keep consistent physics replication and network ownership.
@@ -97,7 +97,7 @@ You cannot explicitly set the root part, but the following factors affect probab
-## Anchoring behavior
+## Anchoring Behavior
When one of an assembly's parts is anchored, that part becomes the root part and all of the other parts become implicitly anchored with it. The following sequence illustrates this behavior.
diff --git a/content/en-us/physics/character-controllers.md b/content/en-us/physics/character-controllers.md
index 78599aaa1..95b2e43fc 100644
--- a/content/en-us/physics/character-controllers.md
+++ b/content/en-us/physics/character-controllers.md
@@ -1,21 +1,21 @@
---
-title: Character controllers
+title: Character Controllers
description: Controller instances can be used as a component in a custom character implementation.
---
The `Class.ControllerManager` instance manages simulated motion control for its assigned `Class.ControllerManager.RootPart|RootPart`. Along with `Class.ControllerPartSensor|ControllerPartSensors`, it can be used to build a physics‑based character controller.
-## Core setup
+## Core Setup
`Class.ControllerManager` requires a `Class.BasePart` to use as its root. Movement forces and part sensing will be on this part.
1. Choose a `Class.Part` or `Class.MeshPart` and name it **RootPart**.
2. Group the part as a `Class.Model` instance for organization along with the other components.
-3. Add a `Class.ControllerManager` instance to the model. If **ControllerManager** doesn't initially appear in the object insertion menu, **uncheck** "Show only recommended objects" in the menu's [insertion settings](../studio/explorer.md#insert-and-parent).
+3. Add a `Class.ControllerManager` instance to the model. If **ControllerManager** doesn't initially appear in the object insertion menu, **uncheck** "Show only recommended objects" in the menu's [insertion settings](../studio/explorer.md#inserting-and-parenting).
-### Sensor setup
+### Sensor Setup
A `Class.ControllerPartSensor` detects parts with the same code the `Class.Humanoid` uses for detecting floors and ladders.
@@ -29,9 +29,9 @@ A `Class.ControllerPartSensor` detects parts with the same code the `Class.Human
-### Controller setup
+### Controller Setup
-Controller instances like `Class.GroundController` and `Class.ClimbController` tell the managed part how to interact with the world, working alongside the sensors you configured during the [sensor setup](#sensor-setup).
+Controller instances like `Class.GroundController` and `Class.ClimbController` tell the managed part how to interact with the world, working alongside the sensors you configured in [Sensor Setup](#sensor-setup).
1. Insert both a `Class.GroundController` and `Class.ClimbController` as children of the `Class.ControllerManager`.
@@ -41,7 +41,7 @@ Controller instances like `Class.GroundController` and `Class.ClimbController` t
-### Link references
+### Linking References
To complete the core setup, you'll need to link various properties of the `Class.ControllerManager` instance to objects within the main `Class.Model`.
@@ -58,9 +58,9 @@ To complete the core setup, you'll need to link various properties of the `Class
-### Test
+### Testing
-With [sensors](#sensor-setup) and [controllers](#controller-setup) in place, and with [references linked](#link-references), you can test the controller in Studio.
+With [sensors](#sensor-setup) and [controllers](#controller-setup) in place, and with [references linked](#linking-references), you can test the controller in Studio.
1. Start a playtest using the **Run** mode (F8) since you don't need to insert your avatar character in this scenario.
@@ -91,7 +91,7 @@ With [sensors](#sensor-setup) and [controllers](#controller-setup) in place, and
Remember that `Class.GroundController.GroundOffset|GroundOffset` must be **less** than the value of `Class.ControllerPartSensor.SearchDistance|SearchDistance` for the [GroundSensor](#sensor-setup), since that sensor will deactivate if it loses sense of the ground and effectively stop its forces on the part. This will cause a bouncing effect as gravity and the `Class.GroundController` repeatedly swap control of the part.
-## Custom sensors
+## Custom Sensors
The `Class.ControllerPartSensor.SensorMode` options of `Enum.SensorMode|Floor` and `Enum.SensorMode|Ladder` run the exact `Class.Humanoid` sensor code, letting you use them for backwards compatibility. However, you can also customize how and when walkable and climbable parts are detected, ultimately changing when the managed part walks/climbs.
diff --git a/content/en-us/physics/constraints/align-orientation.md b/content/en-us/physics/constraints/align-orientation.md
index 42c678c23..df80c53c4 100644
--- a/content/en-us/physics/constraints/align-orientation.md
+++ b/content/en-us/physics/constraints/align-orientation.md
@@ -1,10 +1,10 @@
---
-title: AlignOrientation
+title: Align Orientation
description: The AlignOrientation constraint applies torque to align two attachments, or to align one attachment with a goal orientation.
---
-For an overview on creating, visualizing, and simulating mover constraints, including `Class.AlignOrientation`, see [Mover constraints](../../physics/mover-constraints.md). Also see [Roblox units](../../physics/units.md) to understand how Roblox units compare to metric units.
+For an overview on creating, visualizing, and simulating mover constraints, including `Class.AlignOrientation`, see [Mover Constraints](../../physics/mover-constraints.md). Also see [Roblox Units](../../physics/units.md) to understand how Roblox units compare to metric units.
The `Class.AlignOrientation` constraint applies torque to align two attachments, or to align one attachment with a goal orientation. As indicated by the name, it only affects the **orientation** of the attachments, not their position (to align attachments **positionally**, see [AlignPosition](../../physics/constraints/align-position.md)).
@@ -15,7 +15,7 @@ The `Class.AlignOrientation` constraint applies torque to align two attachments,
By default, the constraint only applies torque to `Class.Constraint.Attachment0|Attachment0`, although this behavior can be controlled through `Class.AlignOrientation.ReactionTorqueEnabled|ReactionTorqueEnabled`.
-## Affected axes
+## Affected Axes
The axes affected by torque are controlled through the constraint's `Class.AlignOrientation.AlignType|AlignType` property. When set to `Enum.AlignType|PrimaryAxisParallel`, `Enum.AlignType|PrimaryAxisPerpendicular` or `Enum.AlignType|PrimaryAxisLookAt`, torque will only occur when the primary axes become misaligned. Otherwise, the constraint will apply torque about all 3 axes to achieve alignment.
@@ -30,7 +30,7 @@ The axes affected by torque are controlled through the constraint's `Class.Align
-## Reactionary torque
+## Reactionary Torque
By default, the constraint only applies torque to `Class.Constraint.Attachment0|Attachment0` while `Class.Constraint.Attachment1|Attachment1` remains unaffected. If desired, torque can be applied to both attachments in **equal and opposite directions** by enabling `Class.AlignOrientation.ReactionTorqueEnabled|ReactionTorqueEnabled`.
@@ -45,11 +45,11 @@ By default, the constraint only applies torque to `Class.Constraint.Attachment0|
-## Torque magnitude
+## Torque Magnitude
You can configure the `Class.AlignOrientation` constraint to apply the maximum torque that constraints allow through the `Class.AlignOrientation.RigidityEnabled|RigidityEnabled` property. When true, the physics solver reacts as quickly as possible to complete the alignment. When false, the torque is determined by `Class.AlignOrientation.MaxTorque|MaxTorque`, `Class.AlignOrientation.MaxAngularVelocity|MaxAngularVelocity`, and `Class.AlignOrientation.Responsiveness|Responsiveness`.
-## Attachment mode
+## Attachment Mode
The `Class.AlignOrientation.Mode|Mode` property specifies whether the constraint uses **one** or **two** attachments in calculating its goal. By default, this is **TwoAttachment**, meaning that the constraint attempts to match the orientation of `Class.Constraint.Attachment0|Attachment0` with the orientation of `Class.Constraint.Attachment1|Attachment1`, disregarding `Class.AlignOrientation.CFrame|CFrame`, `Class.AlignOrientation.PrimaryAxis|PrimaryAxis`, and `Class.AlignOrientation.SecondaryAxis|SecondaryAxis`.
diff --git a/content/en-us/physics/constraints/align-position.md b/content/en-us/physics/constraints/align-position.md
index 6f48a1b38..e5d5dd2a4 100644
--- a/content/en-us/physics/constraints/align-position.md
+++ b/content/en-us/physics/constraints/align-position.md
@@ -1,10 +1,10 @@
---
-title: AlignPosition
+title: Align Position
description: The AlignPosition constraint applies force to move two attachments together, or to move one attachment to a goal position.
---
-For an overview on creating, visualizing, and simulating mover constraints, including `Class.AlignPosition`, see [Mover constraints](../../physics/mover-constraints.md). Also see [Roblox units](../../physics/units.md) to understand how Roblox units compare to metric units.
+For an overview on creating, visualizing, and simulating mover constraints, including `Class.AlignPosition`, see [Mover Constraints](../../physics/mover-constraints.md). Also see [Roblox Units](../../physics/units.md) to understand how Roblox units compare to metric units.
An `Class.AlignPosition` constraint applies force to move two attachments together, or to move one attachment to a goal position. As indicated by the name, it only affects the **position** of the attachments, not their orientation (to align attachments by **orientation**, see [AlignOrientation](../../physics/constraints/align-orientation.md)).
@@ -15,7 +15,7 @@ An `Class.AlignPosition` constraint applies force to move two attachments togeth
By default, the constraint only applies force to `Class.Constraint.Attachment0|Attachment0`, although this behavior can be controlled through `Class.AlignPosition.ReactionForceEnabled|ReactionForceEnabled`.
-## Force location
+## Force Location
By default, force is applied to the parent of `Class.Constraint.Attachment0|Attachment0` at that attachment's location, meaning that if the parent's center of mass is not aligned with the direction of the force, torque will be applied as well as force. Alternatively, force can be applied to the parents' center of mass by toggling on `Class.AlignPosition.ApplyAtCenterOfMass|ApplyAtCenterOfMass`.
@@ -30,7 +30,7 @@ By default, force is applied to the parent of `Class.Constraint.Attachment0|Atta
-## Reactionary force
+## Reactionary Force
By default, the constraint only applies force to `Class.Constraint.Attachment0|Attachment0` while `Class.Constraint.Attachment1|Attachment1` remains unaffected. If desired, force can be applied to both attachments in **equal and opposite directions** by enabling `Class.AlignPosition.ReactionForceEnabled|ReactionForceEnabled`.
@@ -45,10 +45,10 @@ By default, the constraint only applies force to `Class.Constraint.Attachment0|A
-## Force magnitude
+## Force Magnitude
You can configure the `Class.AlignPosition` constraint to apply the maximum force that constraints allow through the `Class.AlignPosition.RigidityEnabled|RigidityEnabled` property. When true, the physics solver reacts as quickly as possible to complete the alignment. When false, the force is determined by `Class.AlignPosition.MaxForce|MaxForce`, `Class.AlignPosition.MaxVelocity|MaxVelocity`, and `Class.AlignPosition.Responsiveness|Responsiveness`.
-## Attachment mode
+## Attachment Mode
The `Class.AlignPosition.Mode|Mode` property specifies whether the constraint uses **one** or **two** attachments in calculating its goal. By default, this is `Enum.PositionAlignmentMode|TwoAttachment`, meaning that the constraint disregards `Class.AlignPosition.Position|Position` and attempts to move `Class.Constraint.Attachment0|Attachment0` to the position of `Class.Constraint.Attachment1|Attachment1`. If set to `Enum.PositionAlignmentMode|OneAttachment`, the constraint disregards `Class.Constraint.Attachment1|Attachment1` and attempts to move `Class.Constraint.Attachment0|Attachment0` to `Class.AlignPosition.Position|Position`.
diff --git a/content/en-us/physics/constraints/angular-velocity.md b/content/en-us/physics/constraints/angular-velocity.md
index b577482e7..17ff82783 100644
--- a/content/en-us/physics/constraints/angular-velocity.md
+++ b/content/en-us/physics/constraints/angular-velocity.md
@@ -1,10 +1,10 @@
---
-title: AngularVelocity
+title: Angular Velocity
description: The AngularVelocity constraint applies torque on an assembly to maintain a constant angular velocity.
---
-For an overview on creating, visualizing, and simulating mover constraints, including `Class.AngularVelocity`, see [Mover constraints](../../physics/mover-constraints.md). Also see [Roblox units](../../physics/units.md) to understand how Roblox units compare to metric units.
+For an overview on creating, visualizing, and simulating mover constraints, including `Class.AngularVelocity`, see [Mover Constraints](../../physics/mover-constraints.md). Also see [Roblox Units](../../physics/units.md) to understand how Roblox units compare to metric units.
An `Class.AngularVelocity` constraint applies torque on an assembly to maintain a constant angular velocity.
diff --git a/content/en-us/physics/constraints/ball-socket.md b/content/en-us/physics/constraints/ball-socket.md
index e3469699e..85d3fd831 100644
--- a/content/en-us/physics/constraints/ball-socket.md
+++ b/content/en-us/physics/constraints/ball-socket.md
@@ -1,10 +1,10 @@
---
-title: BallSocket
+title: Ball Socket
description: BallSocketConstraint forces its two attachments into the same position and allows them to freely rotate about all three axes, with optional limits to restrict both tilt and twist.
---
-For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.BallSocketConstraint`, see [Mechanical constraints](../../physics/mechanical-constraints.md). Also see [Roblox units](../../physics/units.md) to understand how Roblox units compare to metric units.
+For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.BallSocketConstraint`, see [Mechanical Constraints](../../physics/mechanical-constraints.md). Also see [Roblox Units](../../physics/units.md) to understand how Roblox units compare to metric units.
A `Class.BallSocketConstraint` forces its two attachments into the same position and allows them to freely rotate about all three axes. However, you can enable limits to restrict both tilt and twist.
diff --git a/content/en-us/physics/constraints/cylindrical.md b/content/en-us/physics/constraints/cylindrical.md
index 1bf894b0b..a769fa0df 100644
--- a/content/en-us/physics/constraints/cylindrical.md
+++ b/content/en-us/physics/constraints/cylindrical.md
@@ -4,7 +4,7 @@ description: CylindricalConstraint allows its attachments to slide along one axi
---
-For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.CylindricalConstraint`, see [Mechanical constraints](../../physics/mechanical-constraints.md). Also see [Roblox units](../../physics/units.md) to understand how Roblox units compare to metric units.
+For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.CylindricalConstraint`, see [Mechanical Constraints](../../physics/mechanical-constraints.md). Also see [Roblox Units](../../physics/units.md) to understand how Roblox units compare to metric units.
A `Class.CylindricalConstraint` allows its attachments to slide along one axis and rotate about another axis. This constraint, along with a
@@ -16,13 +16,13 @@ A `Class.CylindricalConstraint` allows its attachments to slide along one axis a
Orientation of the attachments affects how the cylindrical aspect will rotate. To ensure rotation occurs around the desired axis, each attachment's `Class.Attachment.Axis|Axis` and `Class.Attachment.SecondaryAxis|SecondaryAxis`, visualized by the yellow and orange arrows, should point in the same direction.
-## Angular power
+## Angular Power
If a cylindrical's `Class.CylindricalConstraint.AngularActuatorType|AngularActuatorType` is set to `Enum.ActuatorType|Motor`, it attempts to rotate the attachments with the goal of reaching its `Class.CylindricalConstraint.AngularVelocity|AngularVelocity`. You can further control this rotation through both `Class.CylindricalConstraint.MotorMaxAngularAcceleration|MotorMaxAngularAcceleration` and `Class.CylindricalConstraint.MotorMaxTorque|MotorMaxTorque`.
If a cylindrical's `Class.CylindricalConstraint.AngularActuatorType|AngularActuatorType` is set to `Enum.ActuatorType|Servo`, it attempts to rotate to an angle specified by `Class.CylindricalConstraint.TargetAngle|TargetAngle`. This rotation is controlled by `Class.CylindricalConstraint.AngularSpeed|AngularSpeed`, `Class.CylindricalConstraint.AngularResponsiveness|AngularResponsiveness`, and `Class.CylindricalConstraint.ServoMaxTorque|ServoMaxTorque`.
-## Linear power
+## Linear Power
If a cylindrical's `Class.CylindricalConstraint|ActuatorType` is set to `Enum.ActuatorType|Motor`, it attempts to translate the attachments with the goal of reaching `Class.CylindricalConstraint|Velocity`. You can further control this translation through both `Class.CylindricalConstraint|MotorMaxAcceleration` and `Class.CylindricalConstraint|MotorMaxForce`.
@@ -47,7 +47,7 @@ Enabling the `Class.CylindricalConstraint.AngularLimitsEnabled|AngularLimitsEnab
-## Inclination angle
+## Inclination Angle
`Class.CylindricalConstraint.InclinationAngle|InclinationAngle` defines the direction of the rotation axis as an angle from the **X** axis in the **X**/**Y** plane of `Class.Constraint.Attachment0|Attachment0`, from -180 to 180. This lets you tilt the rotating element without changing the sliding axis.
diff --git a/content/en-us/physics/constraints/hinge.md b/content/en-us/physics/constraints/hinge.md
index d554dea5f..dd1738758 100644
--- a/content/en-us/physics/constraints/hinge.md
+++ b/content/en-us/physics/constraints/hinge.md
@@ -4,7 +4,7 @@ description: HingeConstraint allows its two attachments to rotate about one axis
---
-For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.HingeConstraint`, see [Mechanical constraints](../../physics/mechanical-constraints.md). Also see [Roblox units](../../physics/units.md) to understand how Roblox units compare to metric units.
+For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.HingeConstraint`, see [Mechanical Constraints](../../physics/mechanical-constraints.md). Also see [Roblox Units](../../physics/units.md) to understand how Roblox units compare to metric units.
A `Class.HingeConstraint`
@@ -18,7 +18,7 @@ powered to behave like a [motor](#angular-power) or [servo](#angular-power), and
Orientation of a hinge's attachments affects how it rotates. To ensure rotation occurs around the desired axis, each attachment's `Class.Attachment.Axis|Axis`, visualized by the yellow arrow, should point in the same direction.
-### Angular power
+### Angular Power
If a hinge's `Class.HingeConstraint.ActuatorType|ActuatorType` is set to `Enum.ActuatorType|Motor`, it attempts to rotate the attachments with the goal of reaching its `Class.HingeConstraint.AngularVelocity|AngularVelocity`. You can further control this rotation through both `Class.HingeConstraint.MotorMaxAcceleration|MotorMaxAcceleration` and `Class.HingeConstraint.MotorMaxTorque|MotorMaxTorque`.
diff --git a/content/en-us/physics/constraints/line-force.md b/content/en-us/physics/constraints/line-force.md
index 6aade6077..41a5b495e 100644
--- a/content/en-us/physics/constraints/line-force.md
+++ b/content/en-us/physics/constraints/line-force.md
@@ -1,17 +1,17 @@
---
-title: LineForce
+title: Line Force
description: The LineForce constraint applies force along the theoretical line connecting its two attachments.
---
-For an overview on creating, visualizing, and simulating mover constraints, including `Class.LineForce`, see [Mover constraints](../../physics/mover-constraints.md). Also see [Roblox units](../../physics/units.md) to understand how Roblox units compare to metric units.
+For an overview on creating, visualizing, and simulating mover constraints, including `Class.LineForce`, see [Mover Constraints](../../physics/mover-constraints.md). Also see [Roblox Units](../../physics/units.md) to understand how Roblox units compare to metric units.
The `Class.LineForce` constraint applies force along the theoretical line connecting its two `Class.Attachment|Attachments`. As the end points (attachments) move, the direction of force will change accordingly.
-## Force location
+## Force Location
By default, force is applied to either parent at its attachment location. If desired, force can be focused at each parent's center of mass by toggling on `Class.LineForce.ApplyAtCenterOfMass|ApplyAtCenterOfMass`.
@@ -26,7 +26,7 @@ By default, force is applied to either parent at its attachment location. If des
-## Inverse square law
+## Inverse Square Law
When `Class.LineForce.InverseSquareLaw|InverseSquareLaw` is true, the force magnitude is multiplied by the inverse square of the distance, meaning the force will increase exponentially as the two attachments get closer together, like magnets. When using this setting, it's recommended that you set a `Class.LineForce.MaxForce|MaxForce` threshold to prevent infinite force if the attachments align precisely.
@@ -41,7 +41,7 @@ When `Class.LineForce.InverseSquareLaw|InverseSquareLaw` is true, the force magn
-## Reactionary force
+## Reactionary Force
By default, the constraint only applies force to `Class.Constraint.Attachment0|Attachment0`, while `Class.Constraint.Attachment1|Attachment1` remains unaffected. However, force can be applied to both attachments in **equal and opposite directions** by enabling `Class.LineForce.ReactionForceEnabled|ReactionForceEnabled`.
diff --git a/content/en-us/physics/constraints/linear-velocity.md b/content/en-us/physics/constraints/linear-velocity.md
index 7d461f24b..69436ee7e 100644
--- a/content/en-us/physics/constraints/linear-velocity.md
+++ b/content/en-us/physics/constraints/linear-velocity.md
@@ -1,10 +1,10 @@
---
-title: LinearVelocity
+title: Linear Velocity
description: The LinearVelocity constraint applies force on an assembly to maintain a constant velocity along a 3D vector, line, or 2D plane.
---
-For an overview on creating, visualizing, and simulating mover constraints, including `Class.LinearVelocity`, see [Mover constraints](../../physics/mover-constraints.md). Also see [Roblox units](../../physics/units.md) to understand how Roblox units compare to metric units.
+For an overview on creating, visualizing, and simulating mover constraints, including `Class.LinearVelocity`, see [Mover Constraints](../../physics/mover-constraints.md). Also see [Roblox Units](../../physics/units.md) to understand how Roblox units compare to metric units.
A `Class.LinearVelocity` constraint applies force on an assembly to maintain a constant velocity. It can be set to apply force along a `Datatype.Vector3`, line, or 2D plane.
diff --git a/content/en-us/physics/constraints/no-collision.md b/content/en-us/physics/constraints/no-collision.md
index 57da9ea09..fd7be6db3 100644
--- a/content/en-us/physics/constraints/no-collision.md
+++ b/content/en-us/physics/constraints/no-collision.md
@@ -1,5 +1,5 @@
---
-title: NoCollision
+title: No Collision
description: NoCollisionConstraint prevents collisions between two specific parts, but those parts may still register collisions with the rest of the world.
---
diff --git a/content/en-us/physics/constraints/plane.md b/content/en-us/physics/constraints/plane.md
index 4da33d7d7..7508640ba 100644
--- a/content/en-us/physics/constraints/plane.md
+++ b/content/en-us/physics/constraints/plane.md
@@ -4,7 +4,7 @@ description: PlaneConstraint moves two attachments into a position/orientation a
---
-For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.PlaneConstraint`, see [Mechanical constraints](../../physics/mechanical-constraints.md). Also see [Roblox units](../../physics/units.md) to understand how Roblox units compare to metric units.
+For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.PlaneConstraint`, see [Mechanical Constraints](../../physics/mechanical-constraints.md). Also see [Roblox Units](../../physics/units.md) to understand how Roblox units compare to metric units.
A `Class.PlaneConstraint` moves its `Class.Constraint.Attachment0|Attachment0` and `Class.Constraint.Attachment1|Attachment1` into a position/orientation along a plane whose normal vector is the primary axis of `Class.Constraint.Attachment0|Attachment0`. Both parent assemblies remain free to translate and rotate unless otherwise constrained.
diff --git a/content/en-us/physics/constraints/prismatic.md b/content/en-us/physics/constraints/prismatic.md
index 68b7a7cc9..a6c0df173 100644
--- a/content/en-us/physics/constraints/prismatic.md
+++ b/content/en-us/physics/constraints/prismatic.md
@@ -4,7 +4,7 @@ description: PrismaticConstraint allows two attachments to slide along one axis
---
-For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.PrismaticConstraint`, see [Mechanical constraints](../../physics/mechanical-constraints.md). Also see [Roblox units](../../physics/units.md) to understand how Roblox units compare to metric units.
+For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.PrismaticConstraint`, see [Mechanical Constraints](../../physics/mechanical-constraints.md). Also see [Roblox Units](../../physics/units.md) to understand how Roblox units compare to metric units.
A `Class.PrismaticConstraint` creates a rigid joint between two attachments, allowing them to slide along one axis but not rotate. The constraint can also be [powered](#linear-power) for mechanisms like sliding doors and elevator platforms.
@@ -15,7 +15,7 @@ A `Class.PrismaticConstraint` creates a rigid joint between two attachments, all
Orientation of a prismatic's attachments affects how it will move. To ensure movement occurs along the desired axis, each attachment's `Class.Attachment.Axis|Axis`, visualized by the yellow arrow, should point in the same direction.
-## Linear power
+## Linear Power
If a prismatic's `Class.PrismaticConstraint|ActuatorType` is set to `Enum.ActuatorType|Motor`, it attempts to translate the attachments with the goal of reaching `Class.PrismaticConstraint|Velocity`. You can further control this translation through both `Class.PrismaticConstraint|MotorMaxAcceleration` and `Class.PrismaticConstraint|MotorMaxForce`.
diff --git a/content/en-us/physics/constraints/rod.md b/content/en-us/physics/constraints/rod.md
index a8ee7e559..062d44092 100644
--- a/content/en-us/physics/constraints/rod.md
+++ b/content/en-us/physics/constraints/rod.md
@@ -4,7 +4,7 @@ description: RodConstraint keeps two attachments separated by a defined length,
---
-For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.RodConstraint`, see [Mechanical constraints](../../physics/mechanical-constraints.md). Also see [Roblox units](../../physics/units.md) to understand how Roblox units compare to metric units.
+For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.RodConstraint`, see [Mechanical Constraints](../../physics/mechanical-constraints.md). Also see [Roblox Units](../../physics/units.md) to understand how Roblox units compare to metric units.
A `Class.RodConstraint` keeps two attachments separated by its defined `Class.RodConstraint.Length|Length`. By default, both attachments can rotate freely, although you can enable limits to restrict rotational tilt.
diff --git a/content/en-us/physics/constraints/rope.md b/content/en-us/physics/constraints/rope.md
index 92166373b..c83a4a785 100644
--- a/content/en-us/physics/constraints/rope.md
+++ b/content/en-us/physics/constraints/rope.md
@@ -4,7 +4,7 @@ description: RopeConstraint prevents two attachments from separating further tha
---
-For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.RopeConstraint`, see [Mechanical constraints](../../physics/mechanical-constraints.md). Also see [Roblox units](../../physics/units.md) to understand how Roblox units compare to metric units.
+For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.RopeConstraint`, see [Mechanical Constraints](../../physics/mechanical-constraints.md). Also see [Roblox Units](../../physics/units.md) to understand how Roblox units compare to metric units.
A `Class.RopeConstraint` prevents two attachments from separating further than a defined `Class.RopeConstraint.Length|Length`. The attachments can move closer together than this length and both can freely rotate. `Class.RopeConstraint.Restitution|Restitution` defines the elasticity of the attachments when they reach the separation limit specified by `Class.RopeConstraint.Length|Length`.
diff --git a/content/en-us/physics/constraints/spring.md b/content/en-us/physics/constraints/spring.md
index 5a7cc5dbe..0cd479145 100644
--- a/content/en-us/physics/constraints/spring.md
+++ b/content/en-us/physics/constraints/spring.md
@@ -4,14 +4,14 @@ description: SpringConstraint applies a force on its attachments based on spring
---
-For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.SpringConstraint`, see [Mechanical constraints](../../physics/mechanical-constraints.md). Also see [Roblox units](../../physics/units.md) to understand how Roblox units compare to metric units.
+For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.SpringConstraint`, see [Mechanical Constraints](../../physics/mechanical-constraints.md). Also see [Roblox Units](../../physics/units.md) to understand how Roblox units compare to metric units.
A `Class.SpringConstraint` applies a force on its attachments based on spring and damper behavior. You can customize a spring's [damping](#damping) and [stiffness](#stiffness), as well as set minimum and maximum [limits](#limits) on the spring's length.
-## Free length
+## Free Length
`Class.SpringConstraint.FreeLength|FreeLength` defines the natural resting length of the spring. If the attachments are further apart than the free length, they are forced together; if the attachments are closer together than the free length, they are forced apart.
diff --git a/content/en-us/physics/constraints/torque.md b/content/en-us/physics/constraints/torque.md
index e00f74fb8..c4e679f76 100644
--- a/content/en-us/physics/constraints/torque.md
+++ b/content/en-us/physics/constraints/torque.md
@@ -4,7 +4,7 @@ description: The Torque constraint applies constant torque on an assembly from i
---
-For an overview on creating, visualizing, and simulating mover constraints, including `Class.Torque`, see [Mover constraints](../../physics/mover-constraints.md). Also see [Roblox units](../../physics/units.md) to understand how Roblox units compare to metric units.
+For an overview on creating, visualizing, and simulating mover constraints, including `Class.Torque`, see [Mover Constraints](../../physics/mover-constraints.md). Also see [Roblox Units](../../physics/units.md) to understand how Roblox units compare to metric units.
A `Class.Torque` constraint applies constant torque on an assembly from its center of mass.
diff --git a/content/en-us/physics/constraints/torsion-spring.md b/content/en-us/physics/constraints/torsion-spring.md
index 383cb1f0e..2cd0b962f 100644
--- a/content/en-us/physics/constraints/torsion-spring.md
+++ b/content/en-us/physics/constraints/torsion-spring.md
@@ -1,10 +1,10 @@
---
-title: TorsionSpring
+title: Torsion Spring
description: TorsionSpringConstraint applies torque based on a relative angle and relative angular velocity, in an attempt to bring two axes from two parts together.
---
-For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.TorsionSpringConstraint`, see [Mechanical constraints](../../physics/mechanical-constraints.md). Also see [Roblox units](../../physics/units.md) to understand how Roblox units compare to metric units.
+For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.TorsionSpringConstraint`, see [Mechanical Constraints](../../physics/mechanical-constraints.md). Also see [Roblox Units](../../physics/units.md) to understand how Roblox units compare to metric units.
A `Class.TorsionSpringConstraint` applies torque based on a relative angle and relative angular velocity. It attempts to bring two axes from two parts together and is useful for [hinged](../../physics/constraints/hinge.md) swinging doors with a spring-back effect.
diff --git a/content/en-us/physics/constraints/universal.md b/content/en-us/physics/constraints/universal.md
index 13b9f75a4..9fd8d7879 100644
--- a/content/en-us/physics/constraints/universal.md
+++ b/content/en-us/physics/constraints/universal.md
@@ -4,7 +4,7 @@ description: UniversalConstraint ensures two axes on two assemblies remain perpe
---
-For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.UniversalConstraint`, see [Mechanical constraints](../../physics/mechanical-constraints.md). Also see [Roblox units](../../physics/units.md) to understand how Roblox units compare to metric units.
+For an overview on creating, visualizing, and simulating mechanical constraints, including `Class.UniversalConstraint`, see [Mechanical Constraints](../../physics/mechanical-constraints.md). Also see [Roblox Units](../../physics/units.md) to understand how Roblox units compare to metric units.
A `Class.UniversalConstraint` ensures two axes on two assemblies remain perpendicular. Example applications include vehicle power transmission to the rear drive shafts, robotics, and more.
diff --git a/content/en-us/physics/constraints/vector-force.md b/content/en-us/physics/constraints/vector-force.md
index 89f3e8836..b71e30a7c 100644
--- a/content/en-us/physics/constraints/vector-force.md
+++ b/content/en-us/physics/constraints/vector-force.md
@@ -1,10 +1,10 @@
---
-title: VectorForce
+title: Vector Force
description: The VectorForce constraint applies constant linear force on an assembly.
---
-For an overview on creating, visualizing, and simulating mover constraints, including `Class.VectorForce`, see [Mover constraints](../../physics/mover-constraints.md). Also see [Roblox units](../../physics/units.md) to understand how Roblox units compare to metric units.
+For an overview on creating, visualizing, and simulating mover constraints, including `Class.VectorForce`, see [Mover Constraints](../../physics/mover-constraints.md). Also see [Roblox Units](../../physics/units.md) to understand how Roblox units compare to metric units.
The `Class.VectorForce` constraint applies constant linear force on an assembly. The direction and strength of the force is determined by a `Datatype.Vector3` and can be relative to an attachment on the part, another attachment, or the world coordinate system.
@@ -15,7 +15,7 @@ The `Class.VectorForce` constraint applies constant linear force on an assembly.
Because the `Class.VectorForce` constraint applies **constant** force and acceleration, very high speeds may result if no other forces are involved. If you want to maintain a more steady velocity over time, use a [LinearVelocity](../../physics/constraints/linear-velocity.md) constraint. Alternatively, if you only need **initial** velocity, set the `Class.BasePart.AssemblyLinearVelocity|AssemblyLinearVelocity` property directly on the assembly.
-## Force location
+## Force Location
By default, force is applied to the assembly at the location of `Class.Constraint.Attachment0|Attachment0`. Thus, if its center of mass is not aligned with the direction/point of force, torque will be applied as well. If desired, force can be focused at the center of mass by toggling on `Class.VectorForce.ApplyAtCenterOfMass|ApplyAtCenterOfMass`.
diff --git a/content/en-us/physics/constraints/weld.md b/content/en-us/physics/constraints/weld.md
index 15024ea2f..6d4d57b93 100644
--- a/content/en-us/physics/constraints/weld.md
+++ b/content/en-us/physics/constraints/weld.md
@@ -21,7 +21,7 @@ Note that this tool behaves differently depending on how many `Class.BasePart|Ba
- If one `Class.BasePart` is already selected, the next `Class.BasePart` clicked will be connected to the selected one with a new `Class.WeldConstraint`.
- If multiple `Class.BasePart|BaseParts` are selected, those which are touching or overlapping will be automatically welded together by new `Class.WeldConstraint|WeldConstraints`.
-## Reposition behavior
+## Repositioning Behavior
Roblox handles moving a welded part differently depending on whether the part
was moved through its `Class.BasePart.Position|Position` or through its
diff --git a/content/en-us/physics/index.md b/content/en-us/physics/index.md
index e6cfd09db..ffd6d221a 100644
--- a/content/en-us/physics/index.md
+++ b/content/en-us/physics/index.md
@@ -28,15 +28,15 @@ An [assembly](../physics/assemblies.md) is one or more `Class.BasePart|BaseParts
Non-anchored assemblies react to force from gravity and collisions, but physical force can also be applied through **mechanical constraints** or **mover constraints**.
-### Mechanical constraints
+### Mechanical Constraints
-Mechanical constraints include familiar objects like hinges, springs, and ropes which can be used to build mechanisms. Each is covered in [Mechanical constraints](../physics/mechanical-constraints.md).
+Mechanical constraints include familiar objects like hinges, springs, and ropes which can be used to build mechanisms. Each is covered in [Mechanical Constraints](../physics/mechanical-constraints.md).
-### Mover constraints
+### Mover Constraints
-Mover constraints apply force or torque to move one or more assemblies. Each is outlined in [Mover constraints](../physics/mover-constraints.md).
+Mover constraints apply force or torque to move one or more assemblies. Each is outlined in [Mover Constraints](../physics/mover-constraints.md).
@@ -48,14 +48,14 @@ Through [collision filtering](../workspace/collisions.md#collision-filtering) te
See [Collisions](../workspace/collisions.md) for more details on detecting and filtering collisions.
-## Network ownership
+## Network Ownership
-In order to support complex physical mechanisms while also aiming for a smooth and responsive experience for players, the Roblox physics engine utilizes a **distributed physics** system in which computations are distributed between the server and all connected clients. Within this system, the engine assigns **network ownership** of physically simulated `Class.BasePart|BaseParts` to either a client or server to divide the work of calculating physics. See [Network ownership](../physics/network-ownership.md) for further details.
+In order to support complex physical mechanisms while also aiming for a smooth and responsive experience for players, the Roblox physics engine utilizes a **distributed physics** system in which computations are distributed between the server and all connected clients. Within this system, the engine assigns **network ownership** of physically simulated `Class.BasePart|BaseParts` to either a client or server to divide the work of calculating physics. See [Network Ownership](../physics/network-ownership.md) for further details.
-## Adaptive timestepping
+## Adaptive Timestepping
-The engine emphasizes best performance by automatically assigning assemblies to one of three simulation rates. For scenarios featuring complex mechanisms like tanks, you can improve stability by setting a fixed timestep. See [Adaptive timestepping](../physics/adaptive-timestepping.md) for more information.
+The engine emphasizes best performance by automatically assigning assemblies to one of three simulation rates. For scenarios featuring complex mechanisms like tanks, you can improve stability by setting a fixed timestep. See [Adaptive Timestepping](../physics/adaptive-timestepping.md) for more information.
-## Sleep system
+## Sleep System
-When an assembly is not moving or accelerating, the Roblox physics engine improves performance by automatically stops simulating the assembly. See [Sleep system](../physics/sleep-system.md) for a detailed description of the sleep system.
+When an assembly is not moving or accelerating, the Roblox physics engine improves performance by automatically stops simulating the assembly. See [Sleep System](../physics/sleep-system.md) for a detailed description of the sleep system.
diff --git a/content/en-us/physics/mechanical-constraints.md b/content/en-us/physics/mechanical-constraints.md
index aeaf2e478..ab929ff14 100644
--- a/content/en-us/physics/mechanical-constraints.md
+++ b/content/en-us/physics/mechanical-constraints.md
@@ -1,5 +1,5 @@
---
-title: Mechanical constraints
+title: Mechanical Constraints
description: Mechanical constraints behave as conceptual mechanical connections such as hinges, springs, and motors.
---
@@ -133,7 +133,7 @@ The physics engine includes the following `Class.Constraint|Constraints` that be
-## Constraint visualization
+## Constraint Visualization
To accurately visualize constraints in Studio, you can use the following options from the [Model](../studio/model-tab.md) tab:
@@ -156,14 +156,14 @@ To accurately visualize constraints in Studio, you can use the following options
In addition to the above visualization, you can view colored outlines around mechanisms (groups of parts that share simulation step and [network ownership](../physics/network-ownership.md)) by toggling on **Mechanisms** from the [Visualization Options](../studio/ui-overview.md#visualization-options) widget in the upper‑right corner of the 3D viewport.
-## Create constraints
+## Creating Constraints
All mechanical constraints must connect one or two `Class.Attachment|Attachments` or `Class.Bone|Bones`, except for [WeldConstraint](../physics/constraints/weld.md) and [NoCollisionConstraint](../physics/constraints/no-collision.md). When connected to `Class.Bone|Bones`, the constraint will use their animated position and orientation.
To create a mechanical constraint, you can use either the **Create** tool or the [Explorer](../studio/explorer.md) window.
-
+
1. In the [Model](../studio/model-tab.md) tab, access the **Create** button's picker menu and select the desired constraint type, for example **Spring**.
@@ -212,9 +212,9 @@ Note that [WeldConstraint](../physics/constraints/weld.md) and [NoCollisionConst
-## Physical simulation
+## Physical Simulation
-To simulate physics while [moving](../parts/index.md#move) or [rotating](../parts/index.md#rotate) parts, you can switch to **Physical** mode in
+To simulate physics while [moving](../parts/index.md#moving) or [rotating](../parts/index.md#rotating) parts, you can switch to **Physical** mode in
the [Model](../studio/model-tab.md) tab, effectively forcing parts to obey physical limitations. For example, if two parts are attached by a [RopeConstraint](../physics/constraints/rope.md) and you drag one part around the scene, the other part will follow as the rope becomes taut.
diff --git a/content/en-us/physics/mover-constraints.md b/content/en-us/physics/mover-constraints.md
index 034db523c..5ca3df10f 100644
--- a/content/en-us/physics/mover-constraints.md
+++ b/content/en-us/physics/mover-constraints.md
@@ -1,5 +1,5 @@
---
-title: Mover constraints
+title: Mover Constraints
description: Mover constraints apply force or torque to move one or more assemblies.
---
@@ -79,7 +79,7 @@ The physics engine includes the following `Class.Constraint|Constraints` that ap
-## Constraint visualization
+## Constraint Visualization
To accurately visualize constraints in Studio, you can use the following options from the [Model](../studio/model-tab.md) tab:
@@ -102,14 +102,14 @@ To accurately visualize constraints in Studio, you can use the following options
In addition to the above visualization, you can view colored outlines around mechanisms (groups of parts that share simulation step and [network ownership](../physics/network-ownership.md)) by toggling on **Mechanisms** from the [Visualization Options](../studio/ui-overview.md#visualization-options) widget in the upper‑right corner of the 3D viewport.
-## Create constraints
+## Creating Constraints
Mover constraints typically connect one or two `Class.Attachment|Attachments` or `Class.Bone|Bones`. When connected to `Class.Bone|Bones`, the constraint will use their animated position and orientation.
To create a mover constraint, you can use either the **Create** tool or the [Explorer](../studio/explorer.md) window.
-
+
1. In the Model tab, access the **Create** button's picker menu and select the desired constraint type, for example **Angular Velocity**.
@@ -164,8 +164,8 @@ To create a mover constraint, you can use either the **Create** tool or the [Exp
-## Physical simulation
+## Physical Simulation
-To simulate physics while [moving](../parts/index.md#move) or [rotating](../parts/index.md#rotate) parts, you can switch to **Physical** mode in the [Model](../studio/model-tab.md) tab, effectively forcing parts to obey physical limitations. For example, if you drag one part around the scene and it collides with another part, it will physically push that part out of the way.
+To simulate physics while [moving](../parts/index.md#moving) or [rotating](../parts/index.md#rotating) parts, you can switch to **Physical** mode in the [Model](../studio/model-tab.md) tab, effectively forcing parts to obey physical limitations. For example, if you drag one part around the scene and it collides with another part, it will physically push that part out of the way.
diff --git a/content/en-us/physics/network-ownership.md b/content/en-us/physics/network-ownership.md
index d2521d2e0..046d17c7a 100644
--- a/content/en-us/physics/network-ownership.md
+++ b/content/en-us/physics/network-ownership.md
@@ -1,19 +1,19 @@
---
-title: Network ownership
-description: Learn how the Roblox Engine utilizes network ownership to improve physical responsiveness for players.
+title: Network Ownership
+description: Learn how the Roblox engine utilizes network ownership to improve physical responsiveness for players.
---
In order to support complex physical mechanisms while also aiming for a smooth and responsive experience for players, the Roblox [physics](../physics/index.md) engine utilizes a **distributed physics** system in which computations are distributed between the server and all connected clients. Within this system, the engine assigns **network ownership** of physically simulated `Class.BasePart|BaseParts` to either a client or server to divide the work of calculating physics.
Clients experience **more responsive** physics interactions with parts that they own, since there's no latency from communication with the server. Network ownership also improves server performance because physics computations can be split up among individual clients, allowing the server to prioritize other tasks.
-## BasePart ownership
+## BasePart Ownership
By default, the server retains ownership of any `Class.BasePart`. Additionally, the server **always** owns anchored `Class.BasePart|BaseParts` and you cannot manually change their ownership.
Based on a client's hardware capacity and the player's `Class.Player.Character` proximity to an unanchored `Class.BasePart`, the engine automatically assigns ownership of that part to the client. Thus, parts close to a player's character are more likely to become player-owned.
-## Assembly ownership
+## Assembly Ownership
If a physics-based mechanism has no anchored parts, [setting ownership](#setting-ownership) on an [assembly](../physics/assemblies.md) within that mechanism sets the same ownership for **every assembly** in the mechanism.
@@ -21,7 +21,7 @@ If you anchor a lone assembly that is **not** part of a broader mechanism, its o
If you anchor one assembly within a broader mechanism of assemblies, its ownership goes to the server, but ownership of the other assemblies remains unchanged. Unanchoring the same assembly reverts its previously set ownership.
-## Setting ownership
+## Setting Ownership
In experiences with complex physics interactions or in cases where you need to assign direct control, you can set ownership through a server-side call to `Class.BasePart:SetNetworkOwner()`.
@@ -60,7 +60,7 @@ end)
For smooth performance and responsive behavior, ensure you also assign ownership of any loose `Class.BasePart|BaseParts` on top of a vehicle to the same client that controls the vehicle.
-## Visualizing ownership
+## Visualizing Ownership
To assist with network ownership debugging, Studio can render colored outlines around objects when playtesting.
@@ -69,7 +69,7 @@ To assist with network ownership debugging, Studio can render colored outlines a
-
Outline color
+
Outline Color
Description
@@ -104,7 +104,7 @@ To enable network ownership visualization:
2. In the dropdown menu, toggle on **Network owners**.
-## Security concerns
+## Security Concerns
Roblox cannot verify physics calculations when a client has ownership over a `Class.BasePart`. Clients can exploit this and send bad data to the server, such as teleporting the `Class.BasePart`, making it go through walls or fly around.
diff --git a/content/en-us/physics/sleep-system.md b/content/en-us/physics/sleep-system.md
index 76543eaba..46f97efe4 100644
--- a/content/en-us/physics/sleep-system.md
+++ b/content/en-us/physics/sleep-system.md
@@ -1,13 +1,13 @@
---
-title: Sleep system
+title: Sleep System
description: Explore how the sleep system automatically prevents unnecessary simulation of non-moving parts.
---
-Each [assembly](../physics/assemblies.md) in the Roblox Engine corresponds to a single **rigid body**. The position and velocity of each rigid body describe where it's located and how fast it's moving, and one of the primary engine tasks is to update the positions and velocities of each assembly.
+Each [assembly](../physics/assemblies.md) in the Roblox engine corresponds to a single **rigid body**. The position and velocity of each rigid body describe where it's located and how fast it's moving, and one of the primary engine tasks is to update the positions and velocities of each assembly.
Assemblies can be connected together with [mechanical constraints](../physics/mechanical-constraints.md) and [mover constraints](../physics/mover-constraints.md) to form mechanisms such as cars or airplanes. As the number of assemblies and constraints in a mechanism increases, the time required to simulate the mechanism also increases. Fortunately, this increase is offset when the **sleep system** determines that the engine can skip simulation of non‑moving assemblies.
-## Sleep states
+## Sleep States
Each assembly can be in one of three states: [awake](#awake), [sleep‑checking](#sleep-checking), or [sleeping](#sleeping).
@@ -15,7 +15,7 @@ Each assembly can be in one of three states: [awake](#awake), [sleep‑checking]
An **awake** assembly is moving or accelerating, and is therefore simulated. Assemblies enter this state from situations outlined in [sleep‑checking](#sleep-checking) and [sleeping](#sleeping), as well as [additional wake situations](#additional-wake-situations).
-### Sleep-checking
+### Sleep-Checking
A non-moving assembly that shares a constraint with at least one [awake](#awake) neighboring assembly is put into the **sleep-checking** state and is not simulated. On each worldstep, a sleep-checking assembly checks whether:
@@ -36,7 +36,7 @@ In some cases, simply checking for non-movement would cause an assembly to incor
If an assembly falls asleep when you expect it to remain awake, it's commonly because the assembly is moving too slowly. In addition to automatic checks outlined in [sleep‑checking](#sleep-checking) and [sleeping](#sleeping), you can forcibly wake up an assembly through the conditions outlined in [additional wake situations](#additional-wake-situations).
-## Threshold reference
+## Threshold Reference
The following table provides the various displacement and velocity thresholds used to determine if an assembly is moving or accelerating.
@@ -45,7 +45,7 @@ The following table provides the various displacement and velocity thresholds us
Threshold
Value
-
State change
+
State Change
@@ -82,7 +82,7 @@ The following table provides the various displacement and velocity thresholds us
-## Additional wake situations
+## Additional Wake Situations
In addition to situations outlined in [sleep‑checking](#sleep-checking) and [sleeping](#sleeping), an assembly enters the [awake](#awake) state when:
@@ -116,7 +116,7 @@ In addition to situations outlined in [sleep‑checking](#sleep-checking) and [s
- The assembly is within the `Class.Explosion.BlastRadius|BlastRadius` of an `Class.Explosion`.
-## Debug visualization
+## Debugging Visualization
During playtesting, you can visualize assembly sleep states by toggling on **Awake parts** from the [Visualization Options](../studio/ui-overview.md#visualization-options) widget in the upper‑right corner of the 3D viewport.
diff --git a/content/en-us/physics/units.md b/content/en-us/physics/units.md
index d9bef561e..0f7aa7c10 100644
--- a/content/en-us/physics/units.md
+++ b/content/en-us/physics/units.md
@@ -1,5 +1,5 @@
---
-title: Roblox units
+title: Roblox Units
description: Explore the physical units used in Roblox and how they convert to metric units.
---
@@ -9,7 +9,7 @@ This article outlines Roblox physical units and how they convert to metric units
- Tuning linear/angular velocities, forces, torques, stiffness, and damping of [mechanical constraints](../physics/mechanical-constraints.md) and [mover constraints](../physics/mover-constraints.md).
- Adjusting the density of [custom materials](../parts/materials.md#custom-materials).
-## Unit conversions
+## Unit Conversions
@@ -42,7 +42,7 @@ In general, you can use the conversions in the following table to relate Roblox'
\* RMU = Roblox Mass Unit
-
+
The primary units are used to generate conversions for **derived** units such as water density and air pressure at standard conditions. The following physical properties are expressed in metric units and Roblox units, with primary unit equivalents provided in brackets. All conversions have been rounded to three significant figures.
@@ -127,7 +127,7 @@ The following table illustrates gravitational acceleration in Roblox units and m
-
+
Roblox places limits on certain physical properties, as outlined in the following table. Details on these properties is located in the `Datatype.PhysicalProperties` documentation.
@@ -169,7 +169,7 @@ Roblox places limits on certain physical properties, as outlined in the followin
-## Importance of unit consistency
+## Importance of Unit Consistency
Internally, the Roblox physics engine does not use unit conversions. You're free to define your own unit interpretations for studs (length) and RMUs (mass), but these should be used in a consistent manner throughout the experience. For example, if you decide that one stud equals one foot (30.483 cm), the unit density of water implies an RMU is equal to 62.4 lbs (28.3 kg):
diff --git a/content/en-us/platform.md b/content/en-us/platform.md
index 259bd5ed4..80530c1b8 100644
--- a/content/en-us/platform.md
+++ b/content/en-us/platform.md
@@ -1,5 +1,5 @@
---
-title: Platform overview
+title: Platform Overview
description: Learn about the unique value propositions on Roblox.
next: /creation
---
diff --git a/content/en-us/players/avatar-context-menu.md b/content/en-us/players/avatar-context-menu.md
index 8f1f0d34c..66fa76ad7 100644
--- a/content/en-us/players/avatar-context-menu.md
+++ b/content/en-us/players/avatar-context-menu.md
@@ -5,13 +5,13 @@ description: The Avatar Context Menu (ACM) allows users to interact and customiz
The **Avatar Context Menu** (ACM) makes it easier for users to interact with each other. When the ACM is enabled in your experience, a user can walk up to another user's character and click on them to open a small menu with several default options. The player can send a friend request, begin a private chat, view the user's profile, or wave.
-After [enabling](#enable-the-avatar-context-menu) the ACM in your experience, you can customize the ACM in the following ways:
+After [enabling](#enabling-the-avatar-context-menu) the ACM in your experience, you can customize the ACM in the following ways:
-- Programmatically [open and close](#open-and-close-the-acm) the ACM for specific users.
-- [Add](#add-menu-options) custom options and [remove](#remove-menu-options) existing options to the ACM.
-- [Customize the ACM appearance](#customize-menu-appearance) to create a unique user interface.
+- Programmatically [open and close](#opening-and-closing-the-acm) the ACM for specific users.
+- [Add](#adding-menu-options) custom options and [remove](#removing-menu-options) existing options to the ACM.
+- [Customize the ACM appearance](#customizing-menu-appearance) to create a unique user interface.
-## Enable the Avatar Context Menu
+## Enabling the Avatar Context Menu
The Avatar Context Menu must be enabled using the `Class.StarterGui:SetCore()` option "AvatarContextMenuEnabled" in a `Class.LocalScript`. The ACM is best used in experiences where there is no predefined behavior for clicking on other users.
@@ -30,7 +30,7 @@ If you need to detect whether the ACM is enabled, you can use the following code
StarterGui:GetCore(AvatarContextMenuEnabled)
```
-## Open and close the ACM
+## Opening and Closing the ACM
Once enabled, you can open and close the ACM programmatically with `Class.StarterGui`.
@@ -47,14 +47,14 @@ To programmatically close the ACM, use the following code:
StarterGui:SetCore("AvatarContextMenuTarget", nil)
```
-## Menu options
+## Menu Options
-You can [add](#add-menu-options) and [remove](#remove-menu-options) actions through scripting. By default, the menu has the following options:
+You can [add](#adding-menu-options) and [remove](#removing-menu-options) actions through scripting. By default, the menu has the following options:
-
Menu option
+
Menu Option
Description
@@ -82,7 +82,7 @@ Once the ACM is open, the user can scroll and select other users on the characte
-### Add menu options
+### Adding Menu Options
Once enabled, experience-specific actions can be added to the ACM. For example, an experience might allow for trade requests, add-to-party options, or other special interactions.
@@ -106,7 +106,7 @@ local options = {"Custom ACM Action", bindableEvent}
StarterGui:SetCore("AddAvatarContextMenuOption", options)
```
-### Remove menu options
+### Removing Menu Options
You can remove custom and the default Add Friend, Chat, View, and Wave options from the ACM by referencing the custom Action name or the default `Enum.AvatarContextMenuOption` enum.
@@ -124,7 +124,7 @@ StarterGui:SetCore("RemoveAvatarContextMenuOption", Enum.AvatarContextMenuOption
You can not make edits to the ACM while it is open. Your code should verify that an action is still relevant in case the action was removed from the menu. For example, if a marketplace area adds an option to send trade requests, you should verify both users are still in the marketplace.
-## Customize menu appearance
+## Customizing Menu Appearance
To change the appearance of the Avatar Context Menu, call `Class.StarterGui:SetCore()` with the option "AvatarContextMenuTheme", providing a table of parameters and values to adjust the menu appearance.
@@ -138,7 +138,7 @@ B. Button Frame: Contains all of the ACM buttons.
C. Buttons: Individual buttons for the default or custom ACM actions.
-### Appearance parameters
+### Appearance Parameters
These are the customization parameters with the ACM:
@@ -173,7 +173,7 @@ These are the customization parameters with the ACM:
-#### Name tag
+#### Name Tag
@@ -188,7 +188,7 @@ These are the customization parameters with the ACM:
-#### Button frame
+#### Button Frame
@@ -261,7 +261,7 @@ These are the customization parameters with the ACM:
-#### Various image
+#### Various Image
@@ -280,7 +280,7 @@ These are the customization parameters with the ACM:
-#### Selected character
+#### Selected Character
@@ -291,7 +291,7 @@ These are the customization parameters with the ACM:
-#### Size and position
+#### Size and Position
@@ -326,7 +326,7 @@ These are the customization parameters with the ACM:
-### Example customization
+### Example Customization
The following code sample customizes the ACM theme using some basic parameters:
diff --git a/content/en-us/players/avatar-editor.md b/content/en-us/players/avatar-editor.md
index 6c22bdc3e..77cb49447 100644
--- a/content/en-us/players/avatar-editor.md
+++ b/content/en-us/players/avatar-editor.md
@@ -7,14 +7,14 @@ The Avatar Editor Service lets you access and make changes to a user's avatar wi
We recommend implementing the Avatar Editor Service with an in-game avatar editor for a complete character customization experience. See the [Simple Avatar Editor Demo](https://www.roblox.com/games/9376329300/Simple-Avatar-Editor-Demo) reference place for an example of this feature.
-To begin using the Avatar Editor Service, you must first [request access](#request-access) to the user's inventory. After access is successfully granted, you can perform the following actions:
+To begin using the Avatar Editor Service, you must first [request access](#requesting-access) to the user's inventory. After access is successfully granted, you can perform the following actions:
-- [Read user's inventory](#read-user-inventory) to get a list of items owned by the user.
-- [Search the Marketplace](#search-the-marketplace), using a variety of properties to filter and sort.
-- [Equip avatar items and save outfits](#save-avatars-and-outfits) to the user's avatar.
-- [Prompt the user to purchase](#purchase-items) an Marketplace item.
+- [Read user's inventory](#reading-user-inventory) to get a list of items owned by the user.
+- [Search the Marketplace](#searching-the-marketplace), using a variety of properties to filter and sort.
+- [Equip avatar items and save outfits](#saving-avatars-and-outfits) to the user's avatar.
+- [Prompt the user to purchase](#purchasing-items) an Marketplace item.
-## Request access
+## Requesting Access
To begin accessing a user's inventory, you need to prompt the user to allow access through `Class.AvatarEditorService:PromptAllowInventoryReadAccess()|PromptAllowInventoryReadAccess()`. You need to perform this request once per session.
@@ -38,7 +38,7 @@ The user receives the following prompt:
Once the user accepts the prompt, the `Class.AvatarEditorService` can begin accessing the user's inventory.
-## Read user inventory
+## Reading User Inventory
Once access is granted by the user, you can read their inventory with the `Class.AvatarEditorService:GetInventory()|GetInventory()` function, supplying an array of `Enum.AvatarAssetType|AvatarAssetTypes` to filter by. This function returns an `Class.InventoryPages` object containing the user owned items.
@@ -66,7 +66,7 @@ if result == Enum.AvatarPromptResult.Success then
end
```
-## Search the Marketplace
+## Searching the Marketplace
`Class.AvatarEditorService` includes functions and events which let you search the Roblox catalog. To search, supply your query with a `Datatype.CatalogSearchParams` object that includes one or more of the following properties:
@@ -142,7 +142,7 @@ for _, item in currentPage do
end
```
-## Save avatars and outfits
+## Saving Avatars and Outfits
When used alongside an in-game avatar editor, `Class.AvatarEditorService` can save and update avatar items and outfits to the Roblox platform. Users don't receive catalog items they don't own when saving an avatar or outfit.
@@ -199,7 +199,7 @@ if result == Enum.AvatarPromptResult.Success then
end
```
-## Purchase items
+## Purchasing Items
When saving either an avatar or an outfit that uses catalog items, the user doesn't receive any items that they do not own. Before saving an avatar or outfit, check if the user owns the asset with `Class.MarketplaceService:PlayerOwnsAsset()` and provide them with an option to purchase the item with `Class.MarketplaceService:PromptPurchase()`.
diff --git a/content/en-us/players/avatar-inspect-menu.md b/content/en-us/players/avatar-inspect-menu.md
index 2626e389b..8818f24e4 100644
--- a/content/en-us/players/avatar-inspect-menu.md
+++ b/content/en-us/players/avatar-inspect-menu.md
@@ -11,12 +11,12 @@ The **Avatar Inspect Menu** allows users to view another user's Roblox avatar ch
You can customize a user's **Avatar Inspect Menu** in the following ways:
-- Change the inspect target from the user's Roblox avatar to their [current in-experience appearance](#inspect-currently-equipped-items).
-- Change the inspect target to a [specific User ID](#inspect-specific-users), even if they are not in the experience.
+- Change the inspect target from the user's Roblox avatar to their [current in-experience appearance](#inspecting-currently-equipped-items).
+- Change the inspect target to a [specific User ID](#inspecting-specific-users), even if they are not in the experience.
For more specific catalog access, you can also use the [Avatar Editor Service](../players/avatar-editor.md) to access and make changes to a user's platform-wide avatar within an experience.
-## Inspect currently equipped items
+## Inspecting Currently Equipped Items
By default, the Inspect Menu shows the same information as the user's Roblox Avatar profile page. The avatar outfit may not match the user's current appearance, since you may have opted to equip different accessories or avatar items at that specific moment.
@@ -46,7 +46,7 @@ if humanoid then
end
```
-## Inspect specific users
+## Inspecting Specific Users
The Avatar Inspect Menu can inspect players who aren't in the current experience. You can use `Class.GuiService:InspectPlayerFromUserId()` to inspect a player from any `Class.Player.UserId`.
diff --git a/content/en-us/players/disable-ui.md b/content/en-us/players/disabling-ui.md
similarity index 87%
rename from content/en-us/players/disable-ui.md
rename to content/en-us/players/disabling-ui.md
index 4a79941d0..ba460c864 100644
--- a/content/en-us/players/disable-ui.md
+++ b/content/en-us/players/disabling-ui.md
@@ -1,5 +1,5 @@
---
-title: Disable default UI
+title: Disabling Default UI
description: Explains the process of disabling Roblox's default user interface elements.
---
diff --git a/content/en-us/players/index.md b/content/en-us/players/index.md
index 2c8c98a2b..81e521faa 100644
--- a/content/en-us/players/index.md
+++ b/content/en-us/players/index.md
@@ -1,5 +1,5 @@
---
-title: Users and players
+title: Users and Players
description: The Player instance contains information on the individual users within your experience.
---
@@ -13,11 +13,11 @@ Client and server-side scripts can both connect to the `Class.Players.PlayerAdde
Use Scripts to access server-related services, such as a data store to retrieve and save data when a user joins or leaves. Use LocalScripts if the client needs to create and remove gameplay instances tied to the new user, such as a GUI display for the user's stats on a custom leaderboard.
-### User joining
+### User Joining
When a client connects to an experience, its associated `Class.Player` object clones to the `Class.Players` service. The `Class.Players.PlayerAdded` represents users joining the experience. Some example use-cases include loading user data, assigning teams, and changing a user's character's clothing. The `Class.Players.PlayerAdded` event passes the `Class.Player` object of the user who joins, which you can use when calling other functions, such as data store and `Class.RemoteEvent` objects.
-#### Load user data on join
+#### Loading User Data on Join
To load a user's data when they join an experience, use the `Class.Players.PlayerAdded` event in a `Class.Script`. The following example `Class.Script` listens to the event and attempts to retrieve a user's data using their user ID as the datastore key. After successfully retrieving the user data, you can use it to load the user's progress and stats.
@@ -45,13 +45,13 @@ end)
The `Class.Instance.Name` of the `Class.Player` object is the name of the user. If you need a unique reference to a user, such as to save information about them in a [data store](../cloud-services/data-stores/index.md), use their `Class.Player.UserId` instead of their `Class.Player.Name` because users can't change their `UserId` even though they can change their Username and Display Name.
-### User leaving
+### User Leaving
When a client disconnects from an experience, the server destroys its associated `Class.Player` object from the `Class.Players` service. The `Class.Players.PlayerRemoving` event represents users leaving the experience. Some example use-cases include saving user data, removing their stats from a scoreboard, and destroying any of their models, such as their house. The `Class.Players.PlayerRemoving` event passes the `Class.Player` object of the user who leaves, which you can use when calling other functions, such as data store and `Class.RemoteEvent` objects.
Notice that the event is called `Class.Player.PlayerRemoving`, not `Class.Player.PlayerRemoved`, because "removed" would imply that the `Class.Player` object is already removed and is therefore inaccessible to scripts.
-#### Save user data on leave
+#### Saving User Data on Leave
To save a user's data when they leave an experience, use the `Class.Players.PlayerRemoving` event in a `Class.Script`. The following example `Class.Script` listens to the event and attempts to save a user's data using their user ID as the data store key.
@@ -77,18 +77,18 @@ end)
```
-### Character spawning
+### Character Spawning
A user's `Class.Player.Character` model represents their avatar. By default, `Class.Player.CharacterAutoLoads` is true, and a user's character model automatically spawns when they join the experience. If `Class.Player.CharacterAutoLoads` is false, then you need to call `Class.Player:LoadCharacter()` to manually spawn the character.
When a user's `Class.Player.Character` spawns, Scripts and LocalScripts in `Class.StarterCharacterScripts` clone into the character model and the `Class.Player.CharacterAdded` event fires.
The `Class.Player.CharacterAdded` event passes the new character model to any event listeners, which you can use to find the character's `Class.Humanoid` object and modify its behavior. For example, you can use `Class.Humanoid:ApplyDescription()` to change the outfit of the avatar and `Class.Humanoid.WalkSpeed` or `Class.Humanoid.JumpHeight` to modify the avatar's movement.
-### Character despawning
+### Character Despawning
When the player's `Class.Humanoid` dies, its body parts fall to the ground and the `Class.Humanoid.Died` event fires. The server automatically removes the character model and any scripts inside it after amount of time that the `Class.Players.Respawntime` property determines. You can use the `Class.Player.CharacterRemoving` event to reset other objects associated with the character, such as the network ownership of a vehicle they were driving.
-#### Count player deaths
+#### Counting Player Deaths
You can use the `Class.Humanoid.Died` event to handle scoring for a kill or create a custom ragdoll model. The following `Class.Script` connects to `Class.Player.CharacterAdded` to retrieve each user's character model, then connects to the character's `Class.Humanoid` object. When the humanoid's `Class.Humanoid.Died` event fires, the script increments the number of times the user's humanoid has died and outputs that number.
@@ -105,13 +105,13 @@ game:GetService("Players").PlayerAdded:Connect(function(player)
end)
```
-## Ban users
+## Banning Users
To ensure civility and fair play in your experiences, you can ban users who violate your experience rules and community guidelines. You can modify ban durations, ban messages, and even extend bans to potential alternate accounts. When using this feature, you must also follow guidelines for [banning](#ban-guidelines) and [messaging](#message-guidelines).
For implementation and usage instructions, see `Class.Players.BanAsync`.
-### Ban guidelines
+### Ban Guidelines
When implementing bans in your experience, adhere to the following guidelines:
@@ -123,7 +123,7 @@ When implementing bans in your experience, adhere to the following guidelines:
- Roblox will not mediate these appeals, unless the user believes the creator's experience rules or enforcement of their rules violate the [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards).
- Roblox can moderate an experience if there is reason to believe that a creator's experience rules or enforcement of their rules violate the [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards).
-### Message guidelines
+### Message Guidelines
When a user is banned, they receive an error modal displaying information such as the ban length and reason. In the text-filtered message, you can include additional information such as appeal or contact information as long as you meet Roblox's [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards).
diff --git a/content/en-us/players/leaderboards.md b/content/en-us/players/leaderboards.md
index 951a8fa75..d97a5b060 100644
--- a/content/en-us/players/leaderboards.md
+++ b/content/en-us/players/leaderboards.md
@@ -1,5 +1,5 @@
---
-title: In-experience leaderboards
+title: In-Experience Leaderboards
description: In-experience Leaderboards let you display user information to all users in the experience, such as top scores.
---
@@ -7,7 +7,7 @@ Roblox has a built-in **leaderboard system** that lets you display user informat
-## Set up the leaderboard
+## Setting up the Leaderboard
To set up the leaderboard and add players when they enter the experience:
@@ -47,7 +47,7 @@ To set up the leaderboard and add players when they enter the experience:
It's essential that the folder is named `leaderstats` with all lowercase letters. Roblox doesn't add the player to the leaderboard if you name it any other way.
-## Add stats
+## Adding Stats
Leaderboards use **value type objects** to store and display player stats. This script will show a player's gold using an `Class.IntValue`, a placeholder for an integer.
@@ -89,7 +89,7 @@ These lines accomplish the following:
-## Update stats
+## Updating Stats
To update a player's leaderboard stat, change the `Value` property of that stat within their `leaderstats` folder. For example, you can attach the following `Class.Script` to any pickup object to increase the **Gold** stat of the player collects it.
@@ -116,7 +116,7 @@ end
goldChunk.Touched:Connect(onPartTouch)
```
-## Order stats
+## Ordering Stats
There are three ways to control the order of stats in a leaderboard:
@@ -152,7 +152,7 @@ Players.PlayerAdded:Connect(leaderboardSetup)
`IsPrimary` takes precedence over any `Priority` values. If multiple stats have `IsPrimary` values set to `true`, their `Priority` values determine the leaderboard order.
-## Hide the leaderboard
+## Hiding the Leaderboard
To hide the leaderboard, such as on a menu screen or during a cutscene, place a `Class.LocalScript` within `Class.StarterGui` or `Class.StarterPlayerScripts` containing a call to `Class.StarterGui:SetCoreGuiEnabled()|StarterGui`.
diff --git a/content/en-us/players/load-screens.md b/content/en-us/players/loading-screens.md
similarity index 94%
rename from content/en-us/players/load-screens.md
rename to content/en-us/players/loading-screens.md
index 86f0d8c7e..6b9d1cbbc 100644
--- a/content/en-us/players/load-screens.md
+++ b/content/en-us/players/loading-screens.md
@@ -1,19 +1,19 @@
---
-title: Load screens
+title: Loading Screens
description: Explains the process of customizing the loading screen when users are connecting to your experience.
---
Roblox displays a default loading screen when users are connecting to an experience, but you can personalize your experience with a custom loading screen that contains static or animated content.
-This article covers the loading screens that display when a user initially joins an experience. To customize loading screens that display when a user teleports between places, see [Teleport between places](../projects/teleport.md#create-custom-teleport-screens).
+This article covers the loading screens that display when a user initially joins an experience. To customize loading screens that display when a user teleports between places, see [Teleporting Between Places](../projects/teleporting.md#creating-custom-teleport-screens).
-## Display custom loading screens
+## Displaying Custom Loading Screens
To display a custom loading screen, you can either design a `Class.ScreenGui` instance directly within a `Class.LocalScript`, or you can reference a `Class.ScreenGui` object in your workspace. Both options utilize `Class.ReplicatedFirst`, as this service that replicates instances to clients before anything else is replicated. This ensures that your loading screen is the first thing users see when they enter your experience.
-### Design within LocalScripts
+### Designing within LocalScripts
To design and display a custom loading screen:
@@ -53,7 +53,7 @@ end
screenGui:Destroy()
```
-### Reference ScreenGuis
+### Referencing ScreenGuis
Instead of creating the `Class.ScreenGui` through a `Class.LocalScript`, you can also reference an existing `Class.ScreenGui` directly in your workspace. Ensure that your experience includes a `Class.ScreenGui` within `Class.ReplicatedFirst` and that the `Class.ScreenGui` includes UI elements like `TextLabels` and `ImageLabels`, then set it as the loading screen by referencing it within a `Class.LocalScript`. This method allows you to easily view your loading screen as you're creating it.
@@ -82,7 +82,7 @@ end
screenGui:Destroy()
```
-## Add animations
+## Adding Animations
In addition to static custom loading screens, you can add animations to enhance the loading screen and indicate loading progress. The easiest way to do this is to create a UI element, such as a `Class.TextLabel` or `Class.ImageLabel`, then to animate it using `Class.TweenService`. For example, the following code sample creates a new `Class.ScreenGui` with a child `Class.ImageLabel`, removes the default loading screen, then `Class.TweenService` rotates the `Class.ImageLabel` continuously until the experience loads:
diff --git a/content/en-us/players/teams.md b/content/en-us/players/teams.md
index 1245c0c2e..a1d57e4f3 100644
--- a/content/en-us/players/teams.md
+++ b/content/en-us/players/teams.md
@@ -1,11 +1,11 @@
---
-title: Implement teams
+title: Implementing Teams
description: The Teams service allows you assign users to different teams within your experience.
---
You can divide users in your experience to multiple teams using the `Class.Teams` service to support your experience needs. By enabling the `Class.Teams` service, it automatically updates the color of the name above each user character `Class.Model` to differentiate members that belong to different teams, and the default user list displays users based on their teams.
-## Configure teams
+## Configuring Teams
By default, your **Explorer** hierarchy includes the `Class.Teams` service. If you don't find it or accidentally deleted it, you can still add it to your experience through the following steps:
@@ -19,7 +19,7 @@ By default, your **Explorer** hierarchy includes the `Class.Teams` service. If y
-## Add teams
+## Adding Teams
With the `Class.Teams` service present, you can create a new team through the following steps:
@@ -36,7 +36,7 @@ You can now select the new `Class.Team` object and, in the **Properties** window
-## Assign users to teams
+## Assigning Users to Teams
By default, Roblox **auto-assigns** new users joining the experience to the team with the fewest members, and you can still use the following steps to assign users to a specific team:
@@ -48,7 +48,7 @@ By default, Roblox **auto-assigns** new users joining the experience to the team
3. Assign a user to a specific team by changing their `Class.Player.Team` property to the team name in the format of `Teams[name of the team]`, such as `Teams["Blue Team"]`.
-## Spawn teams
+## Spawning Teams
You can use `Class.SpawnLocation` objects to spawn users of different teams at specific locations when they join or respawn. By default, `Class.SpawnLocation|SpawnLocations` are **neutral** and any user can spawn upon them, so you need to lock each one to the team that can occupy it using the following steps:
diff --git a/content/en-us/players/tools.md b/content/en-us/players/tools.md
index 39879fa8f..b181a1447 100644
--- a/content/en-us/players/tools.md
+++ b/content/en-us/players/tools.md
@@ -1,15 +1,15 @@
---
-title: In-experience tools
+title: In-Experience Tools
description: Create in-experience tools for your users.
---
In-experience `Class.Tool|Tools` are interactive tools that users can equip in sessions, such as swords, rocket launchers, and magic wands. You can create customized in-experience tools, put them in your experience hierarchy, and write scripts to implement them for your users.
-## Create an in-Experience Tool
+## Creating an In-Experience Tool
-For the first step of creating any in-experience tool, you need to [create a tool object](#create-the-tool-object) to contain all elements that make up the tool. You can then add other instances to the tool object including [parts and meshes](#add-parts-or-meshes), sound effects, and scripts which provide functionality. You can also set up a [tool handle](#set-the-tool-handle), [adjust the tool grip](#adjust-the-tool-grip-orientation), and [customize your tool icon](#customize-the-tool-icon) to improve the user experience.
+For the first step of creating any in-experience tool, you need to [create a tool object](#creating-the-tool-object) to contain all elements that make up the tool. You can then add other instances to the tool object including [parts and meshes](#adding-parts-or-meshes), sound effects, and scripts which provide functionality. You can also set up a [tool handle](#setting-the-tool-handle), [adjust the tool grip](#adjusting-the-tool-grip-orientation), and [customize your tool icon](#customizing-the-tool-icon) to improve the user experience.
-### Create the tool object
+### Creating the Tool Object
You can create a new tool object with the following steps:
@@ -19,17 +19,17 @@ You can create a new tool object with the following steps:
-### Add parts or meshes
+### Adding Parts or Meshes
-After creating the tool object, you need to add `Class.Part|Parts` or `Class.MeshPart|MeshParts` to the tool model or [create the tool as an inventory item](#create-tools-as-inventory-items) without parts and meshes. Like other models, in-experience tools can consist of multiple `Class.Part|Parts`, so you need to connect all parts of the tool together using the `Class.Weld` constraints.
+After creating the tool object, you need to add `Class.Part|Parts` or `Class.MeshPart|MeshParts` to the tool model or [create the tool as an inventory item](#creating-tools-as-inventory-items) without parts and meshes. Like other models, in-experience tools can consist of multiple `Class.Part|Parts`, so you need to connect all parts of the tool together using the `Class.Weld` constraints.
When constructing tools, make sure tool parts are not anchored, otherwise users might get stuck in place when equipping it.
-If you want to create a tool without adding parts or meshes, you can [create it as an inventory item](#create-tools-as-inventory-items).
+If you want to create a tool without adding parts or meshes, you can [create it as an inventory item](#creating-tools-as-inventory-items).
-### Set the tool handle
+### Setting the Tool Handle
To enable users to carry tools around, you need to set a `Class.Part` and name it `Handle` for attaching to the user's hand. The following example shows a magic wand with three parts: a glowing tip, the main body, and a red handle. When a user equips the wand, they hold it at the `Class.Part` named `Handle`.
@@ -41,7 +41,7 @@ Make sure to have only one `Class.Part` named `Handle`. If you name multiple `Cl
The `Handle` must be a **direct child** of the tool object. Do not nest it inside a model or folder within the object.
-### Adjust the tool grip orientation
+### Adjusting the Tool Grip Orientation
If your tool's grip orientation is incorrect, such as dragging on the ground or facing backwards, you can fix it by adjusting **Grip** properties under the **Appearance** category in the **Properties** window.
@@ -77,7 +77,7 @@ You can also enable user characters to offset tools from their hand with the **G
-### Customize the tool icon
+### Customizing the Tool Icon
Tools that a user owns are stored in their `Class.Backpack`. Users can view the icon of each tool in their backpacks on an **action bar**:
@@ -88,43 +88,43 @@ In the tool's **Properties** window, use the following properties to customize t
- **TextureID** — The tool icon. Set the image ID for this property the same way as decals and image buttons.
- **ToolTip** — The on-hover tooltip name.
-### Enable and disable users to drop tools
+### Enabling and Disabling Users to Drop Tools
By default, a user can drop a tool by pressing the **Backspace** key on Windows or **delete** on Mac. You can disable this option by setting the **CanBeDropped** property of the tool to `false`. If **CanBeDropped** is `false`, pressing **Backspace** or **delete** returns the tool to the user's backpack.
-### Create tools as inventory items
+### Creating Tools As Inventory Items
You can also make an in-experience tool without parts or meshes as an inventory item that waits for user input, such as a magic spell that user characters can click others or touch the screen to cast it. Inventory item tools don't require handles, so you need to uncheck the **RequiresHandle** property in the tool's **Properties** window.
-## Add tools to your experience
+## Adding Tools to Your Experience
Once you finish setting up your in-experience tool, you need to place it in the proper area of your experience's object hierarchy. Where you place the tool within the experience's object hierarchy depends on it's intended use.
-### Default starting tool
+### Default Starting Tool
If you want all users to start out with a tool in their inventory, put it inside the **StarterPack** folder. When any user spawns, the system copies the tool to their backpack.
-### Collectible tool
+### Collectible Tool
If you want to allow users to collect tools as they move, you can place the tools in the **Workspace** in the **Explorer** hierarchy. For example, you might want to place a super rocket launcher in a hard-to-reach area of your experience world.
-### Earned and purchased tool
+### Earned and Purchased Tool
If you want to set a tool as awards when a user does something special or offer it for sale in an in-experience store, put the tool inside **ServerStorage** in the **Explorer** hierarchy, which can clone the tool to the user's backpack at the proper time.
-## Add tools effects
+## Adding Tools Effects
After adding your tools to your experience, you can add scripts to enable users to use tools to do special effects.
-### Tool-specific events
+### Tool-Specific Events
You can use the following four tool-specific conditions indicating the state of the tool and the user's input with it in your tool script:
@@ -160,7 +160,7 @@ tool.Deactivated:Connect(onDeactivate)
This code sample assumes that the script is a first-level child inside the tool object. If the script is elsewhere, adjust the path on line 1 (the value of `tool`) to point to the core tool object.
-### Add a basic script
+### Adding a Basic Script
The following example shows steps for adding a `Class.Script` on the server that enables users to equip a magic wand that can switch day and night by clicking on the screen:
@@ -189,7 +189,7 @@ The following example shows steps for adding a `Class.Script` on the server that
-### Different types of scripts for tools implementation
+### Different Types of Scripts for Tools Implementation
Some tools only need a `Class.Script` on the server to implement, such as the previous example, but most tools require both a `Class.Script` on the server and a `Class.LocalScript` on the client, where each takes care of certain aspects of the tool's behavior.
@@ -204,8 +204,8 @@ Here are some example tools and their behaviors managed by either a local script
Tool
-
Local script
-
Server script
+
Local Script
+
Server Script
@@ -229,7 +229,7 @@ Here are some example tools and their behaviors managed by either a local script
For more information on the different script types, see [Scripts](../scripting/index.md).
-#### Troubleshooting tips
+#### Troubleshooting Tips
A tool might work fine in Studio but not in a live Roblox experience. If this occurs, use the following tips for troubleshooting:
diff --git a/content/en-us/production/analytics/acquisition.md b/content/en-us/production/analytics/acquisition.md
index 87879f944..da41dafc3 100644
--- a/content/en-us/production/analytics/acquisition.md
+++ b/content/en-us/production/analytics/acquisition.md
@@ -7,16 +7,16 @@ description: Explains how to interpret and improve acquisition metrics for your
When acquiring users to your experience, such as announcing an in-game event or creating ad campaigns, make sure your experience has good [retention](./retention.md) and [engagement](./engagement.md) to ensure a healthy user population and game experience.
-## View acquisition metrics
+## Viewing Acquisition Metrics
To view your experience's acquisition analytics:
1. Navigate to your [Creations](https://create.roblox.com/dashboard/creations) page on **Creator Dashboard** and select your experience.
1. In the **Analytics** menu on the left, select **Acquisition**.
-You can view analytics for individual or group owned experience. To view the latter, you need to have [group permissions for analytics](../../production/analytics/analytics-dashboard.md).
+You can view analytics for individual or group owned experience. To view the latter, you need to have [group permissions for analytics](../../production/analytics/analytics-dashboard.md#granting-group-permission).
-## Acquisition sources
+## Acquisition Sources
On the acquisition dashboard, you'll see the following charts and tables:
@@ -35,11 +35,11 @@ Here's a list of all the available acquisition sources:
Description
-
Home recommendations
+
Home Recommendations
**Recommended Experiences** section on **Home**
-
Continue play
+
Continue Play
**Continue Play** on **Home**
@@ -47,7 +47,7 @@ Here's a list of all the available acquisition sources:
**Today's Picks** and **Roblox Events** on **Home**
-
Home other
+
Home Other
**Favorites** and all other traffic on **Home**
@@ -63,15 +63,15 @@ Here's a list of all the available acquisition sources:
**All sorts** on **Charts**
-
Sponsored ads
+
Sponsored Ads
Acquisition from [Sponsored Experiences](../promotion/ads-manager.md#sponsored-experiences) and **Sponsored Takeovers** on **Home**
-
Search ads
+
Search Ads
Acquisition from [Search Ads](../promotion/search-ads.md)
-
Portal ads
+
Portal Ads
Acquisition from [Portal Ads](../promotion/ads-manager.md#portal-ads)
@@ -84,7 +84,7 @@ Here's a list of all the available acquisition sources:
-## Acquisition attribution
+## Acquisition Attribution
The dashboard categorizes results for each acquisition source as follows:
@@ -94,58 +94,58 @@ The dashboard categorizes results for each acquisition source as follows:
Description
-
Users with plays
+
Users with Plays
Unique new users with plays on the experience.
-
Qualified play through rate
+
Qualified Play Through Rate
Percent of new users who engaged with your experience after viewing an impression.
-
D7 retention
+
D7 Retention
Percentage of new players acquired in the date range who played again on the 8th day (D8) after their first session ended.
-
7D playtime per user (cumulative)
+
7D Playtime per User (Cumulative)
Cumulative playtime for new players acquired in the date range in their first 7 days divided by the number of new players acquired in the date range.
-
30D payer conversion (cumulative)
+
30D Payer Conversion (Cumulative)
Number of paying users from new players acquired in the date range in their first 30 days divided by the number of new players acquired in the date range.
-
30D revenue per user (cumulative)
+
30D Revenue per User (Cumulative)
Cumulative revenue, excluding subscriptions, engagement payouts, and immersive ads, for new players acquired in the date range in their first 30 days divided by the number of new players acquired in the date range.
-## Improve acquisition
+## Improving Acquisition
To improve acquisition, you can run an acquisition funnel to identify sources that might drive more traffic or convert better, such as:
- The sources driving **the most number of new users** to your experience.
- The sources with the best **end-to-end conversion rate**.
-### Improve acquisition from Roblox sources
+### Improving Acquisition from Roblox Sources
Among all Roblox sources, **Home** is usually where the vast majority of users find experiences. To improve your experience's discovery on Home:
-1. **Improve engagement and retention.** Get your [session time](../../production/analytics/engagement.md#improve-average-session-time) and [day 1 retention](../../production/analytics/retention.md#improve-day-1-retention) to be comparable or above your similar experience benchmarks. The algorithm cares about these metrics because they signal how engaging and satisfying your experience is for users.
-2. **Optimize monetization.** Get your [payer conversion](../../production/analytics/monetization.md#improve-payer-conversion-rate) rate and [ARPPU](../../production/analytics/monetization.md#improve-average-revenue-per-paying-user-arppu) (average revenue per paying user) to be comparable or above your similar experience benchmarks. The algorithm cares about these metrics because they measure how invested users are in your experience.
+1. **Improve engagement and retention.** Get your [session time](../../production/analytics/engagement.md#improving-average-session-time) and [Day 1 retention](../../production/analytics/retention.md#improving-day-1-retention) to be comparable or above your similar experience benchmarks. The algorithm cares about these metrics because they signal how engaging and satisfying your experience is for users.
+2. **Optimize monetization.** Get your [payer conversion](../../production/analytics/monetization.md#improving-payer-conversion-rate) rate and [ARPPU](../../production/analytics/monetization.md#improving-average-revenue-per-paying-user-arppu) (average revenue per paying user) to be comparable or above your similar experience benchmarks. The algorithm cares about these metrics because they measure how invested users are in your experience.
You can adopt the following strategies to improve the number of users visiting your experience from Roblox sources, including **Home**, **Discover**, and **Search**:
-1. **Improve your retention**: Day 1 retention signals how engaging and satisfying your experience is for users. Experiences with high Day 1 retention are more likely to be featured in **Recommended Experiences**. For more information on improving Day 1 retention, see [Day 1 retention](../../production/analytics/retention.md#improve-day-1-retention).
+1. **Improve your retention**: Day 1 retention signals how engaging and satisfying your experience is for users. Experiences with high Day 1 retention are more likely to be featured in **Recommended Experiences**. For more information on improving Day 1 retention, see [Day 1 Retention](../../production/analytics/retention.md#improving-day-1-retention).
2. **Grow your engagement**. Average session time measures how much time users spend in your experience and signals how much users enjoy your content. Experiences with high average session time are more likely to be featured in **Recommended Experiences**.
For more information on Roblox sources and best practices on improving the discovery of your experience, see [Discovery](../../discovery.md).
-### Improve qualified play through rate from Roblox sources
+### Improving Qualified Play Through Rate from Roblox Sources
You can get more users to convert by making your experience metadata engaging and accurate:
@@ -154,7 +154,7 @@ You can get more users to convert by making your experience metadata engaging an
-## Improve acquisition from external sources
+## Improving Acquisition from External Sources
Here are some tips to get users to visit your experience from external sources:
diff --git a/content/en-us/production/analytics/analytics-dashboard.md b/content/en-us/production/analytics/analytics-dashboard.md
index b78041179..bbe572cdd 100644
--- a/content/en-us/production/analytics/analytics-dashboard.md
+++ b/content/en-us/production/analytics/analytics-dashboard.md
@@ -1,9 +1,9 @@
---
-title: Analytics dashboard
+title: Analytics Dashboard
description: Analytics Dashboard helps you measure and gain insight into your experience's performance.
---
-The **analytics dashboard** helps you measure and gain insight into your experience's performance to adjust content strategies. It visualizes standard key performance indicators (KPIs) of your experience to help you optimize your experience's full lifecycle, including:
+The **Analytics Dashboard** helps you measure and gain insight into your experience's performance to adjust content strategies. It visualizes standard key performance indicators (KPIs) of your experience to help you optimize your experience's full lifecycle, including:
- [Retention](../../production/analytics/retention.md) KPIs that measure how many users return to your experience again after their first visit.
- [Engagement](../../production/analytics/engagement.md) KPIs that reflect how users actively use your experience and represent your core user base.
@@ -12,9 +12,9 @@ The **analytics dashboard** helps you measure and gain insight into your experie
Any experience with more than 10 Daily Active Users (DAU) and 10 play hours for 7 consecutive days is eligible for accessing all KPIs on the dashboard.
-The dashboard also provides [Sales data](#sales-data) that you can download and analyze in custom ways.
+The dashboard also provides [Sales Data](#sales-data) that you can download and analyze in custom ways.
-## Set up analytics dashboard
+## Setting Up Analytics Dashboard
If you are an experience owner or a group owner, and your experience meets the enrollment requirements, you can enroll in the analytics dashboard at any point with the following steps:
@@ -34,17 +34,17 @@ If you don't want to activate the dashboard immediately, or you accidentally dec
For [group](../../projects/groups.md) experiences, only the group owner and members with sufficient permissions can view the analytics dashboard, as some KPIs such as revenue are sensitive information. See [here](../../projects/groups.md#roles-and-permissions) for details on how to create a group role with access to view the dashboard.
-## Dashboard functionalities
+## Dashboard Functionalities
After activating the analytics dashboard, you can view the default charts on the overview and each KPI category. Hover over the **Information Icon** to understand what each chart represents and the **View Icon** to understand how to interpret the summary statistics on the top of each chart.
-There are also functionalities on each dashboard to help you further analyze your experience's performance, such as [filtering by date](#filter-by-date), [exporting charts](#export-a-chart), [benchmarking](#benchmarking), and [viewing KPI Breakdowns](#view-kpi-breakdowns).
+There are also functionalities on each dashboard to help you further analyze your experience's performance, such as [filtering by date](#filtering-by-date), [exporting charts](#exporting-a-chart), [benchmarking](#benchmarking), and [viewing KPI Breakdowns](#viewing-kpi-breakdowns).
-### Filter by date
+### Filtering by Date
You can apply a date filter to view the chart for a date range by separately selecting any specific time frame between the first date that the data was available and the present day as the start and the end date.
-### Filter by metrics
+### Filtering by Metrics
You can apply various filters to better understand your cohorts by clicking the **Filter By** button. Filters apply to all charts across all analytics pages until they are turned off.
@@ -56,13 +56,13 @@ You can filter by the following metrics:
-
**Filter type**
+
**Filter Type**
**Subcategories**
**Usage**
-
Age group
+
Age Group
<9, 9-12, 13-17, 18+
Analyze latest trends across different age groups.
@@ -102,13 +102,13 @@ You can filter by the following metrics:
Analyze how your experience is performing across different devices. You can identify under-performing devices and focus on improving performance.
-
Acquisition source (only applicable to acquisition metrics)
+
Acquisition Source (only applicable to acquisition metrics)
Home recommendations, home other, search, friends, teleport, sponsored ads
Analyze how users from different acquisition sources engage with your experience.
-### Explore mode
+### Explore Mode
Use the **Explore** button on the top-right corner of the chart to switch to a single chart view. In this view, you can apply different filters and breakdowns to explore under-performing segments and areas of opportunity. If you are using [custom fields](./custom-fields.md), you can filter by additional unique dimensions unique to your experience.
@@ -124,7 +124,7 @@ Use the **Explore** button on the top-right corner of the chart to switch to a s
Explore mode provides additional filters and breakdowns to further analyze and compare data points.
-### Export a chart
+### Exporting a Chart
To export a chart to use with other data analytics tools, click the **Export Button** and save the metrics in a `.csv` file. The file includes timestamps and values of each datapoint per KPI.
@@ -164,21 +164,21 @@ Each of these KPIs shows its similar experience benchmark in the 50th - 90th per
For KPIs on your experience's overall success, the analytics dashboard uses the top 1000 experiences with the highest total playtime on rolling 30 days as the benchmarking pool, excluding experiences that are less than 30 days old. Each of these KPIs has **Top 200**, **Top 500**, and **Top 1000** as benchmarking tiers. The dashboard displays the appropriate tier for your experience based on your experience's engagement metrics and updates them on a daily basis,
-### View KPI breakdowns
+### Viewing KPI Breakdowns
You can apply a breakdown to analyze each chart in a more specific category by clicking the **Breakdown by** and toggling between the breakdown types, including **Age Group**, **Platform**, **OS**, **Country**, and **Language**. The following table explains the subcategories and usage of each breakdown type. You might also see an "Unknown" subcategory refers to users without relevant data.
-
Breakdown type
+
Breakdown Type
Subcategories
Usage
-
Age group
+
Age Group
13 and Under, 13 through Under 18, 18 and Over.
Understand latest trends across different age groups.
@@ -205,11 +205,11 @@ You can apply a breakdown to analyze each chart in a more specific category by c
-## Sales data
+## Sales Data
Sales data download is one of the Roblox analytics offerings that can help you view and analyze your asset and developer product sales in your desired way.
-### Access sales data
+### Accessing Sales Data
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:
@@ -233,9 +233,9 @@ Roblox automatically generates a `.csv` (comma-separated values) file for your s
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/earn-on-roblox.md#the-developer-exchange-program) or pay your collaborators.
+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
+### Sales Data Attributes
On the `.csv` sales data sheet, each sold item has the following attributes and metrics:
@@ -248,7 +248,7 @@ On the `.csv` sales data sheet, each sold item has the following attributes and
| Universe | The name of the experience that the purchased item belongs to. Only applicable for items that belong to an experience, like a game pass. | `My Awesome Experience` |
| Asset ID | The unique identifier of the item. | `234565432` |
| Asset Name | The name of the item. | `My Avatar Shirt`, `My Server` |
-| Asset Type | The type of the item, which can be a [Roblox asset type](../../projects/assets/index.md#asset-types) or a [developer product](../../production/monetization/developer-products.md) type. | `Game Pass`, `Private Server`, `Mesh` |
+| Asset Type | The type of the item, which can be a [Roblox asset type](../../projects/assets/index.md#asset-types) or a [Developer Product](../../production/monetization/developer-products.md) type. | `Game Pass`, `Private Server`, `Mesh` |
| Hold Status | The status of whether Robux from this sale have been released to you or are still in a hold. | `Released`, `Held`, `Cancelled` |
-| Revenue | The amount of Robux you receive for the purchase, which is the item listing price excluding any [Marketplace fees](../../marketplace/marketplace-fees-and-commissions.md), Affiliate Fees, and Recurring Group Payouts. | `50` |
+| Revenue | The amount of Robux you receive for the purchase, which is the item listing price excluding any [Marketplace Fees](../../marketplace/marketplace-fees-and-commissions.md), Affiliate Fees, and Recurring Group Payouts. | `50` |
| Price | The item listing price, which is the amount of Robux that the buyer paid for the purchase. | `10` |
diff --git a/content/en-us/production/analytics/audience.md b/content/en-us/production/analytics/audience.md
index 90b976c39..e695e4632 100644
--- a/content/en-us/production/analytics/audience.md
+++ b/content/en-us/production/analytics/audience.md
@@ -10,9 +10,9 @@ To view your experience's audience analytics:
1. Navigate to your [Creations](https://create.roblox.com/dashboard/creations) page on **Creator Dashboard** and select your experience.
1. In the **Analytics** menu on the left, select **Audience**.
-You can view analytics for individual or group owned experiences. To view the latter, you need to have [group permissions for analytics](../../production/analytics/analytics-dashboard.md#grant-group-permission).
+You can view analytics for individual or group owned experiences. To view the latter, you need to have [group permissions for analytics](../../production/analytics/analytics-dashboard.md#granting-group-permission).
-## View audience metrics
+## Viewing Audience Metrics
On the audience page you can see a breakdown of your monthly active users into the following categories:
@@ -33,7 +33,7 @@ For privacy reasons, if there are less than 3 users in any age or gender groups,
-## Identify audience opportunities
+## Identifying Audience Opportunities
Consider the following strategies for using audience data to improve your experience:
diff --git a/content/en-us/production/analytics/custom-events.md b/content/en-us/production/analytics/custom-events.md
index eea976cd0..556ca2714 100644
--- a/content/en-us/production/analytics/custom-events.md
+++ b/content/en-us/production/analytics/custom-events.md
@@ -1,17 +1,17 @@
---
-title: Custom events
+title: Custom Events
description: Custom Events let you track and aggregate unique metrics to your experience.
---
**Custom events** let you track metrics specific to your experience that other events do not fully capture. This includes:
- **Adoption** — How many users click on a specific UI component?
-- **User behavior** — What is the most frequently used ability on each map?
-- **Core loop** — How do kill/death ratios compare across different weapons?
+- **User Behavior** — What is the most frequently used ability on each map?
+- **Core Loop** — How do kill/death ratios compare across different weapons?
Once your experience begins tracking custom events, you'll unlock the Custom page of the Analytics dashboard on the Creator Hub. You can add up to 100 custom events to your experience.
-## Track custom events
+## Tracking Custom Events
To unlock the Custom Events dashboard, you must first track custom events in your experience. Start by identifying which metrics are the most important for monitoring and improving your experience. Events are aggregated daily so it may take up to 24 hours for charts to populate on the page.
@@ -34,7 +34,7 @@ AnalyticsService:LogCustomEvent(
)
```
-### Events with values
+### Events with Values
You can also track events with values for metrics that require more quantitative data into your experience, such as kill/death ratios or the amount of time a user spends on a mission. It can also be used as a way to send events in batches in order to stay under the rate limits, i.e. sending 10 zombies killed instead of 1 zombie killed ten times.
@@ -48,7 +48,7 @@ AnalyticsService:LogCustomEvent(
)
```
-## Event aggregations
+## Event Aggregations
All events metrics include the following aggregations and include slice-and-dicing support:
@@ -64,7 +64,7 @@ View your event aggregations in the Custom page by selecting the aggregation typ
-## Use custom fields
+## Using Custom Fields
Custom events also allow breaking down on custom fields to support easier comparison between segments. For example, you can provide quest names to each event to see which ones users prefer the most, or attach player class to see if a class has a significantly higher kill/death ratio.
@@ -76,9 +76,9 @@ You should use custom fields whenever possible instead of event names, since the
For example, instead of `PlantCabbage`, `PlantTurnip`, `PlantPepper` as three separate events, you could have a single event with the name `PlantSeed` and custom field values `Plant - Cabbage`, `Plant - Turnip`, and `Plant - Pepper`. This way you can visualize both the total number of seeds planted as well as compare each plant in the same visualization. This also reduces your event name cardinality.
-For more information, see [Custom fields](./custom-fields.md).
+For more information, see [custom fields](./custom-fields.md).
-## Use custom events to grow your experience
+## Using Custom Events to Grow Your Experience
Custom events enable you to track metrics that matter most to your game, providing insights into how players interact with specific features and content. Use these events to uncover patterns in player behavior and optimize your core game loop.
@@ -87,5 +87,5 @@ In the reference game [Plant](../../resources/plant-reference-project.md), the c
- Try to improve the diversity of content within your experience and encourage players to explore other options as part of the [core loop](../game-design/core-loops.md) to prevent repetitiveness.
-- Explore why users significantly prefer turnips over other plants, and if there are any imbalances that turnips are causing (such as with [economy events](./economy-events.md)).
+- Explore why users significantly prefer turnips over other plants, and if there are any imbalances that turnips are causing (such as with [Economy Events](./economy-events.md)).
- Add more event tracking within your loop, such as planting seeds, watering plants, and going to the shop, to better track player behavior and other areas of improvement.
diff --git a/content/en-us/production/analytics/custom-fields.md b/content/en-us/production/analytics/custom-fields.md
index b0a35c627..acb924cdc 100644
--- a/content/en-us/production/analytics/custom-fields.md
+++ b/content/en-us/production/analytics/custom-fields.md
@@ -1,9 +1,9 @@
---
-title: Custom fields
+title: Custom Fields
description: Use custom fields as an additional analytics tool to track unique milestones in your experience.
---
-You can use up to 3 **custom fields** to filter your [economy](./economy-events.md), [funnel](./funnel-events.md), and [custom](./custom-events.md) events by unique dimensions specific to your experience. Some examples include:
+You can use up to 3 **custom fields** to filter your [Economy](./economy-events.md), [Funnel](./funnel-events.md), and [Custom](./custom-events.md) events by unique dimensions specific to your experience. Some examples include:
- Levels — 1, 2, 3, . . .
- Player class — Warrior, Mage, Archer
diff --git a/content/en-us/production/analytics/economy-events.md b/content/en-us/production/analytics/economy-events.md
index 6f5917b64..762bd722a 100644
--- a/content/en-us/production/analytics/economy-events.md
+++ b/content/en-us/production/analytics/economy-events.md
@@ -1,5 +1,5 @@
---
-title: Economy events
+title: Economy Events
description: Use economy events to visualize your experience's economy and track user sources, sinks and wallets.
---
@@ -11,7 +11,7 @@ description: Use economy events to visualize your experience's economy and track
Once your experience begins tracking Economy events, you'll unlock the Economy page of the Analytics dashboard on the Creator Hub.
-## Track economy events
+## Tracking Economy Events
To unlock the Economy dashboard, you need to track some economy events in your experience. Start by identifying where users **source** (i.e. gain) and **sink** (i.e. spend) resources in your experience. These are represented in code by `Enum.AnalyticsEconomyFlowType`, which can be either `Source` or `Sink`.
@@ -19,7 +19,7 @@ To unlock the Economy dashboard, you need to track some economy events in your e
Events can only be sent from the server and in published experiences. Events can't be sent from the client or Studio.
-### Transaction types
+### Transaction Types
Each source and sink event requires a transaction type, encoded with `Enum.AnalyticsEconomyTransactionType`. By default, the options are:
@@ -32,7 +32,7 @@ Each source and sink event requires a transaction type, encoded with `Enum.Analy
These types appear on the dashboard. It's a good idea to start with the default categories, but if you need to you can also provide your own transaction type names when logging an event.
-### Track sources
+### Tracking Sources
The following sample uses `Class.AnalyticsService.LogEconomyEvent` to log two different economy events when users complete the first and second levels in the experience and earn some coins.
@@ -76,7 +76,7 @@ AnalyticsService:LogEconomyEvent(
)
```
-### Track sinks
+### Tracking Sinks
The following sample logs an event when users spend coins to buy a `DoubleJumpUpgrade`. Note the `Sink` flow type and the `Shop` transaction type when compared to the source tracking samples.
@@ -97,9 +97,9 @@ AnalyticsService:LogEconomyEvent(
)
```
-For information on `Class.AnalyticsService` limitations, see [Event tracking limitations](./event-types.md#event-tracking-limitations).
+For information on `Class.AnalyticsService` limitations, see [event tracking limitations](./event-types.md#event-tracking-limitations).
-## Use custom fields
+## Using Custom Fields
Economy events also allow breaking down on custom fields to support easier comparison between segments. For example, you can provide quest names to each event to see which ones users are making the most money from, or attach store locations to see if users prefer one location over another.
@@ -107,9 +107,9 @@ You can breakdown by custom fields by using the breakdown selector.
-For more information, see [Custom fields](./custom-fields.md).
+For more information, see [custom fields](./custom-fields.md).
-## Use economy to grow your experience
+## Using Economy to Grow Your Experience
The Economy dashboard includes five charts to help you take action to grow your revenue. You can add up to five currencies of resources, and all charts can be filtered by gender, age group, platform, OS, and up to three custom fields specific to your experience.
@@ -129,4 +129,4 @@ The Economy dashboard includes five charts to help you take action to grow your
-For more tips on how to balance your in-experience economy, see [Balance virtual economies](../game-design/balance-virtual-economies.md).
+For more tips on how to balance your in-experience economy, see [Balancing Virtual Economies](../game-design/balancing-virtual-economies.md).
diff --git a/content/en-us/production/analytics/engagement.md b/content/en-us/production/analytics/engagement.md
index 4e9106250..998ac9b7f 100644
--- a/content/en-us/production/analytics/engagement.md
+++ b/content/en-us/production/analytics/engagement.md
@@ -9,20 +9,20 @@ description: Explains how to improve engagement metrics for your experience.
**Engagement** measures how engaging your experience is for users.
-## View engagement metrics
+## Viewing Engagement Metrics
To view your experience's engagement analytics:
1. Navigate to your [Creations](https://create.roblox.com/dashboard/creations) page on **Creator Dashboard** and select your experience.
1. In the **Analytics** menu on the left, select **Engagement**.
-You can view analytics for individual or group owned experience. To view the latter, you need to have [group permissions for analytics](../../production/analytics/analytics-dashboard.md).
+You can view analytics for individual or group owned experience. To view the latter, you need to have [group permissions for analytics](../../production/analytics/analytics-dashboard.md#granting-group-permission).
-## Improve average session time
+## Improving Average Session Time
Average session time is the total time users spend in your experience divided by the number of sessions. It's a key metric that's closely tied to retention. To ensure that users are having meaningful sessions, you need to focus on the efficiency and effectiveness of engaging your users.
-### Get users into the fun immediately
+### Getting Users Into the Fun Immediately
Usually, the friction of joining and leaving an experience is very low on Roblox, so first impressions are extremely important, and you want to get users into the fun part of your experience as fast as possible with the following strategies:
@@ -34,7 +34,7 @@ Usually, the friction of joining and leaving an experience is very low on Roblox
-### Give users a reason to keep coming back
+### Give Users a Reason to Keep Coming Back
Regardless of what type of experiences you are designing, you want to design for repeat visits. You can adopt the following strategies to motivate your users to continually use your experience:
@@ -42,7 +42,7 @@ Regardless of what type of experiences you are designing, you want to design for
2. **Add a progression system to make content last**: Progression systems give users a clear path toward their goals and can make content last longer, so you have time to make more content before users unlock them.
3. **Balance the progression system to not gate off the fun**: If you add progression, make sure there is still enough content available upfront to ensure new users can still have fun in their first session.
-### Monitor your experience's performance
+### Monitor Your Experience's Performance
Performance is how well your experience runs on different devices and platforms. To improve your experience's performance:
@@ -52,7 +52,7 @@ Performance is how well your experience runs on different devices and platforms.
You can grow your experience faster if it's more engaging to both new and existing users. For more information on retaining your users for engagement, see [Retention](../../production/analytics/retention.md).
-## Improve new user first session retention
+## Improving New User First Session Retention
The New User First Session Retention chart shows how many new users are still playing X minutes after joining your experience for the first time. It compares the current period with the previous period. You can use it to generate insights and catch issues with your experience's onboarding.
diff --git a/content/en-us/production/analytics/error-report.md b/content/en-us/production/analytics/error-report.md
index e42a89438..2f2a183f8 100644
--- a/content/en-us/production/analytics/error-report.md
+++ b/content/en-us/production/analytics/error-report.md
@@ -1,20 +1,20 @@
---
-title: Error report
+title: Error Report
description: Explains how error reports can help you improve your experience.
---
**Error report** lets you view up-to-the-minute Lua system errors and warnings for both server and client. Monitor your error report before and after updating your experience to identify potential issues early.
-## View your error report
+## Viewing Your Error Report
To view your experience's error report:
- Navigate to your [Creations](https://create.roblox.com/dashboard/creations) page in the **Creator Dashboard** and select your experience.
- Select **Error Report**.
-You can view analytics for individual or group owned experience. To view the latter, you need to have [group permissions for analytics](../../production/analytics/analytics-dashboard.md).
+You can view analytics for individual or group owned experience. To view the latter, you need to have [group permissions for analytics](../../production/analytics/analytics-dashboard.md#granting-group-permission).
-## Monitor errors and warnings
+## Monitoring Errors and Warnings
You can apply the following filters and toggles to your error report:
@@ -30,7 +30,7 @@ Below the filters and toggles, a chart displays the numbers of errors and warnin
Errors and warnings shown over time by category.
-## Troubleshoot errors and warnings
+## Troubleshooting Errors and Warnings
The Errors and Warnings table has the following columns:
@@ -46,11 +46,11 @@ The Errors and Warnings table has the following columns:
The error report table.
-
View the stack trace for an error or warning
+
Viewing the stack trace for an error or warning
If you see a dropdown on an error or warning, click to expand it and see its corresponding _stack trace_. A stack trace is a list of the calls that your experience was performing when the exception was thrown. This can help you figure out what's going wrong.
-
Error and warning limits
+
Error and Warning limits
The error report can report up to 500 unique errors and 500 unique warnings at a time. The report drops any unique warnings after this limit and resets every 6 hours. To maximize the number of errors and warnings you can log, consider removing unique identifiers such as:
@@ -58,7 +58,7 @@ The error report can report up to 500 unique errors and 500 unique warnings at a
- X, Y, Z location coordinates
- Asset IDs
-## Resolve errors and warnings
+## Resolving Errors and Warnings
To resolve errors and warnings, consider the following debugging steps:
diff --git a/content/en-us/production/analytics/event-types.md b/content/en-us/production/analytics/event-types.md
index cd17f4c13..c2ec47441 100644
--- a/content/en-us/production/analytics/event-types.md
+++ b/content/en-us/production/analytics/event-types.md
@@ -1,5 +1,5 @@
---
-title: Event types
+title: Event Types
description: Overview of using event types to track user sources, sinks and milestones in your experience.
---
@@ -7,11 +7,11 @@ description: Overview of using event types to track user sources, sinks and mile
Event types help you identify opportunities to grow and monetize your experience. They allow you to **integrate event tracking in your experience** and visualize your in-experience economy and player usage patterns on the Analytics dashboard
-Once you begin tracking these events from your experience using the `Class.AnalyticsService`, you'll unlock new [economy](./economy-events.md), [funnel](./funnel-events.md), and [custom](./custom-events.md) dashboards under Analytics on the Creator Dashboard. You can use these dashboards to identify growth opportunities and segment users by age, gender, platform, OS and custom fields. All of these features are **free to use**.
+Once you begin tracking these events from your experience using the `Class.AnalyticsService`, you'll unlock new [Economy](./economy-events.md), [Funnel](./funnel-events.md), and [Custom](./custom-events.md) dashboards under Analytics on the Creator Dashboard. You can use these dashboards to identify growth opportunities and segment users by age, gender, platform, OS and custom fields. All of these features are **free to use**.
-## Event types
+## Event Types
Roblox provides three sets of analytic dashboards you can use to track different aspects of your experience:
@@ -35,11 +35,11 @@ Roblox provides three sets of analytic dashboards you can use to track different
- **User Behavior** — What is the most frequently used ability on each map?
- **Core Loop** — How do kill/death ratios compare across different weapons?
-For more information on setting up these dashboards, see [Economy events](./economy-events.md), [Funnel events](./funnel-events.md) and [Custom events](./custom-events.md).
+For more information on setting up these dashboards, see [Economy Events](./economy-events.md), [Funnel Events](./funnel-events.md) and [Custom Events](./custom-events.md).
-## Validate your event tracking
+## Validating Your Event Tracking
-Once you add [economy](./economy-events.md), [funnel](./funnel-events.md), or [custom](./custom-events.md) events to your experience, charts on the respective pages typically take 24 hours to appear. In the meantime, you can check if events are set up correctly using the **View Events** tool:
+Once you add [Economy](./economy-events.md), [Funnel](./funnel-events.md), or [Custom](./custom-events.md) events to your experience, charts on the respective pages typically take 24 hours to appear. In the meantime, you can check if events are set up correctly using the **View Events** tool:
1. Navigate to the **Economy**, **Funnel**, or **Custom** pages of your Analytics dashboard for your experience.
2. Click the **View Events** button at the top of each page. A near real-time list of the most recent events displays.
@@ -49,7 +49,7 @@ Once you add [economy](./economy-events.md), [funnel](./funnel-events.md), or [c
You can also visit your experience's [error report](./error-report.md) to see if there are any errors with your event tracking.
-## Event tracking limitations
+## Event Tracking Limitations
The following limitations apply when tracking your events with `Class.AnalyticsService`:
@@ -65,7 +65,7 @@ For example, instead of tracking `WarriorXP`, `MageXP`, `PaladinXP` as separate
**Limitation**
-
**Maximum value**
+
**Maximum Value**
**Examples**
diff --git a/content/en-us/production/analytics/funnel-events.md b/content/en-us/production/analytics/funnel-events.md
index 527cced2d..d807615b1 100644
--- a/content/en-us/production/analytics/funnel-events.md
+++ b/content/en-us/production/analytics/funnel-events.md
@@ -1,5 +1,5 @@
---
-title: Funnel events
+title: Funnel Events
description: Use funnel events to visualize user progression through key milestones in your experience.
---
@@ -11,7 +11,7 @@ description: Use funnel events to visualize user progression through key milesto
Once your experience begins tracking Funnel events, you'll unlock the Funnel page of the Analytics dashboard on the Creator Hub. You can add tabs to the dashboard for up to ten funnels.
-## Track funnel events
+## Tracking Funnel Events
To track funnel events, first identify the most important funnels in your experience and segment them into steps. Your onboarding flow is a great place to start, as this is where you may be losing most of your users.
@@ -19,7 +19,7 @@ To track funnel events, first identify the most important funnels in your experi
Events can only be sent from the server and in published experiences. Events can't be sent from the client or Studio.
-### Track one-time funnels
+### Tracking One-Time Funnels
A one-time funnel monitors conversion events that only occur once per user.
@@ -43,7 +43,7 @@ AnalyticsService:LogOnboardingFunnelStepEvent(
)
```
-### Track recurring funnels
+### Tracking Recurring Funnels
A recurring funnel monitors conversion events that occur multiple times per user.
@@ -85,15 +85,15 @@ AnalyticsService:LogFunnelStepEvent(
)
```
-### Implement funnelSessionId
+### Implementing funnelSessionId
When implementing funnels, a `funnelSessionId` can help you track your events but may not be required in every instance. Use the following guidelines:
- **One-Time Funnels** - You don't need to use `funnelSessionId` for one-time funnels because they only occur once per user.
-- **Store Funnels** - Use `funnelSessionId` to distinguish between different sessions of the same user in a recurring funnel, such as opening the shop multiple times in a single session in the [earlier example](#track-recurring-funnels). In cases like this, where the player may open the shop multiple times in a single session, it is recommended to use a GUID as the `funnelSessionId`.
+- **Store Funnels** - Use `funnelSessionId` to distinguish between different sessions of the same user in a recurring funnel, such as opening the shop multiple times in a single session in the [earlier example](#tracking-recurring-funnels). In cases like this, where the player may open the shop multiple times in a single session, it is recommended to use a GUID as the `funnelSessionId`.
- **Item Upgrades** - Use `funnelSessionId` to distinguish between different item upgrade paths, generally over a longer time period than a single play session. Rather than use a GUID as in the store funnel case, you can often build a unique key based on the item being upgraded, for example: `-`.
-## Initial step
+## Initial Step
Funnels start when the first step is logged. If you want to start a funnel immediately on player join, you'll need to log the first step on the `PlayerAdded` event.
@@ -110,17 +110,17 @@ Players.PlayerAdded:Connect(function(player)
end)
```
-## Repeated steps
+## Repeated Steps
If a user repeats a step in a funnel, the funnel only considers the first instance of the step. For example, if a user logs step 2 of a funnel twice, the funnel only counts the first instance of step 2.
-## Skipped steps
+## Skipping Steps
If for some reason you skip a step in funnel, the earlier steps automatically complete.
For example, if you have a funnel with steps 1, 2, and 3. If you log step 3 without logging steps 1 or 2, the funnel will consider steps 1 and 2 as completed.
-## Use funnel filters
+## Using Funnel Filters
Roblox provides filters to help you analyze your funnel data. These include player data, device data, and you can send custom data as well. In some cases, a player's status may change during the funnel, such as when the player switches devices from mobile to desktop.
@@ -128,7 +128,7 @@ To avoid double-counting funnels, filters always **only apply to the first step*
Similarly, funnels display by cohort, meaning that if a player enters the funnel on 6/19, the funnel will be attributed to the 6/19 cohort even if they complete the funnel on 6/20.
-## Modify funnels
+## Modifying Funnels
After you make an update to your funnel steps, it's important to set the correct date range to see the latest funnel. If the current date is 6/21 and you updated step 2 of your onboarding funnel on 6/14, you should set the date range to 6/14 – 6/21 to view the latest funnel.
@@ -136,7 +136,7 @@ If you select a date range that includes a funnel step update, a warning display
-## Protect your funnels from exploiters
+## Protecting your Funnels From Exploiters
In order to keep your data clean, it is important to add some level of data validation in your server code to prevent exploiters from sending invalid data to your analytics service.
@@ -176,7 +176,7 @@ end
onboardingEvent.OnServerEvent:Connect(onPlayerEventFired)
```
-## Use custom fields
+## Using Custom Fields
Funnel events also allow breaking down on custom fields to support easier comparison between segments. For example, you can track which starter car gives players the best progression, or attach different maps to see if a certain map has a better game loop than others.
@@ -184,7 +184,7 @@ Funnel events also allow breaking down on custom fields to support easier compar
For more information, see [custom fields](./custom-fields.md).
-## Use funnels to grow your experience
+## Using Funnels to Grow Your Experience
One of the most important funnels to track is onboarding because many experiences struggle with new user retention and engagement.
diff --git a/content/en-us/production/analytics/index.md b/content/en-us/production/analytics/index.md
index 87475e70c..e69d04982 100644
--- a/content/en-us/production/analytics/index.md
+++ b/content/en-us/production/analytics/index.md
@@ -5,7 +5,7 @@ description: An overview of analytics features to track an experience's growth,
Roblox offers a variety of analytics features to help you chart your experience's growth, track user behavior and retention, and find opportunities for optimization. You can use analytics to understand what actions you can take to grow your experience.
-## Grow your experience with analytics
+## Growing Your Experience with Analytics
Consider following this 3-step plan to use analytics to grow your experience:
@@ -72,7 +72,7 @@ Your similar experience benchmarks are updated daily. Roblox does not use these
- Monitor the analytics of multiple experiences at once
- Track avatar item sales and revenue
-### Monitor experiences
+### Monitoring Experiences
You can monitor the analytics of up to nine Roblox experiences by putting them into a **watchlist**. If you have analytics permissions for the experience, your watchlist provides the following analytics at a glance:
@@ -97,9 +97,9 @@ Watchlists are applied on the account level, are private, and persist when toggl
Experience watchlist on Analytics Home.
-Clicking on an experience you're monitoring takes you to the experience overview page. If applicable, [analytics insights](#analytics-insights) offer direction on next steps and redirect you to applicable documentation and relevant analytics.
+Clicking on an experience you're monitoring takes you to the experience overview page. If applicable, [Analytics Insights](#analytics-insights) offer direction on next steps and redirect you to applicable documentation and relevant analytics.
-### Track avatar sales and revenue
+### Tracking Avatar Sales and Revenue
Avatar items you've sold automatically appear within the **Avatar Items** tab. Here, you can:
@@ -112,7 +112,7 @@ Avatar items you've sold automatically appear within the **Avatar Items** tab. H
Avatar Items on Analytics Home.
-## Analytics insights
+## Analytics Insights
In each experience's overview page, there are insights that highlight major weekly changes in key metrics and areas of improvement.
@@ -122,7 +122,7 @@ For example, the insight below shows that your revenue declined 21%, but similar
-### Achievement panel
+### Achievement Panel
Your achievement panel highlights key metric milestones that you've reached over the past 6 months. This insight is meant to help you celebrate progress when a metric has reached a six month high. Note that if a metric is at a six month high but below benchmark comparisons, you should still continue to improve it.
@@ -130,4 +130,4 @@ Your achievement panel highlights key metric milestones that you've reached over
-For more information on how analytics works, see [Analytics dashboard](../../production/analytics/analytics-dashboard.md). For more information on how to use analytics to optimize your experience's design, see [Analytics essentials](../../production/game-design/analytics-essentials.md).
+For more information on how analytics works, see [Analytics Dashboard](../../production/analytics/analytics-dashboard.md). For more information on how to use analytics to optimize your experience's design, see [Analytics Essentials](../../production/game-design/analytics-essentials.md).
diff --git a/content/en-us/production/analytics/monetization.md b/content/en-us/production/analytics/monetization.md
index 5ed8bab25..ae6436be5 100644
--- a/content/en-us/production/analytics/monetization.md
+++ b/content/en-us/production/analytics/monetization.md
@@ -9,7 +9,7 @@ description: Explains how to improve monetization metrics for your experience.
**Monetization** measures your experience's ability to generate revenue.
-## View monetization metrics
+## Viewing Monetization Metrics
To view your experience's monetization analytics:
@@ -18,7 +18,7 @@ To view your experience's monetization analytics:
2. In the **Monetization** menu, select **Overview**.
-You can view analytics for individual or group owned experience. To view the latter, you need to have [group permissions for analytics](../../production/analytics/analytics-dashboard.md#grant-group-permission).
+You can view analytics for individual or group owned experience. To view the latter, you need to have [group permissions for analytics](../../production/analytics/analytics-dashboard.md#granting-group-permission).
On the monetization page, you can see the following metrics:
@@ -32,14 +32,14 @@ On the monetization page, you can see the following metrics:
From there, you can explore data for each monetization product:
-- [Developer products](../monetization/developer-products.md#developer-product-analytics)
+- [Developer Products](../monetization/developer-products.md#developer-product-analytics)
- [Passes](../monetization/game-passes.md#passes-analytics)
-- [Avatar items](../monetization/avatar-items.md#avatar-items-analytics)
+- [Avatar Items](../monetization/avatar-items.md#avatar-items-analytics)
- [Subscriptions](../monetization/subscriptions.md#subscription-analytics)
-- [Immersive ads](../monetization/immersive-ads.md#view-immersive-ad-metrics)
-- [Engagement payouts](../monetization/engagement-based-payouts.md#access-payout-data)
+- [Immersive Ads](../monetization/immersive-ads.md#viewing-immersive-ad-metrics)
+- [Engagement Payouts](../monetization/engagement-based-payouts.md#accessing-payout-data)
-## Improve revenue
+## Improving Revenue
Here are some high level tips for growing your revenue:
@@ -52,7 +52,7 @@ Devote as much creativity and attention to your storefront as you do to the rest
-## Improve payer conversion rate
+## Improving Payer Conversion Rate
Payer conversion measures the percent of your users who engage with your paid features or content.
@@ -64,7 +64,7 @@ To improve this metric:
-## Improve average revenue per paying user (ARPPU)
+## Improving Average Revenue per Paying User (ARPPU)
ARPPU measures the spending behavior of your repeat purchasers.
@@ -74,7 +74,7 @@ To improve this metric:
2. **Provide a variety of purchasable items**. If you only have a limited number of sales items available, users might not have anything new to purchase even if they're interested in buying something new. You can find your top-selling items and expand those offerings to provide more options for users.
3. **Add seasonal items**. Seasonal items can create a sense of fun and excitement around particular holidays or real-world events.
-## Improve average revenue per daily active users (ARPDAU)
+## Improving Average Revenue per Daily Active Users (ARPDAU)
ARPDAU is a combination of your payer conversion rate and your ARPPU.
diff --git a/content/en-us/production/analytics/performance.md b/content/en-us/production/analytics/performance.md
index 0946be3c5..762ec356a 100644
--- a/content/en-us/production/analytics/performance.md
+++ b/content/en-us/production/analytics/performance.md
@@ -1,5 +1,5 @@
---
-title: Performance dashboard
+title: Performance Dashboard
description: Explains how to improve performance analytics metrics for your experience.
---
@@ -7,16 +7,16 @@ The **Performance** dashboard provides up-to-the-minute client and server metric

-## Access the dashboard
+## Accessing the Dashboard
-To access the Performance page, you must either be the experience owner or have [analytics group permissions](../../production/analytics/analytics-dashboard.md#grant-group-permission).
+To access the Performance page, you must either be the experience owner or have [analytics group permissions](../../production/analytics/analytics-dashboard.md#granting-group-permission).
1. Navigate to the [Creations](https://create.roblox.com/dashboard/creations) page on the **Creator Hub**.
2. Under the **Creator Hub** dropdown, select your account or the group that owns the experience.
3. Select the experience.
4. In the **Monitoring** dropdown, select **Performance**.
-## Use the dashboard
+## Using the Dashboard
The dashboard begins with the current number of users, the number of servers they are spread across, and a device breakdown. For the dashboard to show client and server **charts** like the ones below, your experience must have at least 100 daily active users (DAU).
@@ -38,7 +38,7 @@ When reviewing charts or filtering:
Percentile values are calculated smallest to largest, so for metrics where lower numbers are better (e.g. server CPU time), P10 represents the "best case" and P90 the "worst case" rather than the other way around.
-## Client charts
+## Client Charts
The **Client** tab includes the following charts, all of which are broken down by platform or operating system:
@@ -77,7 +77,7 @@ The **Client** tab includes the following charts, all of which are broken down b
-## Server charts
+## Server Charts
The **Server** tab includes the following charts:
@@ -126,7 +126,7 @@ If a category is higher than usual or appears to be taking up a disproportionate
To exclude a group or process from a chart, click its label in the legend.
-- CPU categories and tasks map to the ones in the [MicroProfiler](../../studio/microprofiler/index.md), so you can take [server dumps](../../studio/microprofiler/index.md#profile-the-server), select **Timers** mode, and then use the **Groups** menu to filter by the problematic process group.
+- CPU categories and tasks map to the ones in the [MicroProfiler](../../studio/microprofiler/index.md), so you can take [server dumps](../../studio/microprofiler/index.md#profiling-the-server), select **Timers** mode, and then use the **Groups** menu to filter by the problematic process group.
For example, if you spot a potential problem with the **assemble** process under the **Physics** group, you can find it under the same name in the MicroProfiler:
@@ -141,7 +141,7 @@ To exclude a group or process from a chart, click its label in the legend.
If you spot a potential problem, use the following steps to remediate and fix it:
1. Check your recent updates and consider rolling them back if the impact to metrics is severe.
-2. See [Identify performance issues](../../performance-optimization/identify.md) and [Improve performance](../../performance-optimization/improve.md) for information on troubleshooting problems with server compute, client compute, and memory usage.
+2. See the [Identifying Performance Issues](../../performance-optimization/identifying.md) and [Improving Performance](../../performance-optimization/improving.md) for information on troubleshooting problems with server compute, client compute, and memory usage.
3. Use built-in testing tools to further drill down on problems:
- [Developer Console](../../studio/developer-console.md) for viewing error and log messages and detailed information on memory and networking.
diff --git a/content/en-us/production/analytics/retention.md b/content/en-us/production/analytics/retention.md
index ac7da35ae..871fa6897 100644
--- a/content/en-us/production/analytics/retention.md
+++ b/content/en-us/production/analytics/retention.md
@@ -9,20 +9,20 @@ description: Explains how to improve retention metrics for your experience.
**Retention** measures how many users return to your experience after their first visit in 1 day, 7 days, and 30 days.
-## View retention metrics
+## Viewing Retention Metrics
To view your experience's retention analytics:
1. Navigate to your [Creations](https://create.roblox.com/dashboard/creations) page on **Creator Dashboard** and select your experience.
1. In the **Analytics** menu on the left, select **Retention**.
-You can view analytics for individual or group owned experience. To view the latter, you need to have [group permissions for analytics](../../production/analytics/analytics-dashboard.md).
+You can view analytics for individual or group owned experience. To view the latter, you need to have [group permissions for analytics](../../production/analytics/analytics-dashboard.md#granting-group-permission).
-## Improve day 1 retention
+## Improving Day 1 Retention
Day 1 retention is the percentage of new users who come back to your experience after visiting it for the first time. To improve this metric, focus on your experience's **core loop**, **first-time user experience**, and **performance**.
-### Core loop
+### Core Loop
Core loop is the actions that users repeat in your experience to make progress in a single session.
@@ -39,9 +39,9 @@ The following example is one path to improve your core loop:
-To learn more on how to design core loops, see [Core loops](../../production/game-design/core-loops.md).
+To learn more on how to design core loops, see [Core Loops](../../production/game-design/core-loops.md).
-### First-time user experience
+### First-time User Experience
**First-time user experience (FTUE)** is how new users experience your core loop for the first time. To improve your FTUE:
@@ -77,11 +77,11 @@ To learn more on how to design your FTUE, see [Onboarding](../../production/game
2. **Monitor crash rates, frame rates, and errors** each time you update your experience.
3. **Set up a user community** that can help identify bugs and crashes.
-## Improve day 7 retention
+## Improving Day 7 Retention
Day 7 retention is the percentage of new users who come back to your experience after visiting it for the first time on the 8th day (Day 7). To improve this metric, focus on your experience's **progression system**.
-### Progression system
+### Progression System
Progression system is how users accomplish goals and gain rewards in your experience, such as leveling up and unlocking new content. To build a healthy progression system:
@@ -103,11 +103,11 @@ You can use analytics to improve your progression system:
-## Improve day 30 retention
+## Improving Day 30 Retention
Day 30 retention is the percentage of new users who come back to your experience after visiting it for the first time on the 31st day (Day 30). To improve this metric, focus on your experience's ending system.
-### Ending system
+### Ending System
Ending system is what's available to users after they've completed the main objectives of your experience or reached higher levels. To improve it:
diff --git a/content/en-us/production/creator-store.md b/content/en-us/production/creator-store.md
index 1338bc920..103512112 100644
--- a/content/en-us/production/creator-store.md
+++ b/content/en-us/production/creator-store.md
@@ -5,13 +5,13 @@ description: The Creator Store is where you can find all assets for public use i
The **Creator Store** features assets made by Roblox and the Roblox community for the community to use within their experiences, including models, images, meshes, audio, fonts, videos, and plugins.
-You can create and distribute models, images, meshes, plugins, and audio sound effects under 10 seconds to the Creator Store for others to use as long as you are the original creator, and it adheres to Roblox's [Community Rules][CommunityRulesURL] and [Terms of Use][TermsUseURL]. If you have a [seller account](./sell-on-creator-store.md), you can also sell your plugins to other creators.
+You can create and distribute models, images, meshes, plugins, and audio sound effects under 10 seconds to the Creator Store for others to use as long as you are the original creator, and it adheres to Roblox's [Community Rules][CommunityRulesURL] and [Terms of Use][TermsUseURL]. If you have a [seller account](./selling-on-creator-store.md), you can also sell your plugins to other creators.
To maintain community safety, Roblox may terminate accounts that publish spam or assets with malicious or obfuscated code.
-## Asset moderation
+## Asset Moderation
Roblox performs both human and automated asset moderation on a proactive and reactive basis to ensure assets adhere to the [Community Rules][CommunityRulesURL], [Terms of Use][TermsUseURL], and [Digital Millennium Copyright Act](../production/publishing/dmca-guidelines.md) (DMCA). If any asset violates these moderation policies, such as including discriminatory or adult content, the moderation team flags and removes the asset to protect users from harmful or non-compliant content. This process generally happens within a few hours after you upload the asset.
@@ -25,7 +25,7 @@ In addition, the Creator Store **restricts** use of the following practices to e
These policies only apply to assets on the Creator Store, **not** private models or scripts inside experiences.
-## Open the Creator Store
+## Opening Creator Store
To open the Creator Store:
@@ -39,7 +39,7 @@ To open the Creator Store:
-## Find assets
+## Finding Assets
With millions of assets available, it's helpful to narrow the search results to find exactly what you are looking for. To find a specific asset:
@@ -56,7 +56,7 @@ The Creator Store curates a selection of assets according to your filters.
-### Community ratings
+### Community Ratings
In addition to the Creator Store's filters, you can view an asset's community approval when you hover over its tile. There are four asset community ratings:
@@ -65,14 +65,14 @@ In addition to the Creator Store's filters, you can view an asset's community ap
- **Yellow** - The asset has moderate community confidence.
- **Green** - The asset has high community confidence.
-### Trusted reviews
+### Trusted Reviews
Users can now leave reviews on Creator Store assets in addition to the currently available thumbs up or down ratings. To improve reliability and ensure authentic feedback, only users that acquire the asset are able to submit reviews. After submitting a review:
- Asset creators can respond to reviews, closing the feedback loop.
- The community can mark reviews as helpful for future users.
-## Add assets to experiences
+## Adding Assets to Experiences
To add an asset to your experience from the [Toolbox](../projects/assets/toolbox.md), click it or drag‑and‑drop it into the 3D viewport.
@@ -84,7 +84,7 @@ To add an asset to your experience from the [Toolbox](../projects/assets/toolbox
Some assets include scripts that perform specific actions, such as animating at runtime or triggering a sound. If you want to use an asset without allowing any of its scripts to run, right-click the object in the [Explorer](../studio/explorer.md) window and select **Disable Scripts** from the context menu.
-## Verify your account
+## Verifying Your Account
In addition to being able to distribute more of each asset type, verifying your account ensures that you are eligible to distribute audio assets under 10 seconds, and that your assets are visible to creators, as the default option for discoverability for assets on the Creator Store is reserved for verified accounts. In order to verify your account, you must:
@@ -92,15 +92,15 @@ In addition to being able to distribute more of each asset type, verifying your
- Have a government-issued photo ID with your picture on it, such as a driver's license, passport, or residency permit.
- Have a mobile device with a camera that can take photos of your face and ID.
-For information on how to verify your account either through a government-issued ID or through a phone number, see [Account verification](../production/publishing/account-verification.md).
+For information on how to verify your account either through a government-issued ID or through a phone number, see [Account Verification](../production/publishing/account-verification.md).
-**Phone number verification is not sufficient** to sell priced assets on the Creator Store. To sell priced assets, you need to verify with a [government ID](./publishing/account-verification.md#verify-through-government-id) and create a seller account. For more information, see [Sell on the Creator Store](./sell-on-creator-store.md).
+**Phone number verification is not sufficient** to sell priced assets on the Creator Store. To sell priced assets, you need to verify with a [government ID](./publishing/account-verification.md#verifying-through-government-id) and create a seller account. For more information, see [Selling on the Creator Store](./selling-on-creator-store.md).
-## Distribute and sell assets
+## Distributing and Selling Assets
Distributing to the Creator Store is the only way to make your assets publicly available to all users to use within their own experiences in Studio. You can distribute any mesh or image that you have imported through the [Asset Manager](../projects/assets/manager.md), or any [model](../parts/models.md), [plugin](../studio/plugins.md), or [audio asset](../sound/assets.md) sound effect under 10 seconds that you have uploaded to your inventory.
@@ -110,10 +110,10 @@ Every asset that you import must adhere to the [Community Rules][CommunityRulesU
-
Mesh assets
-
Image assets
-
Model assets
-
Audio assets
+
Mesh Assets
+
Image Assets
+
Model Assets
+
Audio Assets
Plugins
@@ -137,16 +137,16 @@ Every asset that you import must adhere to the [Community Rules][CommunityRulesU
-You can also choose to **sell** plugins on the Creator Store for **United States Dollars**. Roblox offers a market-leading revenue share for these sales, as only taxes and payment processing fees are deducted. Note that you can only set USD pricing for plugins through the Creator Dashboard. For more information, see [Sell on the Creator Store](./sell-on-creator-store.md).
+You can also choose to **sell** plugins on the Creator Store for **United States Dollars**. Roblox offers a market-leading revenue share for these sales, as only taxes and payment processing fees are deducted. Note that you can only set USD pricing for plugins through the Creator Dashboard. For more information, see [Selling on the Creator Store](./selling-on-creator-store.md).
### Through Creator Dashboard
To distribute an asset through the [Creator Dashboard](https://create.roblox.com/dashboard/creations):
-1. In the horizontal navigation, select [Development Items](https://create.roblox.com/dashboard/creations?activeTab=Model). All assets you have [previously imported](../projects/assets/manager.md#import-assets) display within their respective category.
+1. In the horizontal navigation, select [Development Items](https://create.roblox.com/dashboard/creations?activeTab=Model). All assets you have [previously imported](../projects/assets/manager.md#importing-assets) display within their respective category.
1. Select the asset that you want to distribute. The asset's **Configure** page displays.
1. In the **Settings** section, enable the **Distribute on Creator Store** toggle.
-1. **(Optional)** If you have a [seller account](./sell-on-creator-store.md) and are distributing a plugin, set a price in USD for the asset in the **USD Pricing** field. If you keep the default value of **Free**, the asset will be free to all creators.
+1. **(Optional)** If you have a [seller account](./selling-on-creator-store.md) and are distributing a plugin, set a price in USD for the asset in the **USD Pricing** field. If you keep the default value of **Free**, the asset will be free to all creators.
1. **(Optional)** If you are [ID or phone verified](../production/publishing/account-verification.md), add up to 5 supplementary thumbnails for your asset.
1. Click the **Save** button.
1. If you are distributing an audio asset for the first time, enable all legal agreements, then click the **Submit** button.
@@ -155,20 +155,20 @@ The asset will become public and visible to everyone within the Creator Store, p
### Through Studio
-You can upload assets directly in Studio from the [Toolbox](../projects/assets/toolbox.md) or [Explorer](../studio/explorer.md) window. However, you must complete the process on the [Creator Dashboard](#through-creator-dashboard) to list an asset for sale on the Creator Store, distribute audio assets under 10 seconds, or set a [USD price](./sell-on-creator-store.md) for a plugin.
+You can upload assets directly in Studio from the [Toolbox](../projects/assets/toolbox.md) or [Explorer](../studio/explorer.md) window. However, you must complete the process on the [Creator Dashboard](#through-creator-dashboard) to list an asset for sale on the Creator Store, distribute audio assets under 10 seconds, or set a [USD price](./selling-on-creator-store.md) for a plugin.
Assuming the asset is in your [inventory](../projects/assets/toolbox.md#inventory) and you want to distribute it in the Creator Store:
-1. In the [Toolbox](../projects/assets/toolbox.md), select the **Creations** tab. All assets you have [previously imported](../projects/assets/manager.md#import-assets) display within the chosen category.
+1. In the [Toolbox](../projects/assets/toolbox.md), select the **Creations** tab. All assets you have [previously imported](../projects/assets/manager.md#importing-assets) display within the chosen category.
2. Right-click the asset you'd like to distribute and select **Edit Asset**.
3. In the **Asset Configuration** window that opens, confirm and/or update asset details such as **Title** and **Description**.
4. Click **Save**. Once the asset has uploaded, click the dashboard link formatted as `https://create.roblox.com/dashboard/creations/store/.../configure`.
-5. In the browser window that opens, follow the instructions [through the Creator Dashboard](#through-creator-dashboard).
+5. In the browser window that opens, follow the instructions above in [Through Creator Dashboard](#through-creator-dashboard).
@@ -182,7 +182,7 @@ To upload an asset from the [Explorer](../studio/explorer.md) and distribute it
3. If you need to **overwrite** a previously-uploaded asset with a new version, click **Overwrite an existing asset...** in the bottom-left of the configuration window.
4. Click **Save**. Once the asset has uploaded, click the dashboard link formatted as `https://create.roblox.com/dashboard/creations/store/.../configure`.
-5. In the browser window that opens, follow the instructions [through the Creator Dashboard](#through-creator-dashboard).
+5. In the browser window that opens, follow the instructions above in [Through Creator Dashboard](#through-creator-dashboard).
diff --git a/content/en-us/production/earn-on-roblox.md b/content/en-us/production/earning-on-roblox.md
similarity index 85%
rename from content/en-us/production/earn-on-roblox.md
rename to content/en-us/production/earning-on-roblox.md
index 385471b73..c41fd20c1 100644
--- a/content/en-us/production/earn-on-roblox.md
+++ b/content/en-us/production/earning-on-roblox.md
@@ -1,19 +1,19 @@
---
-title: Earn on Roblox
+title: Earning on Roblox
description: Explains how Roblox's economy and virtual currency works.
---
Roblox's goal is to enable the creation of anything, anywhere, by anyone, and we are constantly investing in new tools and services to empower our creator community. We give our creators, from an individual to a large studio, diverse ways to earn on Roblox by creating content and experiences, specifically:
-- [Developing an experience](#develop-an-experience)
- - [In-experience purchases](#in-experience-purchases)
- - [Engagement-based payouts](#engagement-based-payouts)
- - [Immersive ads](#immersive-ads)
-- [Creating, selling, and reselling avatar items](#create-sell-and-resell-avatar-items)
-- [Creating and selling Studio plugins](#create-and-sell-studio-plugins)
-- [Joining the Creator Affiliate Program](#join-the-creator-affiliate-program)
+- [Developing an Experience](#developing-an-experience)
+ - [In-Experience Purchases](#in-experience-purchases)
+ - [Engagement-Based Payouts](#engagement-based-payouts)
+ - [Immersive Ads](#immersive-ads)
+- [Creating, Selling, and Reselling Avatar Items](#creating-selling-and-reselling-avatar-items)
+- [Creating and Selling Studio Plugins](#creating-and-selling-studio-plugins)
+- [Joining the Creator Affiliate Program](#joining-the-creator-affiliate-program)
-This page provides information about different ways to earn on Roblox and how to [convert earned Robux to cash](#convert-earned-robux-to-cash) through the [Developer Exchange][link_developer_exchange] program.
+This page provides information about different ways to earn on Roblox and how to [convert earned Robux to cash](#converting-earned-robux-to-cash) through the [Developer Exchange][link_developer_exchange] program.
@@ -28,7 +28,7 @@ This page provides information about different ways to earn on Roblox and how to
-## Economy powered by creators
+## Economy Powered by Creators
We are building one of the world's largest immersive platforms with 79.5M global daily active users (DAUs) in 16 languages across 190 countries, available across platforms including mobile, desktop, consoles, and VR headsets. In 2023, more than 58% of our daily active users were 13 and over, and users aged 17 and over accounted for 42% of our daily active users. In 2023, our community visited over 13 million experiences, and in the second quarter of 2024 alone, users spent 17.4 billion hours on our platform.
@@ -58,11 +58,11 @@ We are seeing healthy growth across creators and studios of varying sizes. Since
2 Defined as Roblox annual bookings, which measures total economic activity on our platform.3 Of the millions of creators monetizing on Roblox, around 20,000 are part of our Devex program with the median creator receiving $1,645 USD during the twelve months ended June 30, 2024.
-## Develop an experience
+## Developing an Experience
Building successful content takes time and effort, but there is low risk and no upfront cost to building an experience on Roblox. You pay **after** earning on Roblox and we provide the tools, services, and support to help you build the most immersive experiences. Roblox has a robust community and [developer forum](https://devforum.roblox.com/) to guide and support you along the way.
-### No upfront costs; publish globally in seconds
+### No Upfront Costs; Publish Globally in Seconds
Instant publishing to reach a global audience
@@ -84,7 +84,7 @@ With your content live and in front of lots of users, we provide a rapid and ric
On other platforms, you can incur expenses such as storage, hosting, and infrastructure before you earn any money or even start building. On Roblox, developing an experience has minimal risk as you are charged for these expenses after you monetize.
-### Average cash payouts
+### Average Cash Payouts
Our goal is to drive as much money to our creators as possible while maintaining reasonable margins for our company to develop, maintain, and improve the tools and technology that support our community.
@@ -105,7 +105,7 @@ This chart illustrates the estimated utilization of each dollar spent in an expe
-
+
@@ -117,11 +117,11 @@ This chart illustrates the estimated utilization of each dollar spent in an expe
-
+
-
Developers also get extra Robux for simply building an engaging experience through the [engagement-based payouts](../production/monetization/engagement-based-payouts.md) feature. Roblox calculates payout based on the share of time a [Premium][Link_Premium_Membership] subscriber spends in your experience as a way to reward engaging experiences.
+
Developers also get extra Robux for simply building an engaging experience through the [Engagement-Based Payouts](../production/monetization/engagement-based-payouts.md) feature. Roblox calculates payout based on the share of time a [Premium][Link_Premium_Membership] subscriber spends in your experience as a way to reward engaging experiences.
This percentage reflects our platform average, though the actual percent of earnings from EBP varies from experience to experience based on the engagement level in the experience.
We are a platform and therefore we do not make experiences that compete with our creators for these payouts.
@@ -131,7 +131,7 @@ This chart illustrates the estimated utilization of each dollar spent in an expe
-
+
@@ -145,7 +145,7 @@ This chart illustrates the estimated utilization of each dollar spent in an expe
-
+
@@ -157,7 +157,7 @@ This chart illustrates the estimated utilization of each dollar spent in an expe
-
+
@@ -169,7 +169,7 @@ This chart illustrates the estimated utilization of each dollar spent in an expe
-
+
@@ -180,61 +180,61 @@ This chart illustrates the estimated utilization of each dollar spent in an expe
\*29% returned directly to the developers of experiences cents per dollar spent in experience assumes the full amount of Robux earned are exchanged through the DevEx program, and not spent on the platform. Figures are as of March 31, 2024.
-### Experience monetization
+### Experience Monetization
Once you've developed an experience, you can earn through the following methods:
-#### In-experience purchases
+#### In-Experience Purchases
- [Subscriptions](./monetization/subscriptions.md) within experiences offer you the ability to earn from your experience through subscription-based offerings and business models.
-- [Developer products](../production/monetization/developer-products.md) which are items or abilities that a user can purchase, such as in-experience currency.
+- [Developer Products](../production/monetization/developer-products.md) which are items or abilities that a user can purchase, such as in-experience currency.
- [Passes](../production/monetization/game-passes.md) for access to special privileges within an experience, such as entry to a restricted area or a permanent power‑up. When you sell your own passes in your experience, you earn 70% of the Robux spent. You can also sell passes within your experience that were made by other creators; in this case, you earn a 10% affiliate fee on the Robux spent within your experience, and the original creator of the pass earns 60%.
-- [Private servers](../production/monetization/private-servers.md) for users to play with just friends (subscription-based access fees).
+- [Private Servers](../production/monetization/private-servers.md) for users to play with just friends (subscription-based access fees).
-#### Engagement-based payouts
+#### Engagement-Based Payouts
-Developers earn extra Robux for simply building an engaging experience. Roblox calculates an [engagement-based payout](../production/monetization/engagement-based-payouts.md) (EBP) based on the share of time a [Roblox Premium](https://www.roblox.com/premium/membership) subscriber spends in your experience, and these payouts happen automatically as a way to reward engaging experiences.
+Developers earn extra Robux for simply building an engaging experience. Roblox calculates an [Engagement-Based Payout](../production/monetization/engagement-based-payouts.md) (EBP) based on the share of time a [Roblox Premium](https://www.roblox.com/premium/membership) subscriber spends in your experience, and these payouts happen automatically as a way to reward engaging experiences.
-#### Immersive ads
+#### Immersive Ads
-[Immersive ads](../production/monetization/immersive-ads.md) allow developers to place high-quality, native ad units in their experience that will programmatically serve ads. Creators are paid through a revenue share for the video views, impressions, and teleports generated.
+[Immersive Ads](../production/monetization/immersive-ads.md) allow developers to place high-quality, native ad units in their experience that will programmatically serve ads. Creators are paid through a revenue share for the video views, impressions, and teleports generated.
-## Create, sell, and resell avatar items
+## Creating, Selling, and Reselling Avatar Items
Millions of users already visit the [Marketplace][link_marketplace] every day. In December 2023, nearly 71 percent of them spent time editing their avatar, and people have purchased billions of items there, including nearly 1.6 billion digital fashion items during the first nine months of 2023.
-[Eligible](../marketplace/marketplace-policy.md#creator-requirements) creators can [create](../marketplace/publish-to-marketplace.md) and sell [accessories](../art/accessories/index.md), [clothing](../art/accessories/index.md), and [avatar bodies and heads](../art//characters/index.md) in the Marketplace or in their own or other developers' experiences. We have a breadth of ways users can discover and buy your creations, whether through searching the Marketplace or enabling developers to promote and sell your items. Users can purchase your item within an experience using the [Avatar Inspect Menu](../players/avatar-inspect-menu.md) or modules such as [Merch Booth](../resources/modules/merch-booth.md). You can also increase the discoverability of your 3D user-generated content within the Marketplace through [sponsored item](../production/promotion/sponsor-items.md) ads.
+[Eligible](../marketplace/marketplace-policy.md#creator-requirements) creators can [create](../marketplace/publishing-to-marketplace.md) and sell [accessories](../art/accessories/index.md), [clothing](../art/accessories/index.md), and [avatar bodies and heads](../art//characters/index.md) in the Marketplace or in their own or other developers' experiences. We have a breadth of ways users can discover and buy your creations, whether through searching the Marketplace or enabling developers to promote and sell your items. Users can purchase your item within an experience using the [Avatar Inspect Menu](../players/avatar-inspect-menu.md) or modules such as [Merch Booth](../resources/modules/merch-booth.md). You can also increase the discoverability of your 3D user-generated content within the Marketplace through [Sponsored Item](../production/promotion/sponsoring-items.md) ads.
After you pay any applicable upload and publishing fees and submit a new asset for approval, the moderation team reviews your asset and, if approved, you'll be able to publish your asset to the Marketplace.
You receive a commission every time a user purchases your item. When community items are sold in the marketplace, a portion of the sales is split between the item creator and Roblox. If the item is sold within an experience, the revenue share will additionally be split with the owner of the experience who we refer to as an "affiliate." An affiliate earns commission for marketing another user's creations.
-As follows is an overview of our commission structure. To learn more about fees and commissions for the Marketplace, see [Marketplace fees and commissions](../marketplace/marketplace-fees-and-commissions.md).
+As follows is an overview of our commission structure. To learn more about fees and commissions for the Marketplace, see [Marketplace Fees and Commissions](../marketplace/marketplace-fees-and-commissions.md).
-
- Creator of the virtual item receives **30%**
- Affiliate (Roblox) receives **40%**
- Platform receives **30%**
-These commissions also apply to the original sale of [Limiteds](../marketplace/marketplace-fees-and-commissions.md#limiteds). When setting assets on sale, you can [configure](../marketplace/publish-to-marketplace.md#marketplace-settings) your creation as a Limited item to set an available quantity for that asset. Limiteds require a [per-unit fee](../marketplace/marketplace-fees-and-commissions.md#per-unit-fee) and can be [resold](../marketplace/marketplace-fees-and-commissions.md#reselling) by [Roblox Premium](https://www.roblox.com/premium/membership) members. At this time, only Roblox-created Limiteds are tradeable.
+These commissions also apply to the original sale of [Limiteds](../marketplace/marketplace-fees-and-commissions.md#limiteds). When setting assets on sale, you can [configure](../marketplace/publishing-to-marketplace.md#marketplace-settings) your creation as a Limited item to set an available quantity for that asset. Limiteds require a [per-unit fee](../marketplace/marketplace-fees-and-commissions.md#per-unit-fee) and can be [resold](../marketplace/marketplace-fees-and-commissions.md#reselling) by [Roblox Premium](https://www.roblox.com/premium/membership) members. At this time, only Roblox-created Limiteds are tradeable.
-
+
While anyone can buy a Limited item, only Roblox [Premium][link_premium_membership] subscribers can resell them. Every time a creator's Limited item is resold, the creator benefits from a 10% original creator commission on the value of each resale.
@@ -253,11 +253,11 @@ After purchasing a Limited, there is up to a 30‑day holding period when the it
-## Create and sell Studio plugins
+## Creating and Selling Studio Plugins
-You can create and sell Studio [plugins](../studio/plugins.md) to the creator community through the [Creator Store](../production/creator-store.md). A plugin is an extension that adds additional features or functionality to [Roblox Studio](../studio/index.md) and helps improve creator workflows. You can either offer plugins for free or sell them for a minimum of $4.99 USD. Roblox offers a market-leading revenue share for these sales, as only taxes and payment processing fees are deducted. For more information, see [Sell on the Creator Store](../production/sell-on-creator-store.md).
+You can create and sell Studio [plugins](../studio/plugins.md) to the creator community through the [Creator Store](../production/creator-store.md). A plugin is an extension that adds additional features or functionality to [Roblox Studio](../studio/index.md) and helps improve creator workflows. You can either offer plugins for free or sell them for a minimum of $4.99 USD. Roblox offers a market-leading revenue share for these sales, as only taxes and payment processing fees are deducted. For more information, see [Selling on the Creator Store](../production/selling-on-creator-store.md).
-## Join the Creator Affiliate Program
+## Joining the Creator Affiliate Program
To join the Creator Affiliate Program, you must be 13+ and reside in a country supported by the [Developer Exchange][link_developer_exchange] program.
@@ -274,13 +274,13 @@ When a user creates a Roblox account using your affiliate link and then buys Rob
You receive your revenue in Robux, which you can exchange for real-world money through Developer Exchange.
-## Convert earned Robux to cash
+## Converting Earned Robux to Cash
-Once you earn Robux, you can continue to use it in our platform to buy developer assets, plugins, [advertising](../production/promotion/advertise-on-roblox.md), in-experience items, or virtual items. In addition, when you have at least 30,000 earned Robux in your account, you may be eligible to exchange your earned Robux for real currency using the [Developer Exchange][link_developer_exchange] program.
+Once you earn Robux, you can continue to use it in our platform to buy developer assets, plugins, [advertising](../production/promotion/advertising-on-roblox.md), in-experience items, or virtual items. In addition, when you have at least 30,000 earned Robux in your account, you may be eligible to exchange your earned Robux for real currency using the [Developer Exchange][link_developer_exchange] program.
To learn more about strategies to earn Robux, see [Monetization](../production/monetization/index.md).
-## Frequently asked questions
+## Frequently Asked Questions
@@ -293,8 +293,8 @@ Every platform reports their creator share a bit differently. When you compare c
- **The platform may also be competing for engagement and payouts** — Some platforms are actually also creators on their platform and therefore compete with their creators for engagement-based payouts. Roblox does not.
- **Other platform benefits** — Creator shares can be high but consider other benefits that the platform provides such as costs that they are paying on your behalf, the scale and diversity of their audience, the devices/platforms they are available on, the types of creators that are earning, and more.
- **The total size of the payout pool** — Understand the total size of the platform's payout pool. Other platforms may invest less in growing their user base and more on making their products accessible in new markets across the globe. This may allow them to pay developers a higher share, but at the expense of slower growth and less total earnings being put in creators' pockets.
-
-
+
+
diff --git a/content/en-us/production/game-design/analytics-essentials.md b/content/en-us/production/game-design/analytics-essentials.md
index 7dcfbf24a..9db543c0e 100644
--- a/content/en-us/production/game-design/analytics-essentials.md
+++ b/content/en-us/production/game-design/analytics-essentials.md
@@ -1,6 +1,6 @@
---
-title: Analytics essentials
-description: Analytics essentials
+title: Analytics Essentials
+description: Analytics Essentials
---
Roblox offers a variety of analytics features to help you chart your experience's growth, track user behavior and retention, and find opportunities for optimization. You can use analytics to understand what actions you can take to grow your experience.
@@ -13,7 +13,7 @@ Analytics provide a high level overview of your experience's health and surface
For an in-depth look at all the analytics features Roblox offers to help you improve you experience, see [Analytics](../../production/analytics/index.md).
-## Engagement metrics
+## Engagement Metrics
@@ -27,7 +27,7 @@ Engagement metrics reveal how often and for how long players are interacting wit
- **Average session length:** The average session length is how long a player plays your experience on average from the start of their session to the time they log out. This metric helps you design content to fit within that window of time to ensure your experience can be enjoyed by the majority of your players. The average session length also serves as a health metric. If the average session length fluctuates after a significant update or seasonal event, it can inform you how your latest content was received.
-## Retention metrics
+## Retention Metrics
@@ -41,7 +41,7 @@ Retention metrics determine if players are returning to your experience. Three o
- **Day 30 (D30) retention:** D30 retention tracks the amount of players who return to your experience after 30 days. If this number is low, it's often indicative of a lack of end-game content or lack of an end-game goal. Consider if you have enough content at the end of your experience for seasoned players, be it quests, social aspects, or narrative elements.
-## Monetization metrics
+## Monetization Metrics
@@ -53,4 +53,4 @@ Monetization metrics indicate much revenue your experience is generating. Three
- **Conversion rate:** The conversion rate is considered one of the most important metrics. The conversion rate is the percentage of all users who have spent any amount of money at all in your experience. The reason why this is one of the most important metrics is that if a player makes an initial purchase, they are much more likely to make a purchase again in the future. Consider if your monetization practices encourage your players to spend.
- **Average revenue per paying user (ARPPU):** The ARPPU metric tracks the total amount spent for all players in your experience, known as **spend depth**. This tells you if players in your experience are motivated to spend a lot, a little, or somewhere in between. If this number is low, it's often indicative of purchase item value's not being correctly optimized.
-To learn how to design systems that increase all of these metrics and encourage players to spend money in your experience, see [Monetization foundations](../../production/game-design/monetization-foundations.md).
+To learn how to design systems that increase all of these metrics and encourage players to spend money in your experience, see [Monetization Foundations](../../production/game-design/monetization-foundations.md).
diff --git a/content/en-us/production/game-design/balance-virtual-economies.md b/content/en-us/production/game-design/balancing-virtual-economies.md
similarity index 95%
rename from content/en-us/production/game-design/balance-virtual-economies.md
rename to content/en-us/production/game-design/balancing-virtual-economies.md
index 94bb2267c..5e630694c 100644
--- a/content/en-us/production/game-design/balance-virtual-economies.md
+++ b/content/en-us/production/game-design/balancing-virtual-economies.md
@@ -1,5 +1,5 @@
---
-title: Balance virtual economies
+title: Balancing Virtual Economies
description: Balancing Virtual Economies
---
@@ -10,7 +10,7 @@ Virtual economies on Roblox are intricate systems that mimic real-world economie
- Impact estimation
- Resource sinks
-## Data-driven content
+## Data-Driven Content
Using data to understand how players interact with and consume your experience's content is key to maintaining a balanced economy. When building your experience's database, be sure to track:
@@ -23,9 +23,9 @@ Using data to understand how players interact with and consume your experience's
These data points are crucial considerations when planning events. While running events can help keep players engaged between major content updates, it's essential to prioritize data tracking for in-game actions, content consumption, item sales and item usage.
-To learn more about planning and creating events, see [Content updates](content-updates.md) and [LiveOps essentials](liveops-essentials.md).
+To learn more about planning and creating events, see [Content Updates](content-updates.md) and [LiveOps Essentials](liveops-essentials.md).
-## Resource planning
+## Resource Planning
**Resource planning** involves balancing how virtual resources are created and how they're spent. This concept is best illustrated in the fictitious experience _Feline Fishing Fun_, where players fish for their resources. _Feline Fishing Fun_ has the following characteristics:
@@ -37,7 +37,7 @@ To learn more about planning and creating events, see [Content updates](content-
- Trout: `20% chance to catch, 20G`
- Salmon: `10% chance to catch, 30G`
-_Feline Fishing Fun_ developers are planning an event where a special Golden Salmon will become available for 24 hours, with 0.1% chance of being caught, and be worth 1000 Gold. This type of event entices players to fish for a chance to acquire it and integrates smoothly with the experience's [core loop](core-loops.md) of fishing.
+_Feline Fishing Fun_ developers are planning an event where a special Golden Salmon will become available for 24 hours, with 0.1% chance of being caught, and be worth 1000 Gold. This type of event entices players to fish for a chance to acquire it and integrates smoothly with the experience's [Core Loop](core-loops.md) of fishing.
If the developers launch the event without estimating the economic impact of increased fishing, data visualization reveals that the quantity of Gold purchased from the store remains flat, while spending surges. This underestimation of increased fishing leads to a significant surplus of Gold in the virtual economy. As a result, players with abundant Gold spend freely, leaving little incentive to purchase more, which causes a decline in revenue after the event ends.
@@ -46,7 +46,7 @@ If the developers launch the event without estimating the economic impact of inc
An unbalanced event in *Feline Fishing Fun*.
-## Impact estimation
+## Impact Estimation
Estimating the potential impact of an event on an experience's economy is paramount to ensuring balance. A common method to gauge potential impact is through **Expected Value** (EV) calculations.
@@ -74,7 +74,7 @@ Adding up the results, the EV of a single fishing attempt is `7G + 4G + 3G` = `1
While it's impossible to know exactly how many players will participate on a given day of an event, each successive event aids in future estimations. For _Feline Fishing Fun_'s fishing event, when determining the appropriate Gold Salmon value, add it to the EV calculator and compare the resulting EV to the EV of a non-event day. By understanding normal item purchasing pace and the time it takes players to buy useful items, you can determine how much currency is too much.
-## Resource sinks
+## Resource Sinks
A **resource sink** is an economic system designed to remove resources from circulation. When designing new sources of currency, it's imperative to have plans for how to "sink" different quantities of excess currency. Common examples include:
diff --git a/content/en-us/production/game-design/content-updates.md b/content/en-us/production/game-design/content-updates.md
index de247ce83..5551f9d2a 100644
--- a/content/en-us/production/game-design/content-updates.md
+++ b/content/en-us/production/game-design/content-updates.md
@@ -1,6 +1,6 @@
---
-title: Content updates
-description: Content updates
+title: Content Updates
+description: Content Updates
---
@@ -16,7 +16,7 @@ Content releases keep players engaged between larger updates and can be an essen
- Establish a routine
- Prioritize sustainability
-## Choose correct content
+## Choose Correct Content
A content cadence draws on existing gameplay systems to produce small, frequent releases of content. By being simple and relatively easy to produce, these rapid releases can be maintained without becoming an undue burden on the developers. Common examples of a content cadence include:
@@ -71,11 +71,11 @@ The **core loop** is a good place to start in identifying systems to support wit
For more about core loops, see [Core Loops](../../production/game-design/core-loops.md).
-## Manage scope
+## Manage Scope
Scope is the amount of content contained in an update and the hours of work required to produce it. Spending fewer than three weeks' effort on content cadence is recommended in order to maintain a rapid update schedule and leave room for other LiveOps releases. The amount and type of content that can be produced in that time is dependent on each developer's capabilities and priorities.
-## Establish a routine
+## Establish a Routine
Establishing a routine release cadence encourages players to check back often so they don't miss out on new releases. They may begin to anticipate the next release, and even speculate about it on social media, increasing awareness and interest among other players.
@@ -83,7 +83,7 @@ A regular release cadence also creates a beneficial routine for developers. Rele
Determining the appropriate frequency of releases for a game must take into account factors such as the capabilities and availability of the developers, the scope of the planned releases, and player sentiment. In order to maintain player engagement between game expansions, many games release content cadence updates every two weeks to one month.
-## Prioritize sustainability
+## Prioritize Sustainability
To keep players engaged between updates, cadence content should not be immediately consumed by the majority of players,otherwise its purpose is defeated and developers are forced to release more frequently to keep up with demand. Requiring players to earn the content over time extends the life of each release and gives developers space to work on other update types.
@@ -97,11 +97,11 @@ Because content requires time and effort to produce, it's imperative to produce
Games with progression, such as player levels or gated map zones, can use their content cadence to add more permanent content at the end of the progression, where seasoned players are starting to run out of objectives. Those high-level players will appreciate the fresh content that they can play immediately, while newer players will have more content to look forward to reaching in the future.
-### Limited time content
+### Limited Time Content
Limited-time content is content which is available to all players but only for the duration of an event. Players may be required to complete quests, achieve gameplay milestones,or earn event currency that they can exchange for the limited-time items. The limited-time nature of the event drives player engagement, and the objectives are balanced so that most players will require weeks to exhaust the entirety of the content.
-### Season passes
+### Season Passes
A **season pass** system, also known as a battle pass, is a combination of limited-time event and progression system in which players must complete a series of quest objectives to earn item rewards. Season passes can be adapted to most games, offering developers a straightforward framework for designing cadence releases.
@@ -110,4 +110,4 @@ A **season pass** system, also known as a battle pass, is a combination of limit
Season Pass in [*Jailbreak*](https://www.roblox.com/games/606849621/)
-However they choose to deliver their content updates, if developers structure their releases sustainably and keep up with the cadence, players will never be without new content for long. For more about season passes, see [Season pass design](../../production/game-design/season-pass-design.md)
+However they choose to deliver their content updates, if developers structure their releases sustainably and keep up with the cadence, players will never be without new content for long. For more about season passes, see [Season Pass Design](../../production/game-design/season-pass-design.md)
diff --git a/content/en-us/production/game-design/contextual-purchases.md b/content/en-us/production/game-design/contextual-purchases.md
index 770c454a4..e5a36c27a 100644
--- a/content/en-us/production/game-design/contextual-purchases.md
+++ b/content/en-us/production/game-design/contextual-purchases.md
@@ -1,5 +1,5 @@
---
-title: Contextual purchases
+title: Contextual Purchases
description: Contextual Purchases
---
@@ -13,7 +13,7 @@ Approaches to contextual purchases can be divided into the following categories:
- Complementary
- UI
-## In-play
+## In-Play
**In-play** contextual purchases refer to presenting a purchase opportunity when a player is actively participating in an in-experience activity. Carefully consider the timing of any in-play contextual purchases to avoid negatively impacting a player's session.
@@ -32,7 +32,7 @@ Approaches to contextual purchases can be divided into the following categories:
This approach mimics the "continue countdown" option used by traditional arcade games. Make sure that your in-play contextual purchase opportunities account for players having time to finish the entire "buy Robux" purchase flow, which can take several seconds to complete. If it isn't feasible to design gameplay pauses to accommodate these transactions taking place, in-play contextual purchases might not be appropriate for your experience.
-## Pre-play
+## Pre-Play
**Pre-play** contextual purchases refer to presenting a purchase opportunity when a player is waiting to participate in an in-experience activity. This often occurs in instance-based experiences where gameplay occurs in isolated and repeated loops.
diff --git a/content/en-us/production/game-design/core-loops.md b/content/en-us/production/game-design/core-loops.md
index a8201ddcb..f7137e5d2 100644
--- a/content/en-us/production/game-design/core-loops.md
+++ b/content/en-us/production/game-design/core-loops.md
@@ -1,5 +1,5 @@
---
-title: Core loops
+title: Core Loops
description: Core Loops
---
@@ -13,7 +13,7 @@ An experience's **core loop** is the central gameplay through which an entire ex
- Most repeated set of actions
- Progression engine
-## Minute to minute player interaction
+## Minute to Minute Player Interaction
The first step in a core loop is the **minute to minute player interaction**. These constant actions form the baseline for the experience and vary depending on genre.
@@ -24,7 +24,7 @@ In an action RPG, exploration represents the minute to minute player interaction
First step in a core loop in an Action RPG
-## Most repeated set of actions
+## Most Repeated Set of Actions
The second step in a core loop is the **most repeated set of actions**. The minute to minute interaction facilitates these actions, and these are often the defining mechanic of the experience. While experiences might involve multiple action sets, the most frequently repeated actions become part of the experience's core loop.
@@ -35,7 +35,7 @@ In an action RPG, fighting is the most repeated set of actions. As they explore
Second step in a core loop in an Action RPG
-## Progression engine
+## Progression Engine
The third step in a core loop is the **progression engine**, which propels players through the experience. Without a progression system, an experience becomes repetitive, boring, and shallow.
diff --git a/content/en-us/production/game-design/design-for-roblox.md b/content/en-us/production/game-design/designing-for-roblox.md
similarity index 94%
rename from content/en-us/production/game-design/design-for-roblox.md
rename to content/en-us/production/game-design/designing-for-roblox.md
index cee3f656e..6fd65463b 100644
--- a/content/en-us/production/game-design/design-for-roblox.md
+++ b/content/en-us/production/game-design/designing-for-roblox.md
@@ -1,5 +1,5 @@
---
-title: Design for Roblox
+title: Designing for Roblox
description: Explains overall concepts for designing experiences on Roblox.
---
@@ -9,17 +9,17 @@ Roblox is unique, and the expectations and behavior of its user base can be conf
- Designing for the audience
- Designing for the engine
-## Design for behavior
+## Designing for Behavior
Each experience on Roblox exists within the **wider context** of the platform and its catalog, with users often hopping from one experience to another with friends. Always consider the way that user behavior on Roblox reflects this when designing an experience.
-
First time user experience (FTUE)
+
First Time User Experience (FTUE)
Because experiences are so easy to join and leave, FTUEs that get users into the fun quickly tend to do better on Roblox. Lengthy, detailed tutorials are liable to bore users and cause them to bounce off your experience in search of something more immediately engaging. Ensure that any tutorials you do include are as visual as possible to make it easier for less experienced readers. This visual emphasis also simplifies translation.
Be conscious of the norms of your genre. The closer your design patterns and user experience are to the most popular experiences in that genre, the less you have to explain upfront, and the more intuitive your experience becomes to seasoned Roblox users. Bear in mind that users often help each other out and fill in the gaps of what you don't explain explicitly, either through socializing off-platform or through the in-experience chat.
-
Social interaction
+
Social Interaction
Many users treat Roblox as a place to hang out with their friends. Creating an experience conducive to social interaction encourages this kind of engagement and helps to grow your audience as users invite their friends to play with them. You can even make invitations a feature of your gameplay through mechanics such as parties and trading.
@@ -27,26 +27,26 @@ Encouraging social gameplay can also help with **retention**, as users can act a
Users spend a lot of time and money on their avatars and typically want them to be seen by their friends and other users. A common identity across the platform is part of what makes Roblox special, so if you're going to change that for your experience, make sure you have a good reason.
-To learn how to implement custom avatars in your experience, see [Customize avatar appearances](../../characters/appearance.md).
+To learn how to implement custom avatars in your experience, see [Customizing Avatar Appearances](../../characters/appearance.md).
Ensure you don't get in the way of social interaction with your design or monetization strategies. For instance, avoid making private servers prohibitively expensive, as this may discourage groups of friends from playing together.
-To learn how to implement private servers into your experience, see [Private servers](../../production/monetization/private-servers.md).
+To learn how to implement private servers into your experience, see [Private Servers](../../production/monetization/private-servers.md).
-
Tourists and locals
+
Tourists and Locals
In terms of their behavior, it can be helpful when designing to think of Roblox users in two categories:
- **Tourists:** Tourists typically hop from one experience to another, prioritizing variety over depth.
- **Locals:** Locals are more likely to focus on a particular experience or smaller set of experiences. They engage more deeply and typically form almost all an experience's engaged user base.
-Bear in mind that many locals start out as tourists and convert, so don't neglect tourists in your designs and monetization strategies. For more about monetizing your experience, see [Earn on Roblox](../../production/earn-on-roblox.md).
+Bear in mind that many locals start out as tourists and convert, so don't neglect tourists in your designs and monetization strategies. For more about monetizing your experience, see [Earning on Roblox](../../production/earning-on-roblox.md).
-## Design for the audience
+## Designing for the Audience
-Understanding the sometimes surprising expectations of the Roblox audience is essential to designing effectively for them. While Roblox has traditionally had a younger audience, there is a growing opportunity to create experiences that appeal to older Roblox users. For more about the Roblox audience, see [The Roblox user base](../../production/roblox-user-base.md).
+Understanding the sometimes surprising expectations of the Roblox audience is essential to designing effectively for them. While Roblox has traditionally had a younger audience, there is a growing opportunity to create experiences that appeal to older Roblox users. For more about the Roblox audience, see [The Roblox User Base](../../production/roblox-user-base.md).
-
Younger audiences
+
Younger Audiences
Younger users tend to be more interested in exploration, experimentation, and socializing than they are in competition or specific goals. Younger audiences consume content differently, informed by the instant content of social media and YouTube and driven by online interaction with their friends, and Roblox reflects this.
@@ -60,7 +60,7 @@ Weirdness and creativity are a core part of Roblox culture, shaped by the openne
While stunning visuals can help your experience make a good first impression, the most important thing is to make sure it is fun to play. Younger users are often less sensitive to visual fidelity and more likely to stick around if they're having a good time, regardless of how your experience looks.
-
Older audiences
+
Older Audiences
While Roblox's user base was built on its younger audience, that audience is growing older every day. Many experiences are finding increasing levels of success in appealing to older Roblox users, which often involves a greater overlap with the genres and norms common to other platforms.
@@ -78,7 +78,7 @@ Many Roblox users count Roblox and YouTube as their top two content platforms. U
Consider how your experience might work in a streaming context when designing: could a streamer make great, fun content with it? Can they easily involve their friends, or other streamers? Can you make their job easier? For instance, [Brookhaven](https://www.roblox.com/games/4924922222/) has a "Creator Cam" where content creators can hide the UI when they're recording a video. For more about promoting your experience, see [Promoting on Roblox](../../production/promotion/index.md).
-## Design for the engine
+## Designing for the Engine
While Roblox Studio offers a multitude of features for creating ambitious experiences with high-end visuals, it's wise not to lose focus on performance on lower-end devices. Most users play Roblox on mobile devices, and the audience is sensitive to friction and load times, so be conscious of performance in your designs.
@@ -94,7 +94,7 @@ For more information, see the following resources:
The majority of Roblox users play on a mobile device, so it's wise to design your user interfaces (**UI**) and user experience (**UX**) around mobile devices first. If you want to cater to Xbox/PlayStation or Windows/Mac users, bind commonly used actions to shortcuts on a gamepad and specific keys on keyboards.
-For more information, see [Input and camera](../../input/index.md)
+For more information, see [Input and Camera](../../input/index.md)
All Roblox experiences share a few **core UI** elements, such as the chat and player list. Test your own UI regularly to make sure you avoid conflicting with where they sit on the screen, or disable anything you don't want to show. Many experiences share similar UI patterns, such as having inventory slots along the bottom of the screen. Replicating these patterns will ensure experienced Roblox users will intuitively understand how to use your interface.
@@ -102,7 +102,7 @@ Use consistent icons as much as possible, and keep everything as visual as you c
For a detailed discussion of UI and UX principles on Roblox, see [UI and UX](../../production/game-design/ui-ux-design.md).
-
Genre examples
+
Genre Examples
The following table includes descriptions and examples of common genres found in gaming experiences on Roblox. These categories are not exclusive and names are not fixed.
diff --git a/content/en-us/production/game-design/index.md b/content/en-us/production/game-design/index.md
index 1a2724141..c987d2039 100644
--- a/content/en-us/production/game-design/index.md
+++ b/content/en-us/production/game-design/index.md
@@ -1,6 +1,6 @@
---
-title: Design experiences on Roblox
-description: Design experiences on Roblox
+title: Designing Experiences on Roblox
+description: Designing Experiences on Roblox
---
@@ -9,7 +9,7 @@ description: Design experiences on Roblox
A game designer's role is to create an engaging experience for players, retain those players over time, and devise a sustainable monetization model to fund further development. Whether you are a novice game designer or a veteran, Roblox offers a variety of game design resources to help you through the design process.
-## What's new
+## What's New
@@ -36,30 +36,30 @@ A game designer's role is to create an engaging experience for players, retain t
-## Design your experience
+## Design Your Experience
-- [Design for Roblox:](../../production/game-design/design-for-roblox.md) Learn how Roblox is unique as a platform and how to design experiences with these factors in mind.
-- [Core loops:](../../production/game-design/core-loops.md) Learn how to design central gameplay systems to build your experience from the ground up.
+- [Designing for Roblox:](../../production/game-design/designing-for-roblox.md) Learn how Roblox is unique as a platform and how to design experiences with these factors in mind.
+- [Core Loops:](../../production/game-design/core-loops.md) Learn how to design central gameplay systems to build your experience from the ground up.
- [Prototyping:](../../production/game-design/prototyping.md) Learn different prototyping methods for exploring your experience's potential and how they can help bring your vision to life.
-## Build your experience
+## Build Your Experience
- [Onboarding:](../../production/game-design/onboarding.md) Learn how to design an effective onboarding experience to retain as many new players as possible, increase potential concurrent and daily active users, and improve your experience's monetization potential.
-- [Onboarding techniques:](../../production/game-design/onboarding-techniques.md) Learn strategies to help direct players through the onboarding funnel as quickly and seamlessly as possible.
-- [Quest design:](../../production/game-design/introduction-to-quest-design.md) Learn how to effectively design quests, achievements, and dailies to increase engagement and retention in your experiences.
-- [UI and UX design:](../../production/game-design/ui-ux-design.md) Learn how to design user interfaces and how to design an intuitive and engaging experience.
+- [Onboarding Techniques:](../../production/game-design/onboarding-techniques.md) Learn strategies to help direct players through the onboarding funnel as quickly and seamlessly as possible.
+- [Quest Design:](../../production/game-design/introduction-to-quest-design.md) Learn how to effectively design quests, achievements, and dailies to increase engagement and retention in your experiences.
+- [UI and UX Design:](../../production/game-design/ui-ux-design.md) Learn how to design user interfaces and how to design an intuitive and engaging experience.
-## Monetize your experience
+## Monetize Your Experience
-- [Monetization foundations:](../../production/game-design/monetization-foundations.md) Learn monetization best practices and shop design to maximize your experience's monetary growth potential.
-- [Season pass design:](../../production/game-design/season-pass-design.md) Learn how to design season passes for your experiences to deliver new content, promote player retention, and generate revenue.
-- [Subscription design:](../../production/game-design/subscription-design.md) Learn how to design recurring purchases that your players look forward to each month.
-- [Contextual purchases:](../../production/game-design/contextual-purchases.md) Learn how to design compelling and unintrusive purchase opportunities that occur outside an experience's shop.
-- [Balance virtual economies:](../../production/game-design/balancing-virtual-economies.md) Learn best practices to balance virtual economies when introducing new events.
+- [Monetization Foundations:](../../production/game-design/monetization-foundations.md) Learn monetization best practices and shop design to maximize your experience's monetary growth potential.
+- [Season Pass Design:](../../production/game-design/season-pass-design.md) Learn how to design season passes for your experiences to deliver new content, promote player retention, and generate revenue.
+- [Subscription Design:](../../production/game-design/subscription-design.md) Learn how to design recurring purchases that your players look forward to each month.
+- [Contextual Purchases:](../../production/game-design/contextual-purchases.md) Learn how to design compelling and unintrusive purchase opportunities that occur outside an experience's shop.
+- [Balancing Virtual Economies:](../../production/game-design/balancing-virtual-economies.md) Learn best practices to balance virtual economies when introducing new events.
-## Support your experience
+## Support Your Experience
-- [LiveOps essentials:](../../production/game-design/liveops-essentials.md) Learn how to design content that keeps players coming back and enjoying your experience after launch.
-- [LiveOps planning:](../../production/game-design/liveops-essentials.md) Learn how to maintain a dynamic and captivating experience through interweaving the release of two types of content.
-- [Analytics essentials:](../../production/game-design/analytics-essentials.md) Learn how to leverage key performance indicators (KPIs) to identify the health of your experience and potential growth opportunities.
-- [Content updates:](../../production/game-design/content-updates.md) Learn how to design content cadences to keep players engaged between larger experience updates.
+- [LiveOps Essentials:](../../production/game-design/liveops-essentials.md) Learn how to design content that keeps players coming back and enjoying your experience after launch.
+- [LiveOps Planning:](../../production/game-design/liveops-essentials.md) Learn how to maintain a dynamic and captivating experience through interweaving the release of two types of content.
+- [Analytics Essentials:](../../production/game-design/analytics-essentials.md) Learn how to leverage key performance indicators (KPIs) to identify the health of your experience and potential growth opportunities.
+- [Content Updates:](../../production/game-design/content-updates.md) Learn how to design content cadences to keep players engaged between larger experience updates.
diff --git a/content/en-us/production/game-design/introduction-to-quest-design.md b/content/en-us/production/game-design/introduction-to-quest-design.md
index 37d0b2900..95b497b4e 100644
--- a/content/en-us/production/game-design/introduction-to-quest-design.md
+++ b/content/en-us/production/game-design/introduction-to-quest-design.md
@@ -1,5 +1,5 @@
---
-title: Introduction to quest design
+title: Introduction to Quest Design
description: Introduction to Quest Design, achievements, and dailies.
---
@@ -12,7 +12,7 @@ description: Introduction to Quest Design, achievements, and dailies.
Quests are a game mechanic in which players complete objectives in order to earn rewards like items, currency, or badges. Quests provide players with fresh goals and incentives, which can motivate them to play longer and more often, increasing their [engagement](../../production/analytics/engagement.md). They can also reduce boredom and provide a sense of progression and accomplishment that lead to better [retention](../../production/analytics/retention.md).
-## Quest structure
+## Quest Structure
Structurally, quests consist of three components:
@@ -39,7 +39,7 @@ There are two common types of quests:
For these easy quests, small rewards are appropriate, due to the rate at which they're completed. Because they are available daily, Dailies can provide a reliable source of soft currency and incentivize players to log in every day.
-## Use cases
+## Use Cases
Though they use similar mechanics to task and reward players, quests, achievements, and dailies play complimenting roles in an experience. They actively:
@@ -58,7 +58,7 @@ Though they use similar mechanics to task and reward players, quests, achievemen
Overlap of roles between quests, achievements, and dailies
-### Provide goals
+### Provide Goals
One way to keep players engaged in a game is to provide them with a mixture of short, mid and long-term goals that allow them to feel frequent progress and give them something to aspire toward.
@@ -68,7 +68,7 @@ One way to keep players engaged in a game is to provide them with a mixture of s
**Long-term goals** take months of play to complete. Many achievements represent long-term goals because they require significant time, effort, or skill to earn.
-### Surface features
+### Surface Features
By creating quests that require players to explore different areas of the game or complete certain tasks, you can draw attention to the full breadth of the game's features and content. This can be especially helpful for games with large worlds or complex systems, as players might not realize all the game has to offer.
@@ -79,7 +79,7 @@ In this example from [_Squishmallows_](https://www.roblox.com/games/7941853407/)
Quests in *Squishmallows*
-### Teach through tutorials
+### Teach through Tutorials
Quests can also teach players how to use those features by acting as tutorials. Quest-based tutorials have a number of advantages:
@@ -94,7 +94,7 @@ Quests can also teach players how to use those features by acting as tutorials.
Tutorial quest in [*RoCitizens*](https://www.roblox.com/games/137877687/)
-### Add session variety
+### Add Session Variety
The longer a player plays a game, the more familiar they become with its systems and content. When players are incentivized to try new things, they are less likely to fall into gameplay routines that become boring over time. Quests can add variety to a player's session by encouraging them to engage with content or systems that they might not have otherwise, or to revisit ones that they have not engaged with recently. This can be especially helpful for games with repetitive gameplay, or those that have less frequent updates, but any game can benefit by keeping its players engaged and ensuring that all of its areas remain active.
@@ -103,7 +103,7 @@ The longer a player plays a game, the more familiar they become with its systems
Quests in [*The Wild West*](https://www.roblox.com/games/2317712696/)
-### Create resource drip
+### Create Resource Drip
A **resource drip** is a source that provides small amounts of virtual resources like currencies, XP, or crafting ingredients that add up over time, allowing players to plan their play sessions and resource spending around them.
@@ -118,7 +118,7 @@ For these reasons, it can be beneficial to drip-feed resources to players over t
Daily quests in [*Adopt Me!*](https://www.roblox.com/games/920587237/)
-### Increase engagement
+### Increase Engagement
Limited-time content is any type of consumable or collectible content like quests, pets, or cars that are only available to players temporarily. If players do not earn or complete the content before time runs out, they might never have another opportunity. For that reason, limited-time content spurs engagement as players increase their efforts in a rush to beat the clock.
@@ -129,22 +129,22 @@ Limited-time content is any type of consumable or collectible content like quest
Because it is so effective at driving player engagement and monetization, limited-time content is an essential element of a game's live operations (LiveOps). Like other forms of limited-time content, quests that are only available for a brief time create a sense of urgency and excitement, encouraging players to log in regularly throughout the event's duration in order to earn the limited-time rewards. These temporary quests are common during seasonal events, such as Halloween or anniversary celebrations.
-To learn more about live operations and maintaining and updating a live game, see [LiveOps essentials](../../production/game-design/liveops-essentials.md).
+To learn more about live operations and maintaining and updating a live game, see [LiveOps Essentials](../../production/game-design/liveops-essentials.md).
-### Facilitate progression
+### Facilitate Progression
A **progression system** can help players achieve them by promoting engagement with the game's [core loop](../../production/game-design/core-loops.md). As players engage with the core systems of the game, they progress through the loop and make progress on their own goals.
Quests can act as a progression system by providing a structured way to advance through the game's content. With each quest completed, players earn rewards like weapons or skill points that help to prepare them for the next challenge.
-[Season passes](../../production/game-design/season-pass-design.md) are progression systems that incorporate quests. In [_Dragon Adventures_](https://www.roblox.com/games/3475397644/), players complete quests called "missions" in order to earn points toward reward tiers. The quests are all activities that are tied to the core loop mechanics of hatching and raising dragons. As players progress through the tiers, they unlock more rewards, culminating in unlocking an exclusive dragon as the final season reward. Through this UI, players can track their progress through the tiers as the deadline for the end of the season approaches.
+[Season Passes](../../production/game-design/season-pass-design.md) are progression systems that incorporate quests. In [_Dragon Adventures_](https://www.roblox.com/games/3475397644/), players complete quests called "missions" in order to earn points toward reward tiers. The quests are all activities that are tied to the core loop mechanics of hatching and raising dragons. As players progress through the tiers, they unlock more rewards, culminating in unlocking an exclusive dragon as the final season reward. Through this UI, players can track their progress through the tiers as the deadline for the end of the season approaches.
Season pass progression in *Dragon Adventures*
-### Encourage new gameplay
+### Encourage New Gameplay
Quests can encourage players to play the game in more interesting and challenging ways that they might not have tried before. In this example from Jailbreak, players are required to not only shoot down an enemy helicopter, but to do so while riding in a vehicle – a challenge that they might never attempt otherwise. As evidenced by the "impossible" rating, achieving this badge likely requires many attempts, during which the player is highly engaged.
@@ -155,7 +155,7 @@ Quests can encourage players to play the game in more interesting and challengin
These alternate gameplay goals can be especially engaging for experienced players who might have tried everything the game has to offer. Without new challenges, even the most dedicated players eventually grow bored and move on to other games. Achievements are one way to keep them engaged between content updates.
-### Deliver narrative
+### Deliver Narrative
In addition to their objectives, quantities, and rewards, quests can optionally include **flavor text** that provides bits of narrative, and backstory about the game's world. While not strictly necessary, especially in games without narrative elements, story-based quests can enrich the player's experience and make them feel more immersed in the game world.
diff --git a/content/en-us/production/game-design/liveops-essentials.md b/content/en-us/production/game-design/liveops-essentials.md
index 69240844c..1a600f000 100644
--- a/content/en-us/production/game-design/liveops-essentials.md
+++ b/content/en-us/production/game-design/liveops-essentials.md
@@ -1,5 +1,5 @@
---
-title: LiveOps essentials
+title: LiveOps Essentials
description: LiveOps Essentials is an overview of what live ops are and how to think about designing them effectively.
---
@@ -16,7 +16,7 @@ description: LiveOps Essentials is an overview of what live ops are and how to t
Without LiveOps updates, even dedicated players lose interest. After completing all challenges and consuming all content, they grow bored. A blend of LiveOps updates following [best practices](#best-practices) keeps the game fresh and engaging.
-## Content cadence
+## Content Cadence
**Content cadence**, the regular release of new content in a live game, varies based on developers' capabilities, ranging from weekly to monthly releases. These frequent introductions of fresh content aim to keep players engaged between major updates.
@@ -39,9 +39,9 @@ When choosing content for cadence releases, look at art assets that support curr
Each game has a unique content cadence, based on its specific systems, player preferences, and developer capabilities. Striking a balance between player desires and what developers can reliably deliver is crucial.
-For a more in-depth discussion of the design and production of content releases, see [Content updates](../../production/game-design/content-updates.md).
+For a more in-depth discussion of the design and production of content releases, see [Content Updates](../../production/game-design/content-updates.md).
-## Major updates
+## Major Updates
Unlike content cadences, which involve artists creating content to support existing systems, major updates engage artists, designers, and programmers to provide new or expanded systems that alters the gameplay experience.
@@ -60,7 +60,7 @@ Major updates aim to introduce new, permanent systems that evolve gameplay and b
- Live Events: Large, time-limited events aimed at attracting new players and re-engaging lapsed ones through a game shakeup, such as map overhauls or new player roles.
-## Quality of life improvements
+## Quality of Life Improvements
While content cadence and major updates introduce new content and systems into the game, quality of life (QoL) updates involve polishing the existing experience, making it more usable and enjoyable for players. Although typically smaller than other update types, QoL updates can have an outsized impact on the gameplay experience, and contribute significantly to player goodwill.
@@ -81,7 +81,7 @@ Quality of life updates may be released as needed, or as developers find time be
To identify high-value opportunities for quality of life updates, gather player feedback about common frustrations and time sinks. Developers may also have their own wishlists of improvements to consider.
-## Bug fixes
+## Bug Fixes
Bug fix updates address implementation issues and ensure that the game is functioning as intended. Bugs can range from minor issues that do not impact gameplay, like typos in non-critical text, to major problems that completely shut down the game.
@@ -92,7 +92,7 @@ Bug fix updates address implementation issues and ensure that the game is functi
When prioritizing bugs to work on, consider their severity (how drastically they impact the gameplay experience), how much time and effort they require to fix, and the number of players impacted.
-## Best practices
+## Best Practices
Consider doing the following when deciding the type, content, and frequency of your LiveOps updates:
@@ -100,7 +100,7 @@ Consider doing the following when deciding the type, content, and frequency of y
- Improving gameplay
- Prioritizing mental health
-
Listening to players
+
Listening to Players
Although the developers are the ultimate vision-holders, players are a good source of insight for growing and improving a game. When determining the next update, consider:
@@ -109,7 +109,7 @@ Although the developers are the ultimate vision-holders, players are a good sour
Game groups and social media like Guilded allow developers to connect with players and gather their feedback. Even more important than players' specific suggestions is the reasoning behind them. Often, the gap that they are trying to fill can be addressed in other creative ways that achieve both the players' and developers' goals.
-
Improving gameplay
+
Improving Gameplay
LiveOps updates are also the developers' opportunity to augment and improve their game. They can identify high-value updates by asking:
@@ -124,7 +124,7 @@ Analytics provide valuable insights into player behavior and game health, and ma
- What new features and content inspire them?
- What are their capabilities?
-
Prioritize mental health
+
Prioritizing Mental Health
Supporting a live game may at times feel like a grind. It is important for developers to take the time to work on features and content that inspire them, so they remain fulfilled by their work and excited about the game's future.
diff --git a/content/en-us/production/game-design/liveops-planning.md b/content/en-us/production/game-design/liveops-planning.md
index 7c06c859a..b03275bf4 100644
--- a/content/en-us/production/game-design/liveops-planning.md
+++ b/content/en-us/production/game-design/liveops-planning.md
@@ -1,29 +1,29 @@
---
-title: LiveOps planning
+title: LiveOps Planning
description: LiveOps Essentials is an overview of what live ops are and how to think about designing them effectively.
---
[LiveOps](./liveops-essentials.md) maintain a dynamic and captivating experience through releasing two interweaving content types:
- **Events:** Temporary activities like contests and promotions that complement the [core loop](./core-loops.md). Events offer rewards like exclusive items, status, or currency to maintain player interest between larger content releases.
-- **Content updates:** Significant permanent experience updates that expand or deepen the core loop. Larger content releases provide robust new content for players to enjoy. To learn more about content updates, see [Content updates](./content-updates.md).
+- **Content Updates:** Significant permanent experience updates that expand or deepen the core loop. Larger content releases provide robust new content for players to enjoy. To learn more about content updates, see [Content Updates](./content-updates.md).
To initiate and execute a continuous LiveOps plan, consider how you will:
- **Plan:** Define your objectives and methods for achieving them.
- **Communicate:** Determine how to inform players about upcoming events.
-- **Monitor and analyze:** Evaluate player involvement and the event's success in meeting objectives and assess the event's effectiveness post-completion.
+- **Monitor and Analyze:** Evaluate player involvement and the event's success in meeting objectives and assess the event's effectiveness post-completion.
## Plan
-When designing LiveOps for your experience, consider your **key performance indicators** (KPIs). Determine which metric you want to impact, like daily active users. It's crucial to acknowledge that events typically influence several KPIs simultaneously.
+When designing LiveOps for your experience, consider your **Key Performance Indicators** (KPIs). Determine which metric you want to impact, like daily active users. It's crucial to acknowledge that events typically influence several KPIs simultaneously.
When planning for KPI objectives, consider the following:
- **Player actions:** Clarify the intended player actions during the event and the KPIs these actions will likely influence.
- **Player impact:** Consider how increased player interaction with certain events might alter the usual patterns of earning or buying in-experience currencies and items. An event like a fishing tournament exposes players to a key currency-earning part of the experience and likely yields significant engagement, but the type of reward players receive has to be intentionally designed to not negatively impact the experience's economy.
-To learn more about KPIs, see [Analytics essentials](./analytics-essentials.md).
+To learn more about KPIs, see [Analytics Essentials](./analytics-essentials.md).
@@ -49,11 +49,11 @@ After deciding how to communicate your event to players, be intentional with des
> Take the time to design an impactful and memorable start to an event to inspire players and ensure sure they're excited about the event, will want to engage with it, and keep coming back after the event is over.
-## Monitor and analyze
+## Monitor and Analyze
When designing LiveOps for your experience, monitor your experience effectively by accessing comprehensive data, such as the sources of and spending of your experience's currency and other relevant resources. Integrate tracking into your experience's design to understand how players interact with your features.
-For more about monitoring the impact your events have on your economy, see [Balance virtual economies](./balance-virtual-economies.md).
+For more about monitoring the impact your events have on your economy, see [Balancing Virtual Economies](./balancing-virtual-economies.md).
When tracking data, make sure it's:
@@ -67,4 +67,4 @@ Comparing your event's data to the week before the event and the week after help
If the event had a lasting impact, determine whether it was positive or negative, and if your findings impact how you'll design future events to achieve your desired outcome.
-For additional information and best practices on how to design optimal events, see [LiveOps essentials](./liveops-essentials.md).
+For additional information and best practices on how to design optimal events, see [LiveOps Essentials](./liveops-essentials.md).
diff --git a/content/en-us/production/game-design/monetization-foundations.md b/content/en-us/production/game-design/monetization-foundations.md
index 94adaf1ff..bf83fe2f9 100644
--- a/content/en-us/production/game-design/monetization-foundations.md
+++ b/content/en-us/production/game-design/monetization-foundations.md
@@ -1,6 +1,6 @@
---
-title: Monetization foundations
-description: Monetization foundations
+title: Monetization Foundations
+description: Monetization Foundations
---
@@ -69,7 +69,7 @@ They can then be further divided into categories of utility:
- **Enhancement:** These items improve the experience in some way, such as granting increased speed, protection, strength, tools or event mode access.
- **Expression:** These items personalize the player's experience and makes them unique, such as skins, emotes, and pets.
-## The shop
+## The Shop
@@ -135,7 +135,7 @@ New content and item updates invites players back to the store to see what's new
- Attract attention
- Communicate value
-### Attract attention
+### Attract Attention
How you attract attention to your shop and items depends on your experience's unique style. [_Pet Simulator X_](https://www.roblox.com/games/6284583030/) uses descriptive language to build excitement.
@@ -154,7 +154,7 @@ You can effectively communicate the value of items in your shop by employing the
- Chance-based merchandise
- Bundles
-#### Clear language and imagery
+#### Clear Language and Imagery
Clear language and imagery help show why purchasing an item is worthwhile. It's important to clearly show the benefit of the item, whether it's a percentage bonus, percentage savings or number of uses. [_MeloBlox Adventure_](https://www.roblox.com/games/5803957966/) is very clear and organized, leading with the term "VIP Benefits" at the top and listing the extensive number of benefits players can expect to receive.
@@ -185,7 +185,7 @@ Another example of using clear language and imagery to communicate value is thro
In all cases, ensure that your merchandising terms and item descriptions are truthful and accurate so players know exactly what they will receive. Be mindful to not "oversell" items and remember that you are building a relationship with your players that depends on obtaining and maintaining trust.
-#### Chance-based merchandising
+#### Chance-Based Merchandising
Another common merchandising strategy is to use a chance-based system. In chance-based systems, players don't purchase items directly, but instead purchase the opportunity to receive several kinds of items, usually of varying rarity. There are three common variations of this technique: There are three common variations of this technique:
@@ -222,7 +222,7 @@ For more information on how to design fair loot boxes from two experts in the fi
Bundles are a great way to package up items that go together, whether it's a group of items that new players would find appealing or items that share a common theme. Because a bundle has multiple items, ensure players can clearly see each one and let them know what each item does. As best practice, have a comparison to other bundles to gauge the value of grouped items.
-## Starter packs
+## Starter Packs
@@ -242,7 +242,7 @@ Common durations for starter packs are anywhere from a day to a week, depending
- Contextual descriptions
- Price calculations
-### Prominent location
+### Prominent Location
For a beginner that is not yet familiar with your experience, showcase the starter pack in a place that is easy to find. If you place it prominently, consider how much information you need to provide so the purchase makes sense to the player who might not know anything about the experience.
@@ -253,7 +253,7 @@ For a beginner that is not yet familiar with your experience, showcase the start
There are several good places to surface the starter pack in your UI. Clicking into the starter pack icon can open the offer directly, or open the offer in the context of the experience's shop.
-### Thoughtful design
+### Thoughtful Design
Once you decide how players will see the starter pack, consider the starter pack visualization. Opening the offer in the shop encourages players to get familiar with the shop in general and can serve as a natural transition to exploring all the options available for purchase.
@@ -262,7 +262,7 @@ Once you decide how players will see the starter pack, consider the starter pack
Starter pack in [*_Sword Fighters Simulator_*](https://www.roblox.com/games/11040063484/)
-### Contextual descriptions
+### Contextual Descriptions
Contextual descriptions tell the player why the items are significant and the value they provide. Intentionally designing descriptions to teach players about the impact of the items on the gameplay can serve as a tutorial before they even start playing.
@@ -271,7 +271,7 @@ Contextual descriptions tell the player why the items are significant and the va
Contextual description in *_Sword Fighters Simulator_*
-### Price calculations
+### Price Calculations
The starter pack should be merchandised as a special deal using price calculations to help show the item's value. Make sure when assembling the bundle to calculate the cost of each individual item visually, clearly indicating the kind of discount players will get. This helps players understand the value of the presented item compared to other items in the shop.
@@ -280,7 +280,7 @@ The starter pack should be merchandised as a special deal using price calculatio
Price calculation in _Sword Fighters Simulator_
-## Season passes
+## Season Passes
@@ -302,7 +302,7 @@ A good season pass includes the following characteristics:
- Manageable timeframe
- Progression system
-### Item shop best practices
+### Item Shop Best Practices
A good season pass follows item shop best practices. It's content is:
@@ -337,7 +337,7 @@ Good season passes are inviting. As a subset of an experience's shop, season pas
Descriptive and enticing rewards in *Bot Clash Simulator*
-### Free and premium passes
+### Free and Premium Passes
Good season passes have both a free and premium pass that present opportunities for players to earn rewards. The free pass is a set of rewards which any player can earn by engaging with the missions or tasks provided. The free season pass often serves as a more advanced version of daily quests. The premium pass is a superset of the free pass rewards and enables paid players the opportunity to earn even more. Having both free and premium passes ensures that non-paying players can still earn rewards and enjoy your experience, while rewarding paying players with worthwhile bonuses.
@@ -359,7 +359,7 @@ A good season pass has worthwhile rewards for players to earn. Merchandising tec
Final reward in *Jailbreak*
-### Manageable timeframes
+### Manageable Timeframes
With the right implementation, season passes can be great for day-to-day engagement and longer term retention. Having manageable timeframes ensures that players feel adequately rewarded for the time they spend playing the experience. Similar to daily quests, consider designing the distance between rewards on your season pass relative to the average session time for players who join your experience. Ensure that progression is based on completion of short and long term missions, and that the amount of experience points needed to move through each level is clearly communicated.
diff --git a/content/en-us/production/game-design/onboarding-techniques.md b/content/en-us/production/game-design/onboarding-techniques.md
index 7c2bd79ac..fd40edeea 100644
--- a/content/en-us/production/game-design/onboarding-techniques.md
+++ b/content/en-us/production/game-design/onboarding-techniques.md
@@ -1,5 +1,5 @@
---
-title: Onboarding techniques
+title: Onboarding Techniques
description: Onboarding
---
@@ -13,7 +13,7 @@ Onboarding techniques are strategies used to help direct players through the onb
- Contextual tutorials
- Timed hints
-## Visual elements
+## Visual Elements
**Visual elements** are assets or effects that appear in an experience to help players understand how to play, where to go, what to pay attention to, or what actions to take. Because of these characteristics, visual elements thrive when used in conjunction with an experience's onboarding funnel.
@@ -38,7 +38,7 @@ Examples of visual elements in onboarding include:
Directional arrows and icons in _Creatures of Sonaria._
-### Improve clarity
+### Improve Clarity
Players who don't understand what to do in the first few minutes of a game are likely to quit, but so are players who are bored by lengthy and prescriptive tutorials. Utilizing visual elements in onboarding funnels enables you to teach players what they need to know, while also allowing them to get to the fun quickly. When information must be communicated efficiently, visual elements are used to improve clarity in three ways:
@@ -93,9 +93,9 @@ In Jailbreak, players are not told explicitly what to do in order to escape the
Footprints hint at a possible escape route in _Jailbreak._
-When considering implementing hints into your onboarding funnel, be intentional in determining who will see them and when they appear. For more on utilizing hints, see [Timed hints](#timed-hints).
+When considering implementing hints into your onboarding funnel, be intentional in determining who will see them and when they appear. For more on utilizing hints, see [Timed Hints](#timed-hints).
-### Increase accessibility
+### Increase Accessibility
Visual elements are more broadly accessible than text. Visuals like arrows and particle effects communicate without words and don't require translation to be understood by a global audience. This helps players who rely on localization into other languages, as well as UI designers who don't have to worry about a text string getting longer after translation.
@@ -103,14 +103,14 @@ For experiences that appeal to younger players, teaching without words can help
Using visual elements also ensures accessibility on various platforms, such as mobile devices, where text can be too small to read comfortably. Visual elements are also easier to interpret, especially for players who are visually impaired.
-For more information about designing accessible visual elements, see this video on [color contrast](https://www.youtube.com/watch?v=syQcaeRqqc4).
+For more information about designing accessible visual elements, see this video on [Color Contrast](https://www.youtube.com/watch?v=syQcaeRqqc4).
Directional arrows in _Winds of Fortune._
-### Enhance immersion
+### Enhance Immersion
Visual elements can help players stay immersed in gameplay. Directional trails, for example, provide direction while allowing players the freedom to explore and make other choices. They strongly suggest an action, but don't require it. While most players will follow the directions, the availability of choice makes the tutorial feel less forced than if they had no other options, and allows players to stay immersed in the experience and explore at their own pace.
@@ -119,7 +119,7 @@ Visual elements can help players stay immersed in gameplay. Directional trails,
Directional trail in _Hello Kitty Cafe._
-### Facilitate feedback
+### Facilitate Feedback
Visual elements can be used as feedback outside of tutorials and onboarding funnels. Feedback occurs when a player takes an action in a game and the game responds in a way that communicates the results of the action. Visual elements can be used to communicate feedback and provide players with actionable information to help them make their next choice.
@@ -143,7 +143,7 @@ Anytime a player takes an action in a game, it's imperative to provide clear fee
For more information about feedback and other User Experience (UX) best practices, see [UI and UX](./ui-ux-design.md)
-## Contextual tutorials
+## Contextual Tutorials
Also known as **just in time** tutorials, **contextual tutorials** are tutorials triggered by normal play, such as entering a new map zone or picking up a new weapon. By waiting for players to engage naturally, contextual tutorials personalize instruction, which maximizes their relevance and utility within the broader onboarding funnel. Contextual tutorials facilitate:
@@ -195,7 +195,7 @@ In addition to helping players through the onboarding tutorial, showing timely h
When deciding how and when to use timed hints, observing playtesters can provide valuable information about where such hints are needed and how long to wait before displaying them. Try to find a balance between displaying them so quickly that players feel that they haven't gotten the chance to figure it out on their own, and waiting so long that they get frustrated.
-### Use cases
+### Use Cases
In [Plant](https://create.roblox.com/docs/resources/plant-reference-project), players follow a simple loop of planting seeds, selling produce, and investing currency into larger pots and more valuable plants. A great candidate for timed hint utilization is in the UI when planting seeds. In order to plant a seed, players have to select the **PLANT CABBAGE SEED** button.
diff --git a/content/en-us/production/game-design/onboarding.md b/content/en-us/production/game-design/onboarding.md
index b34ff9dcd..c3c91fa30 100644
--- a/content/en-us/production/game-design/onboarding.md
+++ b/content/en-us/production/game-design/onboarding.md
@@ -12,7 +12,7 @@ description: Onboarding
- Day 1 retention
- Onboarding goals
-## Day 1 retention
+## Day 1 Retention
**Day 1 Retention** is gauged by the amount of players who make it through the FTUE, known as the **Player Funnel**. The funnel is widest at the top and narrowest at the bottom as fewer players complete each step. All experiences lose some amount of players along this path.
@@ -20,7 +20,7 @@ description: Onboarding
The onboarding experience aims to limit drop-off between steps and retain as many new players as possible to increase potential concurrent users, daily active users (DAU), and an experience's monetization potential. The Day 1 (D1) retention metric counts players who return the next day and measures onboarding success by gauging its impact on new players. Experiences with high D1 retention metrics often owe that success to effectively accomplishing their onboarding goals.
-## Onboarding goals
+## Onboarding Goals
Although onboarding experiences are as varied as the experiences they introduce, many of the most successful ones follow these high-level practices:
@@ -28,7 +28,7 @@ Although onboarding experiences are as varied as the experiences they introduce,
- Get to the fun quickly
- Leave players wanting more
-### Teach the essentials
+### Teach the Essentials
For successful onboarding, players need to grasp controls for an experience's navigation and interaction. Displaying complex, unfamiliar controls on-screen or incorporating them in a tutorial can be beneficial.
@@ -39,7 +39,7 @@ For successful onboarding, players need to grasp controls for an experience's na
Besides controls, onboarding should also impart knowledge of the experience's **Core Loop**, the necessary repetitive actions for progress that defines what the experience is. It's important that players understand both what they are expected to do and why they should do it.
-### Get to the fun quickly
+### Get to the Fun Quickly
New players typically decide their interest in an experience within minutes. To retain these players, it's vital to quickly demonstrate an experience's value, which is often determined by how "fun" it is, in order to convince the player to continue playing. Designing for fun is often done through the following:
@@ -58,19 +58,19 @@ Player XP-based leveling systems allow players to earn experience points based o
Player XP Level Up curve.
-
Social motivators
+
Social Motivators
For many Roblox players, playing with others is part of the fun, whether they are joined in an experience by friends or interacting with strangers. These social players often prefer onboarding experiences that provide opportunities for collaboration and competition.
-
Starter items and currency
+
Starter Items and Currency
Providing free items like equipment and avatar customizations in the onboarding experience allows players to experience the fun of those systems early. The items can be low level and few in number, such that players will want to upgrade or exchange them quickly. The goal is to give players the opportunity to enjoy the utility or self-expression afforded by those items to encourage future playtime.
A similar approach can be used in experiences that utilize _soft currencies_. Soft currencies are the most commonly found currencies in free-to-play games. Players can earn them easily and they are widely available from rewards in the experience's _core loop_. Giving players a small amount of soft currency in the onboarding experience alongside a selection of purchasable items that they can afford, allows them to quickly engage with the monetization system and see the value of earning more currency.
-For more on core loops, see [Core loops](../../production/game-design/core-loops.md).
+For more on core loops, see [Core Loops](../../production/game-design/core-loops.md).
-### Leave players wanting more
+### Leave Players Wanting More
By the end of the onboarding experience, players should be aware of the full range of experiences that an experience offers. Even if they cannot access all of the systems and content yet, knowing that there are more challenges and rewards on the horizon encourages them to continue to invest their time in the game. Designing these two characteristics effectively keep players coming back:
@@ -88,6 +88,6 @@ To learn how to accomplish this through season passes, see [Season Pass Design](
Season Pass in _Jailbreak_.
-
Moments of joy
+
Moments of Joy
Joy can be elicited in experiences during moments like leveling up, defeating a boss enemy, finding a rare item, or discovering a new region. Those moments can be made joyful and special through rewards, delightful animations, and visual or auditory effects that celebrate players' achievements. Ending the onboarding experience with intentionally designed moments leave players feeling accomplished and excited to return.
diff --git a/content/en-us/production/game-design/prototyping.md b/content/en-us/production/game-design/prototyping.md
index 09e675055..eccefb0c9 100644
--- a/content/en-us/production/game-design/prototyping.md
+++ b/content/en-us/production/game-design/prototyping.md
@@ -12,7 +12,7 @@ description: Prototyping
- **Time efficiency:** The value of prototyping is the speed in which you can iterate and explore solutions to potential problems. Prototyping ensures that you detect design flaws, oversights, and unexpected technical requirements in the early stages of pre-production, instead of months into development. The time and energy required to prototype in the early stages of creating an experience is less than the time and energy required to fix costly oversights in the later stages.
- **Finding the fun:** Prototyping ensures that the experience being designed is actually fun to play. Ideas for experiences can be abstract, but prototyping forces you to confirm that your vision can be brought to life in the way you imagine.
-## Paper prototyping
+## Paper Prototyping
@@ -47,7 +47,7 @@ Despite its benefits, prototyping on paper has drawbacks due to the difference i
- **Simulation limitations:** Simulating unique mechanics and interactions are limited or impossible to create on paper or using physical assets.
- **False positives:** Some activities might prove more fun and engaging using paper and physical assets than doing them on a phone, computer, or console.
-## Studio prototyping
+## Studio Prototyping
@@ -72,7 +72,7 @@ Despite its benefits, the limitations of studio prototyping include:
A more complex prototype made in Roblox Studio.
-## Best practices
+## Best Practices
The difference between working on a feature and prototyping is scope. Prototyping should be fast and quick, hitting certain aspects of the feature being tested but not the entire feature itself.
@@ -80,7 +80,7 @@ When prototyping, have several playtest sessions with your team to confirm your
When prototyping, take extra care to explore the following parts of your experience:
-- **Core loop:** The core loop is the central gameplay through which an entire experience is built. To learn more about core loop design, see [Core loops](../../production/game-design/core-loops.md).
+- **Core loop:** The core loop is the central gameplay through which an entire experience is built. To learn more about core loop design, see [Core Loops](../../production/game-design/core-loops.md).
- **UI/UX:** Ensure that your menu interaction input controls are intuitive and well designed. To learn more about UI/UX design, see [UI and UX](../../production/game-design/ui-ux-design.md).
- **Game rules:** Get into the details of how your experience will function. As an example, if you know that your game will feature a respawn mechanic, explore how long the respawn timer could be, where the player will physically respawn in experience, and if there are any factors that could change the rate at which a player can rejoin the fun.
- **Edge cases:** Explore how a player might push the limits of what your experience can do. Design solutions and stop gaps to either prevent or encourage this behavior.
diff --git a/content/en-us/production/game-design/season-pass-design.md b/content/en-us/production/game-design/season-pass-design.md
index f36646c41..f510d6368 100644
--- a/content/en-us/production/game-design/season-pass-design.md
+++ b/content/en-us/production/game-design/season-pass-design.md
@@ -1,5 +1,5 @@
---
-title: Season pass design
+title: Season Pass Design
description: Teaches you about best practice guidance on designing season packs.
---
@@ -7,7 +7,7 @@ description: Teaches you about best practice guidance on designing season packs.
-A _season pass_ is a limited-time, quest-based progression systems that is part of a game's content cadence. Players complete quest objectives to earn rewards for the duration of the pre-defined period of time or "season".
+A _Season Pass_ is a limited-time, quest-based progression systems that is part of a game's content cadence. Players complete quest objectives to earn rewards for the duration of the pre-defined period of time or "season".
Season passes are time-bound design strategies used in Roblox experiences to deliver new content, promote player retention, and generate revenue. Season passes encourage players to complete tasks, gain pass experience points (XP), and climb through reward tiers. When making a season pass, it's imperative to:
@@ -18,14 +18,14 @@ Season passes are time-bound design strategies used in Roblox experiences to del
- Season pass in *Jailbreak*
+ Season Pass in *Jailbreak*
While similar in name, season passes are not game passes. Game passes are one-time purchases that confer gameplay bonuses. To learn how to implement game passes into your experiences, see [Game Passes](../../production/monetization/game-passes.md).
-## Identify goals
+## Identify Goals
The _goal_ of a season pass is defined by its desired impact on players. A season pass can have multiple goals. Common goals that successful season passes prioritize are:
@@ -34,7 +34,7 @@ The _goal_ of a season pass is defined by its desired impact on players. A seaso
- Player comprehension
- Player anticipation
-
Core loop alignment
+
Core Loop Alignment
A successful season pass system is built on the experience's core loop, the mechanic upon which the experience is built, and drives players to engage with all of your experiences' systems and content. Tying season pass missions to every system and content type in your experience has multiple benefits:
@@ -42,21 +42,21 @@ A successful season pass system is built on the experience's core loop, the mech
- Introduces players to new systems and content they might not be aware of in a digestible way.
- Gives players a variety of things to do, so that completing the pass doesn't become boring.
-For more about core loops, see **[Core loops](../../production/game-design/core-loops.md)**.
+For more about core loops, see **[Core Loops](../../production/game-design/core-loops.md)**.
-
Player motivation
+
Player Motivation
A successful season pass makes players feel motivated to complete the entire season's missions. This can be achieved by having missions be manageable and not consume the player's entire playtime each day, appeal to different playstyles by having a variety of tasks, have the season UI clearly display player progression, and have season pass rewards accurately reflect the effort required to obtain them.
-
Player comprehension
+
Player Comprehension
A successful season pass is self explanatory, with players understanding how to make progress on the pass in a given season. Players are automatically enrolled in the season's system, they do not need to remember to opt in every new season. A highly visible Season UI helps facilitate this, with the mission and season progress, reward status, and remaining time to complete the season all clearly communicated.
-
Player anticipation
+
Player Anticipation
A successful season pass experience leaves players excited for the next season and looking forward to new rewards. This is obtainable by having the rewards, especially the premium and final rewards, be worthwhile. Having a worthwhile final reward to act as a capstone and celebration of player effort and commitment can result in players wondering what the next season's theme and final rewards will be, and encourages them to come back for more.
-## Create parameters
+## Create Parameters
With your goals defined, your season pass parameters are the bounds in which you'll achieve them. When defining parameters for your season pass, it's important to be mindful of the following:
@@ -65,28 +65,28 @@ With your goals defined, your season pass parameters are the bounds in which you
- Tier rewards
- Future updates
-### Season length
+### Season Length
-The _season length_ is the duration that a season of rewards is available to players. The length of the season is based on your team's bandwidth, but one month is considered a good starting point. A **cadence** is how often season events are available. Allowing at least a one-week rest period between the end of one season and the start of the next creates a buffer that has the following benefits:
+The _Season length_ is the duration that a season of rewards is available to players. The length of the season is based on your team's bandwidth, but one month is considered a good starting point. A **cadence** is how often season events are available. Allowing at least a one-week rest period between the end of one season and the start of the next creates a buffer that has the following benefits:
- Protects players from burnout who have given a hard push to earn the last tier
- Provides the development team with more time to produce missions and rewards
- Season length in *Jailbreak*
+ Season Length in *Jailbreak*
-### Season tiers
+### Season Tiers
_Season tiers_ are the milestones that players meet in order to earn rewards throughout the season. To climb the tiers, players complete missions in order to earn experience points (XP). When players earn enough XP, they graduate to the next tier and receive rewards for the one they just completed. When designing season tiers, ten tiers is a good place to start. Players should feel like they're making progress frequently, but the number of tiers should be short enough that it isn't daunting at the start of a season.
- Season tiers in *Jailbreak*
+ Season Tiers in *Jailbreak*
-
Tier rewards
+
Tier Rewards
_Tier rewards_ are the items players receive when they meet a season tier milestone set throughout the season. Whenever a player accumulates enough XP to graduate from one tier to the next, they earn tier rewards. The rewards should be reflective of the amount of effort needed to complete the tier based on the amount of XP required. Tier rewards should include items that players want, but aren't too valuable. Some ideas include:
@@ -104,10 +104,10 @@ Extra attention is needed in implementing the following sections of a season pas
- Tier rewards in *Jailbreak*
+ Tier Rewards in *Jailbreak*
-
Final rewards
+
Final Rewards
A _final reward_ is the last reward at the end of the season pass. Creating a brand-new asset for the final reward is great option. Additionally, retiring that final reward item after the season is done to make it exclusive to the season pass system creates a stronger incentive and encourages more playtime. Final rewards often define the impact of a season pass, and are pivotal to design correctly in order to incentivize and reward your community.
@@ -124,7 +124,7 @@ Although your Tiers UI shows the rewards that players earn, it's good practice t
-
How to claim rewards
+
How to Claim Rewards
When _claiming rewards_, the best practice is to require players to claim them via a button in the season pass UI. Automatic rewards run the risk of being overlooked or misunderstood. Forcing players to manually accept rewards does two things:
@@ -133,18 +133,18 @@ When _claiming rewards_, the best practice is to require players to claim them v
Ensure it's obvious to the player that they have rewards to collect. A common way to do this placing an icon on the feature's button to draw players attention. If a player has uncollected rewards at the end of the season, automatically awarding them ensures the player still gets rewarded for their efforts.
-
Free passes
+
Free Passes
A _free pass_ is a version of a season pass that is available to all players. Players are automatically enrolled in a free pass, opting in to each season to complete missions and earn rewards by default. Free passes give players an amount of missions every day that they can complete to earn XP, but receive separate rewards than those who have premium passes.
- Free season pass in *Jailbreak*
+ Free Season Pass in *Jailbreak*
Free passholders should not be able to complete premium missions or earn premium tier rewards unless they upgrade to the premium pass. Having this tiered difference still encourages and rewards player effort and playtime, but provides a monetization opportunity for your experience and incentivizes players to keep playing.
-
Premium passes
+
Premium Passes
A _premium pass_ is a variation of a season pass that players have to pay in order to access. The price of the pass is determined by the developer, but should accurately price the value of the rewards to the cost of the pass. Premium passes generally offer additional missions and the opportunity to earn greater rewards.
@@ -155,7 +155,7 @@ A _premium pass_ is a variation of a season pass that players have to pay in ord
If free players upgrade to the premium pass mid-season, it's good practice to award all of the premium reward for tiers that they have already completed, so they get the full value out of the pass and aren't penalized for waiting.
-### Future updates
+### Future Updates
When designing a new system, it's necessary to think about how it will be supported and improved in the future. To help your season pass remain relevant and exciting for players long term, consider the following:
@@ -164,7 +164,7 @@ When designing a new system, it's necessary to think about how it will be suppor
- Implement a catch-up mechanic: Provide double XP in the season's final week, offering behind-schedule players a chance to catch up. This feature acknowledges the challenge of finishing the season in time and displays your commitment to players' success.
- Roll out weekly missions: Give players challenging, high-reward missions once a week in addition to their daily tasks. These missions provide high-achievers with more weekly activities and additional XP, acknowledging their dedication and effort.
-## Design missions
+## Design Missions
_Mission design_ is the careful construction of season pass missions to maximize player engagement and retention that accounts for [mission categories](#mission-categories), [mission difficulty](#mission-difficulty), [mission surfacing](#mission-surfacing). Core tenants of effective mission design include:
@@ -177,7 +177,7 @@ _Mission design_ is the careful construction of season pass missions to maximize
- Free players receive a number of missions every day.
- Premium passholders receive bonus missions every day. These additional missions are visible to everyone, but are only completable by premium passholders. These extra opportunities to earn XP and easier difficulty completing the season's rewards is a key selling point of the premium pass.
-### Mission categories
+### Mission Categories
Deriving _mission categories_ from the different activities in your experience is an easy way to ensure that you are assigning players a variety of tasks. These could include:
@@ -195,13 +195,13 @@ Deriving _mission categories_ from the different activities in your experience i
- Daily missions from *Dragon Adventures*
+ Daily Missions from *Dragon Adventures*
Your experience's categories may look very different, depending on the systems that you have available. Keep categories broad enough to encompass multiple activities, aiming to have at least three across your entire experience.
-### Mission difficulty
+### Mission Difficulty
When presenting players with multiple missions and a time limit for completing them, it's important to consider the difficulty of the tasks. Difficulty can come from the quantity required to complete a mission as well as the tasks themselves. For example, eating 5 berries is easier than eating 25 berries, and combat is likely harder than driving a car.
@@ -214,23 +214,23 @@ Like categories, you can designate easy, medium and hard difficulties for tasks
- Daily missions from *Dragon Adventures*
+ Daily Missions from *Dragon Adventures*
- Weekly missions from *Dragon Adventures*
+ Weekly Missions from *Dragon Adventures*
Difficulty designations also help you determine the appropriate amount of XP to award for completing each mission, as well as balance the overall difficulty of your tiers. With these missions meant to be completed within a day, it's important not to make them too difficult. If players regularly fail to complete their missions, their interest in the season pass feature tends to wane. Ensure that you leave players some time to play however they want, and to do the things that they already love to do in the experience.
-### Mission surfacing
+### Mission Surfacing
**Surfacing** is the act of making a specific part of your experience highly visible to your players to promote discoverability and engagement. When adding any new system to your game, make sure that you're doing everything you can to surface it. Having your season pass surfaced ensures your players are aware of it and interact with it as you intend.
- Season pass HUD surfacing in *Dragon Adventures*
+ Season Pass HUD surfacing in *Dragon Adventures*
Surfacing methods include:
@@ -242,14 +242,14 @@ Surfacing methods include:
- Adding a badge to a button when there's an update that the player needs to know about. Badges can to draw a player's attention, letting them know they have new or completed missions, or tier rewards to collect.
- Creating an in-world prize showcase to display rewards. Putting rewards in the world allows players to appreciate them even more, and be more motivated to complete the season.
-## Collaborate effectively
+## Collaborate Effectively
Effective collaboration across teams is essential when creating far reaching and impactful systems and content like season passes. The following collaboration techniques ensure clear communication and helps teams stay aligned and motivated:
- Asset requests
- Tech requests
-
Asset requests
+
Asset Requests
An _asset request_ is a formal document between team members stating the need for the specific assets required for a feature. Listing the in-game assets required to ship a feature makes it much easier to scope and allocate your resources. Ensure to break out each asset separately so that the entire scope of the work is clear. The item's visual appearance is unimportant at this stage, simply knowing what type and how many of an asset and your experience needs is all that's required at this stage.
@@ -266,7 +266,7 @@ An asset type is either _evergreen_, needing only to be created once, or _new ea
- Final tier reward item.
- Themed marketing assets for each season.
-
Tech requests
+
Tech Requests
A _tech request_ is a formal document between the coder who will be working on the feature to help define the scope of the work. During tech requests, account for potential unexpected challenges or problems in development.
@@ -280,15 +280,15 @@ A tech request could look like:
For more information on season passes, see the following resources:
-- [Generic season pass system PDF](../../assets/game-design/season-pass-design/season-pass-design.pdf)
-- [Season pass tier balance calculator](../../assets/game-design/season-pass-design/season-pass-spreadsheet-.xlsx)
-- [Season pass UI wireframes](../../assets/game-design/season-pass-design/season-pass-ui.pdf)
+- [Generic Season Pass System PDF](../../assets/game-design/season-pass-design/season-pass-design.pdf)
+- [Season Pass Tier Balance Calculator](../../assets/game-design/season-pass-design/season-pass-spreadsheet-.xlsx)
+- [Season Pass UI Wireframes](../../assets/game-design/season-pass-design/season-pass-ui.pdf)
-
Example missions
+
Example Missions
The following is a list of potential mission types and tasks chosen to illustrate the variety within a given category. While difficulty is subjective relative to the ease of completing the task a single time, the difficulty in the example below increases from this baseline when the quantity **(X)** increases.
-| Mission category | Task | Difficulty | Notes |
+| Mission Category | Task | Difficulty | Notes |
| ---------------- | ----------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------- |
| WORK | Complete **(X)** jobs | Easy | Players can choose any job |
| WORK | Earn **(X)** dollars | Medium | Players must earn a required amount of money through jobs or other means |
@@ -296,16 +296,16 @@ The following is a list of potential mission types and tasks chosen to illustrat
| SOCIAL | Throw or attend **(X)** parties | Easy | This one doesn't require other players (no one has to show up to the party you throw) so it's a little easier |
| SOCIAL | Compete in **(X)** races | Medium | If the activity requires other players, it's generally more difficult than solo tasks |
-
UI samples
+
UI Samples
The UI of your season pass is critical to clearly communicating with your players. These wireframe mockups illustrate one way that this feature could be implemented in your experience. Creating wireframes like these helps everyone on the team to visualize the feature, ensures that the user interface remains consistent from screen to screen, and ultimately makes it easier for the coder implementing the UI.
- Daily mission UI sample
+ Daily Mission UI Sample
- Reward tiers UI sample
+ Reward Tiers UI Sample
diff --git a/content/en-us/production/game-design/starter-pack-design.md b/content/en-us/production/game-design/starter-pack-design.md
index 5cf2707d8..ff7d82921 100644
--- a/content/en-us/production/game-design/starter-pack-design.md
+++ b/content/en-us/production/game-design/starter-pack-design.md
@@ -1,5 +1,5 @@
---
-title: Starter pack design
+title: Starter Pack Design
description: Teaches you about best practice guidance on designing starter packs.
---
@@ -10,7 +10,7 @@ According to industry benchmarks, games that implement a starter pack may see an
The tips below are based on industry best practices and the Developer Excellence team's experience. Feel free to follow our suggestions, or design the starter pack that best suits your own game.
-For out-of-the-box functionality to sell collections of items to players at a discount, see the [Bundles feature package](../../resources/feature-packages/bundles.md).
+For out-of-the-box functionality to sell collections of items to players at a discount, see the [Bundles Feature Package](../../resources/feature-packages/bundles.md).
## Availability
@@ -23,7 +23,7 @@ In addition to being single-time purchases, starter packs are often offered to p
Starter packs are designed to help new players jumpstart their experience, but they do not necessarily remain relevant past a certain point of progression; for example, 500 coins might be a significant amount of currency to a Level 1 player, but a trivial amount to a Level 10 player.
-The [Bundles feature package](../../resources/feature-packages/bundles.md) allows you to define the timer that's best for your game. In general, it is preferable to give players time to make the decision to purchase rather than aggressively limiting its availability; we recommend between 24 hours and 3 days for most experiences.
+The [Bundles Feature Package](../../resources/feature-packages/bundles.md) allows you to define the timer that's best for your game. In general, it is preferable to give players time to make the decision to purchase rather than aggressively limiting its availability; we recommend between 24 hours and 3 days for most experiences.
## Surfacing
@@ -51,6 +51,6 @@ The starter pack should be one of the best offers in the game, with **outsized a
Whatever price you choose, **we recommend a discount of around 90%** to make value abundantly clear. For items like XP that aren't directly monetized, consider how much time it takes players to earn them and work backward to assign a value.
-Beyond your starter pack, make sure that your game has sufficient **spend depth**, or a variety of purchasable content and price points, to appeal to spenders of all levels. Along with frequent content updates, this will help encourage any new payers converted by the starter pack to continue spending in your game. You can use the [Bundles package](../../resources/feature-packages/bundles.md) to create item offers for this purpose, from permanent content packs to limited-time event bundles.
+Beyond your starter pack, make sure that your game has sufficient **spend depth**, or a variety of purchasable content and price points, to appeal to spenders of all levels. Along with frequent content updates, this will help encourage any new payers converted by the starter pack to continue spending in your game. You can use the [Bundles Package](../../resources/feature-packages/bundles.md) to create item offers for this purpose, from permanent content packs to limited-time event bundles.
-For more information on monetizing your experience, check out [Monetization foundation](monetization-foundations.md).
+For more information on monetizing your experience, check out [Monetization Foundation](monetization-foundations.md).
diff --git a/content/en-us/production/game-design/subscription-design.md b/content/en-us/production/game-design/subscription-design.md
index 7cd549a6e..9c6432e64 100644
--- a/content/en-us/production/game-design/subscription-design.md
+++ b/content/en-us/production/game-design/subscription-design.md
@@ -1,5 +1,5 @@
---
-title: Subscription design
+title: Subscription Design
description: Learn how to effectively design subscriptions on Roblox.
---
@@ -24,9 +24,9 @@ When considering different ways to implement subscriptions into your experience,
- **Retention**: Is your core loop and other content deep and strategic, so a monthly "trickle" of items can track a typical player's progression from new to veteran status?
- **Monetization**: Is your economy based on just a few items, so that the demand for them is relatively consistent? Or is it based on many items, so that monthly curations could bring awareness to lesser-known, but beneficial items?
-To learn more about KPIs, see [Analytics essentials](./analytics-essentials.md).
+To learn more about KPIs, see [Analytics Essentials](./analytics-essentials.md).
-## Best practices
+## Best Practices
Players return to experiences for engaging gameplay, fresh content, and social interactions. By continuously improving the player experience and offering valuable content through subscriptions, you ensure players recognize the worth of their purchases, which builds trust and promotes long-term retention. When designing subscriptions for your experience, consider making them:
@@ -37,7 +37,7 @@ Players return to experiences for engaging gameplay, fresh content, and social i
- **Progressive**: Match subscription content with player progression to accommodate every stage of a player's journey, from beginner to veteran.
- **Engaging**: Use subscriptions to showcase exclusive and special content that ties into exciting in-experience events and systems.
-## Use cases
+## Use Cases
The structure of the subscriptions you offer depends on the unique characteristics of your experience. Carefully consider the core elements of the experience and the items offered that could appeal to players month after month. Common subscription use cases include:
@@ -61,7 +61,7 @@ Consider selling a subscription bundle containing a single type, a combination o
To learn more about Bundles, see [Monetization Foundations](./monetization-foundations.md).
-#### Currency packs
+#### Currency Packs
**Currency packs** are bundles that contain a certain amount of in-experience currency. This serves as a baseline amount of currency that a player can depend on each month to fund a portion of their content purchases. Utilizing subscriptions that provide currency packs can be an effective method to increase your experience's monetization potential and provide value to your players.
@@ -85,13 +85,13 @@ To start determining this, think about how much gameplay it would take a user to
When pricing currency packs, remember to compare the relative value of your in-experience currency to existing single-purchase Robux costs. For example, if you're creating a new subscription currency pack and have an existing pack that sells for 100 Robux, assess the value of the new pack's contents in comparison to the current offering.
-To learn more about rewards and currency balancing, see [Balance virtual economies](./balance-virtual-economies.md).
+To learn more about rewards and currency balancing, see [Balancing Virtual Economies](./balancing-virtual-economies.md).
-#### Item packs
+#### Item Packs
**Item packs** are collections of varied items. If more than one item product type is included in a bundle, it's called a **variety pack**. Offering these as monthly subscriptions can provide players with both unique event items alongside common ones. If players know that each month they can expect to receive something interesting or exclusive, they are more likely to maintain interest in the experience. This concept is often called the "content cadence."
-To learn more about content cadences, see [Content updates](https://create.roblox.com/docs/production/game-design/content-updates).
+To learn more about content cadences, see [Content Updates](https://create.roblox.com/docs/production/game-design/content-updates).
@@ -100,7 +100,7 @@ To learn more about content cadences, see [Content updates](https://create.roblo
Depending on the items you offer, it could be beneficial to mix both durable and consumable items in these packs, but be intentional with the amount of durable items you include. Because durable items don't expire, overrelying on them can force you into a cycle of constantly designing new ones. The key to a successful item pack lies in the perceived value and positive impact on the player's experience. Instead of filling your packs with random items, fill them with intentionally designed items that your players will anticipate and appreciate each month.
-### Membership and VIP benefits
+### Membership and VIP Benefits
**Membership** and **VIP benefit** rewards are another way to merchandise packs of items, currency, and content access. They are conceptually similar to bundles. Subscriptions are the optimal method for providing this reward, as their monthly value is equivalent to a one-time purchase.
@@ -115,7 +115,7 @@ Depending on the items you offer, it could be beneficial to mix both durable and
-### Season passes
+### Season Passes
**Season passes** are quest-based content systems that repeat at regular cadences each month. Because seasons typically last from a week to a month, they're a great candidate to consider when designing subscriptions for your experience.
diff --git a/content/en-us/production/game-design/ui-ux-design.md b/content/en-us/production/game-design/ui-ux-design.md
index 35b7fe95e..f5bb4cbda 100644
--- a/content/en-us/production/game-design/ui-ux-design.md
+++ b/content/en-us/production/game-design/ui-ux-design.md
@@ -1,5 +1,5 @@
---
-title: UI and UX design
+title: UI and UX Design
description: UI and UX design in Roblox
---
@@ -171,21 +171,21 @@ These choices are deliberate, aiming to facilitate player comprehension and navi
UX design relates to how players interact with the game, how they make their choices known to the game, and how they move from one choice to the next. Although UX often works hand-in-hand with user interface (UI), it is more focused on interactivity and player experience than the visual and informational design of UI.
-### Understanding players
+### Understanding Players
A primary goal of the UX designer is to create interactions and flows that are intuitive, unobtrusive and convenient for players to use. That process starts with an understanding of the players themselves, the intended audience for a game. When identifying players of an experience, consider the following:
- **Demographics:** Demographics help to inform design choices by revealing generalized information about a player group. For example, younger players are generally more likely to play on mobile or tablet devices than personal computers, so games intended for that audience often prioritize designing and polishing the mobile user experience.
-- **Experience level:** Developers may choose to design for players with little gaming experience, a significant amount, or somewhere in between. Interactions that are familiar to experienced players, such as tapping a number key to equip an item in a toolbar, or pressing c to crouch, may not be obvious to inexperienced players, and require additional messaging or training.
+- **Experience Level:** Developers may choose to design for players with little gaming experience, a significant amount, or somewhere in between. Interactions that are familiar to experienced players, such as tapping a number key to equip an item in a toolbar, or pressing c to crouch, may not be obvious to inexperienced players, and require additional messaging or training.
-- **Genre familiarity:** Similar to general experience level, genre familiarity reflects players' experience level with a specific type of game. Games that fall into popular genres on Roblox, like Roleplay, Survival Horror, and First-Person Shooter, are likely to have many potential players who have played a similar game before. Games in other genres may have fewer experienced players, but that experience gap can be overcome through tutorials and usability.
+- **Genre Familiarity:** Similar to general experience level, genre familiarity reflects players' experience level with a specific type of game. Games that fall into popular genres on Roblox, like Roleplay, Survival Horror, and First-Person Shooter, are likely to have many potential players who have played a similar game before. Games in other genres may have fewer experienced players, but that experience gap can be overcome through tutorials and usability.
-- **Gameplay style:** Players often favor specific types of play, ranging from competition and achievement-collecting to exploration and cooperation. These preferences are not only reflected in the game mechanics players prefer but also influence UX decisions. Designers consider which interactions to prioritize, which to polish, and which to present to the players. They also take into account the mindset players will have when they engage with these interactions and the emotions they aim to evoke from them.
+- **Gameplay Style:** Players often favor specific types of play, ranging from competition and achievement-collecting to exploration and cooperation. These preferences are not only reflected in the game mechanics players prefer but also influence UX decisions. Designers consider which interactions to prioritize, which to polish, and which to present to the players. They also take into account the mindset players will have when they engage with these interactions and the emotions they aim to evoke from them.
After considering these factors and selecting a target player group (or groups), get to know them by meeting them, playing with them, and learning about their goals and preferences to better inform design choices.
-### Design interactions
+### Designing Interactions
_Interactions_ are features that allow players to experience and communicate their choices in a game. UX designers want those interactions to be intuitive, and require as little explanation as possible. To do this they utilize:
@@ -231,7 +231,7 @@ Communication from the game to the player is known as _feedback_. Feedback helps
When feedback is missing or insufficient, players might not know what they've accomplished, understand whether the effects were good or bad, or even know whether the feature they're using is functioning correctly or experiencing bugs.
-### Design flows
+### Designing Flows
Multiple interactions are often required for a player to complete a goal. UX designers are concerned with how players navigate from one action or UI screen or choice to the next and make sure that these paths are logical and convenient.
diff --git a/content/en-us/production/index.md b/content/en-us/production/index.md
index bb42d5a42..e4287c637 100644
--- a/content/en-us/production/index.md
+++ b/content/en-us/production/index.md
@@ -16,11 +16,11 @@ and keep them engaged over time. You need to consider:
- **Analytics** to monitor how it's performing.
-- **Game design** to create and maintain an engaging player experience.
+- **Game Design** to create and maintain an engaging player experience.
## Publishing
-When an experience is ready to play, you can [publish](../production/publishing/publish-experiences-and-places.md) your
+When an experience is ready to play, you can [publish](../production/publishing/publishing-experiences-and-places.md) your
experience on any devices you choose. An experience can be published **privately** (default) in order to test and save to the cloud, or **publicly** so that it can be discovered and played by other users.
## Monetization
@@ -29,7 +29,7 @@ Users can spend Robux in experiences for items such as new vehicles or
power-ups, and creators can also earn Robux from [engagement-based payouts](../production/monetization/engagement-based-payouts.md), [private servers](../production/monetization/private-servers.md), [paid access in Robux](../production/monetization/paid-access-robux.md), and [paid access in local currency](../production/monetization/paid-access-local-currency.md). There are two main methods of
[monetizing](../production/monetization/index.md) within an experience:
-- [Developer products](../production/monetization/developer-products.md) - users can purchase
+- [Developer Products](../production/monetization/developer-products.md) - users can purchase
multiple times. Great for in-experience currency purchases.
- [Passes](../production/monetization/game-passes.md) - users can only purchase once.
@@ -53,13 +53,13 @@ You can promote your experience within the Roblox Ecosystem in multiple ways:
- Use the [Ads Manager](../production/promotion/ads-manager.md#sponsored-experiences) to create ad campaigns using image, video, or portal ads within existing experiences.
- Roblox [experience events](../production/promotion/experience-events.md) are time-based events that users can join and discover through an events detail page.
-- You can use integrated features such as [update announcements](../production/promotion/experience-events.md#announce-updates) and [experience notifications](../production/promotion/experience-notifications.md) to promote your content to a wider audience and keep in touch with your existing user base.
+- You can use integrated features such as [update announcements](../production/promotion/experience-events.md#announcing-updates) and [experience notifications](../production/promotion/experience-notifications.md) to promote your content to a wider audience and keep in touch with your existing user base.
## Analytics
Roblox offers a variety of [analytics](../production/analytics/index.md) features to help you chart your experience's growth, track user behavior and retention, and find
opportunities for optimization.
-## Game design
+## Game Design
The Roblox Game Insights team provides [game design](../production/game-design/index.md) resources for designers of all levels to expand their knowledge and skills.
diff --git a/content/en-us/production/localization/automatic-translations.md b/content/en-us/production/localization/automatic-translations.md
index 2b25e5f95..578f992c8 100644
--- a/content/en-us/production/localization/automatic-translations.md
+++ b/content/en-us/production/localization/automatic-translations.md
@@ -1,19 +1,19 @@
---
-title: Automatic translation
+title: Automatic Translation
description: Roblox's easy to use automatic translation features allow you to quickly begin supporting various language translations on any experience.
---
**Automatic translation** is a tool that automatically collects and translates strings in your experience. This tool is available on any experience and allows you to immediately begin displaying translated strings in your experience and broadening your potential audience.
-## How automatic translation works
+## How Automatic Translation Works
Automatic translation works by first [collecting strings](#enable-automatic-text-capture) encountered within the experience, either through testing or playing. Once these strings are captured, Roblox automatically translates the strings on your experience's localization table.
-After collecting these strings, you can [enable translations](#enable-translations) for your experience to automatically display the captured strings for users who have their default language settings set to the translated language.
+After collecting these strings, you can [enable translations](#enabling-translations) for your experience to automatically display the captured strings for users who have their default language settings set to the translated language.
Automatic translation only provides automated translations for blank entries on the localization table and doesn't override any existing translations, including any [custom translations](../localization/custom-translations.md) made by a developer or translator. For example, if you manually clear a translation for an entry, the tool assumes that you don't want to translate that entry.
-## Enable automatic text capture
+## Enable Automatic Text Capture
Automatic Text Capture (ATC) captures text strings from UI elements in your experience and adds them to your translation table. When enabled, the ATC tool adds text from UI elements encountered by users within your experience or during Studio testing.
@@ -40,7 +40,7 @@ ATC can not capture some experience objects. These objects may require special h
-### Text capture in Studio
+### Text Capture in Studio
There may be situations in which you need to immediately capture strings to your translation table. In these cases, you can use the text capture tool in Studio to capture strings while playtesting. These strings will be added to the localization table within 1–2 minutes of encountering them.
@@ -56,7 +56,7 @@ To enable text capture in Studio:
Studio text capture stays on if you start and stop playtesting within the same Studio session, but must be enabled again when you start a new Studio session.
-### Automatic cleanup
+### Automatic Cleanup
ATC also checks your experience for strings that no longer exist, such as usernames or strings related to a past event. By default, the tool will remove these stale entries when it identifies them. Only auto-scraped strings with automatic translations will be removed; strings that were manually added or that have manual translations will not be impacted.
@@ -64,7 +64,7 @@ If you do not want ATC to clean up your localization table, navigate to your loc
-## Enable translations
+## Enabling Translations
Once strings are captured to your localization table, follow these steps to enable translated content:
@@ -83,7 +83,7 @@ Once strings are captured to your localization table, follow these steps to enab
-### Automatic translation quotas
+### Automatic Translation Quotas
Roblox has initial and monthly quotas for automatic translation. The initial quota determines how many string entries you can translate when you localize your experience for the first time. After you use up the initial quota, any subsequent translations come from your monthly quota, which resets every month.
@@ -94,7 +94,7 @@ You can track your automatic translation quota usage on your experience's locali
Quotas are calculated on a **per-character** and **per-language basis**. For example, translating the source string "hello" into all 15 automatic translation-supported languages will count as 5×15 (75) characters towards your quota.
-### Automatic translation updates
+### Automatic Translation Updates
As the automatic translation tool improves, more accurate translations may become available for existing strings. When these updates become available, Roblox refreshes any automatic translations. Automatic translation updates will appear in your translation history.
@@ -112,22 +112,22 @@ By locking an entry, you are approving the translation and turning it into a man
By default, manually added strings and strings with manual translations are locked. If you unlock an entry, it will be impacted by both automatic translation updates and ATC if it is enabled. If you want to generate a new automatic translation for a previously changed or cleared translation, unlock the entry.
-## Supported languages
+## Supported Languages
Roblox supports automatic translation between the languages listed below. Currently, Roblox Translate will always assume that source strings are in the [experience source language](./index.md#setting-source-language).
-
Currently supported languages for automatic translation
+
Currently Supported Languages for Automatic Translation
-
Chinese - simplified
+
Chinese - Simplified
-
Chinese - traditional
+
Chinese - Traditional
English
diff --git a/content/en-us/production/localization/custom-translations.md b/content/en-us/production/localization/custom-translations.md
index 977ad88b0..da3e702db 100644
--- a/content/en-us/production/localization/custom-translations.md
+++ b/content/en-us/production/localization/custom-translations.md
@@ -1,5 +1,5 @@
---
-title: Custom translations
+title: Custom Translations
description: Use Roblox's various translation tools to modify your experience's translation table.
---
@@ -7,20 +7,20 @@ You can use Roblox's various translation tools to further customize your experie
Custom translations cover a wide variety of workflows which may be more applicable for certain situations. See the following for various resources of the different ways you can customize and implement your translations and localization.
-## Manually edit localization table
+## Manually Editing Localization Table
You, or any assigned translators, can directly edit your experience's localization table. This includes adding context to indicate when to use a certain translation, adding additional languages, and removing extraneous entries. This can help refine your translations and prevent common automatic errors, such as incorrectly translating loan words or homonyms.
-See [Manually edit localization table](../../production/localization/manual-translations.md) for more information on modifying your localization table.
+See [Manually Editing Localization Table](../../production/localization/manual-translations.md) for more information on modifying your localization table.
-## Translate dynamic content
+## Translating Dynamic Content
-You can translate dynamic strings in your experience, such as text that references usernames, substrings, currencies, or time and dates, using localization parameters. For more information on applying dynamic translations, see [Translate dynamic content](../../production/localization/translate-dynamic-content.md).
+You can translate dynamic strings in your experience, such as text that references usernames, substrings, currencies, or time and dates, using localization parameters. For more information on applying dynamic translations, see [Translating Dynamic Content](../../production/localization/translating-dynamic-content.md).
-## Localize with scripting
+## Localizing with Scripting
In some cases, such as localizing images and sounds, targeting individual
strings for context overrides, or switching languages dynamically, you may need
to script more advanced localization behavior. For more information on
-localization scripting and using the `Class.LocalizationService`, see [Localize with
-scripting](/production/localization/localize-with-scripting).
+localization scripting and using the `Class.LocalizationService`, see [Localizing with
+Scripting](/production/localization/localizing-with-scripting).
diff --git a/content/en-us/production/localization/index.md b/content/en-us/production/localization/index.md
index 73fe31292..f16b39046 100644
--- a/content/en-us/production/localization/index.md
+++ b/content/en-us/production/localization/index.md
@@ -9,11 +9,11 @@ users can understand and enjoy your experience as intended. Any experience can i
-## Localization settings
+## Localization Settings
Your experience's localization settings is the starting place for enabling
translations and accessing your localization tools. You'll need to set your
-[source](#set-source-language) and [supported](#set-supported-languages)
+[source](#setting-source-language) and [supported](#setting-supported-languages)
languages before starting any localization to a new language.
The localization page also includes tools to start translating your experiences, add translation collaborators and download translation analytics.
@@ -44,7 +44,7 @@ A link to your experience's localization settings is also available in Studio. T
src="../../assets/localization/Game-Settings-Configure-Localization.png"
width="800" />
-### Set source language
+### Setting Source Language
Before you can start any localization, Roblox needs to know which language you
are translating from and which languages you are translating to.
@@ -64,7 +64,7 @@ To set the **source** language:
2. Select a language from the list.
3. Click **Confirm** to add the language.
-### Set supported languages
+### Setting Supported Languages
The **supported languages** are the languages you intend to provide translations
for. You can have multiple supported languages for your experience. See
@@ -85,20 +85,20 @@ To set the **supported** languages:
4. Click **Confirm** to add the language.
-## Automatic translations
+## Automatic Translations
-Roblox's automatic translation tool is available on any experience and allows you to immediately begin localizing the strings in your experience and broadening your potential audience. In many cases, you can start making significant progress on your localization journey using automatic translations before adding [custom translations](#custom-translations) or working with [manual translators](#work-with-translators).
+Roblox's automatic translation tool is available on any experience and allows you to immediately begin localizing the strings in your experience and broadening your potential audience. In many cases, you can start making significant progress on your localization journey using automatic translations before adding [custom translations](#custom-translations) or working with [manual translators](#working-with-translators).
-For more information on enabling automatic translations in your experience, see [Automatic translations](../../production/localization/automatic-translations.md).
+For more information on enabling automatic translations in your experience, see [Automatic Translations](../../production/localization/automatic-translations.md).
-## Custom translations
+## Custom Translations
Apply various customizations to your translations to improve and expand your experience's localization. You, or any assigned translator, can manually add and modify translations to your experience's translation table. You can also access this table programmatically, allowing you to create contextual translations, switch out images or assets based on language, or even manually display translations from a different language.
-For more information on custom translation use-cases, see [Translate in-experience content](../../production/localization/custom-translations.md).
+For more information on custom translation use-cases, see [Translating In-Experience Content](../../production/localization/custom-translations.md).
-## Work with translators
+## Working with Translators
Add Roblox users as translators for your experience to help you review and polish automatic translations or provide and edit manual translations.
-You can download monthly analytics to track your translation coverage and the contribution of your translators. For more information on working with localization contributors, see [Work with translators](../../production/localization/work-with-translators.md).
+You can download monthly analytics to track your translation coverage and the contribution of your translators. For more information on working with localization contributors, see [Working with Translators](../../production/localization/working-with-translators.md).
diff --git a/content/en-us/production/localization/language-codes.md b/content/en-us/production/localization/language-codes.md
index 6dfd85c7c..282f7a239 100644
--- a/content/en-us/production/localization/language-codes.md
+++ b/content/en-us/production/localization/language-codes.md
@@ -1,6 +1,6 @@
---
-title: Language codes
-description: Language codes are languages you can specify by locale ID to support multi-lingual support.
+title: Language Codes
+description: Language Codes are languages you can specify by locale ID to support multi-lingual support.
---
You can specify languages by their language code or locale ID. Refer to the following table for a list of language codes and locale IDs that you can currently support in your localization tables on Roblox:
@@ -9,7 +9,7 @@ You can specify languages by their language code or locale ID. Refer to the foll
Language
-
Language code
+
Language Code
Locale ID
diff --git a/content/en-us/production/localization/localize-with-scripting.md b/content/en-us/production/localization/localizing-with-scripting.md
similarity index 93%
rename from content/en-us/production/localization/localize-with-scripting.md
rename to content/en-us/production/localization/localizing-with-scripting.md
index 95ecdcc75..82c174d1f 100644
--- a/content/en-us/production/localization/localize-with-scripting.md
+++ b/content/en-us/production/localization/localizing-with-scripting.md
@@ -1,19 +1,19 @@
---
-title: Localize with scripting
+title: Localizing with Scripting
description: Explains how to use localization APIs for specialized translation tasks.
---
You can use localization APIs for specialized translation tasks that are not automatically handled by [adding translations](../../production/localization/manual-translations.md) to the localization table. Roblox provides a `Class.LocalizationService` to handle all localization scripting needs. Use the `Class.LocalizationService` for the following tasks:
-- [**Localizing images and sounds**.](#localize-images-and-sounds)
-- [**Translating part of individual strings**.](#translate-individual-strings)
-- [**Applying translations from multiple languages**.](#switch-languages)
+- [**Localizing images and sounds**.](#localizing-images-and-sounds)
+- [**Translating part of individual strings**.](#translating-individual-strings)
+- [**Applying translations from multiple languages**.](#switching-languages)
-If you use any localization APIs when translating your experience, listen for any changes to the user's LocaleID to [react to users switching their language](#react-to-users-switching-languages) while in an experience.
+If you use any localization APIs when translating your experience, listen for any changes to the user's LocaleID to [react to users switching their language](#reacting-to-users-switching-languages) while in an experience.
-When reusing translation code, you should use a [**TranslationHelper ModuleScript**](#create-a-translationhelper-module) to handle errors and missing translations.
+When reusing translation code, you should use a [**TranslationHelper ModuleScript**](#creating-a-translationhelper-module) to handle errors and missing translations.
-## Localize images and sounds
+## Localizing Images and Sounds
Add localization beyond text in your experience by providing unique images and sounds based off of a user's locale. To localize assets, first add the **source** and **target** asset IDs to your experience's [localization table](../../production/localization/manual-translations.md#cloud-localization-table) then use the localization API to fetch the different assets.
@@ -81,10 +81,10 @@ end
```
-`Class.LocalizationService:GetTranslatorForPlayerAsync()|GetTranslatorForPlayerAsync()` and `Class.LocalizationService:GetTranslatorForLocaleAsync()|GetTranslatorForLocaleAsync()` are asynchronous and may occasionally fail due to poor connectivity or other issues. It is recommended to create a TranslationHelper ModuleScript to catch errors and provide fallback translation instructions.
+`Class.LocalizationService:GetTranslatorForPlayerAsync()|GetTranslatorForPlayerAsync()` and `Class.LocalizationService:GetTranslatorForLocaleAsync()|GetTranslatorForLocaleAsync()` are asynchronous and may occasionally fail due to poor connectivity or other issues. It is recommended to create a TranslationHelper ModuleScript to catch errors and provide fallback translation instructions.
-## Translate individual strings
+## Translating Individual Strings
In some circumstances, you may want to target individual strings for translation. `Class.Translator:Translate()` can fetch individual entries on the localization table based on the source string.
@@ -129,7 +129,7 @@ else
end
```
-### Use context overrides
+### Using Context Overrides
There are some cases where the same string may have multiple meanings. For example, the word "Screen" can indicate both a computer screen and a window screen, but the Spanish translations are completely different.
@@ -177,7 +177,7 @@ else
end
```
-#### Multiple contexts
+#### Multiple Contexts
In the case of multiple contexts, the localization service compares object relationships in the Context field from **right to left**, using the closest match.
@@ -207,9 +207,9 @@ For example, a localization table in your experience may have the following shar
If the string "Screen" is added to a `playerGui.ScreenGui.TextLabel` object in your experience, the localization service displays "Mosquitero" as the Spanish translation as the closest context match.
-### Substitute parameters
+### Substituting Parameters
-When using parameters to translate [dynamic content](./translate-dynamic-content.md), set the values to a [table](../../luau/tables.md) and pass the table as an argument through the API.
+When using parameters to translate [dynamic content](./translating-dynamic-content.md), set the values to a [table](../../luau/tables.md) and pass the table as an argument through the API.
In this example, the experience has a localization table with the following entries:
@@ -259,7 +259,7 @@ else
end
```
-## Switch languages
+## Switching Languages
In some cases, you may want to display translations of other languages in your experience. You can set a new translator with a different country code using `Class.LocalizationService:GetTranslatorForLocaleAsync()`.
@@ -300,7 +300,7 @@ else
end
```
-## React to users switching languages
+## Reacting to Users Switching Languages
Users can change their language settings at any time using their in-experience Settings menu. This user setting change automatically updates non-scripting localization assets, such as strings handled by [automatic translation](../../production/localization/automatic-translations.md), but may not update scripted localization changes that have already rendered, such as GUI images or sounds.
@@ -345,7 +345,7 @@ else
end
```
-## Create a TranslationHelper module
+## Creating a TranslationHelper Module
When you load translators based on the player's default locale, you might reuse code. To reuse code, set up a helper `Class.ModuleScript` that safely loads translators based on the player's default locale and includes functions for providing specific translations and switching languages.
diff --git a/content/en-us/production/localization/manual-translations.md b/content/en-us/production/localization/manual-translations.md
index dad71cd22..6e4871dd2 100644
--- a/content/en-us/production/localization/manual-translations.md
+++ b/content/en-us/production/localization/manual-translations.md
@@ -1,5 +1,5 @@
---
-title: Manually edit localization table
+title: Manually Editing Localization Table
description: Learn how to manually add, edit, and remove entries to your experience's cloud localization table.
---
@@ -7,17 +7,17 @@ When localizing your content, you might need to manually modify your localizatio
Whether you have translation entries automatically captured or manually added, all the translation entries are saved to the [**cloud localization table**](#cloud-localization-table). To modify the localization table, you can perform the following actions:
-- [Add source content](#add-source-content) to the table, either manually or automatically.
-- [Remove content](#remove-content-from-localization-table) from the table, such as usernames or other strings that shouldn't be translated.
-- [Add translations](#add-translations) to entries in the table for any supported languages set in your experience.
+- [Add source content](#adding-source-content) to the table, either manually or automatically.
+- [Remove content](#removing-content-from-localization-table) from the table, such as usernames or other strings that shouldn't be translated.
+- [Add translations](#adding-translations) to entries in the table for any supported languages set in your experience.
Before making any changes to your table, it's important to understand each field in the [cloud localization table](#cloud-localization-table) to prevent issues or conflicts.
-## Cloud localization table
+## Cloud Localization Table
The localization table is the reference for all translations within your experience. It's important to understand each field of the localization table to effectively add or modify entries.
-When populated, the table contains all user-facing content within your experience that requires translation along with any available translations for specific languages. You can [add source content](#add-source-content) and [add translations](#with-file-upload) to the Cloud Localization Table or [download and upload a `.csv` version of your table](#with-file-upload). Only users who have edit permission for an experience can access an experience's localization table.
+When populated, the table contains all user-facing content within your experience that requires translation along with any available translations for specific languages. You can [add source content](#adding-source-content) and [add translations](#with-file-upload) to the Cloud Localization Table or [download and upload a `.csv` version of your table](#with-file-upload). Only users who have edit permission for an experience can access an experience's localization table.
The localization table has the following columns:
@@ -67,19 +67,19 @@ Some fields in the localization table must be unique to avoid unexpected behavio
-## Add source content
+## Adding Source Content
-You must add source text to translate to the experience's localization table before you or any collaborators add translations. You can use [Automatic Text Capture](#automatic-text-capture) to collect text strings automatically as your experience is played by users or [manually add text sources](#manually-add-source-content).
+You must add source text to translate to the experience's localization table before you or any collaborators add translations. You can use [Automatic Text Capture](#automatic-text-capture) to collect text strings automatically as your experience is played by users or [manually add text sources](#manually-adding-source-content).
-See [Localizing images and sounds](./localize-with-scripting.md#localize-images-and-sounds) for instructions on localizing non-text content.
+See [Localizing Images and Sounds](./localizing-with-scripting.md#localizing-images-and-sounds) for instructions on localizing non-text content.
### Automatic Text Capture
The **Automatic Text Capture (ATC)** tool collects text strings that users encounter in your experience through GUI objects, such as `Class.TextLabel|TextLabels` or `Class.BillboardGui` and is usually the fastest way to collect translatable text from your experience. In many cases, the Automatic Text Capture tool is already enabled for [automatic translations](../localization/automatic-translations.md#enable-automatic-text-capture).
-### Manually add source content
+### Manually Adding Source Content
-You can also add content manually. This is recommended if your experience contains text that doesn't appear during typical gameplay, like a complex conversation tree, which may take longer to collect via ATC. You can add entries to the table [in the localization page](#add-sources-with-localization-settings) or [with a `.csv` file upload](#add-sources-with-file-upload). It is recommended to use the `.csv` upload if you want to specify an entry's Key, Context, or Example fields.
+You can also add content manually. This is recommended if your experience contains text that doesn't appear during typical gameplay, like a complex conversation tree, which may take longer to collect via ATC. You can add entries to the table [in the localization page](#adding-sources-with-localization-settings) or [with a `.csv` file upload](#adding-sources-with-file-upload). It is recommended to use the `.csv` upload if you want to specify an entry's Key, Context, or Example fields.
Entries in the localization table are case-sensitive.
@@ -87,9 +87,9 @@ Entries in the localization table are case-sensitive.
For example, when using "hello" as a source value on the localization table, Roblox does not apply translations for "Hello" or "HELLO".
-You can manually add image and sound asset IDs to the localization table with a `.csv` upload. For more information see [Localize images and sounds](./localize-with-scripting.md#localize-images-and-sounds).
+You can manually add image and sound asset IDs to the localization table with a `.csv` upload. For more information see [Localizing Images and Sounds](./localizing-with-scripting.md#localizing-images-and-sounds).
-#### Add sources with localization settings
+#### Adding Sources With Localization Settings
You can add source content in the [localization page](../localization/index.md#localization-settings). This is ideal for making quick additions to your localization table.
@@ -111,7 +111,7 @@ To add source content through the localization page:
6. If the string has multiple meanings, such as a character's back and a back button, input the full path of the specific text object in the **Context** field.
7. Click **Save**.
-#### Add sources with file upload
+#### Adding Sources With File Upload
You can add source content to your localization table with a `.csv` upload. You can use this option when making large numbers of updates to your localization table.
@@ -154,11 +154,11 @@ To add source content through the `.csv` upload:
6. In Studio, in the **Cloud Localization Table** section, select **Update** and upload the new `.csv` file.
7. Click **Confirm** on the **Confirm Upload** prompt to save the new entry to the cloud localization table.
-## Remove content from localization table
+## Removing Content from Localization Table
If you find source content that is wrong or no longer needed in your localization, you can remove this content by either clearing all entries collected via ATC or manually removing source content. When you remove source content, you also remove any associated translations.
-### Clear unmodified auto-captured entries
+### Clear Unmodified Auto-Captured Entries
You might want to remove some auto-captured entries if the ATC tool collects strings that shouldn't be translated, such as usernames, user-generated names, or chat strings. This option only clears auto-captured entries that you haven't manually edited.
@@ -172,7 +172,7 @@ To clear unmodified auto-captured entries:
src="../../assets/localization/Portal-Clear-Strings.png"
width="80%" />
-### Manually remove source content
+### Manually Remove Source Content
You can also remove entries manually. This is recommended if you have specific entries you want to remove or if the entries you want to remove were manually modified in any way, such as content that is added manually or ATC entries that have been manually edited.
@@ -198,17 +198,17 @@ To remove source content through a `.csv` upload:
6. In Studio, in the **Cloud Localization Table** section, select **Update** and upload the new `.csv` file.
7. Click **Confirm** on the **Confirm Upload** prompt to save the new entry to the cloud localization table.
-## Add translations
+## Adding Translations
You can add translations to source entries on your experience's localization table using the [translator portal](#in-translator-portal) or [with a `.csv` file upload](#with-file-upload).
-In some cases, strings may require real-time translation during gameplay, such as a timer, using units of measurement, or when displaying player names. You can add translation parameters to the localization table as placeholders for this type of content. See [Translate dynamic content](./translate-dynamic-content.md) for implementation details.
+In some cases, strings may require real-time translation during gameplay, such as a timer, using units of measurement, or when displaying player names. You can add translation parameters to the localization table as placeholders for this type of content. See [Translating Dynamic Content](./translating-dynamic-content.md) for implementation details.
### In Translator Portal
Your experience's [Translator Portal](../localization/index.md#localization-settings) provides a direct way to provide translations for the collected strings. Users added as translators for your experience can access the Translator Portal.
-#### Add string translations
+#### Adding String Translations
To translate text through the localization page:
@@ -225,7 +225,7 @@ To translate text through the localization page:
You cannot make edits to an existing source's Key, Context or Example fields through the localization settings page. To add or edit a source's Key, Context, or Example fields, you can remove and re-add the entry on the Localization page with these fields included, or make the edits directly with [file upload](#with-file-upload).
-#### Add experience information translations
+#### Adding Experience Information Translations
You can modify experience information, such as the name, description, icon, and thumbnails, by updating the localization table:
@@ -243,7 +243,7 @@ You can modify experience information, such as the name, description, icon, and
-#### Add experience product translations
+#### Adding Experience Product Translations
You can modify experience product details, such as developer [products](../../production/monetization/developer-products.md), [game passes](../../production/monetization/game-passes.md), and [badges](../../production/publishing/badges.md):
@@ -255,7 +255,7 @@ You can modify experience product details, such as developer [products](../../pr
-### With file upload
+### With File Upload
Using Studio or Creator Hub, you can download, modify, and re-upload your localization table as a `.csv` spreadsheet. This is helpful when editing several translations at a time or when collaborating with translators outside of Roblox.
@@ -268,7 +268,7 @@ When modifying or adding translations with file upload, the following behavior a
**Does the entry already exist in the Cloud Localization Table?**
**Changes made to CSV**
-
**Expected behavior on upload**
+
**Expected Behavior on Upload**
@@ -318,7 +318,7 @@ To begin adding a new supported language, you need to manually add the country c
-#### With Creator Hub
+#### Using Creator Hub
To translate text using the `.csv` in Creator Hub:
@@ -330,7 +330,7 @@ To translate text using the `.csv` in Creator Hub:
6. Select **Upload CSV** and upload the updated `.csv`.
7. Click **Confirm** on the prompt to save the new entries to the cloud localization table.
-#### With Studio
+#### Using Studio
To translate text using the `.csv` through Studio:
diff --git a/content/en-us/production/localization/translate-dynamic-content.md b/content/en-us/production/localization/translating-dynamic-content.md
similarity index 93%
rename from content/en-us/production/localization/translate-dynamic-content.md
rename to content/en-us/production/localization/translating-dynamic-content.md
index 2769b5311..26d5c52a0 100644
--- a/content/en-us/production/localization/translate-dynamic-content.md
+++ b/content/en-us/production/localization/translating-dynamic-content.md
@@ -1,9 +1,9 @@
---
-title: Translate dynamic content
+title: Translating Dynamic Content
description: Explains how to use Parameters in localization tables to translate specific parts of content.
---
-You can use **parameters** in your [localization table](../../production/localization/manual-translations.md#cloud-localization-table) when only
+You can use **Parameters** in your [localization table](../../production/localization/manual-translations.md#cloud-localization-table) when only
part of the displayed string requires translation, such as localizing a
unit of measurement after a number value, referencing a username, or
displaying time and date.
@@ -53,8 +53,8 @@ If a user has their locale set to **es**, the translation output would be as fol
-
Original in-game text
-
Spanish translation
+
Original In-Game Text
+
Spanish Translation
@@ -79,7 +79,7 @@ The available format specifiers are as follows:
Specifier
Type
Description
-
Example output
+
Example Output
@@ -152,7 +152,7 @@ The available format specifiers are as follows:
-## Translate substrings
+## Translating Substrings
Use the **translate** specifier when requiring a direct translation from your localization table. The localization will search for an exact match of the parameter in the Source column of your localization table.
@@ -190,8 +190,8 @@ If a user has their locale set to 'es', the translation output displays as follo
-
Original in-game text
-
Spanish translation
+
Original In-Game Text
+
Spanish Translation
@@ -210,7 +210,7 @@ If a user has their locale set to 'es', the translation output displays as follo
-## Translate with numbers
+## Translating With Numbers
You can use a specifier to format your numerical values to match the context within your experience.
@@ -240,8 +240,8 @@ If a user has their locale set to **es**, the translation output displays as fol
-
Original in-game text
-
Spanish translation
+
Original In-Game Text
+
Spanish Translation
diff --git a/content/en-us/production/localization/work-with-translators.md b/content/en-us/production/localization/working-with-translators.md
similarity index 84%
rename from content/en-us/production/localization/work-with-translators.md
rename to content/en-us/production/localization/working-with-translators.md
index ca27601e3..fd94987e4 100644
--- a/content/en-us/production/localization/work-with-translators.md
+++ b/content/en-us/production/localization/working-with-translators.md
@@ -1,19 +1,19 @@
---
-title: Work with translators
+title: Working with Translators
description: Explains the benefit of working with a native speaker to assist with localization efforts.
---
When translating content in your experience to a language that you are not familiar with, it's beneficial to work with a native speaker of that language to add or review any translations. Use the following tools to manage translators for your experience:
-- [Add other Roblox users or groups](#add-translators) to help you translate your experience,
+- [Add other Roblox users or groups](#adding-translators) to help you translate your experience,
- [Access localization reports](#translation-analytics) to track the contributions and translation coverage of your Roblox translators.
-- Share the `.csv` file of your localization table with a [Non-Roblox translator](#work-with-non-roblox-translators).
+- Share the `.csv` file of your localization table with a [Non-Roblox translator](#working-with-non-roblox-translators).
-Before working with any translators, make sure you set your source and supported languages in the experience's localization settings.
+Before working with any translators, make sure you set your source and supported languages in the experience's localization settings.
-## Add translators
+## Adding Translators
You can add Roblox users or groups as translators in your experience's [localization page](../localization/index.md#localization-settings). Adding Roblox users as translators allows you to leverage all the benefits of Roblox's translation tools such as managing group-level permissions and viewing translation analytics.
@@ -38,7 +38,7 @@ To add a Roblox user or group as a translator:
5. If adding a group, input the **group ID** and select the right group from the dropdown and the selected roles.
6. Click **Confirm** once you have selected the users or groups you want to add.
-## Access the Translator Portal
+## Accessing the Translator Portal
All translators that you add to your experience can access the **Translator Portal**, a translator specific page that provides access to your experience's localization table.
@@ -59,7 +59,7 @@ To access an experience's Translator Portal from the Creator Dashboard:
src="../../assets/localization/Translator-Portal.png"
width="80%" />
-## Translation analytics
+## Translation Analytics
As translators add translations, Roblox compiles translation reports every two weeks that give you visibility into what your translation coverage looks like for each supported language and which translators have been contributing.
@@ -73,8 +73,8 @@ To download a translation report:
src="../../assets/localization/Translation-Reports.png"
width="80%" />
-## Work with non-Roblox translators
+## Working with Non-Roblox Translators
You can work with translators who do not have Roblox accounts by downloading your experience's localization table as a `.csv` and having your translators add directly to the spreadsheet file. Once your translators have added their contributions, you can re-upload the `.csv` file through Studio. When adding translations through this workflow, translation analytics does not capture translator contributions and detailed history.
-See [Add translations with file upload](../../production/localization/manual-translations.md#add-translations-with-file-upload) for more information on downloading your experience's localization spreadsheet.
+See [Adding Translations With File Upload](../../production/localization/manual-translations.md#adding-translations-with-file-upload) for more information on downloading your experience's localization spreadsheet.
diff --git a/content/en-us/production/monetization/avatar-creation-token.md b/content/en-us/production/monetization/avatar-creation-token.md
index 4b607cc9a..d2f46157b 100644
--- a/content/en-us/production/monetization/avatar-creation-token.md
+++ b/content/en-us/production/monetization/avatar-creation-token.md
@@ -1,17 +1,17 @@
---
-title: Avatar creation token
+title: Avatar Creation Token
description: Enable users to create and purchase avatar items in experience.
---
-An **avatar creation token** enables developers to allow users to create, purchase, and save avatar items directly from an experience to their platform-level inventory. Experiences that implement in-experience creation APIs, such as `Class.AvatarCreationService.PromptCreateAvatarAsync|PromptCreateAvatarAsync`, must include one or more avatar creation tokens. You can purchase and manage tokens in your experience's [Creator Dashboard](https://create.roblox.com/dashboard/creations).
+An **Avatar Creation Token** enables developers to allow users to create, purchase, and save avatar items directly from an experience to their platform-level inventory. Experiences that implement in-experience creation APIs, such as `Class.AvatarCreationService.PromptCreateAvatarAsync|PromptCreateAvatarAsync`, must include one or more Avatar Creation Tokens. You can purchase and manage tokens in your experience's [Creator Dashboard](https://create.roblox.com/dashboard/creations).
Owners of experiences that incorporate in-experience avatar item creation also benefit from [Marketplace commissions](../../marketplace/marketplace-fees-and-commissions.md#commissions) as both **creator** and **experience owner**.
-To create avatar creation tokens, you or your group must meet the [Marketplace creator requirements](../../marketplace/marketplace-policy.md#creator-requirements). For the token to remain valid, the token owner must maintain these creator requirements.
+To create Avatar Creation Tokens, you or your group must meet the [Marketplace Creator requirements](../../marketplace/marketplace-policy.md#creator-requirements). For the token to remain valid, the token owner must maintain these creator requirements.
-## Create a token
+## Creating a Token
To allow users to create, pay for, and save avatar items to their Roblox inventory in your experience, you'll need to set up an Avatar Creation Token in your experience's dashboard.
@@ -37,5 +37,5 @@ To create a token:
7. When complete, verify the **Creation Advance** and **Creation Fee** calculations and select **Create Token** to submit your purchase.
-8. You can now access the created token in the experience's **avatar creation tokens** settings. To implement `Class.AvatarCreationService.PromptCreateAvatarAsync|PromptCreateAvatarAsync`, you'll need the token ID which you can access by selecting the three dots on the thumbnail and selecting **Copy Token ID**.
+8. You can now access the created token in the experience's **Avatar Creation Tokens** settings. To implement `Class.AvatarCreationService.PromptCreateAvatarAsync|PromptCreateAvatarAsync`, you'll need the token ID which you can access by selecting the three dots on the thumbnail and selecting **Copy Token ID**.
diff --git a/content/en-us/production/monetization/avatar-items.md b/content/en-us/production/monetization/avatar-items.md
index fbe14aedb..1be9124c5 100644
--- a/content/en-us/production/monetization/avatar-items.md
+++ b/content/en-us/production/monetization/avatar-items.md
@@ -1,5 +1,5 @@
---
-title: Avatar items
+title: Avatar Items
description: Sell community created Avatar items exclusively through your experience.
---
@@ -13,24 +13,24 @@ By selling unique avatar items in your experience, you can create experience-spe
For information on how to create and sell your own avatar items, which requires third-party software such as Blender or Maya, see Roblox's [Avatar](../../avatar/index.md) documentation.
-## Enable in-experience sales
+## Enabling In-Experience Sales
To set an avatar item on sale, the item creator and the experience owner must perform the following:
-1. The **item creator** must [add the experience's Place ID](#add-place-id) to their item's sale location data.
-2. The **experience owner** must [add the avatar item's Asset ID](#add-items-to-experience) and enable the item.
+1. The **item creator** must [add the experience's Place ID](#adding-place-id) to their item's sale location data.
+2. The **experience owner** must [add the avatar item's Asset ID](#adding-items-to-experience) and enable the item.
1. If the experience owner and the item creator are the same person, Roblox automatically adds and enables the asset to the experience after setting the sale location.
-### Add place ID
+### Adding Place ID
Before enabling an avatar item sale in your experience, the creator of the item must add the experience's starting place ID to the avatar item's sales location.
1. Open the [Creations](https://create.roblox.com/dashboard/creations) page on **Creator Dashboard**.
2. Click the **⋯** in the corner of the experience's thumbnail and select **Copy Start Place ID**.
-3. As the item creator, [update your item's marketplace settings](../../marketplace/publish-to-marketplace.md#marketplace-settings) and add the Place ID to the item's Sale Location field.
+3. As the item creator, [update your item's marketplace settings](../../marketplace/publishing-to-marketplace.md#marketplace-settings) and add the Place ID to the item's Sale Location field.
-### Add items to experience
+### Adding Items to Experience
After the item creator adds your experience to the asset's sale location, you can now enable the item for the experience.
@@ -47,7 +47,7 @@ To search and enable an asset for sale:
-## Avatar items analytics
+## Avatar Items Analytics
Avatar Items analytics help you gauge the success of individual Avatar Items, identify trends, and forecast potential future earnings.
diff --git a/content/en-us/production/monetization/business-resources.md b/content/en-us/production/monetization/business-resources.md
index 888682d09..dc5618d77 100644
--- a/content/en-us/production/monetization/business-resources.md
+++ b/content/en-us/production/monetization/business-resources.md
@@ -1,5 +1,5 @@
---
-title: Build your business
+title: Building Your Business
description: Explains the resources that can help you run and build businesses on Roblox.
---
@@ -7,19 +7,19 @@ See the following resources to help you run and build businesses on Roblox.
## Videos
-### Grow bigger developer studios
+### Growing Bigger Developer Studios
Learn how to create partnerships with developers and grow your team.
-### Tips for scaling up a company on Roblox
+### Tips For Scaling Up a Company on Roblox
Get tips and lessons Nathan learned while scaling up a company on Roblox.
-### Protect you and your business
+### Protecting You and Your Business
How to protect yourself, your business, and your intellectual property.
diff --git a/content/en-us/production/monetization/developer-products.md b/content/en-us/production/monetization/developer-products.md
index 22235ccfd..bd77f4f87 100644
--- a/content/en-us/production/monetization/developer-products.md
+++ b/content/en-us/production/monetization/developer-products.md
@@ -1,5 +1,5 @@
---
-title: Developer products
+title: Developer Products
description: Developer products let you charge users a Robux fee for items or abilities that they can access and use inside your experience.
---
@@ -11,10 +11,10 @@ A **developer product** is an item or ability that a user can purchase more than
For items or abilities that a user should only purchase **once**, such as a special weapon or a permanent power-up, see [Passes](../../production/monetization/game-passes.md).
-## Create developer products
+## Creating Developer Products
- Before creating a developer product, make sure your experience has been [published](../../production/publishing/publish-experiences-and-places.md) and is accessible on Roblox.
+ Before creating a developer product, make sure your experience has been [published](../../production/publishing/publishing-experiences-and-places.md) and is accessible on Roblox.
To create a developer product:
@@ -28,10 +28,10 @@ To create a developer product:
7. Click **Create Developer Product**.
- If you want to use the developer product as a randomized reward, review the [randomized virtual item policy](./randomized-virtual-items-policy.md).
+ If you want to use the developer product as a randomized reward, review the [Randomized Virtual Item Policy](./randomized-virtual-items-policy.md).
-## Get developer product IDs
+## Getting Developer Product IDs
To use scripting, you need a developer product ID. To get the product ID:
@@ -41,7 +41,7 @@ To use scripting, you need a developer product ID. To get the product ID:
-## Sell developer products
+## Selling Developer Products
If you're using [price optimization](./price-optimization.md), make sure to place the script inside a `Class.LocalScript` so that users see personalized product prices.
@@ -143,7 +143,7 @@ button.MouseButton1Click:Connect(function()
end)
```
-## Handle developer product purchases
+## Handling Developer Product Purchases
After a user purchases a developer product, you must handle and record the transaction. To do this, use a `Class.Script` within `Class.ServerScriptService` using the `Class.MarketplaceService.ProcessReceipt()|ProcessReceipt()` function.
@@ -218,7 +218,7 @@ The functions for handling each product ID must return `true` for the transactio
Although Roblox itself does **not** record the purchase history of developer products by specific users, you can request to [download sales data](../../production/analytics/analytics-dashboard.md#sales-data). If you want to track user-specific purchase history, it's your responsibility to [store the data](../../cloud-services/data-stores).
-## Developer product analytics
+## Developer Product Analytics
Use developer product analytics to analyze the success of individual products, identify trends, and forecast potential future earnings.
diff --git a/content/en-us/production/monetization/engagement-based-payouts.md b/content/en-us/production/monetization/engagement-based-payouts.md
index 0a6044b37..c093b838c 100644
--- a/content/en-us/production/monetization/engagement-based-payouts.md
+++ b/content/en-us/production/monetization/engagement-based-payouts.md
@@ -1,5 +1,5 @@
---
-title: Engagement-based payouts
+title: Engagement-Based Payouts
description: Engagement-based payouts allow you to earn Robux based on the share of time Roblox Premium members engage in your experience.
---
@@ -7,7 +7,7 @@ Automatic **engagement-based payouts** let you earn Robux based on the share of
To encourage Premium subscriber growth and increase your potential to earn engagement-based payouts, you can add the [Premium Purchase Modal](#premium-purchase-modal) directly into an experience. Keep in mind, users from some countries may not have access to Premium subscriptions.
-## Access payout data
+## Accessing Payout Data
Payout data can provide vital feedback to help you understand what factors drive Premium subscribers to your experiences.
@@ -18,7 +18,7 @@ To access payout data:
2. Navigate to the **Monetization** tab and select **Engagement Payouts**.
-### Engagement payouts
+### Engagement Payouts
The **Engagement-Based Payouts** charts track payout data based on the following metrics:
@@ -34,7 +34,7 @@ The **Engagement-Based Payouts** charts track payout data based on the following
Note that the dotted "projected earnings" line becomes solid after the payout amount is final, at which point Roblox adds the payout to your **Pending Robux** amount [here](https://www.roblox.com/transactions).
-## Premium purchase modal
+## Premium Purchase Modal
One strategy to increase engagement-based payouts is to encourage [Premium](https://www.roblox.com/premium/membership) upgrade through the **purchase modal**. Players can complete the purchase entirely within the experience and immediately receive both Premium status and their initial stipend of Robux.
@@ -45,14 +45,14 @@ One strategy to increase engagement-based payouts is to encourage [Premium](http
Remember that Premium membership should not be a "requirement" to enjoy an experience. When implementing incentives for Premium members, it's highly recommended that you follow these best practices:
-- Honestly and accurately describe the benefits of upgrading within the experience's [description](../../production/publishing/publish-experiences-and-places.md#experience-description).
+- Honestly and accurately describe the benefits of upgrading within the experience's [description](../../production/publishing/publishing-experiences-and-places.md#experience-description).
- Do not promise Robux or other out-of-experience rewards that you don't control.
- Do not show the modal as a "paywall" when non-Premium members enter the experience.
- Consider offering exclusive [merch](../../resources/modules/merch-booth.md) to Premium members, but do not give them a tactical gameplay advantage over others, such as an array of ultra-powerful weapons that non-Premium members can't compete against.
-### Check membership
+### Checking Membership
-Before scripting any logic related to Premium membership or [triggering the modal](#trigger-the-modal), check a user's `Class.Player.MembershipType|MembershipType` property to determine if they're already subscribed.
+Before scripting any logic related to Premium membership or [triggering the modal](#triggering-the-modal), check a user's `Class.Player.MembershipType|MembershipType` property to determine if they're already subscribed.
```lua
local Players = game:GetService("Players")
@@ -64,7 +64,7 @@ if player.MembershipType == Enum.MembershipType.Premium then
end
```
-### Trigger the modal
+### Triggering the Modal
You can trigger the purchase modal with the `Class.MarketplaceService:PromptPremiumPurchase()|PromptPremiumPurchase()` method. For example, the following code prompts users to purchase Premium when their character touches the part that its containing `Class.Script` is attached to, such as a teleporter that allows access to an exclusive area.
diff --git a/content/en-us/production/monetization/game-passes.md b/content/en-us/production/monetization/game-passes.md
index 809fac551..7fa0141ad 100644
--- a/content/en-us/production/monetization/game-passes.md
+++ b/content/en-us/production/monetization/game-passes.md
@@ -9,10 +9,10 @@ description: Passes let you charge users a one-time Robux fee to access privileg
For items that a player might purchase multiple times, such as potions, temporary power-ups, or in-experience currency, see [Developer Products](../../production/monetization/developer-products.md).
-## Create passes
+## Creating Passes
- Before creating a pass, make sure your experience has been [published](../../production/publishing/publish-experiences-and-places.md) and is accessible on Roblox.
+ Before creating a pass, make sure your experience has been [published](../../production/publishing/publishing-experiences-and-places.md) and is accessible on Roblox.
To create a pass:
@@ -43,7 +43,7 @@ To create a pass:
If you want to use the pass as a randomized reward, review the [Randomized Virtual Item Policy](./randomized-virtual-items-policy.md).
-## Get pass IDs
+## Getting Pass IDs
To use scripting, you need a pass ID. To get the pass ID:
@@ -53,7 +53,7 @@ To use scripting, you need a pass ID. To get the pass ID:
-## Sell passes
+## Selling Passes
If you're using [price optimization](./price-optimization.md), make sure to place the script inside a `Class.LocalScript` so that users see personalized pass prices.
@@ -61,7 +61,7 @@ If you're using [price optimization](./price-optimization.md), make sure to plac
You can sell passes outside or inside an experience.
-### Outside an experience
+### Outside an Experience
To sell a pass in an experience's **Store** page:
@@ -73,7 +73,7 @@ To sell a pass in an experience's **Store** page:
6. In the **Price in Robux** field, enter the amount of Robux you want to charge users for the pass. The price you enter affects how much Robux you earn per sale. The price you enter affects how much Robux you earn per sale. The minimum price is 1 Robux, and the maximum price is 1 billion Robux.
7. Click **Save Changes**. The pass populates in the experience's **Store** page.
-### Inside an experience
+### Inside an Experience
To implement and sell a pass inside an experience, call `Class.MarketplaceService|MarketplaceService` functions.
@@ -162,7 +162,7 @@ MarketplaceService.PromptGamePassPurchaseFinished:Connect(onPromptPurchaseFinish
Although Roblox itself does **not** record the purchase history of developer products by specific users, you can request to [download sales data](../../production/analytics/analytics-dashboard.md#sales-data). If you want to track user-specific purchase history, it's your responsibility to [store the data](../../cloud-services/data-stores).
-## Assign pass privileges
+## Assigning Pass Privileges
You must manually assign pass privileges to users that purchase your passes. To do this, use `Class.Players.PlayerAdded|PlayerAdded` when a user joins your experience to check if they already own the pass and to assign them the pass privileges.
@@ -199,7 +199,7 @@ end
Players.PlayerAdded:Connect(onPlayerAdded)
```
-## Pass analytics
+## Pass Analytics
Use pass analytics to analyze the success of individual passes, identify trends, and forecast potential future earnings.
diff --git a/content/en-us/production/monetization/immersive-ads.md b/content/en-us/production/monetization/immersive-ads.md
index b5701d73d..86cd3a7f7 100644
--- a/content/en-us/production/monetization/immersive-ads.md
+++ b/content/en-us/production/monetization/immersive-ads.md
@@ -1,34 +1,34 @@
---
-title: Immersive ads
-description: Immersive ads allow you insert ad units into your experience that programmatically serve ad content.
+title: Immersive Ads
+description: Immersive Ads allow you insert ad units into your experience that programmatically serve ad content.
---
-The **immersive ads** system allows you to insert ad units into your experience that permit Roblox to programmatically serve ad content from advertisers to your active users. There are three ad formats that may be served in your experience:
+The **Immersive Ads** system allows you to insert ad units into your experience that permit Roblox to programmatically serve ad content from advertisers to your active users. There are three ad formats that may be served in your experience:
-- **Video ads** — A video up to 30 seconds that users can watch in-experience, which can either be click-to-play or autoplaying.
-- **Image ads** — A static, non-clickable image within the 3D space.
-- **Portal ads** — A static, non-clickable image with a door that teleports users into an advertiser's experience.
+- **Video Ads** — A video up to 30 seconds that users can watch in-experience, which can either be click-to-play or autoplaying.
+- **Image Ads** — A static, non-clickable image within the 3D space.
+- **Portal Ads** — A static, non-clickable image with a door that teleports users into an advertiser's experience.
- With portal ads, the advertiser's experience includes a button to return users back to your experience.
+ With Portal Ads, the advertiser's experience includes a button to return users back to your experience.
- Video ad format (autoplaying)
+ Video Ad Format (Autoplaying)
- Video ad format (click-to-play)
+ Video Ad Format (Click-to-play)
- Image ad format
+ Image Ad Format
- Portal ad format
+ Portal Ad Format
@@ -51,7 +51,7 @@ To illustrate this concept, see the following three images of the same ad unit s
-## Publisher earnings from immersive ads
+## Publisher Earnings From Immersive Ads
If your active users are eligible to see ads and meet the specific criteria from the advertiser, such as their country or device, you may be eligible to earn Robux according to how they interact with the ad content.
@@ -73,13 +73,13 @@ Roblox pays out earnings on the 25th of the following month from when you insert
Roblox has ad fraud systems in place to create a positive advertiser, publisher, and user experience. Per Roblox's [Advertising Standards](https://en.help.roblox.com/hc/en-us/articles/13722260778260-Advertising-Standards), if you engage in malicious practices to inflate impressions or teleports, Roblox may deduct Robux from your expected payout or reclaim fraudulently earned Robux. In addition, Roblox may suspend your experience and/or account.
-## Publisher eligibility
+## Publisher Eligibility
The following requirements take effect from June 1st, 2024.
-While anyone can insert ad units into their experiences, Roblox only serves ads into ad units if the experience or group owner and experience is eligible to serve ads. In Creator Hub, you can see and manage your publisher eligibility status in a new "Eligibility" tab on the immersive ads page.
+While anyone can insert ad units into their experiences, Roblox only serves ads into ad units if the experience or group owner and experience is eligible to serve ads. In Creator Hub, you can see and manage your publisher eligibility status in a new "Eligibility" tab on the Immersive Ads page.
@@ -106,11 +106,11 @@ Publishers who do not comply with these requirements may lose their eligibility
-## User eligibility
+## User Eligibility
-Even if your experience is eligible to serve ads, not all users are eligible to see ads, such as those under the age of 13 or users outside of a campaign's audience selection. If a user is ineligible to see ads, ad units display a fallback image of the Roblox logo to those ineligible users, but you can remove the ad units altogether as described in [Remove ad units for ineligible users](#remove-ad-units-for-ineligible-users).
+Even if your experience is eligible to serve ads, not all users are eligible to see ads, such as those under the age of 13 or users outside of a campaign's audience selection. If a user is ineligible to see ads, ad units display a fallback image of the Roblox logo to those ineligible users, but you can remove the ad units altogether as described in [Removing Ad Units for Ineligible Users](#removing-ad-units-for-ineligible-users).
-## Insert ad units
+## Inserting Ad Units
@@ -129,7 +129,7 @@ When you insert an ad unit into an eligible experience, it's important to check
-### Video ads
+### Video Ads
Eligible users can see two types of video ads within Roblox experiences, depending on how the advertiser bids:
@@ -192,7 +192,7 @@ Video ads should not be served when users are idle or away from keyboard (AFK).
-### Image ads
+### Image Ads
An image ad is a non-clickable static image that serves ads through an `Class.AdGui` instance that you can place on block `Class.Part` instances anywhere within the 3D space of an experience as long as nothing obstructs the view of the ad from users. The aspect ratio of the image scales with the face of the block you choose to display the ad content.
@@ -219,7 +219,7 @@ To insert an image ad:
1. From the menu, insert an **AdGui**.
- You can also insert an image ad package from the Creator Store, then customize it to fit your experience as long as the ad unit continues to meet the validation criteria. For instructions on how to insert ad units from the Creator Store, see [Insert ad units - portal ads](#portal-ads).
+ You can also insert an image ad package from the Creator Store, then customize it to fit your experience as long as the ad unit continues to meet the validation criteria. For instructions on how to insert ad units from the Creator Store, see [Inserting Ad Units - Portal Ads](#portal-ads).
Once you publish the experience, users can see the ad unit in one of the following states:
@@ -251,7 +251,7 @@ Once you publish the experience, users can see the ad unit in one of the followi
-### Portal ads
+### Portal Ads
A portal ad is made up of two core components:
@@ -325,7 +325,7 @@ Once you publish the experience, users can see the ad unit in one of the followi
-## Remove ad units for ineligible users
+## Removing Ad Units for Ineligible Users
Per Roblox's [Advertising Standards](https://en.help.roblox.com/hc/en-us/articles/13722260778260-Advertising-Standards), you must either hide, replace, or block ad content from users who are ineligible to see ads. By default, immersive ad units handle this by replacing ads with a fallback image of the Roblox logo for users ineligible to see ads. However, if you want to hide or remove the ad units entirely, you must use `Class.PolicyService:GetPolicyInfoForPlayerAsync()` to return an `AreAdsAllowed` boolean that determines the eligibility of each user who accesses your experience to see ads, then include logic to modify ad visibility to ineligible users.
@@ -352,7 +352,7 @@ local mainPortal = Workspace:WaitForChild("Main Portal Template")
end
```
-## View immersive ad metrics
+## Viewing Immersive Ad Metrics
Once you insert ad units into your experience, the [Creator Dashboard](https://create.roblox.com/dashboard/creations) generates different types of metrics graphs to help you analyze the overall performance of your Immersive Ads. After about 48 hours of having Immersive Ads run in your experience, you can see how many video views, impressions, and teleports you're generating through your user base, how each ad unit format performs, and how many Robux you're earning from individual ad units.
diff --git a/content/en-us/production/monetization/index.md b/content/en-us/production/monetization/index.md
index 4fc815556..865c1ec20 100644
--- a/content/en-us/production/monetization/index.md
+++ b/content/en-us/production/monetization/index.md
@@ -3,17 +3,17 @@ title: Monetization
description: Monetization is a part of Roblox's overall structure to provide value to creators.
---
-Monetization is a part of Roblox's overall structure to provide value to creators. There are several different approaches to monetize your content, including utilizing [subscriptions](#subscriptions), charging an [access fee](#paid-access), providing [items or abilities that users can purchase](#developer-products), offering [private servers](#private-servers) for users to play just with friends, and [selling plugins](../sell-on-creator-store.md) to other creators on the Creator Store.
+Monetization is a part of Roblox's overall structure to provide value to creators. There are several different approaches to monetize your content, including utilizing [subscriptions](#subscriptions), charging an [access fee](#paid-access), providing [items or abilities that users can purchase](#developer-products), offering [private servers](#private-servers) for users to play just with friends, and [selling plugins](../selling-on-creator-store.md) to other creators on the Creator Store.
If you choose to offer purchasable content, Roblox doesn't automatically record product or purchase information. To prevent data loss, you must carefully store this data using `Class.DataStoreService` or another data storage service hosted outside of Roblox.
-For an in-depth look at designing optimal monetization strategies for your experience, see [Monetization foundations](../../production/game-design/monetization-foundations.md).
+For an in-depth look at designing optimal monetization strategies for your experience, see [Monetization Foundations](../../production/game-design/monetization-foundations.md).
-## Monetization strategies
+## Monetization Strategies
Be mindful of the monetization methods you introduce into your experience as our users are likely to **downvote** your experience if they do not approve of your strategies. Also, all developers need to be transparent with any [chance-based monetization](../../production/monetization/randomized-virtual-items-policy.md) and use these mechanics responsibly.
@@ -25,45 +25,45 @@ The following best practice suggestions are popular among top developers for tai
Please note that by applying these techniques and considerations, you are not guaranteed to be able to effectively monetize your experience. Remember that you don't need to have any financial goals to have fun creating a Roblox experience.
-### Tourists and locals
+### Tourists and Locals
It can be helpful to think of Roblox users in two categories:
- **Tourists** typically hop from one experience to another, prioritizing variety over depth. They prefer items with immediate effects, either through making gameplay more fun or through making them stand out, inviting other users to question how and where they got the item.
- **Locals** are more likely to focus on a particular experience or smaller set of experiences. They engage more deeply, and typically form almost all an experience's engaged user base. They are more interested in items with long term benefits, such as a '[battle pass](../../production/game-design/season-pass-design.md)'.
-To learn more about how to design your experience with Roblox users in mind, see [Design for Roblox](../../production/game-design/design-for-roblox.md).
+To learn more about how to design your experience with Roblox users in mind, see: [Designing for Roblox](../../production/game-design/designing-for-roblox.md).
-### Social features
+### Social Features
Roblox users tend to enjoy experiences which emphasize social interaction. For instance, having items or events that are only available for a **limited time** can create excitement around that content. A **trading** system encourages users to interact. While both systems can be successful on their own, they are particularly effective when combined.
-### Live ops
+### Live Ops
Post-launch support is in many ways easier on Roblox than on other platforms as you can quickly ship updates to improve your experience.
-**Frequent** content updates can be helpful if you want to maintain engagement with your experience over time. Roblox users are used to being engaged by regular updates, and it can be much harder to regain a user's interest than it can be to maintain active ones. A **weekly cadence** for updates is ideal. At the bare minimum, aim for monthly updates. For a discussion on content cadence, see the Level Up [content cadence workshop](../../production/game-design/content-updates.md).
+**Frequent** content updates can be helpful if you want to maintain engagement with your experience over time. Roblox users are used to being engaged by regular updates, and it can be much harder to regain a user's interest than it can be to maintain active ones. A **weekly cadence** for updates is ideal. At the bare minimum, aim for monthly updates. For a discussion on content cadence, see the Level Up [Content Cadence workshop](../../production/game-design/content-updates.md).
When designing updates, keep them focused on a particular **theme**. This makes it easier for users to understand the new update and tell what content is new when they join. It also helps you coordinate your content and promotional assets. For example, if you're adding a new Zoo to your roleplaying experience, make sure all new content has some connection to the Zoo theme.
Don't be afraid to make users earn their **access** to new content. New users will flock to play new updates, but if they don't feel like they've **achieved** something in the experience, they may check out soon after. You can create a sense of earning an update either through monetizing the update content or creating pre-requisite conditions for playing the new content.
-To learn more about how to design effective post-launch support for your experience, see [Live ops essentials](../../production/game-design/liveops-essentials.md).
+To learn more about how to design effective post-launch support for your experience, see [Live Ops Essentials](../../production/game-design/liveops-essentials.md).
## Products
-### Immersive ads
+### Immersive Ads
-The [immersive ads](../../production/monetization/immersive-ads.md) system allows you to insert ad units into your experience that permit Roblox to programmatically serve ad content from advertisers to your active users.
+The [Immersive Ads](../../production/monetization/immersive-ads.md) system allows you to insert ad units into your experience that permit Roblox to programmatically serve ad content from advertisers to your active users.
- Image ad format
+ Image Ad Format
- Portal ad format
+ Portal Ad Format
@@ -78,37 +78,37 @@ The [immersive ads](../../production/monetization/immersive-ads.md) system allow
### Passes
-A [pass](../../production/monetization/game-passes.md) allows you to charge a **one-time Robux fee** in order for users to access special privileges within an experience, such as entry to a restricted area, an in-experience avatar item, or a permanent power-up.
+A [Pass](../../production/monetization/game-passes.md) allows you to charge a **one-time Robux fee** in order for users to access special privileges within an experience, such as entry to a restricted area, an in-experience avatar item, or a permanent power-up.
-### Developer products
+### Developer Products
-A [developer product](../../production/monetization/developer-products.md) is an item or ability that a user can purchase more than once, such as in-experience currency, ammo, or potions. You can prompt purchases, record them, and get product information through scripting.
+A [Developer Product](../../production/monetization/developer-products.md) is an item or ability that a user can purchase more than once, such as in-experience currency, ammo, or potions. You can prompt purchases, record them, and get product information through scripting.
-### Price optimization
+### Price Optimization
[Price optimization](../../production/monetization/price-optimization.md) lets you find the best price points for your passes and developer products, which can help you earn more money over time while keeping your prices competitive.
-### Engagement-based payouts
+### Engagement-Based Payouts
-[Engagement-based payouts](../../production/monetization/engagement-based-payouts.md) allow you to automatically earn Robux based on the share of time that [Premium](https://www.roblox.com/premium/membership) subscribers engage in your experiences.
+[Engagement-Based Payouts](../../production/monetization/engagement-based-payouts.md) allow you to automatically earn Robux based on the share of time that [Premium](https://www.roblox.com/premium/membership) subscribers engage in your experiences.
-### Paid access in Robux
+### Paid Access in Robux
[Paid access in Robux](../../production/monetization/paid-access-robux.md) allows you to charge users a **one-time Robux fee** to access your experience. Some developers temporarily use this feature to create a closed beta where their most engaged users can have early access to an experience and help with testing and feedback.
-### Paid access in local currency
+### Paid Access in Local Currency
[Paid access in local currency](../../production/monetization/paid-access-local-currency.md) allows you to charge users a **one-time fee in their local currency** to access your experience. If their local currency isn't available, they're charged in USD. Some developers temporarily use this feature to create a closed beta where their most engaged users can have early access to an experience and help with testing and feedback.
-### Private servers
+### Private Servers
A [private server](../../production/monetization/private-servers.md) is a subscription-based feature that allows a user to decide who can play an experience with them. While private servers can be free, you can also use private servers as a method of monetization by charging users who want to access private servers a **monthly Robux fee**. Private servers are often purchased for:
@@ -122,15 +122,15 @@ A [private server](../../production/monetization/private-servers.md) is a subscr
-### Catalog fees and commissions
+### Catalog Fees and Commissions
You can create and sell accessories and clothes on the Marketplace. After you pay the upload fee and submit a new asset for approval, the moderation team reviews your asset and, if approved, adds your asset to the catalog.
-You'll receive a [commission](../../marketplace/marketplace-fees-and-commissions.md) every time users purchase your catalog item. If users purchase your catalog item within an experience using the [avatar inspect menu](../../players/avatar-inspect-menu.md) or the [avatar editor service](../../players/avatar-editor.md), the experience owner also receives a commission.
+You'll receive a [commission](../../marketplace/marketplace-fees-and-commissions.md) every time users purchase your catalog item. If users purchase your catalog item within an experience using the [Avatar Inspect Menu](../../players/avatar-inspect-menu.md) or the [Avatar Editor Service](../../players/avatar-editor.md), the experience owner also receives a commission.
### Plugins
-A [plugin](../../studio/plugins.md) is an extension that adds additional functionality to Studio. You can offer them to other creators on the [Creator Store](../../production/creator-store.md) for free, or you can sell them for **United States Dollars** (the minimum price is $4.99). Roblox offers a market-leading revenue share for these sales, as only taxes and payment processing fees are deducted. For more information on selling plugins, see [Sell on the Creator Store](../sell-on-creator-store.md).
+A [plugin](../../studio/plugins.md) is an extension that adds additional functionality to Studio. You can offer them to other creators on the [Creator Store](../../production/creator-store.md) for free, or you can sell them for **United States Dollars** (the minimum price is $4.99). Roblox offers a market-leading revenue share for these sales, as only taxes and payment processing fees are deducted. For more information on selling plugins, see [Selling on the Creator Store](../selling-on-creator-store.md).
There is a 30 day escrow hold for each purchase. Roblox holds your share of the sale for 30 days, starting from the date of sale.
diff --git a/content/en-us/production/monetization/paid-access-local-currency.md b/content/en-us/production/monetization/paid-access-local-currency.md
index 36494be30..d5557b90c 100644
--- a/content/en-us/production/monetization/paid-access-local-currency.md
+++ b/content/en-us/production/monetization/paid-access-local-currency.md
@@ -1,5 +1,5 @@
---
-title: Paid access in local currency
+title: Paid Access in Local Currency
description: Paid access lets you charge users a one-time fee in their local currency to access your experience.
---
@@ -14,7 +14,7 @@ Some developers temporarily enable paid access to create a closed beta so that t
-Users can only purchase paid access in local currency on desktop and on web, but they can play their purchased experiences on any of the devices you [enable in the Creator Hub](#enable-paid-access-in-the-creator-hub).
+Users can only purchase paid access in local currency on desktop and on web, but they can play their purchased experiences on any of the devices you [enable in the Creator Hub](#enabling-paid-access-in-the-creator-hub).
## Eligibility
@@ -22,9 +22,9 @@ Users can only purchase paid access in local currency on desktop and on web, but
To charge users for paid access in local currency, you must:
- Have a verified email address.
-- Be 13 years of age or older with a [verified ID](./../publishing/account-verification.md#verify-through-government-id).
-- Successfully [set up an account with Roblox's third-party payment provider Tipalti](#set-up-your-account-to-receive-payouts).
-- Reside in a country supported by Tipalti. See [Payment methods coverage](https://support.tipalti.com/Content/Topics/UserGuide/PaymentInformation/PaymentMethodsCoverage/IntroUSD.htm?Highlight=payment%20coverage#USD) for a list of eligible countries.
+- Be 13 years of age or older with a [verified ID](./../publishing/account-verification.md#verifying-through-government-id).
+- Successfully [set up an account with Roblox's third-party payment provider Tipalti](#setting-up-your-account-to-receive-payouts).
+- Reside in a country supported by Tipalti. See [Payment Methods Coverage](https://support.tipalti.com/Content/Topics/UserGuide/PaymentInformation/PaymentMethodsCoverage/IntroUSD.htm?Highlight=payment%20coverage#USD) for a list of eligible countries.
Users residing in Argentina, China, Colombia, India, Indonesia, Russia, Taiwan, Turkey, UAE, Ukraine, or Vietnam are not able to purchase paid access experiences in local currency.
@@ -73,7 +73,7 @@ Users have 48 hours to request a refund after purchasing a paid access experienc
Refunds aren't available after 48 hours.
-## Set up your account to receive payouts
+## Setting Up Your Account to Receive Payouts
You must set up a Tipalti account to receive payouts for purchases of paid access in local currency. To set up a Tipalti account:
@@ -90,7 +90,7 @@ Local currency earnings from paid access purchases are held in escrow for a mini
For experiences owned by groups, the group owner must be the one to set up a Tipalti account. Only group owners can receive payouts.
-## Enable paid access in the Creator Hub
+## Enabling Paid Access in the Creator Hub
To enable paid access in the Creator Hub:
@@ -104,15 +104,15 @@ To enable paid access in the Creator Hub:
Before becoming available to users, your paid access experience must undergo a policy moderation review. You'll receive an email and a notification in the Creator Hub with a decision after the moderation team has reviewed your experience.
-## Enable paid access in Roblox Studio
+## Enabling Paid Access in Roblox Studio
To enable paid access in Roblox Studio:
1. In Studio, go to **Home** > **Game Settings**.
2. Under **Monetization**, click **Configure on Creator Hub**.
-3. Follow the steps to [enable paid access in the Creator Hub](#enable-paid-access-in-the-creator-hub).
+3. Follow the steps to [enable paid access in the Creator Hub](#enabling-paid-access-in-the-creator-hub).
-## View transaction history
+## Viewing Transaction History
To view your transaction history for local currency paid access purchases:
diff --git a/content/en-us/production/monetization/paid-access-robux.md b/content/en-us/production/monetization/paid-access-robux.md
index 918212b60..59bb59b92 100644
--- a/content/en-us/production/monetization/paid-access-robux.md
+++ b/content/en-us/production/monetization/paid-access-robux.md
@@ -1,5 +1,5 @@
---
-title: Paid access in Robux
+title: Paid Access in Robux
description: Paid access lets you charge users a one-time fee in Robux to access your experience.
---
@@ -36,7 +36,7 @@ Payouts for purchases of paid access in Robux are held in escrow for up to 7 day
Refunds are not available for users who purchase paid access in Robux.
-## Enable paid access in the Creator Hub
+## Enabling Paid Access in the Creator Hub
To enable paid access in the Creator Hub:
@@ -46,13 +46,13 @@ To enable paid access in the Creator Hub:
4. Under **Devices**, select which devices you want to enable paid access for.
5. Click **Save Changes**.
-## Enable paid access in Roblox Studio
+## Enabling Paid Access in Roblox Studio
To enable paid access in Roblox Studio:
1. In Studio, go to **Home** > **Game Settings**.
2. Under **Monetization**, click **Configure on Creator Hub**.
-3. Follow the steps to [enable paid access in the Creator Hub](#enable-paid-access-in-the-creator-hub).
+3. Follow the steps to [enable paid access in the Creator Hub](#enabling-paid-access-in-the-creator-hub).
## Policies
diff --git a/content/en-us/production/monetization/price-optimization.md b/content/en-us/production/monetization/price-optimization.md
index 72eed2a15..f1574eefc 100644
--- a/content/en-us/production/monetization/price-optimization.md
+++ b/content/en-us/production/monetization/price-optimization.md
@@ -1,8 +1,12 @@
---
-title: Price optimization
+title: Price Optimization
description: Price optimization finds the best price points for your passes and developer products, helping you earn more money over time.
---
+
+Price optimization tests will not be available from December 6 2024 to January 6 2025. To make sure your prices are optimized before the holiday season, start a pricing test before December 6.
+
+
@@ -10,20 +14,20 @@ description: Price optimization finds the best price points for your passes and
To run a successful price optimization test, your experience has to have enough transactions to produce significant data. In most cases, this means your experience should have had at least 100,000 transactions over the previous 30 days.
-To find how many transactions your experience has had, add the total number of product sales over a 30-day period. For more information, see [Pass analytics](./game-passes.md#pass-analytics) and [Developer product analytics](./developer-products.md#developer-product-analytics).
+To find how many transactions your experience has had, add the total number of product sales over a 30-day period. For more information, see [Pass Analytics](./game-passes.md#pass-analytics) and [Developer Product Analytics](./developer-products.md#developer-product-analytics).
**Price optimization** lets you find the best price points for your passes and developer products, which can help you earn more money over time while keeping your prices competitive. When you run a price test, subsets of your users see different prices for the same product. At the end of the test, you receive recommendations for the prices that performed best with your audience.
-Before using price optimization, you should use the [dynamic price check tool](#use-the-dynamic-price-check-tool) to make sure product prices are dynamically scripted inside your experience. After using price optimization, you can run a [price review period](#run-a-price-review-period) to track the long-term revenue impact of your price changes.
+Before using price optimization, you should use the [dynamic price check tool](#using-the-dynamic-price-check-tool) to make sure product prices are dynamically scripted inside your experience. After using price optimization, you can run a [price review period](#running-a-price-review-period) to track the long-term revenue impact of your price changes.
-## Use the dynamic price check tool
+## Using the Dynamic Price Check Tool
Price optimization can't collect data from and make changes to prices you have hard-coded into your experience. To run a price optimization test on products with hard-coded prices, you must first update them to be dynamically scripted.
-Dynamically scripted prices update through `Class.MarketplaceService|MarketplaceService` and use functions like `Class.MarketplaceService:GetProductInfo()|GetProductInfo()` and `Class.MarketplaceService:GetDeveloperProductsAsync()|GetDeveloperProductsAsync()` to retrieve and display product prices you have set through the Creator Hub. For information on how to dynamically script product prices, see [Selling Passes](./game-passes.md#sell-passes) and [Selling Developer Products](./developer-products.md#sell-developer-products).
+Dynamically scripted prices update through `Class.MarketplaceService|MarketplaceService` and use functions like `Class.MarketplaceService:GetProductInfo()|GetProductInfo()` and `Class.MarketplaceService:GetDeveloperProductsAsync()|GetDeveloperProductsAsync()` to retrieve and display product prices you have set through the Creator Hub. For information on how to dynamically script product prices, see [Selling Passes](./game-passes.md#selling-passes) and [Selling Developer Products](./developer-products.md#selling-developer-products).
The dynamic price check tool updates all products for sale with a fake Robux price to identify which of your product prices are hard-coded and which are scripted with `Class.MarketplaceService|MarketplaceService` inside your experience. If a product price updates to the fake Robux price, the price is scripted. If it remains the same, the price is hard-coded.
@@ -49,7 +53,7 @@ To use the dynamic price check tool:
To disable the dynamic price check tool, go to the **Dynamic Price Check** page and click **Disable**.
-## Use price optimization
+## Using Price Optimization
To use price optimization:
@@ -58,7 +62,7 @@ To use price optimization:
3. Select the developer products and passes you want to include in the price test. For best results, include all products.
4. Click **Start Test**. After approximately two weeks, you receive an e-mail notification that the test is complete. The **Price Optimization** page updates with the optimized product prices, the recommended price percentage change, and the approximate long-term revenue impact of applying the new product prices.
5. Click **Review & Apply prices** to apply the results of the price optimization test.
-6. **(Optional)** Click **Start price review** to [run a price review period](#run-a-price-review-period).
+6. **(Optional)** Click **Start price review** to [run a price review period](#running-a-price-review-period).
You can stop the price optimization test any time by clicking **Stop test** in the **Price Optimization** page. If you stop the test, your product prices revert to their original prices.
@@ -66,7 +70,7 @@ You can stop the price optimization test any time by clicking **Stop test** in t
To make sure your product prices stay optimal, run a price optimization test every three months. You should also consider running a new price test whenever you create new products that account for a significant part of your revenue, or when you make substantial changes to your experience mechanics.
-## Run a price review period
+## Running a Price Review Period
After you receive the results from a price test, you can start an optional price review period to track the long-term revenue impact of the price recommendations.
@@ -76,7 +80,7 @@ If the price review period results are favorable, the optimized prices are appli
To run a price review period:
-1. After [running a price optimization test](#use-price-optimization), click **Start price review** in the **Price Optimization** page. After four weeks, you receive an e-mail notification that the review is complete. The **Price Optimization** page updates with the reviewed prices, the overall revenue increase, and the approximate long-term revenue impact of applying the new product prices.
+1. After [running a price optimization test](#using-price-optimization), click **Start price review** in the **Price Optimization** page. After four weeks, you receive an e-mail notification that the review is complete. The **Price Optimization** page updates with the reviewed prices, the overall revenue increase, and the approximate long-term revenue impact of applying the new product prices.
2. Click **Finish** to complete the review.
## Limitations
diff --git a/content/en-us/production/monetization/private-servers.md b/content/en-us/production/monetization/private-servers.md
index 61e21786d..1fee37c2f 100644
--- a/content/en-us/production/monetization/private-servers.md
+++ b/content/en-us/production/monetization/private-servers.md
@@ -1,5 +1,5 @@
---
-title: Private servers
+title: Private Servers
description: Private servers are a subscription-based feature that allows users to decide who can play an experience with them.
---
@@ -22,7 +22,7 @@ You cannot enable [paid access in Robux](../monetization/paid-access-robux.md) o
Players under the age of 13 may not be able to join private servers depending on their privacy and parental control settings.
-## Enable private servers
+## Enabling Private Servers
Before you can enable private servers, your experience must be **public** to all users.
diff --git a/content/en-us/production/monetization/randomized-virtual-items-policy.md b/content/en-us/production/monetization/randomized-virtual-items-policy.md
index a8c2b6738..d69a745f4 100644
--- a/content/en-us/production/monetization/randomized-virtual-items-policy.md
+++ b/content/en-us/production/monetization/randomized-virtual-items-policy.md
@@ -1,5 +1,5 @@
---
-title: Randomized virtual items policy
+title: Randomized Virtual Items Policy
description: Explains Roblox's policy for selling randomized virtual items.
---
diff --git a/content/en-us/production/monetization/subscriptions.md b/content/en-us/production/monetization/subscriptions.md
index 954ac22bd..c104e3a12 100644
--- a/content/en-us/production/monetization/subscriptions.md
+++ b/content/en-us/production/monetization/subscriptions.md
@@ -3,11 +3,11 @@ title: Subscriptions
description: Subscriptions within experiences let you offer users recurring benefits for a monthly fee.
---
-**Subscriptions** within experiences let you offer users recurring benefits for a monthly fee. Similar to [passes](./game-passes.md), the major difference between subscriptions and passes is that the benefits of a pass are granted in perpetuity, while the benefits of a subscription are contingent on the user paying a monthly fee. Subscriptions on Roblox have the following characteristics:
+**Subscriptions** within experiences let you offer users recurring benefits for a monthly fee. Similar to [Passes](./game-passes.md), the major difference between subscriptions and passes is that the benefits of a pass are granted in perpetuity, while the benefits of a subscription are contingent on the user paying a monthly fee. Subscriptions on Roblox have the following characteristics:
- **Auto-renewal:** Subscriptions are auto-renewing, not one-time purchases, and are priced in local currency.
-- **Robux payout:** You receive subscription revenue in Robux. For more details, see [Earn with subscriptions](#earn-with-subscriptions).
-- **Single-tiered:** All subscriptions within an experience can be owned by users simultaneously. Mutually exclusive subscriptions are not supported.
+- **Robux Payout:** You receive subscription revenue in Robux. For more details, see [Earning with Subscriptions](#earning-with-subscriptions).
+- **Single-Tiered:** All subscriptions within an experience can be owned by users simultaneously. Mutually exclusive subscriptions are not supported.
Users can purchase subscriptions on the desktop app or website using Roblox gift card credit or a credit or debit card, and through payment methods on the Apple and Google stores in qualifying regions. Users can view and manage their subscription purchases in the Subscriptions tab in their Roblox account settings.
@@ -19,7 +19,7 @@ Subscriptions will be rolled out to more regions in the future.
To learn how to design subscriptions for your experience, see [Subscription Design](../../production/game-design/subscription-design.md). For a reference on how to implement subscriptions into your experience's monetization strategy, see this [implementation example](https://devforum.roblox.com/t/subscriptions-within-experiences-livetopia-implementation/2710072).
-## Subscription guidelines
+## Subscription Guidelines
Before creating your subscriptions, ensure they align with [Roblox's Terms of Use](https://en.help.roblox.com/hc/articles/19694609252884/) and comply with local laws. Any experience that engages in scams, attempts to mislead users with false offerings, or otherwise violate our [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards) will be taken down. In addition, ensure your subscriptions abide by the following guidelines:
@@ -30,7 +30,7 @@ Before creating your subscriptions, ensure they align with [Roblox's Terms of Us
- **Do not direct users to purchase on another platform (e.g. mobile, web, etc.) in-experience:** While you are free to communicate with users off-platform, using the Roblox app to direct users to purchase elsewhere is prohibited.
- **Do not gate subscription benefits by additional requirements once a user has paid:** Requiring a user to perform additional tasks, such as posting to social media, to get access to benefits they have paid for is prohibited. This guideline does not impact battle passes, which you are allowed to both create and market as a subscription purchase.
-## Create subscriptions
+## Creating Subscriptions
Before you can create a subscription, you must be phone or [ID verified](../publishing/account-verification.md). To create a subscription:
@@ -61,25 +61,25 @@ Before you can create a subscription, you must be phone or [ID verified](../publ
After creating your subscription, you can't make changes to anything but the cover image and description.
-### Activate subscriptions
+### Activating Subscriptions
Once a subscription is ready to go on-sale, click **⋯** at the top right corner of the subscription tile and select **Activate**. Activated subscriptions are available for sale in the **Experience Details** page and within the experience itself.
-Before activating your subscription for the first time, you must confirm a shortened version of your experience name. This shortened experience name is displayed to the user when they subscribe, appearing alongside the subscription name you created in [Create subscriptions](#create-subscriptions). It's also visible managing subscriptions in Roblox and App Store Settings.
+Before activating your subscription for the first time, you must confirm a shortened version of your experience name. This shortened experience name is displayed to the user when they subscribe, appearing alongside the subscription name you created in [Creating Subscriptions](#creating-subscriptions). It's also visible managing subscriptions in Roblox and App Store Settings.
Shortened experience names are permanent and cannot be changed when set. Shortened experience names don't change the name of your experience on Roblox.
-## Edit subscriptions
+## Editing Subscriptions
You can have up to 50 subscriptions per experience between active and inactive subscriptions. To edit subscriptions, navigate to your experience in the [Creator Dashboard](https://create.roblox.com/) and select **Monetization Products** > **Subscriptions**.
You can edit a subscription's image, description, or state. If you want to edit more than these properties, you need to delete and recreate the subscriptions with the desired changes.
-### Change image
+### Changing Image
To update a subscription's image:
@@ -89,7 +89,7 @@ To update a subscription's image:
2. Choose a new image and click **Save**, then **Save Changes**. The new image goes live after successfully passing moderation.
-### Change description
+### Changing Description
To change a subscription's description:
@@ -97,7 +97,7 @@ To change a subscription's description:
2. Edit the description, then click **Save Changes**. Descriptions are capped at 1,000 characters and can support emojis.
3. Confirm changes by clicking **Yes, Confirm** on the confirmation window. Description updates are reflected immediately.
-### Change state
+### Changing State
Subscriptions have two possible states:
@@ -114,7 +114,7 @@ To change a subscription's state:
Deleting an active subscription results in full refunds for active subscribers and zero Robux for you. In most situations, if you want to delete a subscription, take it off sale first, select the option to cancel all renewals, and wait for the current period to conclude. Deleting a subscription requires the last four digits of the subscription ID for confirmation.
-## Integrate subscriptions into an experience
+## Integrating Subscriptions into an Experience
This code sample is a simple example of how to implement subscription detection in your experience:
@@ -162,7 +162,7 @@ Players.PlayerAdded:Connect(checkSubStatus)
Players.UserSubscriptionStatusChanged:Connect(onUserSubscriptionStatusChanged)
```
-### Replace a game pass with a subscription
+### Replacing a Game Pass with a Subscription
One option for rolling out subscriptions in your experience is to replace an existing Game Pass with a subscription. This is a great option if you want to quickly implement subscriptions in your experience without adding new features or awards.
@@ -248,7 +248,7 @@ Players.UserSubscriptionStatusChanged:Connect(onUserSubscriptionStatusChanged)
MarketplaceService.PromptGamePassPurchaseFinished:Connect(onPromptGamePassPurchaseFinished)
```
-### Prompt subscription purchases
+### Prompting Subscription Purchases
Although users can purchase subscriptions directly from an experience's **Game Details** page, you should also add a way to purchase a subscription in-game.
@@ -257,7 +257,7 @@ When you prompt a subscription purchase, `Players.UserSubscriptionStatusChanged`
Although you can prompt a subscription purchase from the client, checking if a user already has a subscription via `MarketplaceService.GetUserSubscriptionStatusAsync` must be done from the server.
-When adding subscriptions to your experience, make sure to only offer them in supported regions and platforms. If not, users in unsupported regions and platforms can view the offering but will be unable to complete the purchase.
+When adding subscriptions to your experience, make sure to only offer them in supported regions and platforms. If not, users in unsupported regions and platforms can view the offering, but are unable to complete the purchase.
This example creates a `RemoteFunction` that the client can use to request the status of a subscription:
@@ -340,7 +340,7 @@ Other relevant functions are available in `Class.MarketplaceService`:
- `Class.MarketplaceService:GetUserSubscriptionPaymentHistoryAsync()`
- `Class.MarketplaceService:GetUserSubscriptionStatusAsync()`
-## Earn with subscriptions
+## Earning with Subscriptions
Subscriptions are priced in local currency, but you earn Robux at a rate of US $0.01 to 1 Robux according to the base platform price you selected for the subscription after platform fees. Roblox takes a 30% platform fee for the first month only, meaning that you receive the full subscription earnings from the second month onward. This revenue split is consistent across all platforms.
@@ -359,7 +359,7 @@ Users cancelling an active subscription and failing to renew it does not automat
Subscriptions are currently ineligible to be cross-sold by other experiences and are ineligible for affiliate fees. This additional opportunity will be supported at a later date.
-### Subscription payouts
+### Subscription Payouts
Payouts are found in **Robux Balance** > **My Transactions**:
@@ -371,7 +371,7 @@ Payouts are found in **Robux Balance** > **My Transactions**:
To view refunding information of individual users, use `Class.MarketplaceService:GetUserSubscriptionPaymentHistoryAsync()`.
-## Subscription analytics
+## Subscription Analytics
**Subscription analytics** help you gauge the success of individual subscriptions, identify trends, and forecast potential future earnings. Subscriptions are added to the subscriptions analytics page after the first time they're activated and are not removed when they're deactivated or deleted. You can access ready-made analytics through the Creator Dashboard, or you can capture subscription updates in real-time using webhooks.
@@ -387,20 +387,20 @@ To access subscription analytics on the Creator Dashboard:
Subscription analytics track the following metrics:
- **Subscriptions:** The total amount of active subscriptions in your experience.
-- **Estimated revenue:** The net revenue earned by experiences after fees. Does not include refund information.
-- **Subscriber breakdown:** The different types of subscribers.
+- **Estimated Revenue:** The net revenue earned by experiences after fees. Does not include refund information.
+- **Subscriber Breakdown:** The different types of subscribers.
- **New**: The number of subscription purchases by first-time subscribers.
- **Renewed**: The number of renewing subscriptions purchased in a prior period.
- **Resurrected**: The number of new subscriptions purchased by users who had previously canceled.
- **Cancellations**: The number of subscriptions that were not renewed. This includes all cancellations regardless of trigger, be it user cancellation, subscription deactivation by the creator, or by other means.
- Cancellations are different from refunds. Cancelled subscriptions are subscriptions that will no longer renew but are paid in full for the remainder of the billing cycle, whereas refunds return the paid subscription amount to the user.
-- **Subscriptions by platform**: The number of subscriptions purchased on each platform.
-- **Platform earnings**: The net revenue earned through subscriptions purchased on each platform.
+- **Subscriptions by Platform**: The number of subscriptions purchased on each platform.
+- **Platform Earnings**: The net revenue earned through subscriptions purchased on each platform.
This information is visible in the form of charts based on a date range under the **Trends** tab, and as a comprehensive list of total subscriptions offered under the **History** tab.
-### Through webhooks
+### Through Webhooks
-The Cloud API Webhook feature includes triggers for four subscription events: cancelled, purchased, refunded and renewed. These notifications fire immediately, so you can respond in real-time or create your own custom analytics. For more information on how to set up a webhook, see [Webhook notifications](../../cloud/webhooks/webhook-notifications.md).
+The Cloud API Webhook feature includes triggers for four subscription events: cancelled, purchased, refunded and renewed. These notifications fire immediately, so you can respond in real-time or create your own custom analytics. For more information on how to set up a webhook, see [Webhook Notifications](../../cloud/webhooks/webhook-notifications.md).
diff --git a/content/en-us/production/promotion/ads-manager.md b/content/en-us/production/promotion/ads-manager.md
index 125d8cc12..fcfc058d3 100644
--- a/content/en-us/production/promotion/ads-manager.md
+++ b/content/en-us/production/promotion/ads-manager.md
@@ -9,7 +9,7 @@ This feature is in beta.
**Ads Manager** offers advertisers valuable control over their ad campaigns, empowering them to create, optimize, and measure ads effectively while reaching their campaign objectives. Advertisers can use this tool to manage their ad campaigns, ads reporting, and ads billings in one place. Ads Manager allows you to create campaigns for **immersive ads** for ad units within experiences ([image](#image-ads) ads, [video](#video-ads) ads, [portal](#portal-ads) ads), [**sponsored experiences**](#sponsored-experiences), which appear on the Home page, and [search ads](./search-ads.md) that appear on Search results.
-## Create an ad account
+## Creating an Ad Account
To access the Ads Manager, you need an ad account. Create an ad account with a verified email on a Roblox account registered for users aged 13 years or older.
@@ -23,7 +23,7 @@ To create an ad account:
-## Add a payment method
+## Adding a Payment Method
Before you can create and manage ads on Roblox, you first need to provide a payment method. To add a payment method to your ad account:
@@ -33,9 +33,9 @@ Before you can create and manage ads on Roblox, you first need to provide a paym
2. There are two payment methods available for selection:
1. **Credit or Debit Card:** Credit or debit cards are available for users 18 and above. A temporary $1.00 USD hold will be placed on the card and refunded after verification is complete within 7 business days.
- 2. **Robux Ad Credit:** Converting Robux into ad credits to fund your campaigns is available for all users 13 and up. For more information, see [Convert Robux to ad credits](#convert-robux-to-ad-credits).
+ 2. **Robux Ad Credit:** Converting Robux into ad credits to fund your campaigns is available for all users 13 and up. For more information, see [Converting Robux to Ad Credits](#converting-robux-to-ad-credits).
-### Convert Robux to ad credits
+### Converting Robux to Ad Credits
Any Roblox user aged 13 and above can convert Robux to ad credit and utilize it for running ads. This accessibility ensures that a wide range of creators can participate in the advertising ecosystem.
@@ -52,7 +52,7 @@ This minimum conversation requirement streamlines the conversion process, preven
Converting Robux to ad credit is a permanent and irreversible action. Once you convert Robux to ad credits they can only be spent on campaigns within the Ads Manager.
-## Create ad campaigns
+## Creating Ad Campaigns
An **ad campaign** is a coordinated series of ads designed to achieve a specific goal. To create an ad campaign, you must do the following:
@@ -66,7 +66,7 @@ Before launching your campaign, you'll be able to [review your campaign details]
Advertising paid experiences is prohibited. You will not be able to select paid experiences in the dropdown menu during the ad selection process.
-### Define the campaign
+### Define the Campaign
Campaigns are defined by their **campaign objective** and **budgeting and scheduling** parameters.
@@ -111,7 +111,7 @@ To set up an ad campaign:
6. Name your campaign and click the **NEXT** button.
-### Define ad sets
+### Define Ad Sets
Ad sets are a group of ads within a campaign that share the same targeting and bidding parameters. When defining an ad set, you can customize your ad campaigns according to the following areas:
@@ -140,20 +140,20 @@ By adjusting all three categories, you can control who sees your ad to meet the
-
Brand suitability tiers
-
Experiences with content maturity labels eligible to serve ads
-
Age of users eligible to see ads
+
Brand Suitability Tiers
+
Experiences with Content Maturity Labels Eligible to Serve Ads
+
Age of Users Eligible to See Ads
**Full Inventory**
-
Minimal, mild, moderate, restricted
+
Minimal, Mild, Moderate, Restricted
13+, except in 17+ experiences where users must be 17+ and ID-verified
**Standard Inventory**
-
Minimal, mild
+
Minimal, Mild
Users age 13+
@@ -175,7 +175,7 @@ By adjusting all three categories, you can control who sees your ad to meet the
-
Maturity label
+
Maturity Label
Description
@@ -220,7 +220,7 @@ When you define your ad set, an audience estimation displays that indicates how
-#### Brand suitability tables
+#### Brand Suitability Tables
The following tables show what types of content you can expect to appear alongside your immersive ads depending on your brand suitability inventory selection.
@@ -229,7 +229,7 @@ While context exclusions are done as effectively as possible, complete accuracy
For more information on content exclusions associated with content maturity, see [Content Maturity](content-maturity.md) and [Content Maturity Labels](https://en.help.roblox.com/hc/en-us/articles/8862768451604-Experience-Guidelines-and-Age-Recommendations).
-
Always excluded content
+
Always Excluded Content
To support brand safety, all content on Roblox must continue to abide by the [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards). The Roblox Community Standards set a high bar for content that is safe and civil for the platform.
@@ -245,7 +245,7 @@ For example, this content is not allowed on the platform in any context:
-
**Violent content and gore**
+
**Violent Content and Gore**
Full
Standard
Limited
@@ -275,7 +275,7 @@ For example, this content is not allowed on the platform in any context:
-
**Crude humor and language**
+
**Crude Humor and Language**
@@ -305,7 +305,7 @@ For example, this content is not allowed on the platform in any context:
-
**Illegal or regulated goods and activities**
+
**Illegal or Regulated Goods and Activities**
@@ -329,7 +329,7 @@ For example, this content is not allowed on the platform in any context:
-
**Romantic and sexual content**
+
**Romantic and Sexual Content**
@@ -345,7 +345,7 @@ For example, this content is not allowed on the platform in any context:
-#### Bidding and auction
+#### Bidding and Auction
Ads on Roblox work in a bidding system, where advertisers bid to have their ads shown to users through the available ad units placed in an experience. When determining your bidding settings, bids are reflected as CPM (cost-per-thousand impressions). Your max bid for CPM is the maximum amount you're willing to pay every thousand times your ad is seen by the user. A higher CPM can increase the chances of winning the auction, but it also means you'll pay more.
@@ -368,19 +368,19 @@ As an example:
The second advertiser wins the auction and is charged $10.01, the price of the second highest bid, plus one cent.
-#### Genre targeting
+#### Genre Targeting
Genre targeting helps you target your ads to reach people who are more likely to engage with your experience.
You can target particular genres with your ad sets. Note that these are Roblox's genre classifications and may not be the same as the genre categories self-declared by developers.
-
Experience genre
+
Experience Genre
When buying [immersive ads](../../production/monetization/immersive-ads.md), which are ads within experiences, experience genres are based on the genre of the experiences your ads will be served in. For instance, if you select only "Roleplaying," your ads will only appear in experiences classified as "Roleplaying."
-
Audience genre
+
Audience Genre
For **sponsored experiences**, audience genre targeting is based on users' preferences. Ads will only be served to users who like to play experiences in the selected genres.
@@ -402,21 +402,21 @@ Audience Genre targeting isn't available when buying sponsored experiences to re
-### Create ads
+### Create Ads
You can create three different types of ads using the Ads Manager:
-- [Sponsored experiences](#sponsored-experiences) appear as sponsored experience tiles on the Home page.
-- [Portal ads](#portal-ads) are static, non-clickable images within the 3D space of an experience, with a door that teleports a player into an advertiser's experience.
-- [Image ads](#image-ads) are static, non-clickable images within the 3D space of an experience.
-- [Video ads](#video-ads) are either auto-playing (non-rewarded) or click-to-play (can be rewarded) videos within the 3D space of an experience.
+- [Sponsored Experiences](#sponsored-experiences) appear as sponsored experience tiles on the Home page.
+- [Portal Ads](#portal-ads) are static, non-clickable images within the 3D space of an experience, with a door that teleports a player into an advertiser's experience.
+- [Image Ads](#image-ads) are static, non-clickable images within the 3D space of an experience.
+- [Video Ads](#video-ads) are either auto-playing (non-rewarded) or click-to-play (can be rewarded) videos within the 3D space of an experience.
- [Search ads](#search-ads) allow you to promote your experience to users ages 13+ who are actively searching for experiences or genres of experiences using specific keywords.
-The **ad type** is determined by your [campaign objective](#define-the-campaign). Campaign objectives valuing **awareness** are displayed as image ads, while campaign objectives valuing **visits** are displayed as tile and portal ads.
+The **Ad Type** is determined by your [campaign objective](#define-the-campaign). Campaign objectives valuing **awareness** are displayed as image ads, while campaign objectives valuing **visits** are displayed as tile and portal ads.
Roblox reviews each submitted ad prior to it being run. Ensure your ad is eligible to run by following the [Roblox Advertising Standards](https://en.help.roblox.com/hc/en-us/articles/13722260778260).
-#### Sponsored experiences
+#### Sponsored Experiences
You can create a sponsored experience for All Ages, 9+ and 13+ experiences by choosing "visits" Campaign Objective. Currently, you may not run sponsored experiences for 17+ experiences.
@@ -437,7 +437,7 @@ To create a sponsored experience:
5. Name your image ad in the **Ad Name** field and click the **NEXT** button. The [Review](#review-the-campaign) window displays.
-#### Portal ads
+#### Portal Ads
@@ -466,7 +466,7 @@ To create a portal ad:
5. Name your image ad in the **Ad Name** field and click the **NEXT** button. The [Review](#review-the-campaign) window displays.
-#### Image ads
+#### Image Ads
@@ -487,7 +487,7 @@ To create an image ad:
4. Name your image ad in the **Ad Name** field and click the **NEXT** button. The [Review](#review-the-campaign) window displays.
-#### Video ads
+#### Video Ads
To create a video ad:
@@ -500,11 +500,11 @@ To create a video ad:
4. Name your video ad in the **Ad Name** field and click the **NEXT** button. The [Review](#review-the-campaign) window displays.
-#### Search ads
+#### Search Ads
Search ads have unique audience targeting, and a specific bidding and auction process for keywords. For more information, see the [Search Ads documentation](./search-ads.md).
-#### Live preview of ads
+#### Live Preview of Ads
You can use live preview to see what your immersive ad looks like to the audience inside an experience. Live preview is available for immersive ads in [portal](#portal-ads), [image](#image-ads), and [video](#video-ads) formats.
@@ -516,7 +516,7 @@ After selecting and uploading an image or video file, click **Live Preview** nex
After you upload an image or video file, that file is submitted to Roblox for moderator approval. If approval is pending, a watermark displays on top of the live preview of your ad inside the demo experience. If Roblox rejects your file, the live preview of your ad doesn't show up inside the demo experience.
-### Review the campaign
+### Review the Campaign
With your ad campaign, ad set, and individual ad created, it's time to review your selections. This final screen enables you to revisit any previous setting of your campaign and is required for review before launch. Once submitted, your ad is reviewed by moderators for approval.
@@ -540,7 +540,7 @@ To review your ad campaign:
4. When you finish reviewing, click the **SUBMIT** button.
-### Edit campaigns
+### Editing Campaigns
Once a campaign, ad set, or ad is submitted, an advertiser can make adjustments to certain parameters. To determine which parameters are changeable, consult the following table:
@@ -554,31 +554,31 @@ Once a campaign, ad set, or ad is submitted, an advertiser can make adjustments
| Ad name | |
| Ad type | |
-### Cancel a campaign
+### Canceling a Campaign
If an advertiser wishes to retract a campaign for any reason, they have the option to cancel the campaign up to six hours before its scheduled start time. Cancellation is accessible at the campaign level and automatically cancels any associated ad sets and ads. This feature is available for campaigns with any payment method, and enables advertisers to recover their ad credits or prevent their credit or debit card from being charged.
You can't transfer ad credits associated with a specific campaign to another campaign. When a campaign is cancelled, Roblox applies the campaign's ad credits back to the account.
-## Ads reporting
+## Ads Reporting
**Ads reporting** is a tool that provides necessary information to effectively manage campaigns at the campaign, ad set, and individual ad level. Ads Manager utilizes click-based attribution for conversion tracking, ensuring accurate and transparent reporting. Ads reporting helps advertisers evaluate campaign performance, optimize strategies, and reach their campaign objectives.
-- [Ad campaign reports](#ad-campaign-reports): Ads reporting at the campaign level offers insights into overall campaign effectiveness, enabling advertisers to compare and optimize various campaigns they have running simultaneously. This level provides a holistic view of performance, guiding budget allocation and strategy adjustments.
-- [Ad set reports](#ad-set-reports): Ads reporting at the ad set level highlights targeting and budget effectiveness, enabling adjustments for better audience engagement. This level informs optimization for specific audiences.
-- [Ad reports](#ad-reports): Ads reporting at the individual ad level assesses creative impact, guiding design improvements. This level reveals ad resonance and informs creative refinements.
+- [Ad Campaign Reports](#ad-campaign-reports): Ads reporting at the campaign level offers insights into overall campaign effectiveness, enabling advertisers to compare and optimize various campaigns they have running simultaneously. This level provides a holistic view of performance, guiding budget allocation and strategy adjustments.
+- [Ad Set Reports](#ad-set-reports): Ads reporting at the ad set level highlights targeting and budget effectiveness, enabling adjustments for better audience engagement. This level informs optimization for specific audiences.
+- [Ad Reports](#ad-reports): Ads reporting at the individual ad level assesses creative impact, guiding design improvements. This level reveals ad resonance and informs creative refinements.
-### Ad campaign reports
+### Ad Campaign Reports
The information provided at the [campaign](#define-the-campaign) level includes:
-| Reporting column | Definition |
+| Reporting Column | Definition |
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Name** | The name of the ad campaign. |
| **Off/On** | A toggle indicating if the ad campaign is active, paused, or disabled. |
-| **Status** | Displays the status of the ad campaign. For a list of all statuses, see [Ad campaign statuses](#ad-campaign-statuses). |
+| **Status** | Displays the status of the ad campaign. For a list of all statuses, see [Ad Campaign Statuses](#ad-campaign-statuses). |
| **Spent** | The total amount of USD or ad credit you have spent on the selected campaign. |
| **Impressions** | An **image impression** is when a user looks at the ad for at least 1 second and the ad occupies 1.5% of the viewport, is viewed at an angle of up to 55 degrees, with at least 50% of the image ad pixels visible.
A **video impression** where an impression is when a user looks at the ad for at least 0.5 seconds and the ad occupies 1.5% of the viewport, be viewed at an angle of up to 55 degrees, with at least 50% of the video ad pixels visible. |
| **Cost Per Mille (CPM)** | The cost of 1,000 impressions of your ad. |
@@ -592,17 +592,17 @@ The information provided at the [campaign](#define-the-campaign) level includes:
| **Schedule** | Displays the campaign run time. |
| **Payment Method** | The method used to pay for your advertising campaign, categorized as either card or ad credit. |
-### Ad set reports
+### Ad Set Reports
The information provided at the [ad set](#define-ad-sets) level includes:
-| Reporting column | Definition |
+| Reporting Column | Definition |
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Name** | The name of the ad set. |
| **Off/On** | A toggle indicating if the ad campaign is active, paused, or disabled. |
-| **Status** | Displays the status of the ad set. For a list of all statuses, see [Ad set statuses](#ad-set-statuses). |
+| **Status** | Displays the status of the ad set. For a list of all statuses, see [Ad Set Statuses](#ad-set-statuses). |
| **Campaign** | Shows to which campaign an ad set belongs. |
| **Max Bid** | The maximum bid amount set for ad auction, shown in either USD or ad credit. |
| **Spent** | The total amount of USD or ad credit you have spent. |
@@ -615,17 +615,17 @@ The information provided at the [ad set](#define-ad-sets) level includes:
| **Play Rate** | Percentage calculated by dividing the number of plays by the number of impressions. |
| **Cost Per Play (CPP)** | The average cost incurred for each play, calculated by dividing the total campaign cost by the number of plays. |
-### Ad reports
+### Ad Reports
The information provided at the [individual ad](#create-ads) level includes:
-| Reporting column | Definition |
+| Reporting Column | Definition |
| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Name** | The name of the ad. |
| **Off/On** | A toggle indicating if the ad campaign is active, paused, or disabled. |
-| **Status** | Displays the status of the individual ad. For a list of all statuses, see [Ad statuses](#ad-statuses). |
+| **Status** | Displays the status of the individual ad. For a list of all statuses, see [Ad Statuses](#ad-statuses). |
| **Ad Set** | Displays the ad set the corresponding individual ad belongs to. |
| **Ad Format** | Displays if the Ad is an Image or Portal Ad. |
| **Spent** | The total amount of USD or ad credit you have spent. |
@@ -636,19 +636,19 @@ The information provided at the [individual ad](#create-ads) level includes:
| **Play Rate** | Percentage calculated by dividing the number of plays by the number of impressions. |
| **Cost Per Play (CPP)** | The average cost incurred for each play, calculated by dividing the total campaign cost by the number of plays. |
-### Delivery columns
+### Delivery Columns
The delivery column of the Ads Manager defines the **status** of your campaign, ad set, or ad.
-- [Ad campaign statuses](#ad-campaign-statuses) offer a valuable overview of the campaign's overall progress, helping advertisers identify and optimize active, underperforming, or completed campaigns for better results.
-- [Ad set statuses](#ad-set-statuses) highlight the performance of each ad set in terms of targeting and budget allocation, enabling advertisers to fine-tune their strategies for improved audience engagement and to reach their campaign objectives.
-- [Ad statuses](#ad-statuses) provide insights into the delivery status of each individual ad, allowing advertisers to monitor their effectiveness and note any dependencies on their parent ad sets or Campaigns.
+- [Ad Campaign Statuses](#ad-campaign-statuses) offer a valuable overview of the campaign's overall progress, helping advertisers identify and optimize active, underperforming, or completed campaigns for better results.
+- [Ad Set Statuses](#ad-set-statuses) highlight the performance of each ad set in terms of targeting and budget allocation, enabling advertisers to fine-tune their strategies for improved audience engagement and to reach their campaign objectives.
+- [Ad Statuses](#ad-statuses) provide insights into the delivery status of each individual ad, allowing advertisers to monitor their effectiveness and note any dependencies on their parent ad sets or Campaigns.
You can use the following status tables to understand what each status means.
-#### Ad campaign statuses
+#### Ad Campaign Statuses
-| Delivery status | Definition |
+| Delivery Status | Definition |
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Active** | Your campaign contains at least one ad running normally. |
| **Paused** | The campaign is not delivering because it is toggled off (paused by user). |
@@ -657,9 +657,9 @@ You can use the following status tables to understand what each status means.
| **Error** | Technical error. Please contact [support](https://www.roblox.com/support). |
| **Completed** | The campaign, ad set or ad is no longer running because the scheduled end date has passed. |
-#### Ad set statuses
+#### Ad Set Statuses
-| Delivery status | Definition |
+| Delivery Status | Definition |
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Active** | The ad is running normally, or your campaign or ad sets contains at least one ad running normally. |
| **Paused** | The ad set is not delivering because it is toggled off. |
@@ -668,9 +668,9 @@ You can use the following status tables to understand what each status means.
| **Completed** | The campaign, ad set or ad is no longer running because the scheduled end date has passed. |
| **Error** | Technical error. Please contact [support](https://www.roblox.com/support). |
-#### Ad statuses
+#### Ad Statuses
-| Delivery status | Definition |
+| Delivery Status | Definition |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Active** | The ad is running normally, or your campaign or ad sets contains at least one ad running normally. |
| **Rejected** | The ad can't run because it doesn't comply with Roblox advertising policy. |
@@ -681,13 +681,13 @@ You can use the following status tables to understand what each status means.
| **Paused** | Ad is toggled on but parent ad set is off so ad is not active. |
| **Error** | Technical error. Please contact [support](https://www.roblox.com/support). |
-## Ads billing
+## Ads Billing
**Ads billing** charges advertisers for ad placements on Roblox using the [payment method on file](#adding-a-payment-method). Billing information can be found under **Payment Activity**.
-### Credit and debit cards
+### Credit and Debit Cards
For first-time credit card users, 5.00 USD will be charged upon campaign submission and used toward your first bill. Any unused balance will be refunded.
@@ -705,7 +705,7 @@ For example:
-### Ad credits
+### Ad Credits
Campaigns using ad credit are settled at the end of the campaign at the end date. Any unused ad credits will be refunded to their ad credit balance within 24-48 hours after the campaign ends. Ad credits will never be refunded to Robux. There is no daily spend limit when using ad credits.
@@ -725,7 +725,7 @@ Ad credit-related activities are categorized as follows:
-## Ad fraud protection
+## Ad Fraud Protection
Roblox diligently combats ad fraud using advanced detection methods for bots and other fraudulent activities, ensuring advertisers don't pay for fraudulent traffic and regularly adjusts billing and reporting to safeguard their interests. After 14 days from the campaign end date, campaigns are analyzed for fraudulent traffic, and transaction amounts are refunded accordingly. If invalid traffic is detected, refunds are applied 16 days after the campaign end date. This proactive approach helps maintain the integrity of your campaigns and ensures fair spending.
diff --git a/content/en-us/production/promotion/advertise-on-roblox.md b/content/en-us/production/promotion/advertising-on-roblox.md
similarity index 86%
rename from content/en-us/production/promotion/advertise-on-roblox.md
rename to content/en-us/production/promotion/advertising-on-roblox.md
index 2906aceaa..febeb255a 100644
--- a/content/en-us/production/promotion/advertise-on-roblox.md
+++ b/content/en-us/production/promotion/advertising-on-roblox.md
@@ -1,5 +1,5 @@
---
-title: Advertise on Roblox
+title: Advertising on Roblox
comment: Changes to this article require additional review
description: An overview of advertising opportunities on the platform.
---
@@ -8,7 +8,7 @@ description: An overview of advertising opportunities on the platform.
In either case, all advertisements on the platform must adhere to Roblox's [Advertising Standards](https://en.help.roblox.com/hc/articles/13722260778260), [Community Standards](https://en.help.roblox.com/hc/articles/203313410), and [Terms of Use](https://en.help.roblox.com/hc/articles/115004647846).
-## Roblox-served ads
+## Roblox-Served Ads
Roblox-served ads are advertisements you can purchase and serve through Roblox's official advertising products. Almost every Roblox advertising product allows you to choose your audience, schedule the duration of your ad, and specify your budget per day.
@@ -17,36 +17,36 @@ Which advertising product is right for your content depends on the type of conte
Within the **Sponsored** category on any item's main details page on the Roblox website, and the **Recommended Items for You** page of the Marketplace on the Roblox app
-## Independent advertising
+## Independent Advertising
In general, independent advertisements are advertisements that fall outside of Roblox's advertising products that promote the sale of a product or service that's either out-of-experience or off-Roblox. This type of advertisement can take many forms. If you're a brand or a developer working with outside advertisers and are unsure if your content is advertising, **it's best to consult applicable regulatory guidance and seek legal counsel as appropriate**. While not prescriptive, you may want to ask yourself the following questions as a starting point when determining if your content is advertising:
@@ -57,7 +57,7 @@ In general, independent advertisements are advertisements that fall outside of R
- Does the content promote where or how to purchase something available outside the experience?
- Does the content contain a call to action encouraging the purchase of something available outside the experience?
-If your content is advertising, you are fully responsible for ensuring this content complies with all Roblox policies and any applicable local laws or regulations. For example, independent advertisements must adhere to Roblox's [Independent Advertising Policy](https://en.help.roblox.com/hc/articles/203313410#independent-advertisement-publishing), [Community Standards](https://en.help.roblox.com/hc/articles/203313410), and [Terms of Use](https://en.help.roblox.com/hc/articles/115004647846), which require that you hide advertisements from users who are ineligible to receive ads and disclose that content is advertising in a way that Roblox users who encounter it will understand. For more information, see [Comply with Advertising Standards](../../production/promotion/comply-with-advertising-standards.md).
+If your content is advertising, you are fully responsible for ensuring this content complies with all Roblox policies and any applicable local laws or regulations. For example, independent advertisements must adhere to Roblox's [Independent Advertising Policy](https://en.help.roblox.com/hc/articles/203313410#independent-advertisement-publishing), [Community Standards](https://en.help.roblox.com/hc/articles/203313410), and [Terms of Use](https://en.help.roblox.com/hc/articles/115004647846), which require that you hide advertisements from users who are ineligible to receive ads and disclose that content is advertising in a way that Roblox users who encounter it will understand. For more information, see [Complying with Advertising Standards](../../production/promotion/complying-with-advertising-standards.md).
If you violate any of Roblox's advertising standards, Roblox may suspend your experience and/or account.
diff --git a/content/en-us/production/promotion/comply-with-advertising-standards.md b/content/en-us/production/promotion/complying-with-advertising-standards.md
similarity index 89%
rename from content/en-us/production/promotion/comply-with-advertising-standards.md
rename to content/en-us/production/promotion/complying-with-advertising-standards.md
index 3e6f43398..d3f20f34a 100644
--- a/content/en-us/production/promotion/comply-with-advertising-standards.md
+++ b/content/en-us/production/promotion/complying-with-advertising-standards.md
@@ -1,12 +1,12 @@
---
-title: Comply with advertising standards
+title: Complying with Advertising Standards
comment: Changes to this article require additional review
description: Explains ad content, disclosure, data privacy, user safety, and ad system integrity requirements.
---
Roblox's **advertising standards** aim to foster a more transparent, safe, and civil experience for users, advertisers, and publishers of advertising content. Together, each standard works to create a positive experience on the platform, whether that applies to what type of ad content users can interact with, how they can identify it as an ad, or if they're even able to see ads at all.
-Roblox's advertising standards apply to every ad on Roblox, regardless if it's a [Roblox-served ad or independent ad](../../production/promotion/advertise-on-roblox.md), but when you choose to independently publish advertising content outside of Roblox's advertising products, it's your responsibility as the ad publisher to ensure that your ad content adheres to these policies, including Roblox's [Terms of Use](https://en.help.roblox.com/hc/articles/115004647846), [Community Standards](https://en.help.roblox.com/hc/articles/203313410), [Independent Advertising Policy](https://en.help.roblox.com/hc/articles/203313410#independent-advertisement-publishing), and [Advertising Standards](https://en.help.roblox.com/hc/articles/13722260778260), as well as any applicable laws or regulations across jurisdictions.
+Roblox's advertising standards apply to every ad on Roblox, regardless if it's a [Roblox-served ad or independent ad](../../production/promotion/advertising-on-roblox.md), but when you choose to independently publish advertising content outside of Roblox's advertising products, it's your responsibility as the ad publisher to ensure that your ad content adheres to these policies, including Roblox's [Terms of Use](https://en.help.roblox.com/hc/articles/115004647846), [Community Standards](https://en.help.roblox.com/hc/articles/203313410), [Independent Advertising Policy](https://en.help.roblox.com/hc/articles/203313410#independent-advertisement-publishing), and [Advertising Standards](https://en.help.roblox.com/hc/articles/13722260778260), as well as any applicable laws or regulations across jurisdictions.
This guide outlines the content, disclosure, data privacy, user safety, and overall ad system integrity requirements you must meet in order for your ads to serve on Roblox, such as:
@@ -20,7 +20,7 @@ This guide outlines the content, disclosure, data privacy, user safety, and over
If you fail to comply with any of these advertising standards, Roblox may suspend your experience and/or account.
-## Content requirements
+## Content Requirements
For the safety and well-being of all Roblox users, you must ensure that your ads only contain content that doesn't expose them to dangerous, illegal, fraudulent, or otherwise harmful products, services, or messaging. For example, ad content must not contain any hint of child endangerment, violence, or personally identifiable information, otherwise you are in direct violation of Roblox's advertising standards.
@@ -41,9 +41,9 @@ For a full list of what types of content ads cannot include, see Advertising Sta
-## Disclosure requirements
+## Disclosure Requirements
-If you believe your content is advertising, you must clearly disclose it as advertising in a way that Roblox users will understand in their language. In addition, you must ensure that your disclosures don't replicate ad disclosures from official Roblox advertising products because it might confuse users on which ads are from independent advertising campaigns rather than [official Roblox-served ads](../../production/promotion/advertise-on-roblox.md#roblox-served-ads).
+If you believe your content is advertising, you must clearly disclose it as advertising in a way that Roblox users will understand in their language. In addition, you must ensure that your disclosures don't replicate ad disclosures from official Roblox advertising products because it might confuse users on which ads are from independent advertising campaigns rather than [official Roblox-served ads](../../production/promotion/advertising-on-roblox.md#roblox-served-ads).
For example, the following disclosure is sufficiently different from Roblox's disclosures because it includes a different font and color.
@@ -66,11 +66,11 @@ For example, the following disclosure is sufficiently different from Roblox's di
Roblox's [localization tools](../../production/localization/index.md) are a great starting point to making sure users can read your ad disclosures in many languages.
-## Data privacy requirements
+## Data Privacy Requirements
To protect user privacy and their experience on the platform, it's of the utmost importance that you retain complete control of independent ad content within your experiences. This means that you cannot serve ad content that you didn't directly upload within your own Roblox experiences, and you cannot insert any code within your experiences that makes programmatic calls to third-party ad servers, even for analytics.
-## User safety requirements
+## User Safety Requirements
By maintaining complete control over your independent ad content, you can also take the mandatory precautions to protect users from ad content that they shouldn't have access to. To determine when these precautions are necessary, you must use `Class.PolicyService.GetPolicyInfoForPlayerAsync`, which returns a dictionary of values that determine whether certain aspects of the experience need to change for that unique user. One entry within the policy information is `AreAdsAllowed`, a boolean that represents whether a user is eligible to see ads. Ads can remain visible if `AreAdsAllowed` returns true, but if `AreAdsAllowed` returns false, you must include additional logic to hide, replace, or block the ads so those users cannot interact with the ad content.
@@ -110,7 +110,7 @@ local player = Players.LocalPlayer
end
```
-## Ad system integrity requirements
+## Ad System Integrity Requirements
If you have advertising content in your experience, whether it's Roblox-served or independent ad content, you are an ad publisher, and as an ad publisher, you must engage the ad system with integrity. This means that you cannot abuse the ad system, such as:
diff --git a/content/en-us/production/promotion/content-maturity.md b/content/en-us/production/promotion/content-maturity.md
index 14eedf0bd..ee2d94415 100644
--- a/content/en-us/production/promotion/content-maturity.md
+++ b/content/en-us/production/promotion/content-maturity.md
@@ -1,14 +1,14 @@
---
-title: Content maturity
+title: Content Maturity
description: Explains how to accurately disclose content in experiences to receive appropriate maturity labels and content descriptors.
---
-**Content maturity** provides information on the experience's main details page about what kinds of content the experience contains so that players can make informed decisions about what they interact with. Roblox uses this information to recommend experiences on the [Home](https://www.roblox.com/home) and [Discover](https://www.roblox.com/discover) pages based on each player's age group and regional content policies.
+**Content Maturity** provides information on the experience's main details page about what kinds of content the experience contains so that players can make informed decisions about what they interact with. Roblox uses this information to recommend experiences on the [Home](https://www.roblox.com/home) and [Discover](https://www.roblox.com/discover) pages based on each player's age group and regional content policies.
-Content maturity consists of two components:
+Content Maturity consists of two components:
-- **Content maturity label** - Indicates the level of maturity suitable for the experience according to child development research and industry standards.
-- **Content descriptors** - Indicates what type of content is within an experience, such as realistic depictions of blood or paid item trading.
+- **Content Maturity Label** - Indicates the level of maturity suitable for the experience according to child development research and industry standards.
+- **Content Descriptors** - Indicates what type of content is within an experience, such as realistic depictions of blood or paid item trading.
If an experience does not have guidelines, Roblox restricts the playability of the experience on the platform for players younger than 13. In addition, experiences without guidelines cannot contain any [Restricted content](https://en.help.roblox.com/hc/en-us/articles/15869919570708-Roblox-17-Policy-Standards) without risk of moderation. For this reason, Roblox strongly recommends that you fill out the questionnaire for each of your experiences so that they're available to the largest appropriate audience as possible.
@@ -17,23 +17,23 @@ If an experience does not have guidelines, Roblox restricts the playability of t
- Content maturity information only applies to the content you create for your experience. It does **not** apply to user-generated content that players bring with them into your experience, such as avatar clothing and accessories.
+ Content Maturity information only applies to the content you create for your experience. It does **not** apply to user-generated content that players bring with them into your experience, such as avatar clothing and accessories.
-## Generate labels
+## Generating Labels
-If your Roblox account is at least 30 days old, you can generate content maturity information by filling out the **Maturity & Compliance Questionnaire**, which contains a set of questions about the type of content players can possibly encounter within your experience, as well as how frequently it occurs. Your answers give Roblox an understanding of the content in your experience and ensure that the experience is available to the appropriate audience.
+If your Roblox account is at least 30 days old, you can generate Content Maturity information by filling out the **Maturity & Compliance Questionnaire**, which contains a set of questions about the type of content players can possibly encounter within your experience, as well as how frequently it occurs. Your answers give Roblox an understanding of the content in your experience and ensure that the experience is available to the appropriate audience.
- If your experience is going to have [Restricted content](https://en.help.roblox.com/hc/articles/15869919570708), it must first receive a Restricted maturity label so that its content is restricted to verified players who are at least 17 years old. You must not add any restricted content to your experience before adding content maturity information.
+ If your experience is going to have [Restricted content](https://en.help.roblox.com/hc/articles/15869919570708), it must first receive a Restricted maturity label so that its content is restricted to verified players who are at least 17 years old. You must not add any restricted content to your experience before adding Content Maturity information.
As you are completing the questionnaire, **base your answers on the most mature or extreme content players can encounter within your experience**. You can retake the questionnaire and generate a new maturity label at any time to accurately reflect the content in your experience. For restricted experiences, you can't change the maturity, but you can update its content descriptors.
-To generate content maturity information:
+To generate Content Maturity information:
1. **(Optional)** If you want your experience to include restricted content, confirm you are at least 17 years old by [verifying your account](../../production/publishing/account-verification.md) so the questionnaire can ask questions to generate the Restricted maturity label.
-1. Navigate to the [Creator Dashboard](https://create.roblox.com/dashboard/creations) and click on the thumbnail of the experience you want to generate content maturity information for. The experience's **Overview** page displays.
+1. Navigate to the [Creator Dashboard](https://create.roblox.com/dashboard/creations) and click on the thumbnail of the experience you want to generate Content Maturity information for. The experience's **Overview** page displays.
1. In the left-hand navigation, navigate to the **Audience** section, then select **Maturity & Compliance**.
@@ -45,24 +45,24 @@ To generate content maturity information:
Please review your experience and confirm that your answers accurately reflect the content of your experience. If you intentionally misrepresent your experience, you may be subject to [moderation consequences](#content-maturity-moderation).
-1. If you need to modify a previous answer, click the **Edit** button, otherwise click the **Submit** button to immediately publish the content maturity information to the experience's main page. If your experience receives a Restricted maturity label, servers running the experience restart to remove all players except those age-verified as 17+, and Studio removes all creators from any active [collaboration](../../projects/collaboration.md) session except those age-verified as 17+.
+1. If you need to modify a previous answer, click the **Edit** button, otherwise click the **Submit** button to immediately publish the Content Maturity information to the experience's main page. If your experience receives a Restricted maturity label, servers running the experience restart to remove all players except those age-verified as 17+, and Studio removes all creators from any active [collaboration](../../projects/collaboration.md) session except those age-verified as 17+.
-As long as your experience doesn't have a Restricted maturity label, if you believe that your content maturity information doesn't match your intended audience, you can update the content in your experience so that your experience is appropriate for your target audience, then resubmit the questionnaire. To learn how you can dynamically adjust the content of your experience for different audiences, see the `Class.PolicyService` API reference.
+As long as your experience doesn't have a Restricted maturity label, if you believe that your Content Maturity information doesn't match your intended audience, you can update the content in your experience so that your experience is appropriate for your target audience, then resubmit the questionnaire. To learn how you can dynamically adjust the content of your experience for different audiences, see the `Class.PolicyService` API reference.
If you publish an update that changes any of the answers from the questionnaire, you **must** update your answers and resubmit the questionnaire to remain compliant with Roblox's [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards) and [Terms of Use](https://en.help.roblox.com/hc/articles/115004647846).
-## Questionnaire categories
+## Questionnaire Categories
-The following sections provide guidance on answering the questions within each category of the Maturity & Compliance questionnaire. **Content maturity information only applies to content that you create for your experience**, not user-generated content that players bring with them, such as avatar clothing or accessories.
+The following sections provide guidance on answering the questions within each category of the Maturity & Compliance questionnaire. **Content Maturity information only applies to content that you create for your experience**, not user-generated content that players bring with them, such as avatar clothing or accessories.
After you submit the questionnaire, your experience receives a maturity label with content descriptors according to the following table, as well as a regional compliance result.
-
Maturity label
+
Maturity Label
Description
@@ -107,7 +107,7 @@ If your experience contains violence, you must specify the violence's maximum le
-
Violence intensity
+
Violence Intensity
Description
@@ -143,7 +143,7 @@ After you specify its intensity, you must also specify how often the violence oc
-
Violence frequency
+
Violence Frequency
Description
@@ -172,7 +172,7 @@ If your experience contains blood, you must specify the blood's realism accordin
-
Blood realism
+
Blood Realism
Description
@@ -195,7 +195,7 @@ If you answer unrealistic for question 2, you must also specify how often the un
-
Unrealistic blood frequency
+
Unrealistic Blood Frequency
Description
@@ -218,7 +218,7 @@ If you answer realistic for question 2, you must also specify the blood's maximu
-
Blood intensity
+
Blood Intensity
Description
@@ -248,7 +248,7 @@ If your experience contains scary elements, you must specify the intensity of th
-
Scary elements intensity
+
Scary Elements Intensity
Description
@@ -299,7 +299,7 @@ After you specify its intensity, you must also specify how often the scary eleme
-
Scary elements frequency
+
Scary Elements Frequency
Description
@@ -315,7 +315,7 @@ After you specify its intensity, you must also specify how often the scary eleme
-### Crude humor
+### Crude Humor
**Question 1: Does this experience depict, reference, or encourage crude humor?**
@@ -328,7 +328,7 @@ If your experience contains crude humor, you must specify the intensity of the e
-
Level of crude humor
+
Level of Crude Humor
Description
@@ -352,7 +352,7 @@ Gambling is the practice of exchanging real world money, Robux, or in-experience
You do **not** need to report depictions of, and/or references to, items or activities that are typically associated with gambling, but are not games of chance/luck, such as horse racing, car racing, and poker chips.
-### Free-form user creation
+### Free-Form User Creation
**Question 1: Does this experience include free-form user creation?**
@@ -360,7 +360,7 @@ Free-form user creation are features that allow players to create anything withi
If your experience includes free-form user creation features, you must disclose it within the Maturity & Compliance Questionnaire. Free-form user creation is only available to players that are at least 13 years old.
-### Social hangout
+### Social Hangout
**Question 1: Is the primary theme or activity of this experience a social hangout?**
@@ -368,7 +368,7 @@ Social hangouts are experiences in which the primary theme or activity is to cha
If your experience is a social hangout, you must disclose it within the Maturity & Compliance Questionnaire. Social hangouts are only available to players that are at least 13 years old.
-### Strong language
+### Strong Language
**Question 1: Do you depict and/or want to allow strong language in your experience?**
@@ -380,7 +380,7 @@ If your experience includes strong language, you must disclose it within the Mat
If you want to enable strong language in player communication aside from content for your 17+ experiences, see [Publishing Experiences and Places](../../production/publishing/publishing-experiences-and-places.md#creator-dashboard).
-### Romantic themes
+### Romantic Themes
**Question 1: Does this experience contain romantic, non-sexual expressions of love or affection?**
@@ -392,7 +392,7 @@ Romantic themes are the non-sexual expression of love or affection. If your expe
Alcohol is an intoxicating adult beverage. If your experience includes, depicts, or references alcohol, or depicts adult business and locations that provide or sell alcohol, such as characters drinking alcohol at a bar, you must disclose it within the Maturity & Compliance Questionnaire. Experiences that depict alcohol are only available to verified players that are at least 17 years old.
-### Paid random items
+### Paid Random Items
**Question 1: Does this experience contain paid random items?**
@@ -406,7 +406,7 @@ If your experience contains paid random items, it's recommended to take the mand
One entry within the policy information is `ArePaidRandomItemsRestricted`, a boolean that represents whether a player is eligible to pay for random items. Random items can remain purchaseable if `ArePaidRandomItemsRestricted` returns false, but if `ArePaidRandomItemsRestricted` returns true, include additional logic to hide, replace, or block the purchase of random items for those players so that your experience is available to the largest audience as possible.
-### Paid item trading
+### Paid Item Trading
**Question 1: Does this experience contain the ability for users to trade items that they paid for?**
@@ -418,13 +418,13 @@ If your experience contains paid item trading, it's recommended to take the mand
One entry within the policy information is `IsPaidItemTradingAllowed`, a boolean that represents whether a player is eligible to trade paid items. Paid items can remain tradeable if `IsPaidItemTradingAllowed` returns true, but if `IsPaidItemTradingAllowed` returns false, include additional logic to hide, replace, or block the trading of paid items for those players so that your experience is available to the largest audience as possible.
-## Content maturity moderation
+## Content Maturity Moderation
-Roblox relies on the information you provide in the Maturity & Compliance Questionnaire to generate accurate content maturity information, so the Moderation team may review your content maturity to ensure its validity based on the content of your experience. Whenever Roblox discovers a discrepancy between your submission and the content in your experience, the following actions occur:
+Roblox relies on the information you provide in the Maturity & Compliance Questionnaire to generate accurate Content Maturity information, so the Moderation team may review your Content Maturity to ensure its validity based on the content of your experience. Whenever Roblox discovers a discrepancy between your submission and the content in your experience, the following actions occur:
- You receive a moderation notification through a private message on Roblox.
-- The **Maturity & Compliance Questionnaire** page on the [Creator Dashboard](https://create.roblox.com/dashboard/creations) updates to provide moderator feedback and guidance on how to generate accurate content maturity information.
+- The **Maturity & Compliance Questionnaire** page on the [Creator Dashboard](https://create.roblox.com/dashboard/creations) updates to provide moderator feedback and guidance on how to generate accurate Content Maturity information.
- Roblox provides a moderation action.
- If your experience contains restricted content without a Restricted maturity label, your experience is subject to moderation consequences.
- If your experience contains content that is prohibited by Roblox's [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410), [Terms of Use](https://en.help.roblox.com/hc/articles/115004647846), or [Restricted Content Policy](https://en.help.roblox.com/hc/articles/15869919570708), your experience is subject to moderation consequences.
- - If your experience otherwise has inaccurate content maturity information according to its content, Roblox may remove the maturity label (or only some or all descriptors if the maturity label is Restricted) from your experience. If an experience does not have guidelines, Roblox restricts the playability of the experience on the platform for players younger than 13.
+ - If your experience otherwise has inaccurate Content Maturity information according to its content, Roblox may remove the maturity label (or only some or all descriptors if the maturity label is Restricted) from your experience. If an experience does not have guidelines, Roblox restricts the playability of the experience on the platform for players younger than 13.
diff --git a/content/en-us/production/promotion/deeplinks.md b/content/en-us/production/promotion/deeplinking.md
similarity index 92%
rename from content/en-us/production/promotion/deeplinks.md
rename to content/en-us/production/promotion/deeplinking.md
index c5ebe052b..f06f7a890 100644
--- a/content/en-us/production/promotion/deeplinks.md
+++ b/content/en-us/production/promotion/deeplinking.md
@@ -1,6 +1,6 @@
---
-title: Deep links
-description: Deep links let you launch experiences and send users directly to a specific place with custom launch data.
+title: Deep Linking
+description: Deep linking lets you launch experiences and send users directly to a specific place with custom launch data.
---
Deep links let you send users to a specific place in an experience, which can
@@ -8,12 +8,12 @@ make the process of joining more seamless, help users find their friends, and
provide traffic attribution. The optional launch data in these links lets you
customize the user experience when someone joins.
-## Construct a deep link
+## Constructing a Deep Link
A deep link URL consists of a URL format along with parameters that you specify.
The following sections describe how to construct each format.
-### Requirements and guidelines
+### Requirements and Guidelines
When constructing deep links, consider the following requirements and
guidelines:
@@ -27,7 +27,7 @@ guidelines:
visible in the URL. Further, users can modify the URL, so the data might not
be authentic.
-### Web list to app
+### Web Listing to App
This format sends users to the Roblox experience page on the web and then
launches the Roblox app. The provided example provides a place ID and a URL
@@ -44,7 +44,7 @@ encoded launch data string.
-### Direct to app
+### Direct to App
This format sends users directly to the Roblox app. The provided example
provides a place ID and a URL encoded launch data string.
@@ -80,7 +80,7 @@ the `af_dp` parameter and the "web listing to app" deep link with the
-## Process a deep link
+## Processing a Deep Link
In your experience, obtain the launch data with the `Class.Player:GetJoinData()`
method, which returns a [dictionary](../../luau/tables.md). In that dictionary,
diff --git a/content/en-us/production/promotion/experience-events.md b/content/en-us/production/promotion/experience-events.md
index fdcb1ef0c..146344207 100644
--- a/content/en-us/production/promotion/experience-events.md
+++ b/content/en-us/production/promotion/experience-events.md
@@ -1,5 +1,5 @@
---
-title: Experience events and updates
+title: Experience Events and Updates
description: Explore how to create and promote time-based events for your experience, as well as announce experience updates to opted-in users.
---
@@ -7,11 +7,11 @@ As part of your [promotional](../../production/promotion/index.md) initiatives,
-In addition to events, the integrated [update announcements](#announce-experience-updates) system lets you announce experience updates for which opted‑in players receive a notification in their Roblox notifications stream, along with a link to join the experience directly from the notification.
+In addition to events, the integrated [update announcements](#announcing-experience-updates) system lets you announce experience updates for which opted‑in players receive a notification in their Roblox notifications stream, along with a link to join the experience directly from the notification.
-## Create events
+## Creating Events
To create an event, you must have the [Edit all group experiences](../../projects/groups.md#roles-and-permissions) permission in a [group‑owned](../../projects/groups.md) experience, or be the sole owner of a user‑owned experience. Currently, you can publish a maximum of 10 ongoing or upcoming events.
@@ -29,7 +29,7 @@ To create an event, you must have the [Edit all group experiences](../../project
5. Select an event **category** that most accurately describes your event. The category may be shown alongside your event thumbnail in certain places on Roblox.
-6. Enter the event title, subtitle, and description. The description is optional but it can help provide additional information about the details of your event. If you supply a description, it should follow general [best practices](../../production/publishing/publish-experiences-and-places.md#metadata-best-practices) and accurately portray the event, including:
+6. Enter the event title, subtitle, and description. The description is optional but it can help provide additional information about the details of your event. If you supply a description, it should follow general [best practices](../../production/publishing/publishing-experiences-and-places.md#metadata-best-practices) and accurately portray the event, including:
- A summary of the event and how it relates to the overall experience. If you're using the event to promote a major experience update, summarize the key updates.
@@ -50,11 +50,11 @@ To create an event, you must have the [Edit all group experiences](../../project
Assets which are pending review or are moderated will display a placeholder.
-## Event discovery
+## Event Discovery
The following sections detail how you can promote events and how events are discoverable by players on the Roblox platform.
-### Event details page
+### Event Details Page
All published events feature an event details page which you can share with players on and off platform. To access a **shareable link**, you can use either the event details page itself or the **Events** page.
@@ -70,16 +70,16 @@ From the experience's **Events** page, hover over the event thumbnail, click the
-Event pages persist even after an event ends, but players will no longer be able to join from the page. To remove an event page entirely, see [Deleting Events](#delete-events).
+Event pages persist even after an event ends, but players will no longer be able to join from the page. To remove an event page entirely, see [Deleting Events](#deleting-events).
-### Experience detail page
+### Experience Detail Page
All published events also appear in a dedicated **Events** section on the experience's detail page. Players can join active events directly through the **Join Event** button, or click **Notify Me** for upcoming events to receive stream notifications in their Roblox inbox and the ability to opt into [push notifications](#streampush-notifications).
-### Group page
+### Group Page
If you create events as an admin for a [group](../../projects/groups.md), the group's events will appear under the **Events** tab on the group page.
@@ -96,7 +96,7 @@ In addition, you can feature an event in the group's **About** section for extra
-### Stream/push notifications
+### Stream/Push Notifications
Players who click **Notify Me** for an upcoming event will receive stream notifications in their Roblox inbox when the event starts. In addition, they can opt into **push notifications** to receive a notification on their device that will take them into the experience. Stream notifications remain accessible in the player's Roblox inbox for the duration of the event, making it easy for them to hop back in at any time.
@@ -111,7 +111,7 @@ Players who click **Notify Me** for an upcoming event will receive stream notifi
-## Delete events
+## Deleting Events
To delete an event and remove its [detail page](#event-details-page):
@@ -123,7 +123,7 @@ To delete an event and remove its [detail page](#event-details-page):
-## Use event attribution
+## Using Event Attribution
When a player joins an experience through an event entry point, such as by clicking on an event [notification](#streampush-notifications) or through the join button on the [event details page](#event-details-page), the event ID is added to the player's `GameJoinContext`. You can use this information in your experience to identify players who have come to participate in the event and show them custom prompts or otherwise personalize their experience.
@@ -146,7 +146,7 @@ end
Players.PlayerAdded:Connect(onPlayerAdded)
```
-## Announce experience updates
+## Announcing Experience Updates
Events and updates are currently in the process of being combined. Announcing updates still uses the old form, but that is subject to change in the future.
@@ -193,11 +193,11 @@ To announce an update:
Number of people who have viewed the update.
-
**Visit rate**
+
**Visit Rate**
Percentage of people who have visited the experience from the notification.
-
**Unfollow rate**
+
**Unfollow Rate**
Percentage of people who have unfollowed the experience from the notification.
diff --git a/content/en-us/production/promotion/experience-guidelines.md b/content/en-us/production/promotion/experience-guidelines.md
index 0f9416792..6ed035dfe 100644
--- a/content/en-us/production/promotion/experience-guidelines.md
+++ b/content/en-us/production/promotion/experience-guidelines.md
@@ -1,14 +1,14 @@
---
-title: Experience guidelines
+title: Experience Guidelines
description: Explains how to provide accurate descriptions of experiences to determine accurate experience ratings.
---
-**Experience guidelines** provide information on the experience's main page about what kind of content the experience contains so that players can make informed decisions about what they interact with. Roblox uses this information to recommend experiences on the [Home](https://www.roblox.com/home) and [Discover](https://www.roblox.com/discover) pages according to each user's age group and regional content policies.
+**Experience Guidelines** provide information on the experience's main page about what kind of content the experience contains so that players can make informed decisions about what they interact with. Roblox uses this information to recommend experiences on the [Home](https://www.roblox.com/home) and [Discover](https://www.roblox.com/discover) pages according to each user's age group and regional content policies.
Experience guidelines consist of two components:
-- **Age recommendations** — Indicates which age group an experience is suitable for based on child development research and industry standards. For more information, see [Age recommendations](https://en.help.roblox.com/hc/en-us/articles/8862768451604).
-- **Content descriptors** — Indicates what type of content is within an experience, such as realistic depictions of blood or paid item trading.
+- **Age Recommendations** — Indicates which age group an experience is suitable for based on child development research and industry standards. For more information, see [Age Recommendations](https://en.help.roblox.com/hc/en-us/articles/8862768451604).
+- **Content Descriptors** — Indicates what type of content is within an experience, such as realistic depictions of blood or paid item trading.
@@ -18,7 +18,7 @@ Roblox treats experiences without guidelines the same as experiences with an age
Experience guidelines only apply to the content you create for your experience. They do **not** apply to user-generated content that players bring with them into your experience, such as avatar clothing and accessories.
-## Generate experience guidelines
+## Generating Experience Guidelines
If your Roblox account is at least 30 days old, you can generate experience guidelines by filling out the **Experience Questionnaire** which contains a set of questions about the type of content players can possibly encounter within your experience, as well as how frequently it occurs. Your answers give Roblox an understanding of the content in your experience and ensure that the experience is available to the appropriate audience.
@@ -50,7 +50,7 @@ If you believe that the rating doesn't match your intended audience, and the exp
Please review your experience and confirm that your answers accurately reflect the content of your experience. If you intentionally misrepresent your experience, you may be subject to [moderation consequences](#experience-guidelines-moderation).
-## Questionnaire categories
+## Questionnaire Categories
The following sections provide guidance on answering the questions within each category of the questionnaire. **Guidelines only apply to content that you create for your experience**, not user-generated content that players bring with them, such as avatar clothing and accessories.
@@ -59,13 +59,13 @@ After you submit the questionnaire, your experience receives an age recommendati
-
Age recommendation
+
Age Recommendation
Description
-
**All ages**
+
**All Ages**
Content is generally suitable for all ages. May contain occasional mild violence and/or light unrealistic blood.
@@ -95,7 +95,7 @@ After you submit the questionnaire, your experience receives an age recommendati
Violence is the intentional use of physical or psychological force against players or non-playable characters (NPCs). If your experience includes violence, including within any [asset type](../../projects/assets/index.md#asset-types), you must disclose it in the experience questionnaire based on the violence's maximum level of intensity and how often a user might encounter it.
-#### Level of intensity
+#### Level of Intensity
After you confirm that your experience contains violence, you must specify whether the maximum level of intensity of violence within your experience is **mild**, **moderate**, or **strong**. If you imply violence anywhere within your experience, such as violence that occurs off-screen that players can hear but can't see, your experience automatically meets the mild criteria.
@@ -117,7 +117,7 @@ If you answer **unrealistic**, the questionnaire asks if the blood depictions ar
The next question of the blood category asks you to specify whether the level of intensity of blood within your experience is **light** or **heavy**. If you depict blood anywhere within your experience, such as blood splatter from a distance, your experience automatically meets the light criteria. If you depict heavy bloodshed, such as pools of blood, gushing blood, organs or intestines, decapitation, dismemberment, mutilation of body parts, and/or up-close blood spatter, your experience meets the heavy criteria. Experiences that include heavy bloodshed are only available to verified players that are at least 17 years old.
-### Crude humor
+### Crude Humor
Crude humor is a type of humor that depicts or references bodily functions, such as belching, flatulence, vomiting, urinating, and/or defecation for comical purposes. If your experience includes crude humor, including within any [asset type](../../projects/assets/index.md#asset-types), you must specify if it is **mild** or **moderate** within the experience questionnaire based on what bodily functions you use for comical purposes.
@@ -127,13 +127,13 @@ For example, if you depict or reference flatulence, vomiting, and/or unrealistic
Gambling is the practice of exchanging real world money, Robux, or in-experience items of value for a game of chance. While experiences cannot contain playable gambling content, including simulated gambling, you can depict unplayable gambling content, such as showing a casino or people playing cards.
-### Social hangout
+### Social Hangout
Social hangouts are experiences in which the primary theme or activity is to chat or interact with other players with voice or text either as themselves or as their avatar. While this applies to vibe games, clubs, socializing spaces, and supportive places like sad rooms, it does **not** apply to roleplay and/or life simulation experiences where players adopt various roles like teacher or police officer, or are provided with items to role-play with.
If your experience is a social hangout, you must disclose it within the Maturity & Compliance Questionnaire. Social hangouts are only available to players that are at least 13 years old.
-### Free-form user creation
+### Free-Form User Creation
Free-form user creation are features that allow players to create anything within an experience, such as writing words or making illustrations on a chalkboard. While this applies to in-experience, free-form drawing or creation tools, it does **not** apply to in-experience creations that players assemble with 3D assets, such as building a house or creating an outfit, or anything that goes through Roblox moderation before it's published or replicated.
@@ -143,18 +143,18 @@ If your experience includes free-form user creation features, you must disclose
Alcohol is an intoxicating adult beverage. If your experience includes, depicts, or references alcohol or adult businesses and locations that provide or sell alcohol, you must disclose it within the experience questionnaire. Experiences that depict alcohol are only available to verified players that are at least 17 years old.
-### Romantic themes
+### Romantic Themes
Romantic themes are the non-sexual expression of love or affection. If your experience includes romantic themes, such as a quick kiss on the mouth, you must disclose it within the experience questionnaire. Experiences that include romantic themes are only available to verified players that are at least 17 years old.
-### Strong language
+### Strong Language
Strong language is vulgar and obscene language that players cannot use to harass, discriminate, or threaten others, incite violence, or use in a sexual context. For example, strong language content can be depictions of a non-playable character (NPC) using an obscenity like the "f-word" that isn't directed toward another character or group of people, for example "F* off!".
If your experience includes strong language, you must disclose it within the experience questionnaire. Experiences that include strong language are only available to verified players that are at least 17 years old.
- If you want to enable strong language in user communication aside from content for your 17+ experiences, see [Publishing Experiences and Places](../../production/publishing/publish-experiences-and-places.md#creator-dashboard).
+ If you want to enable strong language in user communication aside from content for your 17+ experiences, see [Publishing Experiences and Places](../../production/publishing/publishing-experiences-and-places.md#creator-dashboard).
### Fear
@@ -197,7 +197,7 @@ After you specify the level of intensity, the questionnaire asks you to specify
The fear descriptor only applies to the content you create for your experiences. It does **not** apply to user-generated content that players bring with them into your experience, such as avatar clothing and accessories.
-## Experience guidelines moderation
+## Experience Guidelines Moderation
Roblox relies on the information you provide in the experience questionnaire to generate accurate guidelines, so the moderation team may review your generated guidelines to ensure their validity based on the content of your experience. Whenever Roblox discovers a discrepancy between your submission and the content in your experience, the following actions occur:
diff --git a/content/en-us/production/promotion/experience-notifications.md b/content/en-us/production/promotion/experience-notifications.md
index ef6967c04..ad74cbb03 100644
--- a/content/en-us/production/promotion/experience-notifications.md
+++ b/content/en-us/production/promotion/experience-notifications.md
@@ -1,5 +1,5 @@
---
-title: Experience notifications
+title: Experience Notifications
description: Experience Notifications are a way for users to keep up with their favorite experiences through timely, personalized notifications.
---
@@ -14,25 +14,25 @@ import Guidelines from '../../includes/experience-notifications/guidelines.md'
-## Eligibility requirements
+## Eligibility Requirements
-## Usage guidelines
+## Usage Guidelines
## Implementation
-Implementing Experience Notifications begins with [creating a notification string](#create-a-notification-string) and including the [package](#include-the-package) in your project. Once these are set up, you can [send notifications](#send-an-experience-notification) with optional [custom parameters](#customize-notifications-using-parameters).
+Implementing Experience Notifications begins with [creating a notification string](#creating-a-notification-string) and including the [package](#including-the-package) in your project. Once these are set up, you can [send notifications](#sending-an-experience-notification) with optional [custom parameters](#customizing-notifications-using-parameters).
Alternatively, you can use the [Open Cloud API](../../cloud/open-cloud/experience-notifications.md) to trigger notifications through freeform API requests.
-### Create a notification string
+### Creating a Notification String
-### Include the package
+### Including the Package
To implement Experience Notifications, you must obtain the Lua package from the [Creator Store](../../production/creator-store.md).
@@ -58,13 +58,13 @@ To implement Experience Notifications, you must obtain the Lua package from the
-### Send an experience notification
+### Sending an Experience Notification
-Once you've [created a notification string](#create-a-notification-string) and included the [package](#include-the-package) in your project, you can send notifications from server‑side scripts. Notifications will be delivered to [opted-in](https://en.help.roblox.com/hc/en-us/articles/24769602332692-Out-of-Experience-Notifications) users age 13+ through their Roblox notification stream, at which point they can join the experience directly via the **Join** button on the notification and spawn according to your [launch data](#include-launch-and-analytics-data).
+Once you've [created a notification string](#creating-a-notification-string) and included the [package](#including-the-package) in your project, you can send notifications from server‑side scripts. Notifications will be delivered to [opted-in](https://en.help.roblox.com/hc/en-us/articles/24769602332692-Out-of-Experience-Notifications) users age 13+ through their Roblox notification stream, at which point they can join the experience directly via the **Join** button on the notification and spawn according to your [launch data](#including-launch-and-analytics-data).
-To send a basic notification to a specific user, include the [notification string](#create-a-notification-string) asset ID in the payload's `messageId` field, then call the [createUserNotification](#createusernotification) function with the recipient's `Class.Player.UserId` and the request data.
+To send a basic notification to a specific user, include the [notification string](#creating-a-notification-string) asset ID in the payload's `messageId` field, then call the [createUserNotification](#createusernotification) function with the recipient's `Class.Player.UserId` and the request data.
```lua title="Send an Experience Notification"
local ServerScriptService = game:GetService("ServerScriptService")
@@ -89,9 +89,9 @@ if result.statusCode ~= 200 then
end
```
-### Customize notifications using parameters
+### Customizing Notifications Using Parameters
-To customize the notification for each recipient, you can include **parameters** in the [notification string](#create-a-notification-string), then customize the parameters when calling the API. For example, you can define the notification string as:
+To customize the notification for each recipient, you can include **parameters** in the [notification string](#creating-a-notification-string), then customize the parameters when calling the API. For example, you can define the notification string as:
@@ -128,7 +128,7 @@ if result.statusCode ~= 200 then
end
```
-### Prompt users to enable notifications
+### Prompting Users to Enable Notifications
To encourage users to enable notifications for your experience, you can display an in‑experience permission prompt to users age 13+ using the `Class.ExperienceNotificationService:PromptOptIn()` method.
@@ -171,9 +171,9 @@ ExperienceNotificationService.OptInPromptClosed:Connect(function()
end)
```
-### Include launch and analytics data
+### Including Launch and Analytics Data
-To further improve user experience, you can include **launch data** in the notification, useful for scenarios such as routing users to a coordinate location or personalizing the joining experience. Additionally, you can include [analytics](#analytics) data to segment the performance of different categories of notifications. Please also refer to the [Player invite prompts](../../production/promotion/invite-prompts.md#include-launch-data) example on how launch data can be set and used.
+To further improve user experience, you can include **launch data** in the notification, useful for scenarios such as routing users to a coordinate location or personalizing the joining experience. Additionally, you can include [analytics](#analytics) data to segment the performance of different categories of notifications. Please also refer to the [Player Invite Prompts](../../production/promotion/invite-prompts.md#including-launch-data) example on how launch data can be set and used.
```lua title="Include Launch Data and Analytics Data"
local ServerScriptService = game:GetService("ServerScriptService")
@@ -204,7 +204,7 @@ if result.statusCode ~= 200 then
end
```
-## Delivery system
+## Delivery System
@@ -212,15 +212,15 @@ end
-### Notifications summary
+### Notifications Summary
-### Itemized stats
+### Itemized Stats
-## API reference
+## API Reference
### Functions
@@ -281,17 +281,17 @@ Table containing details on the notification to be sent to the user. Must contai
`parameters`
table
-
A table of parameters used to render a notification message template. See [Customize notifications using parameters](#customize-notifications-using-parameters) for example usage.
+
A table of parameters used to render a notification message template. See [Customizing Notifications Using Parameters](#customizing-notifications-using-parameters) for example usage.
`joinExperience`
table
-
A call-to-action that represents joining an experience. Currently supports a `launchData` key‑value pair which represents arbitrary data available to an experience when a user joins the experience from the notification; this value is limited to a maximum of 200 bytes. See [Include launch and analytics data](#include-launch-and-analytics-data) for example usage.
+
A call-to-action that represents joining an experience. Currently supports a `launchData` key‑value pair which represents arbitrary data available to an experience when a user joins the experience from the notification; this value is limited to a maximum of 200 bytes. See [Including Launch and Analytics Data](#including-launch-and-analytics-data) for example usage.
`analyticsData`
table
-
Data for how analytics are reported. Currently supports a `category` key‑value pair which represents the notification category, used to group analytics data. See [Include launch and analytics data](#include-launch-and-analytics-data) for example usage.
+
Data for how analytics are reported. Currently supports a `category` key‑value pair which represents the notification category, used to group analytics data. See [Including Launch and Analytics Data](#including-launch-and-analytics-data) for example usage.
diff --git a/content/en-us/production/promotion/get-featured-on-roblox-owned-channels.md b/content/en-us/production/promotion/getting-featured-on-roblox-owned-channels.md
similarity index 97%
rename from content/en-us/production/promotion/get-featured-on-roblox-owned-channels.md
rename to content/en-us/production/promotion/getting-featured-on-roblox-owned-channels.md
index 5976f6e17..34c311429 100644
--- a/content/en-us/production/promotion/get-featured-on-roblox-owned-channels.md
+++ b/content/en-us/production/promotion/getting-featured-on-roblox-owned-channels.md
@@ -1,5 +1,5 @@
---
-title: Get featured on Roblox‑owned channels
+title: Getting Featured on Roblox‑Owned Channels
description: An overview on how Roblox highlights creators, developers, and brands.
---
@@ -7,7 +7,7 @@ Roblox is reimagining the way people come together through deeper forms of expre
We want to see what you build from your imagination, showcasing the breadth of what's possible on Roblox through the eyes of our community.
-## What we're looking for
+## What We're Looking For
Roblox is home to great experiences, user-crafted content, and creations that allow our passionate, global community to express themselves, discover new things, and connect with friends. Our featured content focuses on creations that reimagine the way people come together through deeper forms of expression, communication, and immersion.
@@ -21,23 +21,23 @@ These include:
- New and exciting trends
- Stories of creation and innovation
-### Submission criteria
+### Submission Criteria
In order to submit your application, you must adhere to the following criteria:
- Follow Roblox Terms of Service
- Follow Roblox Community Guidelines
-- Represent the experience guideline rating
+- Represent the Experience Guideline rating
- Be over the age of 13
-## Frequently asked questions
+## Frequently Asked Questions
Should your submission be accepted you will receive an email confirmation for next steps. If you are not chosen, you will be notified via email within two weeks of submission.
diff --git a/content/en-us/production/promotion/index.md b/content/en-us/production/promotion/index.md
index 1876e92b6..696e30c9c 100644
--- a/content/en-us/production/promotion/index.md
+++ b/content/en-us/production/promotion/index.md
@@ -5,7 +5,7 @@ description: An overview of promotional tools you can use to promote your experi
**Promotion** on Roblox allows you to engage a global audience to drive traffic and awareness to your experiences, avatar items, and social media.
-All promotional content on the platform must adhere to Roblox's [Community Standards](https://en.help.roblox.com/hc/articles/203313410) and [Terms of Use](https://en.help.roblox.com/hc/en-us/articles/115004647846), and if your promotional content is advertising, it must also adhere to Roblox's [Advertising Standards](https://en.help.roblox.com/hc/articles/13722260778260). For information on how all advertising works on the platform, including details for both advertising campaigns using Roblox's promotion products, and compliant independent advertising campaigns for experiences, see [Advertise on Roblox](../../production/promotion/advertise-on-roblox.md) and [Comply with advertising standards](../../production/promotion/comply-with-advertising-standards.md).
+All promotional content on the platform must adhere to Roblox's [Community Standards](https://en.help.roblox.com/hc/articles/203313410) and [Terms of Use](https://en.help.roblox.com/hc/en-us/articles/115004647846), and if your promotional content is advertising, it must also adhere to Roblox's [Advertising Standards](https://en.help.roblox.com/hc/articles/13722260778260). For information on how all advertising works on the platform, including details for both advertising campaigns using Roblox's promotion products, and compliant independent advertising campaigns for experiences, see [Advertising on Roblox](../../production/promotion/advertising-on-roblox.md) and [Complying with Advertising Standards](../../production/promotion/complying-with-advertising-standards.md).
## Experiences
@@ -20,38 +20,38 @@ The following table details promotional methods for experiences on the platform.
-
**Search ads**
+
**Search Ads**
Promote your experiences in search results by creating search ads. This form of advertising allows developers to target their ads to users using search, increasing the likelihood of engagement based off of specific keywords.
-
For more information, see [Search ads](../../production/promotion/search-ads.md).
+
For more information, see [Search Ads](../../production/promotion/search-ads.md).
-
**Sponsored experiences**
+
**Sponsored Experiences**
Advertise your experiences within the **Sponsored** category on the [Home](https://www.roblox.com/home) page. Each sponsored experience ad campaign lets you choose your audience, schedule the duration of your ad campaign, and specify your budget per day.
For more information, see [Ads Manager](../../production/promotion/ads-manager.md).
-
**Immersive portal ad campaigns**
+
**Immersive Portal Ad Campaigns**
Advertise experiences through the immersive portal ad format that transports users from other creators' experiences directly into your own.
For more information, see [Ads Manager](../../production/promotion/ads-manager.md).
-
**Time-based events**
-
Invite users back into your experiences with engaging time-based events that display on your experience's main details page. For more information, see [Events and updates](../../production/promotion/experience-events.md).
+
**Time-Based Events**
+
Invite users back into your experiences with engaging time-based events that display on your experience's main details page. For more information, see [Events and Updates](../../production/promotion/experience-events.md).
-
**Player invite prompts**
-
[Player invite prompts](../../production/promotion/invite-prompts.md), implemented directly inside your experience, encourage players to invite their friends and increase co‑experience gameplay.
+
**Player Invite Prompts**
+
[Player Invite Prompts](../../production/promotion/invite-prompts.md), implemented directly inside your experience, encourage players to invite their friends and increase co‑experience gameplay.
-
**Experience notifications**
-
[Experience Notifications](../../production/promotion/experience-notifications.md) are a way for 13+ users to keep up with their favorite experiences through timely, personalized notifications. As the developer, you can determine what kinds of in‑experience activities are most important to notify your users about, as well as define the notification content.
+
**Experience Notifications**
+
[Experience Notifications](../../cloud/open-cloud/experience-notifications.md) are a way for 13+ users to keep up with their favorite experiences through timely, personalized notifications. As the developer, you can determine what kinds of in‑experience activities are most important to notify your users about, as well as define the notification content.
-
**Special sort categories on Roblox channels**
-
Apply for Roblox to feature your experiences within specific categories on the [Discover](https://www.roblox.com/discover) page or in highlights on Roblox-owned channels.
For more information, see [Nominate for the Discover page](../../production/promotion/nominate-for-the-discover-page.md) and [Get featured on Roblox‑owned channels](../../production/promotion/get-featured-on-roblox-owned-channels.md).
+
**Special Sort Categories or Roblox Channels**
+
Apply for Roblox to feature your experiences within specific categories on the [Discover](https://www.roblox.com/discover) page or in highlights on Roblox-owned channels.
For more information, see [Nominating for the Discover Page](../../production/promotion/nominating-for-the-discover-page.md) and [Getting Featured on Roblox‑Owned Channels](../../production/promotion/getting-featured-on-roblox-owned-channels.md).
-## Avatar items
+## Avatar Items
The following table details promotional methods for avatar items on the platform.
@@ -64,15 +64,15 @@ The following table details promotional methods for avatar items on the platform
-
**Sponsored items**
-
Sponsoring items allows you to increase the discoverability of your 3D user-generated content to users within the [Marketplace](https://www.roblox.com/catalog). You can choose your audience, schedule the duration of your ad, and specify your budget per day.
For more information, see [Sponsor items](../../production/promotion/sponsor-items.md).
+
**Sponsored Items**
+
Sponsoring items allows you to increase the discoverability of your 3D user-generated content to users within the [Marketplace](https://www.roblox.com/catalog). You can choose your audience, schedule the duration of your ad, and specify your budget per day.
For more information, see [Sponsoring Items](../../production/promotion/sponsoring-items.md).
-## Social media
+## Social Media
-You can direct users to follow you on social media by embedding social media links on your experience's main details page. Social media links connect your audience over the age of 13 to your social media outside of Roblox, which you can use to market updates, monitor community feedback, and promote your experiences. For more information, see [Social media links](../../production/promotion/social-media-links.md).
+You can direct users to follow you on social media by embedding social media links on your experience's main details page. Social media links connect your audience over the age of 13 to your social media outside of Roblox, which you can use to market updates, monitor community feedback, and promote your experiences. For more information, see [Social Media Links](../../production/promotion/social-media-links.md).
diff --git a/content/en-us/production/promotion/invite-prompts.md b/content/en-us/production/promotion/invite-prompts.md
index d6ea36c44..83dbcd758 100644
--- a/content/en-us/production/promotion/invite-prompts.md
+++ b/content/en-us/production/promotion/invite-prompts.md
@@ -1,6 +1,6 @@
---
-title: Player invite prompts
-description: Invite prompts are prompts sent to the player of an experience to invite their friends to join them.
+title: Player Invite Prompts
+description: Invite Prompts are prompts sent to the player of an experience to invite their friends to join them.
---
In addition to common [promotion](../../production/promotion/index.md) methods for increasing your player base, you can implement **invite prompts** directly inside your experience, encouraging players to invite their friends and increase co-experience gameplay.
@@ -8,13 +8,13 @@ In addition to common [promotion](../../production/promotion/index.md) methods f
The invite prompt system features the following:
- **Dynamic Invitees** — Prompt players to invite multiple friends from a selection list, or invite one specific friend.
-- **Launch Data** — Include optional [launch data](#include-launch-data) that can be read through `Class.Player:GetJoinData()` when the invited friend joins. Example use cases include routing invited friends to a coordinate location or personalizing the joining experience for the invitee.
-- **Customizable Text** — Customize the [invite prompt](#prompt-an-invite) message and the [notification](#set-notification-options) message. For example, an invite prompt for the player may read "Ask your friends to join the adventure!" and the notification message for the invited friend(s) may read "\{displayName\} wants you to join their adventure in \{experienceName\}!".
+- **Launch Data** — Include optional [launch data](#including-launch-data) that can be read through `Class.Player:GetJoinData()` when the invited friend joins. Example use cases include routing invited friends to a coordinate location or personalizing the joining experience for the invitee.
+- **Customizable Text** — Customize the [invite prompt](#prompting-an-invite) message and the [notification](#setting-notification-options) message. For example, an invite prompt for the player may read "Ask your friends to join the adventure!" and the notification message for the invited friend(s) may read "\{displayName\} wants you to join their adventure in \{experienceName\}!".
You can also track and reward inviters and invitees using the [Friend Invite Reward System](./referral-system.md).
-
+
Prompt to invite multiple friends
@@ -24,7 +24,7 @@ You can also track and reward inviters and invitees using the [Friend Invite Rew
Prompt to invite a specific friend
-
+
@@ -38,7 +38,7 @@ You can also track and reward inviters and invitees using the [Friend Invite Rew
-## Set invite options
+## Setting Invite Options
By default, an invite prompt for the player shows a menu of their friends with **Invite** buttons. To customize the prompt message, target a specific friend, or include launch data in the invite, you'll need to set up an `Class.ExperienceInviteOptions` object with the desired properties.
@@ -75,7 +75,7 @@ By default, an invite prompt for the player shows a menu of their friends with *
-
+
```lua title='LocalScript - Invite Multiple Friends' highlight='7-8'
local SocialService = game:GetService("SocialService")
@@ -89,7 +89,7 @@ inviteOptions.PromptMessage = "Ask your friends to join the adventure!"
```
-
+
```lua title='LocalScript - Invite Specific Friend' highlight='5,8-10'
local SocialService = game:GetService("SocialService")
@@ -107,7 +107,7 @@ inviteOptions.PromptMessage = "Invite this friend to join the adventure!"
-## Set notification options
+## Setting Notification Options
By default, the invite notification that friends receive contains the sender's `Class.Player.DisplayName|DisplayName`, username, and the experience name. To customize the message, you can create a **Notification** asset on the [Creator Dashboard](https://create.roblox.com/dashboard/creations) and include its asset ID as a parameter of `Class.ExperienceInviteOptions`.
@@ -143,14 +143,14 @@ By default, the invite notification that friends receive contains the sender's `
inviteOptions.InviteMessageId = "ef0e0790-e2e8-4441-9a32-93f3a5783bf1"
```
-## Prompt an invite
+## Prompting an Invite
To prompt an invite, you should first determine whether the player **can** send an invite, as the ability may vary depending on the platform or player. Once confirmed, you can display the invitation prompt to the player.
1. Call `Class.SocialService:CanSendGameInviteAsync()`, wrapped in a `Global.LuaGlobals.pcall()` since it's an asynchronous network call that may occasionally fail.
-1. If the invite ability is confirmed, call `Class.SocialService:PromptGameInvite()` with the optional [invite options object](#set-invite-options) as the second argument.
+1. If the invite ability is confirmed, call `Class.SocialService:PromptGameInvite()` with the optional [invite options object](#setting-invite-options) as the second argument.
-Once prompted, the player will see an on-screen prompt to invite multiple friends, or the specific friend defined in the [invite options object](#set-invite-options). When the player then clicks the **Invite** button for one or more friends, those friends will receive a notification containing the sender's `Class.Player.DisplayName|DisplayName`, username, and the experience name. Notifications may be further customized as outlined in [Set notification options](#set-notification-options).
+Once prompted, the player will see an on-screen prompt to invite multiple friends, or the specific friend defined in the [invite options object](#setting-invite-options). When the player then clicks the **Invite** button for one or more friends, those friends will receive a notification containing the sender's `Class.Player.DisplayName|DisplayName`, username, and the experience name. Notifications may be further customized as outlined in [Setting Notification Options](#setting-notification-options).
@@ -206,11 +206,11 @@ end
-## Include launch data
+## Including Launch Data
To further improve in-experience cooperation or to incentivize player invites, you can include **launch data** in an invite prompt, useful for scenarios such as routing invited friends to a coordinate location or personalizing the joining experience for the invitee.
-1. When [prompting an invite](#prompt-an-invite), include an `Class.ExperienceInviteOptions` object with relevant data that will be used when the friend joins the experience, for example the sender's `Class.Player.UserId`, the ID of a [badge](../../production/publishing/badges.md) to award to the friend upon joining, or a coordinate location to spawn the friend at. If you need to compile multiple pieces of data, encode the data using `Class.HttpService:JSONEncode()|JSONEncode()`.
+1. When [prompting an invite](#prompting-an-invite), include an `Class.ExperienceInviteOptions` object with relevant data that will be used when the friend joins the experience, for example the sender's `Class.Player.UserId`, the ID of a [badge](../../production/publishing/badges.md) to award to the friend upon joining, or a coordinate location to spawn the friend at. If you need to compile multiple pieces of data, encode the data using `Class.HttpService:JSONEncode()|JSONEncode()`.
diff --git a/content/en-us/production/promotion/nominate-for-the-discover-page.md b/content/en-us/production/promotion/nominating-for-the-discover-page.md
similarity index 97%
rename from content/en-us/production/promotion/nominate-for-the-discover-page.md
rename to content/en-us/production/promotion/nominating-for-the-discover-page.md
index e31f0eb12..b2927af15 100644
--- a/content/en-us/production/promotion/nominate-for-the-discover-page.md
+++ b/content/en-us/production/promotion/nominating-for-the-discover-page.md
@@ -1,5 +1,5 @@
---
-title: Nominate for the Discover page
+title: Nominating for the Discover Page
description: Explains the process of nominating your experience for specialized sort categories on the Discover page.
---
@@ -22,7 +22,7 @@ on the [Developer Forum](https://devforum.roblox.com). To avoid having to
resubmit a nomination, carefully review the criteria for each category to make
sure your submission applies to the correct category.
-## Learn & Explore criteria
+## Learn & Explore Criteria
The **Learn & Explore** sort highlights experiences that let users learn
in an engaging way. The Roblox Education team reviews all applications
diff --git a/content/en-us/production/promotion/referral-system.md b/content/en-us/production/promotion/referral-system.md
index 8249df5f7..5f947599d 100644
--- a/content/en-us/production/promotion/referral-system.md
+++ b/content/en-us/production/promotion/referral-system.md
@@ -1,5 +1,5 @@
---
-title: Friend invite reward system
+title: Friend Invite Reward System
description: Use referral links to track and reward players that have successfully invited other players into your experience, and players that have joined your experience using a referral link invitation from another player.
---
@@ -37,7 +37,7 @@ end
Players.PlayerAdded:Connect(onPlayerAdded)
```
-## Set up a referral event
+## Set Up a Referral Event
To set up a referral event:
@@ -71,7 +71,7 @@ end
Players.PlayerAdded:Connect(onPlayerAdded)
```
-## Grant referral rewards
+## Grant Referral Rewards
To encourage participation, grant rewards to both inviters and invitees. For example, you can give inviters a badge or in-experience currency when their friend joins the experience, and give invitees a welcome reward for joining the experience through a referral link.
@@ -113,7 +113,7 @@ end
Players.PlayerAdded:Connect(onPlayerAdded)
```
-## Manage abuse prevention
+## Manage Abuse Prevention
You can implement safeguards to prevent players from exploiting the friend referral system.
diff --git a/content/en-us/production/promotion/search-ads.md b/content/en-us/production/promotion/search-ads.md
index 6e4b0628c..86c7364fe 100644
--- a/content/en-us/production/promotion/search-ads.md
+++ b/content/en-us/production/promotion/search-ads.md
@@ -1,5 +1,5 @@
---
-title: Search ads
+title: Search Ads
description: Search ads promote experiences in the search results of Roblox's experience catalog.
---
@@ -40,7 +40,7 @@ Search results populate in the following ways:
All Roblox advertisers of experiences must abide by our [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards). Currently, [paid access experiences in Robux](../monetization/paid-access-robux.md), [paid access experiences in local currency](../monetization/paid-access-local-currency.md), and [17+ experiences](https://en.help.roblox.com/hc/en-us/articles/15869919570708-Roblox-17-Policy-Standards) are not eligible to advertise using search ads. Roblox prevents surfacing experiences identified as clickbait or spam.
-## Create search ads
+## Creating Search Ads
Search ads are managed in the [Ads Manager](./ads-manager.md) as a Visits campaign objective. Search ads also use a [modified bidding and auction](#bidding-and-auction) process to determine pricing and availability of individual keywords.
@@ -50,7 +50,7 @@ Unlike other ad types, you can't modify brand suitability and audience targeting
To create search ads:
-1. Navigate to the [Ads Manager](https://advertise.roblox.com/landing). If it's your first time creating an ad campaign, you must first [create an account](./ads-manager.md#create-an-ad-account) and [add a payment method](./ads-manager.md#add-a-payment-method).
+1. Navigate to the [Ads Manager](https://advertise.roblox.com/landing). If it's your first time creating an ad campaign, you must first [create an account](./ads-manager.md#creating-an-ad-account) and [add a payment method](./ads-manager.md#adding-a-payment-method).
2. In **Manage Ads**, click **CREATE**.
@@ -81,9 +81,9 @@ To create search ads:
6. In the Review Campaign page, review the final details of your advertisement and click **SUBMIT** to launch your campaign.
-After launching your campaign, you can monitor the campaign's performance with [ads reporting](#reporting) and [billing](./ads-manager.md#ads-billing).
+After launching your campaign, you can monitor the campaign's performance with [Ads Reporting](#reporting) and [Billing](./ads-manager.md#ads-billing).
-## Bidding and auction
+## Bidding and Auction
Ads on Roblox work in a bidding system, where advertisers bid to have their ads shown to users through the available ad units placed in an experience. Search ads differ from other ads in that they also calculate the relevance of the experience to the user's query. **This means that experiences that are more relevant to a search query have a greater chance of displaying as ads**.
@@ -113,6 +113,6 @@ The following is the [same bidding and auction information](./ads-manager.md#bid
## Reporting
-You can review your ad campaign's performance using the Ad Manager's [ads reporting tool](./ads-manager.md#ads-reporting). At this time, you can't filter reports by keywords, but you can create ad sets with a single keyword to compare how an individual keyword performs for your campaign.
+You can review your ad campaign's performance using the Ad Manager's [Ads Reporting tool](./ads-manager.md#ads-reporting). At this time, you can't filter reports by keywords, but you can create ad sets with a single keyword to compare how an individual keyword performs for your campaign.
Search ad metrics also populate in the [Analytics Dashboard](../analytics/acquisition.md#acquisition-sources) acquisition metrics. At this time, search ad and sponsored ad results are combined as a single Sponsored Ad metric on acquisition reports.
diff --git a/content/en-us/production/promotion/social-media-links.md b/content/en-us/production/promotion/social-media-links.md
index 1b9ca01e7..8585dadf3 100644
--- a/content/en-us/production/promotion/social-media-links.md
+++ b/content/en-us/production/promotion/social-media-links.md
@@ -1,5 +1,5 @@
---
-title: Social media links
+title: Social Media Links
description: Explains how to engage with your audience by promoting your experience on social media.
---
diff --git a/content/en-us/production/promotion/sponsor-items.md b/content/en-us/production/promotion/sponsoring-items.md
similarity index 95%
rename from content/en-us/production/promotion/sponsor-items.md
rename to content/en-us/production/promotion/sponsoring-items.md
index 5b0554bf4..a3df43f46 100644
--- a/content/en-us/production/promotion/sponsor-items.md
+++ b/content/en-us/production/promotion/sponsoring-items.md
@@ -1,5 +1,5 @@
---
-title: Sponsor items
+title: Sponsoring Items
comment: Changes to this article require additional review
description: Sponsoring items allows you to increase the discoverability of 3D user-generated content within the Avatar Marketplace.
---
@@ -8,7 +8,7 @@ Sponsoring items allows you to increase the discoverability of your 3D user-gene
-## Bidding system
+## Bidding System
Advertisement space works on a bidding system where the higher you set your **Daily Budget** amount in relation to other creators' bids, the more likely your sponsored item will display within the **Sponsored** category on any item's details page on the Roblox website or in the Roblox app. The location of each sponsored item within the category is random.
@@ -18,7 +18,7 @@ For example, if there are three sponsored items in the bidding system, advertisi
User
-
Bid amount
+
Bid Amount
Result
@@ -41,7 +41,7 @@ For example, if there are three sponsored items in the bidding system, advertisi
-## Create sponsored items
+## Creating Sponsored Items
Once you have at least **10 Robux** to bid on advertising space per day, you can create a new sponsored item for a specific audience, including gender, age, and platform.
@@ -62,7 +62,7 @@ To create a new sponsored item:
Roblox holds the full amount for your ad cycle as soon as you click the Run button. If you cancel the ad cycle, you will receive a refund for any amount per full day left of the ad cycle.
-## View sponsored item statistics
+## Viewing Sponsoring Item Statistics
After you have created a sponsored item, you can view statistics related to the ad's performance.
@@ -97,15 +97,15 @@ To view a sponsored item's statistics:
The amount of attributed purchases divided by impressions.
-
CPC (Cost Per Click)
+
CPC ("Cost Per Click")
The total Robux spent divided by the number of clicks.
-
CPP (Cost Per Purchase)
+
CPP ("Cost Per Purchase")
The total Robux spent divided by the number of attributed purchases.
-
CTR (Click Through Rate)
+
CTR ("Click Through Rate")
Clicks divided by impressions.
@@ -123,7 +123,7 @@ To view a sponsored item's statistics:
-## Cancel sponsored items
+## Cancelling Sponsored Items
You can cancel a sponsored item at any time and receive a refund for any amount per full day left of the ad cycle. For example, if you set up a three day ad cycle and cancel on the first day, you will receive a refund for the remaining two days.
diff --git a/content/en-us/production/publishing/about-GDPR-and-CCPA.md b/content/en-us/production/publishing/about-GDPR-and-CCPA.md
index 4a1f2b972..550d6c667 100644
--- a/content/en-us/production/publishing/about-GDPR-and-CCPA.md
+++ b/content/en-us/production/publishing/about-GDPR-and-CCPA.md
@@ -16,18 +16,18 @@ GDPR stands for the **General Data Protection Regulation**. The GDPR is a law in
CCPA stands for the **California Consumer Privacy Act**. This law provides rights to consumers who reside in California, USA, including knowing what information is collected about them, requesting a business to delete any personal information about a consumer from that consumer, and not to discriminate against a consumer if they exercise their privacy rights.
-What is personal information?
+What is Personal Information?
Most people associate the terms "personal information" or "personally identifiable information" (PII) as data like a name, email address, or home address. However, GDPR and CCPA have broader definitions for personal information which can also cover information that does not directly link to a specific individual, such as user IDs or IP addresses.
As a general rule, developers should **not** collect more personal information than what is supplied by Roblox, for instance the user ID and username for their players. For more information, see our [community rules](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Rules).
-## Impact on developers
+## Impact on Developers
As a developer, here are some ways to honor a player's rights under GDPR and CCPA:
- You may receive a message from Roblox regarding a **personal information deletion request**. Roblox takes special care to verify these requests to ensure that they're legitimate, so you should **only comply to requests from Roblox**. If a player contacts you first, please ask them to make the request at [https://www.roblox.com/support](https://www.roblox.com/support).
- Aside from user ID and username, do **not** store other forms of personal information such as birth dates or personal photos.
-- If you're **asked by Roblox** to delete personal information about an individual who has exercised their right under GDPR or CCPA, you may need to delete specific data from your experience's [data stores](../../cloud-services/data-stores/index.md).
+- If you're **asked by Roblox** to delete personal information about an individual who has exercised their right under GDPR or CCPA, you may need to delete specific data from your experience's [data stores](../../cloud-services/data-stores).
- If you have already stored other personal information beyond what Roblox provides access to, remove it and update your experience so that it doesn't store that data in the future.
diff --git a/content/en-us/production/publishing/accessibility.md b/content/en-us/production/publishing/accessibility.md
index 5f461e5a2..32cc7d8ab 100644
--- a/content/en-us/production/publishing/accessibility.md
+++ b/content/en-us/production/publishing/accessibility.md
@@ -1,5 +1,5 @@
---
-title: Accessibility guidelines
+title: Accessibility Guidelines
description: Explains the practice of designing products and services to be usable by people with disabilities.
---
@@ -8,7 +8,7 @@ description: Explains the practice of designing products and services to be usab
Accessibility isn't limited to the physical world — online experiences can be made accessible, too. Recent stats cite that over 26% of people have some type of disability, so making your Roblox experience accessible can help you reach a wider audience.
-## Text size
+## Text Size
Users may find it difficult to read small text. Compare the following in-experience shop menu with a blur applied, simulating what it might look like to a user with impaired vision.
@@ -40,7 +40,7 @@ If you increase the size of the smaller font labels, it will be clearer to most
-## Color contrast
+## Color Contrast
Users might find it difficult to read light text on a light background, or dark text on a dark background. To improve accessibility, it's recommended that you pick text and background colors with sufficient color contrast.
@@ -59,7 +59,7 @@ Users might find it difficult to read light text on a light background, or dark
-## Color non-reliance
+## Color Non-Reliance
Over 5% of people in the world have some form of color blindness. Although it's rare for someone to see **only** in black and white, imagine viewing an experience in grayscale:
@@ -84,7 +84,7 @@ By modifying the image to use different **symbols** alongside colors, more users
-## Sound non-reliance
+## Sound Non-Reliance
Sound is an excellent addition for immersive experiences, but hearing-impaired users or anyone who turns their volume off will be confused by in-experience events that are **only** conveyed with sound.
@@ -92,7 +92,7 @@ Consider the following scene where a ringing phone is signalled only by sound, a
-## Volume controls
+## Volume Controls
Different sounds playing at the same time can be overwhelming, distracting, or difficult to distinguish. Providing users with volume controls for different [groups](../../sound/groups.md) of audio such as sound effects, music, and speech lets them customize their experience and focus on what they need to.
diff --git a/content/en-us/production/publishing/account-verification.md b/content/en-us/production/publishing/account-verification.md
index 1de60bdc0..918a3542b 100644
--- a/content/en-us/production/publishing/account-verification.md
+++ b/content/en-us/production/publishing/account-verification.md
@@ -1,15 +1,15 @@
---
-title: Account verification
+title: Account Verification
description: Explains how to verify your Roblox account.
---
-**Account verification** is the process of connecting your identity on Roblox to your real world identity, either through a government ID or through your phone number. When you verify your account, you can distribute more of each asset type and maximize their discoverability within the [Creator Store](../../production/creator-store.md), distribute audio assets under 10 seconds, monetize your [plugins](../../studio/plugins.md), and access age-restricted Studio features such as [voice chat](../../chat/voice-chat.md).
+**Account Verification** is the process of connecting your identity on Roblox to your real world identity, either through a government ID or through your phone number. When you verify your account, you can distribute more of each asset type and maximize their discoverability within the [Creator Store](../../production/creator-store.md), distribute audio assets under 10 seconds, monetize your [plugins](../../studio/plugins.md), and access age-restricted Studio features such as [voice chat](../../chat/voice-chat.md).
-**Phone number verification is not sufficient** to sell priced assets on the Creator Store. To sell priced assets, you need to verify with a [government ID](account-verification.md#verify-through-government-id) and create a seller account. For more information, see [Sell on the Creator Store](../sell-on-creator-store.md).
+**Phone number verification is not sufficient** to sell priced assets on the Creator Store. To sell priced assets, you need to verify with a [government ID](account-verification.md#verifying-through-government-id) and create a seller account. For more information, see [Selling on the Creator Store](../selling-on-creator-store.md).
-## Verify through government ID
+## Verifying Through Government ID
In order to verify your account with this method, you must:
@@ -36,7 +36,7 @@ To verify your account with a government-issued ID:
1. As the different prompts display, use your phone to take pictures of your government-issued ID and your face. If the service is unable to process your verification data, it prompts you to re-capture the necessary images; otherwise a success message displays and the **Verify My Age** button changes to **Age Verified**.
1. **(Optional)** Restart Studio to validate your new age verification status.
-## Verify through phone number
+## Verifying Through Phone Number
In order to verify your account with this method, you must be at least 13 years of age and have a phone number that can receive text messages. You can only use your phone number with a **single** Roblox account.
@@ -65,7 +65,7 @@ To verify your account with your phone number:
1. **(Optional)** Restart Studio to validate your new age verification status.
-## Check verification status by script
+## Checking Verification Status by Script
Within a `Class.Script`, the `Class.Player:IsVerified()` method lets you check the verification status of users accessing your experiences, allowing you to limit access to specific content, ranked queues, or even the experience itself. Because users that verify their accounts connect their Roblox identity to their real-world identity, it's much less likely they will cheat, spam, or otherwise risk being blocked from your experience, making this method especially useful for competitive and ranked experiences.
diff --git a/content/en-us/production/publishing/badges.md b/content/en-us/production/publishing/badges.md
index 8a2d5e57f..f78c7b9f3 100644
--- a/content/en-us/production/publishing/badges.md
+++ b/content/en-us/production/publishing/badges.md
@@ -10,7 +10,7 @@ A **badge** is a special award you can gift players when they meet a goal within
Example badges in a player's inventory
-## Create badges
+## Creating Badges
You can create up to 5 badges for free in a 24‑hour period (GMT) for each experience you own. If you want to create more within the 24‑hour period, each additional badge costs 100 Robux.
@@ -54,13 +54,13 @@ To create a badge:
Badge on experience's main page
-## Script badges
+## Scripting Badges
-Common badge scripting workflows include [awarding badges](#award-badges), checking if a player has previously [earned](#check-earned-badges) a badge in your experience, and [getting badge information](#get-badge-info).
+Common badge scripting workflows include [awarding badges](#awarding-badges), checking if a player has previously [earned](#checking-earned-badges) a badge in your experience, and [getting badge information](#getting-badge-info).
-### Locate badge IDs
+### Locating Badge IDs
-A badge's ID is its unique identifier. You'll need this ID when implementing workflows such as [awarding the badge](#award-badges) to a player.
+A badge's ID is its unique identifier. You'll need this ID when implementing workflows such as [awarding the badge](#awarding-badges) to a player.
1. On the [Creator Dashboard](https://create.roblox.com/dashboard/creations), navigate to the associated experience's **Badges** section under **Engagement**.
@@ -70,7 +70,7 @@ A badge's ID is its unique identifier. You'll need this ID when implementing wor
-### Award badges
+### Awarding Badges
You can award badges to players throughout your experience by calling the `Class.BadgeService:AwardBadge()` method in a server-side `Class.Script`. `Class.BadgeService:GetBadgeInfoAsync()` returns properties of the badge, including `IsEnabled` which confirms whether or not the badge can be awarded to a player. You can enable or disable a badge from the **Configure Badge** form on the [Creator Dashboard](https://create.roblox.com/dashboard/creations).
@@ -97,9 +97,9 @@ local function awardBadge(player, badgeId)
end
```
-### Check earned badges
+### Checking Earned Badges
-The following script checks when any player enters the experience, then uses the `Class.BadgeService:UserHasBadgeAsync()` method to verify if that player owns the badge with the [matching ID](#locate-badge-ids) set in the variable `BADGE_ID`. You can also verify badge ownership in batches using the `Class.BadgeService:CheckUserBadgesAsync()` method.
+The following script checks when any player enters the experience, then uses the `Class.BadgeService:UserHasBadgeAsync()` method to verify if that player owns the badge with the [matching ID](#locating-badge-ids) set in the variable `BADGE_ID`. You can also verify badge ownership in batches using the `Class.BadgeService:CheckUserBadgesAsync()` method.
```lua
local BadgeService = game:GetService("BadgeService")
@@ -126,10 +126,10 @@ end
Players.PlayerAdded:Connect(onPlayerAdded)
```
-### Get badge info
+### Getting Badge Info
To get information about a badge, such as its description or icon asset
-ID, call the `Class.BadgeService:GetBadgeInfoAsync()` method with a [badge ID](#locate-badge-ids). For example:
+ID, call the `Class.BadgeService:GetBadgeInfoAsync()` method with a [badge ID](#locating-badge-ids). For example:
```lua
local BadgeService = game:GetService("BadgeService")
diff --git a/content/en-us/production/publishing/console-guidelines.md b/content/en-us/production/publishing/console-guidelines.md
index 6a3c90a00..41f037e41 100644
--- a/content/en-us/production/publishing/console-guidelines.md
+++ b/content/en-us/production/publishing/console-guidelines.md
@@ -1,5 +1,5 @@
---
-title: Console development guidelines
+title: Console Development Guidelines
description: Explains design requirements to follow for publishing an experience to consoles.
---
@@ -9,11 +9,11 @@ With 200M+ Xbox and PlayStation players, consoles present a major opportunity fo
Experiences designed for consoles always need to provide [Content Maturity information](../../production/promotion/content-maturity.md) to ensure smooth releases and minimize the risk of being removed from consoles.
-## Design for controllers
+## Designing for Controllers
Console experiences receive commands from users through input controllers, which require special designs for smooth interactions.
-### Simplify the UI
+### Simplifying UI
@@ -31,11 +31,11 @@ Apply the following to simplify the UI design for consoles:
As controllers aren't just for consoles and VR but also are available on devices such as desktop and mobile, minimizing the number of moves needed can enhance the UI for all devices and input types in addition to PlayStation and Xbox.
-### Add supplemental control
+### Adding Supplemental Control
Unlike mobiles and desktops, navigation is always sequential on consoles, so users can't jump between far away elements as quickly as on other devices. To enhance the speed of navigation, consider adding additional buttons and shortcuts for essential in-experience actions.
-### Accommodate dynamic button icons
+### Accommodating Dynamic Button Icons
@@ -70,7 +70,7 @@ As your experience expands to more platforms, be sure to show button icons that
imageLabel.Image = mappedIcon
```
-## Provide haptic feedback
+## Providing Haptic Feedback
@@ -82,13 +82,13 @@ One unique advantage of controllers is the capability of providing haptic feedba
`Class.HapticService` also allows you to control the individual motors in a controller to set the intensity and duration of vibrations individually, so you can set different vibrations for different purposes and maintain the consistency with which actions trigger feedback. Design haptics carefully and avoid overuse, as users might find constant vibrations unpleasant and annoying.
-## Build for the 10ft experience
+## Building for the 10ft Experience
When on consoles, users are typically sitting 10 feet away from the screen. A scale factor of 1.5x ensures that the UI is comfortable, easy to navigate, and with legible fonts.
-### Consider TV safe-area
+### Considering TV Safe-Area
@@ -97,7 +97,7 @@ When on consoles, users are typically sitting 10 feet away from the screen. A sc
Since not all TVs show content fully to the edges of the screen due to historical and technical limitations, put UI elements in TV-safe areas to ensure important experience elements are visible on various TVs.
-### Implement dynamically-sized UI
+### Implementing Dynamically-Sized UI
Implement your UI using relative sizes and relative positions to measure everything as percentages of a frame. Incorporate a scale factor to all UI sizes by:
@@ -109,12 +109,12 @@ Implement your UI using relative sizes and relative positions to measure everyth
- Implementing `Class.ScrollingFrame` to reduce clutter on screen as the UI scales up.
-## Adapt progressive disclosure
+## Adapting Progressive Disclosure
Progressive disclosure defers advanced or rarely used features to a secondary screen. It's one of the best ways to declutter your UI and make it easy to use. For the console UX, it's common and faster to have the user go in and out of screens rather than fitting everything onto one screen like designing for desktops.
-## Provide sound feedback
+## Providing Sound Feedback
Unlike desktop or mobile interfaces, on which interactions are typically silent or rely on subtle haptic feedback, you can add sound effects to improve console interactions. When users navigate through the UI using a controller, consider incorporating sound effects to confirm selections or signal menu traversal, which can elevate the overall experience.
diff --git a/content/en-us/production/publishing/dmca-guidelines.md b/content/en-us/production/publishing/dmca-guidelines.md
index 9f49c60a0..a8bcfb553 100644
--- a/content/en-us/production/publishing/dmca-guidelines.md
+++ b/content/en-us/production/publishing/dmca-guidelines.md
@@ -1,5 +1,5 @@
---
-title: DMCA guidelines
+title: DMCA Guidelines
description: Explains copyright law and the details of DMCA claims.
---
@@ -7,7 +7,7 @@ description: Explains copyright law and the details of DMCA claims.
The information below is provided for general informational purposes only and is not legal advice. If you have any questions about this information or your specific situation or rights, please contact an attorney.
-## Frequently asked questions
+## Frequently Asked Questions
diff --git a/content/en-us/production/publishing/experience-genres.md b/content/en-us/production/publishing/experience-genres.md
index 9d7a8c60b..0d3d2913b 100644
--- a/content/en-us/production/publishing/experience-genres.md
+++ b/content/en-us/production/publishing/experience-genres.md
@@ -1,5 +1,5 @@
---
-title: Genres
+title: Experience Genres
description: Genres help users better discover and understand the content of your experience.
---
@@ -7,7 +7,7 @@ Your experience's **genre** and optional **subgenre** are displayed on the exper
-## Update genres
+## Updating Genres
You can update your experience's genre and optional subgenre in the Creator Dashboard.
@@ -27,7 +27,7 @@ To update your genre:
When you update your genre, the genre immediately updates on your experience's main page, but it may take a few days to reflect in other Discovery systems like genre-specific sorts in Charts.
-## Genre accuracy
+## Genre Accuracy
To ensure genres are accurate and relevant for users, Roblox regularly reviews experiences and may update any genre selections that appear inaccurate. If Roblox updates your experience's genre, you will be notified by email and the change will appear on the experience's Settings page.
@@ -49,7 +49,7 @@ Roblox will review your appeal and notify you of the outcome, usually within a f
If your appeal has not yet been reviewed and you update your genre through the regular selection flow, your original appeal will not be reviewed.
-## Best practices
+## Best Practices
Selecting a genre helps users discover and understand what to expect from your experience. Consider the following best practices to select the most relevant genre for your experience.
@@ -57,7 +57,7 @@ Selecting a genre helps users discover and understand what to expect from your e
- **Selecting a subgenre** — While genres give users a broad sense of what kind of gameplay to expect, subgenres help describe the core mechanics of your experience in more detail. It's recommended to select a subgenre if one applies. However, if there isn't a subgenre that fits your experience, you can still select a genre without a subgenre.
- **Genre and subgenre descriptions** — Refer to the [genre and subgenre descriptions](#genre-and-subgenre-descriptions) to compare genres and help you make the best choice for your experience.
-## Genre and subgenre descriptions
+## Genre and Subgenre Descriptions
Use the following genre descriptions and additional subgenres to best represent your experience's content. Some genres do not include subgenres.
@@ -97,7 +97,7 @@ Experiences meant to entertain through consumption or creation of content, inclu
- **Showcase & Hub** — Experiences that act as a demo, show off an immersive environment, or highlight and portal to other experiences.
- **Video** — Experiences for watching or creating video content.
-### Obby & platformer
+### Obby & Platformer
Experiences where players navigate surfaces and obstacles to progress. Player actions often involve jumping, climbing, or changing directions.
@@ -108,7 +108,7 @@ Experiences where players navigate surfaces and obstacles to progress. Player ac
- **Runner** — Experiences where players automatically move and must avoid obstacles to continue.
- **Tower Obby** — Experiences where players climb upwards through a series of platforms and obstacles.
-### Party & casual
+### Party & Casual
Experiences focused on casual social play with other players.
@@ -130,7 +130,7 @@ Experiences focused on problem-solving challenges to progress.
Subgenres
-- **Escape Room** — Experiences focused on solving puzzles to escape a room or building.
+- E**scape Room** — Experiences focused on solving puzzles to escape a room or building.
- **Match & Merge** — Experiences where players combine items to create new ones.
@@ -149,7 +149,7 @@ Experiences where players embody characters in a fictional world, making choices
- **Turn-based RPG** — RPG experiences involving turn-based combat.
-### Roleplay & avatar sim
+### Roleplay & Avatar Sim
Experiences where players immerse themselves in various roles, often with avatar customization. They emphasize creativity, social interaction, and personal expression.
@@ -211,7 +211,7 @@ Experiences simulating real-world systems, processes, and activities. The focus
Experiences that primarily serve to connect people through hanging out, communication, or sharing.
-### Sports & racing
+### Sports & Racing
Experiences focused on sports or racing related competition.
@@ -243,6 +243,6 @@ Experiences where the objective is for players to survive, escape, or defeat som
- **1 vs All** — Experiences where players have different roles and a win condition. Typically one player is "it" and the others need to escape or defeat them.
- **Escape** — Experiences challenging players to make a successful escape in order to survive a threat.
-### Utility & other
+### Utility & Other
Experiences that don't fit into the other genres, including utility experiences that provide value to users in some way.
diff --git a/content/en-us/production/publishing/experience-icons.md b/content/en-us/production/publishing/experience-icons.md
index d9a4e0883..e05873452 100644
--- a/content/en-us/production/publishing/experience-icons.md
+++ b/content/en-us/production/publishing/experience-icons.md
@@ -1,5 +1,5 @@
---
-title: Icons
+title: Experience Icons
description: Icons are an important factor in helping users recognize your experience and grow its brand.
---
@@ -20,13 +20,13 @@ A high-quality **icon**, in addition to a showcase [thumbnail](../promotion/thum
-When you [publish an experience](../../production/publishing/publish-experiences-and-places.md) for the first time, an icon is automatically generated from a collection of default images. While you can only display one icon per [locale](../../production/localization/index.md), you can also include supplementary [image and video thumbnails](../../production/promotion/thumbnails.md) that further promote the experience.
+When you [publish an experience](../../production/publishing/publishing-experiences-and-places.md) for the first time, an icon is automatically generated from a collection of default images. While you can only display one icon per [locale](../../production/localization/index.md), you can also include supplementary [image and video thumbnails](../../production/promotion/thumbnails.md) that further promote the experience.
-For more information on maximizing the impact of your experience's icon, see [best practices](#best-practices).
+For more information on maximizing the impact of your experience's icon, see [Best Practices](#best-practices).
-## Upload icons
+## Uploading Icons
-To ensure your experience's icon always displays in high resolution and with an ideal aspect ratio, use a template of **512×512 pixels**. In some places on the Roblox site and app, icons scale down to smaller sizes like 150×150 pixels, so it's recommended that you preview an icon at smaller sizes to confirm its details remain clear. In addition, see [best practices](#best-practices) for tips on icon format and design.
+To ensure your experience's icon always displays in high resolution and with an ideal aspect ratio, use a template of **512×512 pixels**. In some places on the Roblox site and app, icons scale down to smaller sizes like 150×150 pixels, so it's recommended that you preview an icon at smaller sizes to confirm its details remain clear. In addition, see [Best Practices](#best-practices) for tips on icon format and design.
To upload an experience icon:
@@ -48,11 +48,11 @@ To upload an experience icon:
1. If the preview icon appears as you expect, click **Save Changes**.
-## Best practices
+## Best Practices
To create the most positive impact for users looking to play your experience, consider the following best practices.
-### Quality and aspect ratio
+### Quality and Aspect Ratio
When you upload an icon image, it should be **square** and at least **512×512 pixels** so that it always displays in high resolution and at an ideal aspect ratio across the Roblox site and app.
@@ -77,7 +77,7 @@ When you upload an icon image, it should be **square** and at least **512×512 p
-### Relevant content
+### Relevant Content
An icon will have a higher impact if it's unique and provides relevant imagery on what users should expect when they join the experience. Icons with ambiguous graphics may lead to unnecessary confusion.
@@ -102,7 +102,7 @@ An icon will have a higher impact if it's unique and provides relevant imagery o
-### Color and contrast
+### Color and Contrast
You can express your experience's theme through color and contrast to help users decide if it's suitable and appealing to them.
diff --git a/content/en-us/production/publishing/publish-experiences-and-places.md b/content/en-us/production/publishing/publishing-experiences-and-places.md
similarity index 89%
rename from content/en-us/production/publishing/publish-experiences-and-places.md
rename to content/en-us/production/publishing/publishing-experiences-and-places.md
index 7d1039656..143acbd2c 100644
--- a/content/en-us/production/publishing/publish-experiences-and-places.md
+++ b/content/en-us/production/publishing/publishing-experiences-and-places.md
@@ -1,5 +1,5 @@
---
-title: Experiences and places
+title: Experiences and Places
description: Explains how to publish the places in your experience.
---
@@ -9,41 +9,41 @@ description: Explains how to publish the places in your experience.
-## Publish experiences
+## Publishing Experiences
By default, publishing a new place creates a new experience. New experiences begin as **private** and are only accessible to you and members of your [group](../../projects/groups.md) with the correct permissions.
When you're ready to release an experience to a wider audience, you
-can [release it to the public](#release-to-the-public), although beta testing should still be an essential part of your development cycle. Because you're not able to determine which countries have access to an experience, which limits the ability to run beta tests in smaller markets, consider these strategies:
+can [release it to the public](#releasing-to-the-public), although beta testing should still be an essential part of your development cycle. Because you're not able to determine which countries have access to an experience, which limits the ability to run beta tests in smaller markets, consider these strategies:
-
+
Under the [paid access in Robux](../../production/monetization/paid-access-robux.md) and [paid access in local currency](../monetization/paid-access-local-currency.md) models, users
must pay an upfront fee in **Robux**, the platform's currency, or in their **local currency**. This limits
your user base, allowing you to test and iterate with smaller server fills,
although the test results you gather may not reflect performance among a
wider audience.
-
+
Under the "ghost release" model, you release an experience under a temporary
name and icon. This doesn't necessarily gauge marketing appeal, but it can help
you test the experience without impacting its rating. When testing is
complete, you can remove the ghost version and conduct a
[full release](#full-release).
-
- When you're ready to release an experience to the world, you can [release it to the public](#release-to-the-public) under its final name with a complete description, icon, and other promotional imagery. For guidance on release names, descriptions, and promotional materials, review [metadata best practices](#metadata-best-practices), experience [icons](../../production/publishing/experience-icons.md), and [experience thumbnails](../../production/publishing/thumbnails.md).
+
+ When you're ready to release an experience to the world, you can [release it to the public](#releasing-to-the-public) under its final name with a complete description, icon, and other promotional imagery. For guidance on release names, descriptions, and promotional materials, review [metadata best practices](#metadata-best-practices), experience [icons](../../production/publishing/experience-icons.md), and [experience thumbnails](../../production/publishing/thumbnails.md).
-### Start place
+### Start Place
-While an experience can consist of many places, each experience can only have one **start place** that all users load into when they join. From within any place, you can [teleport](../../projects/teleport.md) users to another place.
+While an experience can consist of many places, each experience can only have one **start place** that all users load into when they join. From within any place, you can [teleport](../../projects/teleporting.md) users to another place.
To publish a place as the start place of an entirely new experience:
1. In the Studio menu bar, select **File** → **Publish to Roblox**. A contextual menu displays.
-2. Fill in the following fields, most of which can be [reconfigured](#configure-experiences) later.
+2. Fill in the following fields, most of which can be [reconfigured](#configuring-experiences) later.
- **Name** / **Description** — The experience name and a description that describes what a potential player should expect. See [metadata best practices](#metadata-best-practices) for guidelines.
- **Creator** — The creator you'd like to attribute as the creator of the experience.
@@ -56,9 +56,9 @@ To publish a place as the start place of an entirely new experience:
3. Click the **Create** button.
-Once you publish your experience, you can [configure more settings](#configure-experiences) and also [add more places](#additional-places).
+Once you publish your experience, you can [configure more settings](#configuring-experiences) and also [add more places](#additional-places).
-### Additional places
+### Additional Places
After you have published a [start place](#start-place) to create the overall experience, you can add additional places through the [Asset Manager](../../projects/assets/manager.md). To create a new place within an existing experience:
@@ -77,7 +77,7 @@ After you have published a [start place](#start-place) to create the overall exp
1. Right-click the new place, select **Rename**, and enter a more descriptive name.
1. When you double-click the new place, a new Studio session opens for editing the new place.
-### Change the start place
+### Changing the Start Place
The [start place](#start-place) of an experience cannot be instantly swapped with another place, but you can change it through the following steps.
@@ -96,9 +96,9 @@ The [start place](#start-place) of an experience cannot be instantly swapped wit
-1. **(Optional)** If the experience is live, it's recommended that you restart its servers as outlined in [update experiences](#update-experiences).
+1. **(Optional)** If the experience is live, it's recommended that you restart its servers as outlined in [Updating Experiences](#updating-experiences).
-## Configure experiences
+## Configuring Experiences
You can customize your experience's settings from the [Creator Dashboard][creatordashboard] or within Studio's [Game Settings](../../studio/game-settings.md). Some settings are only configurable within Studio while others are only configurable on the dashboard.
@@ -119,13 +119,13 @@ Regardless of whether or not you activate the toggle, players do not face modera
In-experience assets and experience metadata cannot contain strong language, even if the toggle is on and your experience is rated 17+. If you include strong language in your assets or experience page, your experience will be moderated.
-### Game settings
+### Game Settings
Once an experience is published, the [Game Settings](../../studio/game-settings.md) window contains many Studio-level settings and customization options. To open it, click the **Game Settings** button in the [Home](../../studio/home-tab.md) tab of the ribbon menu.
-## Release to the public
+## Releasing to the Public
New experiences begin as **private** and are only accessible to you and members of your group with the correct [permissions](../../projects/groups.md#roles-and-permissions). When appropriate, you can release an experience to the public as follows:
@@ -136,9 +136,9 @@ New experiences begin as **private** and are only accessible to you and members
1. **(Recommended)** Explore how to provide [Content Maturity labels and content descriptors](#content-maturity) for the experience.
-### Link to experiences
+### Linking to Experiences
-Once an experience is [public](#release-to-the-public), you can copy its link from the [Creator Dashboard][creatordashboard] or the Roblox app and share it with others via social media or similar.
+Once an experience is [public](#releasing-to-the-public), you can copy its link from the [Creator Dashboard][creatordashboard] or the Roblox app and share it with others via social media or similar.
@@ -152,7 +152,7 @@ Once an experience is [public](#release-to-the-public), you can copy its link fr
-
+
1. Open the Roblox app on your mobile device.
1. Locate the experience, typically under the **Continue** header on the home screen, and tap its tile to open the info screen.
@@ -163,18 +163,18 @@ Once an experience is [public](#release-to-the-public), you can copy its link fr
-### Content maturity
+### Content Maturity
-[Content maturity](../promotion/content-maturity.md) provides information on the experience's main details page about what kind of content the experience contains so that players can make informed decisions about what they interact with. Roblox uses this information to recommend experiences on the [Home](https://www.roblox.com/home) and [Discover](https://www.roblox.com/discover) pages based on each user's age group and regional content policies.
+[Content Maturity](../promotion/content-maturity.md) provides information on the experience's main details page about what kind of content the experience contains so that players can make informed decisions about what they interact with. Roblox uses this information to recommend experiences on the [Home](https://www.roblox.com/home) and [Discover](https://www.roblox.com/discover) pages based on each user's age group and regional content policies.
-Content maturity consists of two components:
+Content Maturity consists of two components:
-- **Maturity label** - Indicates the level of maturity suitable for the experience according to child development research and industry standards. For more information, see Age Recommendations.
-- **Content descriptors** - Indicates what type of content is within an experience, such as realistic depictions of blood or paid item trading.
+- **Maturity Label** - Indicates the level of maturity suitable for the experience according to child development research and industry standards. For more information, see Age Recommendations.
+- **Content Descriptors** - Indicates what type of content is within an experience, such as realistic depictions of blood or paid item trading.
-Roblox strongly recommends that you fill out the Maturity & Compliance questionnaire for each of your experiences so that they're available to the largest appropriate audience possible. Roblox does not recommend experiences without content maturity information to users under 13 years old. In addition, if your experience doesn't have Content Maturity information but it does contain [restricted content](https://en.help.roblox.com/hc/en-us/articles/15869919570708), the experience will be moderated.
+Roblox strongly recommends that you fill out the Maturity & Compliance questionnaire for each of your experiences so that they're available to the largest appropriate audience possible. Roblox does not recommend experiences without Content Maturity information to users under 13 years old. In addition, if your experience doesn't have Content Maturity information but it does contain [Restricted content](https://en.help.roblox.com/hc/en-us/articles/15869919570708), the experience will be moderated.
-### Allow copying
+### Allowing Copying
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.
@@ -199,17 +199,17 @@ To allow the community to access an editable copy of your experience:
-## Update experiences
+## Updating Experiences
After you publish an updated version of an experience to Roblox, players aren't immediately removed from the old version of the experience. Instead, you have a few options for how quickly you transition players to the new version, each with advantages and disadvantages depending on the situation.
-
+
If you take no action, players transition to the new version of the experience as the servers running the old version eventually empty and shut down. This option is non‑disruptive but your player base might be playing different versions of the experience for a prolonged period of time. If you recently published a major update, having players on the old version can be undesirable. This approach is best for minor updates.
-
+
The **Restart Servers for Updates** option is the best choice for most updates. When you choose this option, Roblox performs the following actions:
@@ -230,7 +230,7 @@ To restart all servers for updates:
1. Confirm restart by clicking the **Restart** button.
-
+
The **Shut Down All Servers** option performs the same process as **Restart Servers for Updates**, except that it will apply to **all** servers rather than those running old versions of the experience. This option is only recommended if you have a process for updating your experiences that does not involve publishing new place versions.
@@ -250,7 +250,7 @@ To shut down all servers:
-## Revert to previous versions
+## Reverting to Previous Versions
Roblox automatically retains saved versions of each place for version control and backup purposes. To revert to a previously saved version of any place within an experience:
@@ -264,15 +264,15 @@ Roblox automatically retains saved versions of each place for version control an
1. Right-click the desired place and select **View History**. The version history window opens.
1. Locate and select the version to revert to, then click the **Open** button to launch a new Studio session for the selected version.
-1. If the place has been [released to the public](#release-to-the-public) and you want to overwrite the place's live/public version with the reverted version:
+1. If the place has been [released to the public](#releasing-to-the-public) and you want to overwrite the place's live/public version with the reverted version:
1. Publish the place you just reverted to, choosing the same experience and same place during the publishing process.
- 2. Restart the servers for updates as outlined in [update experiences](#update-experiences).
+ 2. Restart the servers for updates as outlined in [Updating Experiences](#updating-experiences).
-## Metadata best practices
+## Metadata Best Practices
Your experience's name and description create an important first impression and contribute to how easily users find your experience through Roblox's dynamic [discovery](../../discovery.md) systems.
-### Experience name
+### Experience Name
All experiences should adhere to the following best practices for naming:
@@ -320,7 +320,7 @@ All experiences should adhere to the following best practices for naming:
-### Experience description
+### Experience Description
A well-written description promotes the genre and unique qualities of your experience while also providing the best context for both users and Roblox's dynamic discovery systems.
diff --git a/content/en-us/production/publishing/rights-manager.md b/content/en-us/production/publishing/rights-manager.md
index 735019726..39f41de46 100644
--- a/content/en-us/production/publishing/rights-manager.md
+++ b/content/en-us/production/publishing/rights-manager.md
@@ -6,10 +6,10 @@ description: Explains how to request the removal of copyright infringing experie
The **Rights Manager** is an Intellectual Property (IP) management tool that lets rights holders or their authorized representative report unauthorized use of copyright content on Roblox. All rights holders, including those that don't have a presence on Roblox, can use this tool to request the removal of unauthorized experiences, avatar items, and assets hosted on the platform.
-For more information on IP and the Digital Millennium Copyright Act (DMCA), see the [intellectual property](../../marketplace/intellectual-property.md) and [DMCA Guidelines](./dmca-guidelines.md).
+For more information on IP and the Digital Millennium Copyright Act (DMCA), see [Intellectual Property](../../marketplace/intellectual-property.md) and [DMCA Guidelines](./dmca-guidelines.md).
-## Register ownership
+## Registering Ownership
In order to use the Rights Manager, you must first register either as a rights owner or their authorized representative. This allows Roblox to confirm your legal identity with the creations that you own or represent. You only need to complete this process once.
@@ -18,7 +18,7 @@ Roblox requires two forms of verification during the registration process to ver
- Government ID verification
- Email verification
-Once verification is complete, Roblox discards any personal data from your documents, excluding your date of birth. Roblox uses your date of birth to ensure that the age on your account is accurate, and doesn't share it with anyone you report for IP infringement. For more information on how Roblox uses this information, see [Age ID verification FAQs](https://en.help.roblox.com/hc/en-us/articles/4407276151188-Age-ID-Verification-FAQs).
+Once verification is complete, Roblox discards any personal data from your documents, excluding your date of birth. Roblox uses your date of birth to ensure that the age on your account is accurate, and doesn't share it with anyone you report for IP infringement. For more information on how Roblox uses this information, see [Age ID Verification FAQs](https://en.help.roblox.com/hc/en-us/articles/4407276151188-Age-ID-Verification-FAQs).
To register as a rights owner or their authorized representative:
@@ -43,7 +43,7 @@ To register as a rights owner or their authorized representative:
1. At the bottom of the page, click the **Submit For Review** button. A pop-up dialog display displays.
1. In the pop-up dialog, select the **Submit For Review** button. Your registration form enters Roblox review, and you can no longer edit your registration details.
-## File IP removal request
+## Filing IP Removal Request
Once Roblox accepts your registration, you can create IP removal requests for one or more assets, experiences, and avatar items to protect your intellectual property. After you submit an IP removal request, you cannot edit any information within the request while Roblox reviews its content.
@@ -96,7 +96,7 @@ To file an IP removal request:
1. In the **Signature** field, enter your full legal name as your electronic signature.
1. At the bottom of the page, click the **Submit For Review** button. The new IP removal request enters Roblox review.
-## Review IP removal requests
+## Reviewing IP Removal Requests
All IP removal requests display within a table on the Rights Manager landing page, and you can review each reported creation's status as Roblox processes your report.
diff --git a/content/en-us/production/publishing/thumbnails.md b/content/en-us/production/publishing/thumbnails.md
index ffd81863a..efadb4029 100644
--- a/content/en-us/production/publishing/thumbnails.md
+++ b/content/en-us/production/publishing/thumbnails.md
@@ -1,5 +1,5 @@
---
-title: Thumbnails
+title: Experience Thumbnails
description: Thumbnail images and videos appear on the Roblox home page and at the top of an experience's detail page to showcase features and share information.
---
@@ -17,7 +17,7 @@ To access your thumbnails:
While thumbnails help users know what your experience offers, [icons](../publishing/experience-icons.md) are still important to help users recognize your experience and grow its brand.
-## Thumbnail personalization for the Home page
+## Thumbnail Personalization for the Home Page
**Thumbnail personalization** helps you attract more users to your experience by showing the most relevant thumbnail to each user on their Home page. The goal of thumbnail personalization is to improve your qualified play through rate, which is the percentage of users that actively engage with your experience for a significant amount of time.
@@ -33,7 +33,7 @@ After you set up and activate thumbnail personalization, its algorithm shows eac
-### Set up thumbnail personalization
+### Setting Up Thumbnail Personalization
To set up thumbnail personalization:
@@ -46,7 +46,7 @@ To set up thumbnail personalization:
-### Keep multiple thumbnails active
+### Keeping Multiple Thumbnails Active
To get the most out of thumbnail personalization, make sure to **keep multiple thumbnails active** instead of choosing one winner, as this allows personalization to adapt to changing user trends.
@@ -58,7 +58,7 @@ For example, if you had removed the thumbnail associated with the green line in
We recommend testing multiple new thumbnails with any major experience or content update, and then not making changes to your thumbnails until your experience's next update.
-### Analyze thumbnail personalization performance
+### Analyzing Thumbnail Personalization Performance
After a few hours, the **Thumbnail Performance** table in the **Home Page** tab populates with statistics related to each of your active thumbnails:
@@ -99,7 +99,7 @@ After a few hours, the **Thumbnail Performance** table in the **Home Page** tab
You can also use the **Impressions by thumbnail** and the **Qualified play through rate by thumbnail** graphs to further analyze the performance of your personalized thumbnails over time.
-## Thumbnails for the experience detail page
+## Thumbnails for the Experience Detail Page
You can use two types of thumbnails to promote your experience on the experience's detail page:
@@ -125,7 +125,7 @@ You can use two types of thumbnails to promote your experience on the experience
-### Upload
+### Uploading
You can upload up to 10 images or YouTube video links for each of your experiences' detail pages. All uploaded images and linked videos are moderated to make sure they adhere to the [Community Rules](https://en.help.roblox.com/hc/articles/203313410) and [Terms of Use](https://en.help.roblox.com/hc/articles/115004647846).
@@ -154,7 +154,7 @@ To upload video thumbnails:
4. Click **Add video**.
-
+
Roblox can auto‑generate images from the experience itself to showcase your environment designs. Auto‑generated thumbnails are based on Studio's camera position for the most recent publish of the place.
@@ -166,19 +166,19 @@ To upload auto-generated thumbnails:
-### Order
+### Ordering
If you upload multiple thumbnails, your experience's detail page cycles through all of the thumbnails automatically. To change the order of the thumbnail cycle, click and hold a thumbnail's **order** icon and drag it up or down.
-### Delete
+### Deleting
To delete an uploaded thumbnail, click the thumbnail's **menu** icon and then click **Delete**.
-## Capture thumbnails in free camera mode
+## Capturing Thumbnails in Free Camera Mode
Free camera mode is a useful tool to capture in-experience screenshots and videos because it allows you to move the camera to positions that aren't possible when testing or playing under normal circumstances. To enable free camera mode:
-1. Go to an experience where you have server-side [Developer Console](../../studio/developer-console.md) access.
+1. Go to an experience where you have server-side developer console access.
2. In the **Home** tab of the menu bar, go to the **Test** section and click **Play**.
@@ -189,7 +189,7 @@ Once in free camera mode, you can use the following controls:
-
Keys/shortcuts
+
Keys/Shortcuts
Action
@@ -207,11 +207,11 @@ Once in free camera mode, you can use the following controls:
In combination with any movement key, changes the camera speed.
-
**Right mouse button**
+
**Right Mouse Button**
When pressed, dragging the mouse moves the camera view around.
-
**Mouse scroll wheel**
+
**Mouse Scroll Wheel**
Zooms the camera in or out.
@@ -220,12 +220,12 @@ Once in free camera mode, you can use the following controls:
CtrlShiftC (Windows) ⌘ShiftC (Mac)
-
Disables all user-created GUIs but not `Class.CoreGui|CoreGuis`.
+
Disables all user-created GUIs but not `Class.CoreGui|CoreGuis`.
-## Best practices
+## Best Practices
To create the most positive impact for users looking to play your experience, consider the following best practices.
@@ -233,7 +233,7 @@ To create the most positive impact for users looking to play your experience, co
In addition to the practices shown below, avoid placing any essential text or elements at the **bottom** of the thumbnail, as it may potentially be covered by metadata like the player count.
-### Quality and aspect ratio
+### Quality and Aspect Ratio
A thumbnail image should be **16:9** aspect ratio and ideally **1920×1080 pixels** so that it always displays in high resolution across the Roblox site and app. Displayed thumbnails will be stretched to 16:9 aspect ratio regardless of the upload's aspect ratio.
@@ -252,7 +252,7 @@ A thumbnail image should be **16:9** aspect ratio and ideally **1920×1080 pixel
-### Relevant content
+### Relevant Content
A thumbnail will have a higher impact if it's unique and provides relevant imagery on what users should expect when they join the experience. Thumbnails with ambiguous imagery or graphics may lead to unnecessary confusion.
@@ -271,7 +271,7 @@ A thumbnail will have a higher impact if it's unique and provides relevant image
-### Theme and color
+### Theme and Color
You can express your experience's theme through overall theme and colors to help users decide if it's suitable and appealing to them.
diff --git a/content/en-us/production/publishing/vr-guidelines.md b/content/en-us/production/publishing/vr-guidelines.md
index a7eceb7ad..2491cd70d 100644
--- a/content/en-us/production/publishing/vr-guidelines.md
+++ b/content/en-us/production/publishing/vr-guidelines.md
@@ -1,11 +1,11 @@
---
-title: VR guidelines
+title: VR Guidelines
description: Guidelines on publishing an experience for VR devices.
---
Roblox VR uses [OpenXR](https://www.khronos.org/openxr/) as a backend for all VR devices. That means the implementation is platform agnostic, allowing experiences to work interchangeably on Quest and PC VR headsets. Testing on a PC VR headset should be valid for the Quest 2. At minimum, Oculus drivers require an NVidia GTX1060 graphics card or equivalent.
-## Graphics quality mode
+## Graphics Quality Mode
When running Roblox on standalone VR headsets such as Quest 2 or Quest Pro, maintaining a comfortable performance level is crucial, as frame rate drops can cause discomfort for the user. To achieve this, an **Auto Quality Mode** setting is available on Quest which aims to maintain a minimum of 72 frames per second by automatically scaling the rendering detail based on performance data.
@@ -13,7 +13,7 @@ When running Roblox on standalone VR headsets such as Quest 2 or Quest 
If you test an experience on the Quest 2 and are not pleased with the visuals when **Auto Quality Mode** is turned on, it's recommended that you attempt to optimize your experience further.
-## Comfort settings
+## Comfort Settings
When users experience VR, movement of their camera/position can cause some discomfort due to the disconnect between what they see and the lack of motion detected by their body and inner ear. Roblox provides multiple settings to help users of all sensitivity levels, so everyone can enjoy an immersive and comfortable VR experience while playing. In addition to **Comfort**, **Default**, and **Expert** modes, the user may choose **Custom** to individually turn the following settings on and off:
@@ -23,24 +23,24 @@ When users experience VR, movement of their camera/position can cause some disco
Additional information can be found at [VR Menus and Settings](https://en.help.roblox.com/hc/en-us/articles/15703381902740-VR-Menus-and-Settings).
-## Camera modes
+## Camera Modes
When developing a VR-first experience, you can take advantage of the default camera scripts or implement your own custom scripts.
-
+
Roblox provides an array of default camera options, including a third-person comfort camera, a first person camera, and a vehicle camera. These camera modes are implemented as child scripts of `CameraModule` within `Class.PlayerScripts`. Support for the comfort menu options and future "immersion" features will be included with the default scripts.
By utilizing the default scripts provided by Roblox, you benefit from ongoing updates and improvements that ensure compatibility with all new features and devices. This will likely provide an easier and more sustainable development process going forward.
-
+
As a developer, you have the flexibility to customize the default camera scripts by replacing them with your own VR camera implementation. This lets you achieve your own vision with an immersive VR-first view, but doing so opts your experience out of future script updates and you'll need to manually merge changes and improvements to the default scripts as they become available.
If you have existing experiences that use a custom camera or other custom `Class.PlayerScripts`, it's likely that you do **not** have the most recent camera scripts that support VR. If you test your experience in VR and the camera is not working properly, it's recommended that you either merge the most current VR camera scripts or switch to the default scripts.
-## Performance tips
+## Performance Tips
Untethered mobile VR devices like the Quest 2 target a high frame rate and resolution while rendering two separate images on a low-power chipset. To achieve stable and solid performance levels, the draw distance may be scaled down and light computation might get disabled through auto graphics quality.
diff --git a/content/en-us/production/roblox-user-base.md b/content/en-us/production/roblox-user-base.md
index c21951aa5..aea52d715 100644
--- a/content/en-us/production/roblox-user-base.md
+++ b/content/en-us/production/roblox-user-base.md
@@ -1,5 +1,5 @@
---
-title: The Roblox user base
+title: The Roblox User Base
description: Explains the distinct qualities of Roblox's user base and culture.
---
@@ -37,19 +37,19 @@ Roblox is also expanding **geographically**. While the US, UK and Canada are sti
Distribution of Daily Active Users in Q2 2022 worldwide
-## User behavior on the platform
+## User Behavior on the Platform
A Roblox session typically means **playing a handful of different experiences**. Roblox is closer in many ways to YouTube than the App Store. It's important to realize that individual experiences fit into a larger, overarching experience. While some users do focus their attention in a session on one experience, it's very common for users to join an experience for a short time, switch to another, and repeat. User behavior in your experience may reflect this in more ways than just session length.
-Understanding your audience means understanding the other experiences your users engage with regularly. Since experiences are so interconnected, there tends to be a lot of **common conventions** and **mechanics** across the platform. Studying and emulating these conventions helps your users familiarize themselves with your experience quickly and may reduce the risk of them bouncing off in frustration. For more about designing for behavior on the platform, see [Design for Roblox](../production/game-design/index.md).
+Understanding your audience means understanding the other experiences your users engage with regularly. Since experiences are so interconnected, there tends to be a lot of **common conventions** and **mechanics** across the platform. Studying and emulating these conventions helps your users familiarize themselves with your experience quickly and may reduce the risk of them bouncing off in frustration. For more about designing for behavior on the platform, see [Designing for Roblox](../production/game-design/index.md).
-### Social factors
+### Social Factors
Roblox allows users to add **Friends**, join them in their experience, and invite them to yours. Chat is built directly into every experience, so news spreads fast from user to user. In addition to socializing in various user made Groups on-platform, users are often active on platforms like Discord and X (Twitter).
-Engaging experiences will generate a lot of **organic traffic** through word of mouth. Users find an experience they like, invite their friends, and then those friends invite more friends. YouTube can also attract a lot of attention, as users want to try out whatever their favorite YouTuber is playing. For more on generating traffic and building a community, see [Promote on Roblox](../production/promotion/index.md).
+Engaging experiences will generate a lot of **organic traffic** through word of mouth. Users find an experience they like, invite their friends, and then those friends invite more friends. YouTube can also attract a lot of attention, as users want to try out whatever their favorite YouTuber is playing. For more on generating traffic and building a community, see [Promoting on Roblox](../production/promotion/index.md).
-## Roblox culture
+## Roblox Culture
Roblox culture represents the dominant gaming, social, and consumer culture of the future. It has its own vocabulary, memes, celebrities, and even myths. Understanding the culture is essential to understanding your users.
@@ -82,7 +82,7 @@ The sharing of **community-generated content** is the foundation of Roblox cultu
The username of Roblox founder and CEO David Baszucki.
-
Developer forum
+
Developer Forum
A [community forum](https://devforum.roblox.com/) where developers can make posts, report bugs, request features, and read announcements from Roblox staff members. Typically shortened to DevForum.
@@ -98,7 +98,7 @@ The sharing of **community-generated content** is the foundation of Roblox cultu
A generic term for anything that can be created on Roblox, such as games, showcases, and concerts.
-
Pass
+
Game Pass
A premium item sold in an experience that provides a permanent boost to gameplay.
@@ -118,7 +118,7 @@ The sharing of **community-generated content** is the foundation of Roblox cultu
Shorthand for "obstacle course", a popular genre on Roblox that requires users to climb, jump and navigate obstacles to reach the end of the course.
-
Paid access
+
Paid Access
While most experiences on Roblox are free, some developers choose to charge a fee for access. Paid access can be especially useful for developers who want to test their experience with a smaller audience prior to a full, free release.
@@ -126,7 +126,7 @@ The sharing of **community-generated content** is the foundation of Roblox cultu
Roblox experiences consist of one or more places, similar to how games comprise scenes in Unity or maps in the Unreal Engine.
-
Private server
+
Private Server
Some Roblox experiences offer users the ability to create private servers in which only they and their invited friends can play. Developers may offer private servers for free, or charge users a subscription fee to create them.
diff --git a/content/en-us/production/sell-on-creator-store.md b/content/en-us/production/selling-on-creator-store.md
similarity index 94%
rename from content/en-us/production/sell-on-creator-store.md
rename to content/en-us/production/selling-on-creator-store.md
index 362771fac..f2ecebb95 100644
--- a/content/en-us/production/sell-on-creator-store.md
+++ b/content/en-us/production/selling-on-creator-store.md
@@ -1,15 +1,15 @@
---
-title: Sell on the Creator Store
+title: Selling on the Creator Store
description: An explanation of Creator Store seller accounts, their prerequisites, and how to create one.
---
You can sell [plugins](../studio/plugins.md) on the Creator Store for **United States Dollars** (USD). Roblox offers a market-leading revenue share for these sales, as only taxes and payment processing fees are deducted.
-You will soon be able to sell [models](../parts/models.md#upload-and-distribute-models) on the Creator Store for **United States Dollars** (USD). You can create a seller account and start uploading models now.
+You will soon be able to sell [models](../parts/models.md#uploading-and-distributing-models) on the Creator Store for **United States Dollars** (USD). You can create a seller account and start uploading models now.
-In order to set any USD prices and sell your assets, you must have a **seller account**. Roblox administers seller accounts through **Stripe**, a third-party payments provider. If you meet Roblox's eligibility [requirements](#for-sellers), you can fill out Stripe's [application form](#complete-the-application-form) to create a seller account.
+In order to set any USD prices and sell your assets, you must have a **seller account**. Roblox administers seller accounts through **Stripe**, a third-party payments provider. If you meet Roblox's eligibility [requirements](#for-sellers), you can fill out Stripe's [application form](#completing-the-application-form) to create a seller account.
Once you have a seller account, **you can set USD prices** for your plugins from their asset configuration pages and sell them on the Creator Store.
@@ -23,11 +23,11 @@ If you previously listed plugins for sale with Robux pricing, these will now hav
Roblox's eligibility requirements for sellers, customers, and assets are stricter than previous requirements for selling and buying with Robux. Even if you're have previously sold on the Creator Store, you will only be able to continue doing so if you meet these requirements, create a seller account, and set USD prices.
-### For sellers
+### For Sellers
In order to create a seller account, you must meet the following Roblox eligibility requirements:
-- Your Roblox account must be **verified** with a [government ID](account-verification.md#verify-through-government-id).
+- Your Roblox account must be **verified** with a [government ID](account-verification.md#verifying-through-government-id).
- Your Roblox account must not have been recently **banned** for any reason.
- You must be either **18** years of age or older, or **13-17** years of age with **parental consent**.
- You must reside in [one of the countries supported](https://stripe.com/docs/connect/cross-border-payouts) by our third-party payments provider.
@@ -36,27 +36,27 @@ If you violate any of these requirements after you create your seller account, y
-**Phone number verification is not sufficient** to sell priced assets on the Creator Store. To sell priced assets, you need to verify with a [government ID](account-verification.md#verify-through-government-id) and create a seller account.
+**Phone number verification is not sufficient** to sell priced assets on the Creator Store. To sell priced assets, you need to verify with a [government ID](account-verification.md#verifying-through-government-id) and create a seller account.
-### For customers
+### For Customers
Only **individual** user accounts may purchase assets for USD on the Creator Store. Groups are ineligible to purchase plugins.
Transactions between any individual customer and seller are **capped** per month for safey purposes. If you're buying a lot of assets from one seller in a single month, any purchase over the limit will be prohibited until the following month. This includes any purchases between alternate accounts for either the customer or seller.
-### For assets
+### For Assets
Every asset that you sell on the Creator Store must adhere to the [Community Rules](https://en.help.roblox.com/hc/articles/203313410), [Terms of Use](https://en.help.roblox.com/hc/articles/115004647846), and [Digital Millennium Copyright Act](./publishing/dmca-guidelines.md) (DMCA). If any asset breaks these rules, the asset and your account may be subject to moderation.
In addition, you can only sell plugins that you own from an **individual** user account. Group-owned assets are ineligible. If you want to sell a group-owned asset, consider re‑uploading them under individual ownership.
-## Seller account
+## Seller Account
All prospective sellers on the Creator Store must complete an application form through Stripe to create their seller account, set USD prices, and receive payouts. This process applies even if you have previously sold plugins for Robux on the Store.
-### Complete the application form
+### Completing the Application Form
If your Roblox account meets all eligibility criteria on the [Seller Onboarding](https://create.roblox.com/settings/eligibility/priced-assets) page, Roblox provides a link to an application form through Stripe so that you can apply for a seller account. This application form collects your personal information in order to process your case.
@@ -78,7 +78,7 @@ Once Stripe accepts your application, you cannot change the country associated w
-### Check approval status
+### Checking Approval Status
To check the status of your application, revisit the [Seller Onboarding](https://create.roblox.com/settings/eligibility/priced-assets) page, then click **Edit Account Info**. Your approval status can be in any of the following states:
@@ -127,7 +127,7 @@ Reimbursements for customers **deduct from the seller's account**. This may occu
When a refund occurs, Roblox removes the asset from the customer's inventory. If a very high proportion of sales for an asset come from accounts with an exceptional history of chargebacks, the asset is taken off sale and your payouts are frozen. If you have grounds to appeal this action, you can file a request with [Roblox support](https://en.help.roblox.com/hc/en-us/articles/360000245263-Appeal-Your-Content-or-Account-Moderation).
-## Transactions and upcoming payouts
+## Transactions and Upcoming Payouts
You can find a record of all your Creator Store transactions on the [Transactions](https://create.roblox.com/dashboard/transactions) page of the Creator Dashboard. This includes both your **Incoming Payments** (sales) and your **Outgoing Payments** (purchases) on the Store.
diff --git a/content/en-us/projects/activity-history.md b/content/en-us/projects/activity-history.md
index 4626cf150..cfde7e588 100644
--- a/content/en-us/projects/activity-history.md
+++ b/content/en-us/projects/activity-history.md
@@ -1,6 +1,6 @@
---
-title: Activity history
-description: Activity history is a log of key configuration, publish, and edit activities within a place.
+title: Activity History
+description: Activity History is a log of key configuration, publish, and edit activities within a place.
---
@@ -18,7 +18,7 @@ description: Activity history is a log of key configuration, publish, and edit a
-## Work with Activity History
+## Working with Activity History
To open the Activity History view in Studio, your experience must be saved to Roblox.
@@ -29,11 +29,11 @@ To open the Activity History view in Studio, your experience must be saved to Ro
1. If you have a large number of events, you can filter them by type or collaborator.
1. If you want to manage the configuration or get more details on a change, use the **⋯** menu next to each event to get a link to the setting in either Studio or the Creator Hub.
-## Event reference
+## Event Reference
Activity History shows the following events. Most are visible in Studio and the Creator Hub, but some are only visible in one location or the other.
-### Place configuration
+### Place Configuration
Event | Shown in Studio | Shown in Creator Hub
:--- | :---: | :---:
@@ -45,7 +45,7 @@ Place removed from experience | | ✓
**Allow place to be copied as a template using Create Place API** changed | ✓ | ✓
**Allow place to be updated using Save Place API** changed | ✓ | ✓
-### Experience configuration
+### Experience Configuration
Event | Shown in Studio | Shown in Creator Hub
:--- | :---: | :---:
@@ -58,7 +58,7 @@ Age recommendation questionnaire updated | ✓ | ✓
Playable devices changed | ✓ | ✓
**Enable Studio Access to API Services** enabled or disabled | ✓ | ✓
-### Monetization settings
+### Monetization Settings
Event | Shown in Studio | Shown in Creator Hub
:--- | :---: | :---:
@@ -75,9 +75,9 @@ Notification string created | | ✓
Notification string deleted | | ✓
Notification string updated | | ✓
-For more information, see [Experience notifications](../production/promotion/experience-notifications.md).
+For more information, see [Experience Notifications](../production/promotion/experience-notifications.md).
-### Collaboration permissions
+### Collaboration Permissions
Event | Shown in Studio | Shown in Creator Hub
:--- | :---: | :---:
@@ -88,4 +88,4 @@ Group given play permissions | ✓ | ✓
Group with play permissions removed | ✓ | ✓
Group role's permissions to this experience changed | ✓ | ✓
-For more information, see [Group roles and permissions](../projects/groups.md#roles-and-permissions).
+For more information, see [Group Roles and Permissions](../projects/groups.md#roles-and-permissions).
diff --git a/content/en-us/projects/assets/index.md b/content/en-us/projects/assets/index.md
index 9823e67cf..5d40e8451 100644
--- a/content/en-us/projects/assets/index.md
+++ b/content/en-us/projects/assets/index.md
@@ -110,7 +110,7 @@ The basic structure is a **scheme** followed by `://` and a **path** that varies
-The Roblox Engine supports several custom URI schemes for referencing content stored on the platform.
+The Roblox engine supports several custom URI schemes for referencing content stored on the platform.
### rbxassetid
diff --git a/content/en-us/projects/client-server.md b/content/en-us/projects/client-server.md
index 3cf15910e..c4b73a96e 100644
--- a/content/en-us/projects/client-server.md
+++ b/content/en-us/projects/client-server.md
@@ -1,5 +1,5 @@
---
-title: Client-server runtime
+title: Client-Server Runtime
description: An overview of the client-server model in Roblox.
---
diff --git a/content/en-us/projects/collaboration.md b/content/en-us/projects/collaboration.md
index 351cd9199..16435e3e9 100644
--- a/content/en-us/projects/collaboration.md
+++ b/content/en-us/projects/collaboration.md
@@ -9,7 +9,7 @@ With Studio's **built-in** **collaboration tools**, creators can contribute to e
-## Manage collaborators
+## Managing Collaborators
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:
@@ -42,12 +42,12 @@ Collaborators you add to an experience have permission settings that correspond
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
+### Group-Owned Experiences
For [group](../projects/groups.md) experiences, only the group owner or members with sufficient permissions can manage the group's roles, either across **all group experiences** or on a **per‑experience** basis. Such users can also add individual collaborators to group‑owned experiences in the same workflow as [user‑owned](#user-owned-experiences) experiences, but only for **Play** access.
-
+
If you're the group owner or a member with sufficient permissions, you can configure collaboration across **all** group experiences, for example grant **Edit** permission to an "Audio Artist" group role so they can fine-tune audio playback across multiple group experiences.
1. From the [Creator Dashboard](https://create.roblox.com/dashboard/creations), select the group from the **View As** dropdown menu and navigate to **Collaboration** 〉 **Roles**.
@@ -63,7 +63,7 @@ In Studio's **Manage Collaborators** window for any group-owned experience, elig
-
+
If you're the group's owner, you can grant **Edit** permission on a per-experience basis to roles that do **not** have permission to edit all group experiences. For example, you can temporarily grant **Edit** permission to an "FX Artist" group role so they can fine-tune visual effects before an experience's public release.
1. With the experience open in Studio, click the **Collaborate** button in the upper-right corner.
@@ -79,7 +79,7 @@ If you're the group's owner, you can grant **Edit** permission on a per-experien
-### User-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.
@@ -99,7 +99,7 @@ To give **Edit** permission to a friend for an experience that you own:
1. Click **Save** for your collaboration settings to take effect.
-## Access a session
+## Accessing a Session
Those who have permission to edit an experience can join a collaborative session as follows:
@@ -125,7 +125,7 @@ Those who have permission to edit an experience can join a collaborative session
-### View collaborators
+### 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.
@@ -135,7 +135,7 @@ To view more details on the current collaborators, click on any of the icons to
-### Selection visualization
+### Selection Visualization
By default, selected code in the [Script Editor](../studio/script-editor.md) and selected objects in the 3D viewport are highlighted with the unique color assigned to each collaborator. Additionally, the [Explorer](../studio/explorer.md) window marks selected objects with dots in these assigned colors to indicate selection by other collaborators.
@@ -148,17 +148,17 @@ By default, selected code in the [Script Editor](../studio/script-editor.md) and
-To make all collaborators' selections invisible to only you while still seeing their work, uncheck **Show collaborator selections** at the bottom of the [Live Collaborators](#view-collaborators) window.
+To make all collaborators' selections invisible to only you while still seeing their work, uncheck **Show collaborator selections** at the bottom of the [Live Collaborators](#viewing-collaborators) window.
-### Join collaborators
+### Joining Collaborators
-To quickly jump to a location in the workspace or to the exact line in a script that a collaborator is editing, hover over their name in the [Live Collaborators](#view-collaborators) window and click **Join**.
+To quickly jump to a location in the workspace or to the exact line in a script that a collaborator is editing, hover over their name in the [Live Collaborators](#viewing-collaborators) window and click **Join**.
-### Chat with collaborators
+### Chatting with Collaborators
To chat with collaborators during a session:
@@ -168,13 +168,13 @@ To chat with collaborators during a session:
1. Click in the input text field, type your message, and press Enter to send it.
-## Collaborative scripting
+## Collaborative Scripting
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.
-### Live scripting
+### Live Scripting
-**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](#view-collaborators) window.
+**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.
@@ -185,23 +185,23 @@ In a collaborative session, you can code together in real-time through [live scr
-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](#view-script-history) window.
+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.
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.
-### Drafts mode
+### Drafts Mode
-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](#commit-drafts) it to the shared repository and [Team Test](../studio/home-tab.md#team-test) the committed version with collaborators.
+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.
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**.
-Note that all collaborators will need to exit the session for the change to take effect. Alternatively, you can [disable collaboration](#disable-collaboration) and then reenable it to restart the session.
+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.
-#### Commit drafts
+#### Committing Drafts
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.
@@ -213,7 +213,7 @@ To commit your local edits to the repository, left-click a script, or hold
-#### Compare and merge changes
+#### Comparing and Merging Changes
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**.
@@ -237,13 +237,13 @@ To merge their changes into your script:
1. Once you've previewed the merge resolution, click **Merge All** to update your local script.
-#### Restore deleted scripts
+#### Restoring Deleted Scripts
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.
-### View script history
+### Viewing Script History
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:
@@ -264,25 +264,25 @@ All script changes, whether saved by a collaborator, auto-saved, or committed by
-## Save and publish
+## Saving and Publishing
During a collaborative session, Studio automatically saves the project to the cloud every four minutes.
-## Revert to previous versions
+## Reverting to Previous Versions
-The owner of an experience can revert changes made by other editors. See [here](../production/publishing/publish-experiences-and-places.md#revert-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](#disable-collaboration).
+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).
You might also want to check [Activity History](activity-history.md). This view provides a chronological event log that improves team visibility into key experience settings.
-## Disable collaboration
+## Disabling Collaboration
-**Team Create** is the core Studio feature that enables collaboration. Workflows that involve the [Manage Collaborators](#manage-collaborators) dialog will automatically enable the feature, but you can manually disable it if necessary.
+**Team Create** is the core Studio feature that enables collaboration. Workflows that involve the [Manage Collaborators](#managing-collaborators) dialog will automatically enable the feature, but you can manually disable it if necessary.
-1. If the [Live Collaborators](#view-collaborators) window isn't already open, click on any of the collaborator icons to open it.
+1. If the [Live Collaborators](#viewing-collaborators) window isn't already open, click on any of the collaborator icons to open it.
diff --git a/content/en-us/projects/data-model.md b/content/en-us/projects/data-model.md
index e5732a6f1..23c56a83c 100644
--- a/content/en-us/projects/data-model.md
+++ b/content/en-us/projects/data-model.md
@@ -1,5 +1,5 @@
---
-title: Data model
+title: Data Model
description: Explains the hierarchy of objects that describe everything about a place.
---
@@ -10,9 +10,9 @@ also contains objects that can control runtime behavior, such as scripts that
modify properties, call methods and functions, and respond to events that enable
dynamic behavior and interactivity.
-The Roblox Engine uses the data model as a source of truth for a place's state,
+The Roblox engine uses the data model as a source of truth for a place's state,
so it can simulate and render it on client devices. For more information on how
-the Roblox Engine interprets the data model, see [Client-Server
+the Roblox engine interprets the data model, see [Client-Server
Runtime](/projects/client-server).
## Objects
@@ -25,10 +25,10 @@ provides. There are many categories of objects with a wide variety of uses, but
you'll frequently work with `Class.BasePart` and `Class.LuaSourceContainer`
objects, commonly referred to as parts and scripts.
-For a comprehensive list of all the features of the Roblox Engine, see the
+For a comprehensive list of all the features of the Roblox engine, see the
[reference documentation](/reference/engine).
-### 3D building blocks
+### 3D Building Blocks
`Class.BasePart` is the core class for physically-simulated 3D building blocks in the world. It defines the properties and methods common to all physical objects with properties like position, size, and orientation.
@@ -77,10 +77,10 @@ client, or have them communicate across the network boundary.
For scripts to behave properly, you must place them in the correct containers in
the data model. For more information, see the [Server](#server) and [Client](#client) sections.
-## Object organization
+## Object Organization
While you have a lot of flexibility in how you organize your data model, the
-Roblox Engine expects certain objects to be in certain **container services**
+Roblox engine expects certain objects to be in certain **container services**
which are objects that have specific behaviors and can affect the behaviors of
the objects they contain. The main categories of container services include:
@@ -99,8 +99,8 @@ the objects they contain. The main categories of container services include:
`Class.VoiceChatService` and `Class.TextChatService`.
-The Roblox Engine has many more services that provide
-built-in functionality that you can call within your scripts. The Roblox Engine
+The Roblox engine has many more services that provide
+built-in functionality that you can call within your scripts. The Roblox engine
doesn't give these services special treatment in the data model. For more
information, see [Services](../scripting/services.md).
@@ -135,7 +135,7 @@ For example, you can set a camera to follow user movements or stay fixed in a
particular location. You can also adjust the field of view, distance, and angle
to create different visual effects of how users view your 3D world.
-For more information, see [Customize the camera](../workspace/camera.md).
+For more information, see [Customizing the Camera](../workspace/camera.md).
Terrain
@@ -146,7 +146,7 @@ for your 3D world and apply one material to that terrain, you can use the
[Terrain Editor](../studio/terrain-editor.md) to edit regions of your
terrain.
-For more information, see [Environmental terrain](../parts/terrain.md).
+For more information, see [Environmental Terrain](../parts/terrain.md).
### Environment
@@ -179,7 +179,7 @@ For more information, see [Sound](../sound/index.md).
### Replication
**Replication** is the process of the server synchronizing the state of your
-place with all connected clients. The Roblox Engine intelligently and
+place with all connected clients. The Roblox engine intelligently and
automatically replicates data, physics, and chat messages between the server and
client for many cases, but you can also specify certain objects to replicate by
placing them in specific containers.
@@ -204,7 +204,7 @@ container to replicate any objects that don't need to exist in the 3D world
until needed, such as a `Class.ParticleEmitter` for cloning and parenting to all
incoming character models.
-For more information on how replication works, see [Client-server runtime](../projects/client-server.md).
+For more information on how replication works, see [Client-Server Runtime](../projects/client-server.md).
### Server
@@ -263,8 +263,8 @@ the client:
-
Edit data model
-
Runtime data model
+
Edit Data Model
+
Runtime Data Model
Notes
@@ -298,7 +298,8 @@ the client:
-For more information on edit and runtime data models, see [Client-server runtime](./client-server.md#client).
+For more information on edit and runtime data models,
+see [Client-Server Runtime](./client-server.md#client).
@@ -314,7 +315,7 @@ service explicitly.
in-experience text chat tasks, such as managing channels, decorating messages,
filtering text, creating commands, and developing custom chats interfaces.
-For more information, see [In-experience text chat system](../chat/in-experience-text-chat.md).
+For more information, see [In-Experience Text Chat System](../chat/in-experience-text-chat.md).
VoiceChatService
@@ -322,9 +323,9 @@ For more information, see [In-experience text chat system](../chat/in-experience
feature that simulates realistic communication based on how close you are to
other users. You can use this service to toggle the feature on and off.
-For more information, see [Voice chat](../chat/voice-chat.md).
+For more information, see [Voice Chat](../chat/voice-chat.md).
-## Folders and models
+## Folders and Models
There are two primary methods for grouping objects in the data model:
**folders** and **models**. Both are containers for objects, but they have
diff --git a/content/en-us/projects/experience-ownership-transfer.md b/content/en-us/projects/experience-ownership-transfer.md
index 514e74718..abcb5258e 100644
--- a/content/en-us/projects/experience-ownership-transfer.md
+++ b/content/en-us/projects/experience-ownership-transfer.md
@@ -1,5 +1,5 @@
---
-title: Experience ownership transfer
+title: Experience Ownership Transfer
description: Transfer ownership of an experience to other Roblox users or groups.
---
@@ -13,7 +13,7 @@ Before making a transfer or accepting a transfer, you must first:
- Upload your private `ModuleScripts` to the group you're transferring the experience to. If the experience uses packages where the package owner is a user and not a group, you might have to recreate those packages or replace them with packages that are already owned by a group.
- Publish your animation assets to the group you're transferring the experience to.
- - If you have a large number of animations to upload, you can use a community-supported third-party tool like Roblox Animation Transfer. See [Transfer animations](./transfer-animations.md) for more details.
+ - If you have a large number of animations to upload, you can use a community-supported third-party tool like Roblox Animation Transfer. See [Transferring Roblox Animations](./transferring-animations.md) for more details.
- If you have a small number of animations to upload, you can manually re-upload them and then update your animation asset references to support old and new IDs based on the `CreatorID` and `CreatorType`. See the following code for an example:
```lua
@@ -63,7 +63,7 @@ Before making a transfer or accepting a transfer, you must first:
As a best practice, if you're using Open Cloud API keys for the experience, create an API key as the new owner with the name `RobloxTransferApiKey`. During the transfer, the relevant scopes are added to this new key and removed from the original key. You can then use a feature flag to allow your backend services to start using the new key after the transfer is complete.
-## Transfer an experience
+## Transferring an Experience
To transfer an experience to a group:
@@ -86,7 +86,7 @@ Once the group accepts the transfer, Roblox makes your experience private and cl
To cancel a pending transfer, click **Cancel transfer request** in the **Content Settings** page.
-## Receive a transferred experience
+## Receiving a Transferred Experience
To receive a transferred experience:
@@ -103,7 +103,7 @@ To receive a transferred experience:
If you don't want to receive the transfer, click **Decline transfer** in the **Transfer Details** dialog.
-## Frequently asked questions
+## Frequently Asked Questions
**What kind of information does the transferred experience retain?**
diff --git a/content/en-us/projects/external-tools.md b/content/en-us/projects/external-tools.md
index 7264750ee..c201ce2a6 100644
--- a/content/en-us/projects/external-tools.md
+++ b/content/en-us/projects/external-tools.md
@@ -1,5 +1,5 @@
---
-title: Third-party tools
+title: Third-Party Tools
description: These popular tools can enhance developer productivity.
---
@@ -9,7 +9,7 @@ For professional development studios, setting up third-party tools and investing
Although this page covers several popular tools, it shouldn't be taken as a strict recommendation of them. Every team has different needs, so this page is intended to help you examine ways to improve your workflow rather than tell you to download anything in particular.
-## The syncing problem
+## The Syncing Problem
At its core, using external tools with Roblox is a _syncing_ problem:
@@ -21,7 +21,7 @@ For the whole solution to feel seamless and automatic, you need to a) listen for
Rather than Roblox's cloud-first approach, Rojo allows for a "file system-first" approach. It extracts all script files in your project into Luau files. Then it runs a server. The Rojo plugin connects to the server to synchronize those files with Studio.
-## Install Rojo with Foreman
+## Installing Rojo with Foreman
You can manually download and run a Rojo binary, but that approach runs the risk of different developers on your team using different Rojo versions. A better solution is to use a tool manager like [Foreman](https://github.com/Roblox/foreman), which uses a configuration file—a list of repositories and versions—to make the installation and upgrade process consistent across machines.
@@ -37,7 +37,7 @@ Then you install these tools with `foreman install`. In addition to a global `fo
When a tool releases a new version, you then explicitly bump the version number in your `.toml` file, use Foreman to perform the upgrade, test the new version, and downgrade if it causes any problems. For commands and installation instructions, see [Foreman](https://github.com/Roblox/foreman?tab=readme-ov-file#installation).
-## Run Rojo
+## Running Rojo
After you install Rojo with Foreman, what you've really installed is the Rojo server. The next step is to install the Rojo plugin for Roblox Studio:
@@ -67,7 +67,7 @@ In Roblox Studio, open the `.rbxl` file you just built, start the Rojo plugin, a
Rojo projects have certain naming requirements for files, numerous configuration options, and some limitations, all of which are covered in the [Rojo documentation](https://rojo.space/docs/v7/).
-## Package managers
+## Package Managers
Roblox has a robust set of included APIs, but if you want to make use of community software packages in a consistent, reproducible way, you need a package manager. [Wally](https://wally.run/) is a popular option. You can install it through Foreman, just like Rojo.
@@ -140,7 +140,7 @@ Like most other software projects, the goal is that contributors can clone a rep
For a detailed walkthrough of using React to create a Roblox UI, see [React + Roblox](https://devforum.roblox.com/t/how-to-react-roblox/2964543).
-## Version control
+## Version Control
Having a set of plain text files on your computer unlocks a variety of capabilities, but the primary one is _version control_. You can store your scripts and configuration files in a [Git](https://git-scm.com/) or [Mercurial](https://www.mercurial-scm.org/) repository; host remote repositories and review code changes in [GitHub](https://github.com), [GitLab](https://gitlab.com), or [Bitbucket](https://bitbucket.org); and use whichever text editor you like.
@@ -159,6 +159,6 @@ The tools on this page are most applicable to scripts; 3D artists already use ex
The Roblox implementation of packages follows many of the same principles as the tools on this page: a centralized repository with version history that offers a seamless way to keep all copies of an asset in sync. For more information on how they can improve your workflow, see [Packages](../projects/assets/packages.md).
-## Undo everything
+## Undoing Everything
Because third-party tools sync changes back to Roblox Studio rather than replacing it, no part of this workflow involves any lock-in. At any time, you can stop using one or all of these tools and go back to editing your experience exclusively in Studio. The lack of risk makes experimenting with third-party tools particularly appealing.
diff --git a/content/en-us/projects/groups.md b/content/en-us/projects/groups.md
index ea89445d2..a21ec13ee 100644
--- a/content/en-us/projects/groups.md
+++ b/content/en-us/projects/groups.md
@@ -1,5 +1,5 @@
---
-title: Groups (teams)
+title: Groups (Teams)
description: Explains Roblox groups and how to collaborate with multiple creators on the same experience.
---
@@ -9,9 +9,9 @@ A Roblox **group** allows multiple creators to work on the same experience, use
Group ownership of experiences helps creators collaborate and operate as independent studios. If a conflict arises within a group, Roblox cannot help arbitrate or resolve disagreements.
-## Create a new group
+## Creating a New Group
-Creating a group costs 100 Robux. New groups maintain certain capabilities on the legacy [Groups](https://www.roblox.com/groups) pages, but improved workflows and options for [configuring roles/permissions](#roles-and-permissions) and [inviting members](#invite-members) are only available on the [Creator Dashboard](https://create.roblox.com/dashboard/creations).
+Creating a group costs 100 Robux. New groups maintain certain capabilities on the legacy [Groups](https://www.roblox.com/groups) pages, but improved workflows and options for [configuring roles/permissions](#roles-and-permissions) and [inviting members](#inviting-members) are only available on the [Creator Dashboard](https://create.roblox.com/dashboard/creations).
To create a new group:
@@ -22,7 +22,7 @@ To create a new group:
2. On the setup page, upload an image for the group logo and enter the group name.
3. When ready, click the **Purchase** button. Once the group is created, you'll be directed to the group profile page where you can modify the group's details, including adding up to three social links.
-## Roles and permissions
+## Roles and Permissions
Group members can be assigned one or multiple **roles** within a group, and each role has **permissions** which specify the abilities of its members.
@@ -45,7 +45,7 @@ Roles created using the legacy [Groups](https://www.roblox.com/groups) pages wil
-
Group permissions
+
Group Permissions
@@ -72,7 +72,7 @@ Roles created using the legacy [Groups](https://www.roblox.com/groups) pages wil
-
Experience permissions
+
Experience Permissions
@@ -95,7 +95,7 @@ Roles created using the legacy [Groups](https://www.roblox.com/groups) pages wil
-
Group revenue
+
Group Revenue
@@ -114,7 +114,7 @@ Roles created using the legacy [Groups](https://www.roblox.com/groups) pages wil
-
Avatar item permissions
+
Avatar Item Permissions
@@ -129,7 +129,7 @@ Roles created using the legacy [Groups](https://www.roblox.com/groups) pages wil
-
Open Cloud permissions
+
Open Cloud Permissions
@@ -144,7 +144,7 @@ Roles created using the legacy [Groups](https://www.roblox.com/groups) pages wil
-
Asset permissions
+
Asset Permissions
@@ -174,7 +174,7 @@ Roles created using the legacy [Groups](https://www.roblox.com/groups) pages wil
A role's **Settings** section is also where group owners and members with sufficient permissions can remove a role entirely through the **Delete Role** button.
-## Manage members
+## Managing Members
Once [roles](#roles-and-permissions) have been configured for the group, members can be invited and assigned from the **Collaboration** 〉 **Members** page.
@@ -184,7 +184,7 @@ Once [roles](#roles-and-permissions) have been configured for the group, members
Member configuration is only accessible if you're the group owner or you have permission to manage other members and their roles.
-### Invite members
+### Inviting Members
You can invite new members through the **Invite** button in the upper‑right corner.
@@ -194,7 +194,7 @@ From the popup, locate a creator by typing their username into the search field.
-### Assign roles
+### Assigning Roles
To assign one or more roles to a member, hover over their name, click the **⋮** button, and then click the **⊕** button for the desired role.
@@ -208,13 +208,13 @@ To quickly un-assign a role from the members overview, hover over it and click t
Currently, roles configured through the legacy [Groups](https://www.roblox.com/groups) pages appear for each member, and new members are assigned the legacy **Member** role. If permissions were granted to a role through the legacy system, **the member will continue to have those permissions**, so it's recommended that you revoke permissions/roles in the legacy system and then migrate members to the new system.
-### Remove members
+### Removing Members
To remove a member entirely, hover over their name and click the "trash" button. A dialog will appear for you to confirm their removal.
-## Manage payouts
+## Managing Payouts
If you're the owner of a selected group, you'll find a **Payouts** page under **Finances**. Here, you can send one‑time payouts, as well as define percentage splits with other members.
@@ -228,13 +228,13 @@ Some groups may not have this page unlocked initially for various reasons, such
Group owners can't share payouts across group members for experiences that charge for [paid access in local currency](../production/monetization/paid-access-local-currency.md).
-### One-time payouts
+### One-Time Payouts
Group owners can make one-time payouts to members in a batch, selecting a set amount for each. Safety features include 2FA challenges, confirmation dialogues, and checks around the eligibility of members being paid.
-### Recurring payouts
+### Recurring Payouts
Group owners can also define recurring payouts across the entire group **and** per‑experience, assigning a percentage payout to each member before the remainder enters the group's overall balance.
@@ -268,10 +268,10 @@ Consider the following scenario where a group experience "Laser Maze" is sp
Note that revenue from [private server](../production/monetization/private-servers.md) subscriptions does not change if you adjust split percentages at a later time, meaning that if a player buys a private server subscription, the split percentages at time of purchase will apply to that particular subscription forever (until it is canceled). This policy may be changed in the future.
-## Intellectual property protection in groups
+## Intellectual Property Protection in Groups
-Group members with permission to edit all group experiences can enable the [Place Copying](../production/publishing/publish-experiences-and-places.md#allow-copying) setting for a creation, potentially allowing the entire Roblox community to copy it and use assets within it. To help protect intellectual property in a group, the owner or members with sufficient permissions should:
+Group members with permission to edit all group experiences can enable the [Place Copying](../production/publishing/publishing-experiences-and-places.md#allowing-copying) setting for a creation, potentially allowing the entire Roblox community to copy it and use assets within it. To help protect intellectual property in a group, the owner or members with sufficient permissions should:
-- Confirm that each member is [assigned the appropriate role](#assign-roles).
+- Confirm that each member is [assigned the appropriate role](#assigning-roles).
- Check that each group role has the correct [permissions](#roles-and-permissions).
-- Confirm that the [Place Copying](../production/publishing/publish-experiences-and-places.md#allow-copying) setting is disabled before private assets are added.
+- Confirm that [Place Copying](../production/publishing/publishing-experiences-and-places.md#allowing-copying) is disabled before private assets are added.
diff --git a/content/en-us/projects/index.md b/content/en-us/projects/index.md
index a02a05084..397da0ee1 100644
--- a/content/en-us/projects/index.md
+++ b/content/en-us/projects/index.md
@@ -7,18 +7,18 @@ A Roblox project is a collection of [places](#places), [assets](#assets), [setti
## Places
-Experiences on Roblox are made up of individual **places**, comparable to scenes in Unity or maps in Unreal Engine. Each place contains all components for that portion of the experience, including its specific environment, parts, meshes, scripts, and user interface. See [Experiences and places](../production/publishing/publish-experiences-and-places.md) for details on creating and managing experiences.
+Experiences on Roblox are made up of individual **places**, comparable to scenes in Unity or maps in Unreal Engine. Each place contains all components for that portion of the experience, including its specific environment, parts, meshes, scripts, and user interface. See [Experiences and Places](../production/publishing/publishing-experiences-and-places.md) for details on creating and managing experiences.
-Every place is represented by a **data model**, a hierarchy of objects that describe everything about the place. The Roblox Engine uses the data model as a source of truth for a place's state, so it can simulate and render it on client devices. For more information on how the engine interprets the data model, see [Client-server runtime](../projects/client-server.md).
+Every place is represented by a **data model**, a hierarchy of objects that describe everything about the place. The Roblox engine uses the data model as a source of truth for a place's state, so it can simulate and render it on client devices. For more information on how the Roblox engine interprets the data model, see [Client-Server Runtime](../projects/client-server.md).
Proper, intentional object organization within the data model is essential for
functionality and maintenance of your project. For more information on what
objects are available and how to organize and use them, see
-[Data model](../projects/data-model.md).
+[Data Model](../projects/data-model.md).
## Assets
@@ -57,7 +57,7 @@ Experience settings are managed from the [Creator Dashboard](https://create.robl
- **Basic Info** — Basic information about the experience, such as its name, description, and genre. Much of the information here is used in your experience's listing.
- **Communication** — Settings which enable eligible users to use [voice chat](../chat/voice-chat.md) or animate their avatar via their camera within your experience.
-- **Permissions** — Configures who can access your experience. New experiences begin as **private** and can only be edited and joined by you and members of your [group](../projects/groups.md) with the correct permissions. When appropriate, you can [release](../production/publishing/publish-experiences-and-places.md#release-to-the-public) the experience to the public.
+- **Permissions** — Configures who can access your experience. New experiences begin as **private** and can only be edited and joined by you and members of your [group](../projects/groups.md) with the correct permissions. When appropriate, you can [release](../production/publishing/publishing-experiences-and-places.md#releasing-to-the-public) the experience to the public.
- **Monetization** — Options for earning revenue from your experience, as outlined in [Monetization](../production/monetization/index.md).
- **Localization** — Configuration for different [languages and regions](../production/localization/index.md).
- **Avatar** — Settings related to avatars, such as avatar scaling and
@@ -93,4 +93,4 @@ Studio offers a suite of options for testing an experience before releasing it t
device or how on-screen UI displays on different screens and aspect ratios.
- **Collaborative playtesting** with members of your team.
-For more information on each testing option, see [Studio testing modes](../studio/testing-modes.md).
+For more information on each testing option, see [Studio Testing Modes](../studio/testing-modes.md).
diff --git a/content/en-us/projects/place-files.md b/content/en-us/projects/place-files.md
index 8e034fb66..2e6558d1e 100644
--- a/content/en-us/projects/place-files.md
+++ b/content/en-us/projects/place-files.md
@@ -1,5 +1,5 @@
---
-title: Place files
+title: Place Files
description: Learn how to manage and optimize your place files in Roblox.
---
@@ -10,13 +10,13 @@ You might also want to export local copies of places for use with a version cont
- `.rbxl` is the binary place file format. This format is compact, but not human-readable.
- `.rbxlx` is the XML-based place file format, which is quite a bit larger on disk than the binary format.
-## Size limit
+## Size Limit
Roblox supports places up to 100 MB (104,857,600 bytes). Beyond that limit, **Save to Roblox** and **Publish to Roblox** might fail. The data that Studio uploads to Roblox is slightly smaller than the `.rbxl` file format, so you can export your place to `.rbxl` to get a sense of its size.
-Very few places, even the most complex ones, reach this limit, and when they do, it's often due to inefficiencies in the place. See [Troubleshooting](#troubleshoot-place-file-size).
+Very few places, even the most complex ones, reach this limit, and when they do, it's often due to inefficiencies in the place. See [Troubleshooting](#troubleshooting-place-file-size).
-### Auto-recovery files
+### Auto-Recovery Files
If saving to Roblox fails due to the file size limit, Studio automatically generates a backup of your place called a **recovery file**. The frequency of auto-recovery backups depends on whether your experience has [Team Create](collaboration.md) enabled:
@@ -27,15 +27,15 @@ On Windows, recovery files are located in `C:\Users\Admin\AppData\Local\Roblox\R
On macOS, you can find them in `/Users/your-username/Library/Application Support/Roblox/RobloxStudio/AutoSaves/`.
-## Troubleshoot place file size
+## Troubleshooting Place File Size
If you reach the 100 MB limit on your place file, there's likely an underlying issue that you can troubleshoot. Try the following steps.
-### Safety check
+### Safety Check
Check the models in your place and their attached scripts for any obfuscated or unclear text. This text does not compress well and might even be a malicious backdoor into your place. Roblox moderation systems actively filter out these models, but if you happen to find one, delete the model from your place, find the model on the [Creator Store](https://create.roblox.com/store/models), and report it immediately.
-### Redundant parts
+### Redundant Parts
Unreferenced or hidden assets can accumulate over time and unnecessarily increase file size.
@@ -48,7 +48,7 @@ Unreferenced or hidden assets can accumulate over time and unnecessarily increas
1. Check for redundant parts (parts of the same size and shape with the same position) or instances (redundant `Class.SurfaceAppearance|SurfaceAppearances`, textures, etc.) and delete them. The Creator Store has plugins that can help you identify these cases.
-### Simplify terrain
+### Simplifying Terrain
Reducing or simplifying terrain can significantly reduce place size and improve performance. Avoiding excessive terrain features like dense forests or complex hills helps make experiences run faster and more efficiently. Of course, the experience should match your artistic vision, but consider the following optimizations:
@@ -56,10 +56,10 @@ Reducing or simplifying terrain can significantly reduce place size and improve
1. Turn on [wireframe rendering](../studio/view-tab.md#grid-and-wireframe) and check for messy holes or misplaced water under the terrain surface. These mistakes can increase compressed size.
1. There are community plugins that optimize non-visible blocks of terrain for better compression, such as [this one](https://create.roblox.com/store/asset/133396894381603/Terrain-File-Size-Optimizer).
-### Collision fidelity
+### Collision Fidelity
`Enum.CollisionFidelity.Box|Box` and `Enum.CollisionFidelity.Hull|Hull` collision fidelity are more memory efficient than the default. Select your meshes, open the [Properties](../studio/properties.md) window, and change the **CollisionFidelity** values as appropriate for your use case.
### Teleports
-If other size reduction strategies fail, you can break your place into multiple, smaller places and link them through [teleports](teleport.md). Serialization and upload happen at the place level, so this approach lets you grow your universe place by place over time instead of trying to maintain a single, massive place.
+If other size reduction strategies fail, you can break your place into multiple, smaller places and link them through [teleports](teleporting.md). Serialization and upload happen at the place level, so this approach lets you grow your universe place by place over time instead of trying to maintain a single, massive place.
diff --git a/content/en-us/projects/teleport.md b/content/en-us/projects/teleporting.md
similarity index 93%
rename from content/en-us/projects/teleport.md
rename to content/en-us/projects/teleporting.md
index 693c9443f..7c6db9485 100644
--- a/content/en-us/projects/teleport.md
+++ b/content/en-us/projects/teleporting.md
@@ -1,5 +1,5 @@
---
-title: Teleport between places
+title: Teleporting Between Places
description: Explains how to use TeleportService to teleport users between different places in your experience.
---
@@ -9,7 +9,7 @@ If you want to build an experience with many distinct places, such as a fantasy
`Class.TeleportService` doesn't support playtesting in Roblox Studio. You must publish the experience and use it on the Roblox application for testing.
-## Set up teleportation
+## Setting Up Teleportation
To enable teleportation in your experience, use `Class.TeleportService:TeleportAsync()`. The method accepts three parameters:
@@ -32,13 +32,13 @@ TeleportService:TeleportAsync(TARGET_PLACE_ID, {playerToTeleport}, teleportOptio
You can only call `Class.TeleportService:TeleportAsync()|TeleportAsync()` from server-side scripts. This limitation reduces client-side exploitation. If necessary, you can call `Class.TeleportService:Teleport()|Teleport()` from client-side scripts, but `Class.TeleportService:TeleportAsync()|TeleportAsync()` is the recommended method.
-If you want to take precautions of handling errors when setting up teleportation, see how to [handle failed teleports](#handle-failed-teleports).
+If you want to take precautions of handling errors when setting up teleportation, see [Handling Failed Teleports](#handling-failed-teleports).
-### Enable cross experience teleportation
+### Enabling Cross Experience Teleportation
For security purposes, teleporting a user from your experience to another experience owned by others, or the other way around, fails by default. To enable cross experience teleportation, open **Game Settings** > **Security** and enable **Allow Third Party Teleports** on Studio.
-## Create custom teleport screens
+## Creating Custom Teleport Screens
When a user triggers a teleport, they see the standard Roblox loading screen as they wait for the new place to load in. You can add a custom teleport screen to improve immersion for users by calling `Class.TeleportService:SetTeleportGui()` on the client and pass through the `Class.ScreenGui` to use before teleporting the user. The following example sets a customized `Class.ScreenGui` located in `Class.ReplicatedStorage` as the loading screen when a teleport happens. It doesn't run any scripts inside of the `Class.ScreenGui`.
@@ -51,11 +51,11 @@ local teleportGui = ReplicatedStorage.TeleportGui
TeleportService:SetTeleportGui(teleportGui)
```
-## Customize teleport options
+## Customizing Teleport Options
-You can customize teleportations, such as [teleporting users to a specific server](#teleport-to-specific-servers) and [sending user data along with teleports](#send-user-data-along-with-teleports), by setting the `Class.TeleportOptions` instance and passing it to the `Class.TeleportService:TeleportAsync()` method.
+You can customize teleportations, such as [teleporting users to a specific server](#teleporting-to-specific-servers) and [sending user data along with teleports](#sending-user-data-along-with-teleports), by setting the `Class.TeleportOptions` instance and passing it to the `Class.TeleportService:TeleportAsync()` method.
-### Teleport to specific servers
+### Teleporting to Specific Servers
To teleport users to specific servers, set the target server using `Class.TeleportOptions` and pass it to the `Class.TeleportService:TeleportAsync()` method. If you don't specify a server, users are teleported into a matchmade public server. The information of the first user in the list is used to matchmake to that public server.
@@ -80,7 +80,7 @@ local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ShouldReserveServer = true
```
-### Send user data along with teleports
+### Sending User Data Along with Teleports
Teleporting a user between places discards any local data associated with that user. You can use the following approaches to handle data persistence between places.
@@ -119,7 +119,7 @@ Players.PlayerAdded:Connect(onPlayerAdded)
To retrieve only the teleport data on the client, you can use `Class.TeleportService:GetLocalPlayerTeleportData()`.
-## Handle failed teleports
+## Handling Failed Teleports
Like any API call that involves network requests, teleports might fail and throw an error. Even if a call succeeds and the teleport initiates, it can still fail at the last moment without throwing an error and leave the user in the server. When this happens, it triggers `Class.TeleportService.TeleportInitFailed`.
diff --git a/content/en-us/projects/transfer-animations.md b/content/en-us/projects/transferring-animations.md
similarity index 97%
rename from content/en-us/projects/transfer-animations.md
rename to content/en-us/projects/transferring-animations.md
index 94270c4c7..67d184cb2 100644
--- a/content/en-us/projects/transfer-animations.md
+++ b/content/en-us/projects/transferring-animations.md
@@ -1,5 +1,5 @@
---
-title: Transfer animations
+title: Transferring Roblox Animations
description: Transfer animations when you transfer your experience to a new group owner.
---
@@ -17,7 +17,7 @@ Before transferring your animations, you must have `npx` installed. `npx` lets y
For more information about prerequisites, see the [Roblox Animation Transfer README](https://github.com/evaera/roblox-animation-transfer?tab=readme-ov-file#roblosecurity).
-## Map AnimationIds to names
+## Mapping AnimationIds to Names
If your animations are stored as Animation instances under pre-prepared Character models in your experience, you can generate a text file to map the `AnimationIds` to their corresponding names.
@@ -52,7 +52,7 @@ print(ANIMSTRING)
4. Clean up any discrepancies like extra `-Edit` and `-Studio` strings that have been automatically added to the file content.
5. Replace all spaces with underscores to limit the number of moderated names overall.
-## (Optional) Prepare text files
+## (Optional) Preparing Text Files
Roblox has an internal rate limit for animation uploads. The Roblox Animation Transfer tool doesn't respect this rate limit, which can cause issues during the transfer process and break your final text file. For example, you might transfer 1200 animations but end up with only 900 of them and no way of determining which ones failed to transfer.
@@ -61,7 +61,7 @@ To make sure the final file doesn't break, you can:
1. Split your text file into multiple files with up to 200 animations in each.
2. Use the Roblox Animation Transfer tool on each individual file. To prevent any major rate-limit problems, wait a few minutes in-between each batch.
-## Transfer animations
+## Transferring Animations
After your text files are ready, start the transfer process:
@@ -73,7 +73,7 @@ After your text files are ready, start the transfer process:
If the transfer process is successful, the animations in the `outFile` are listed in the same order they were provided in the `inFile`. If a number of animations fail to transfer, the tool attempts to transfer them again; if this second attempt is successful, these animations are appended to the end of the list in the `outFile`.
-## Load animations at runtime
+## Loading Animations at Runtime
After transferring your animations to the new group owner, you must swap the old animations for the new animations.
diff --git a/content/en-us/reference/engine/classes.md b/content/en-us/reference/engine/classes.md
index 8726e3c6b..144fe9fb5 100644
--- a/content/en-us/reference/engine/classes.md
+++ b/content/en-us/reference/engine/classes.md
@@ -1,11 +1,11 @@
---
-title: Roblox Engine classes
-description: Classes represent core objects and services in the Roblox Engine. They contain properties, methods, events, and callbacks.
+title: Roblox Engine Classes
+description: Classes represent core objects and services in the Roblox engine. They contain properties, methods, events, and callbacks.
---
-Classes represent core objects and services in the Roblox Engine. They contain
+Classes represent core objects and services in the Roblox engine. They contain
properties, methods, events, and callbacks.
-
+
diff --git a/content/en-us/reference/engine/classes/AnimationClip.yaml b/content/en-us/reference/engine/classes/AnimationClip.yaml
index ab0bfaa07..821839dcf 100644
--- a/content/en-us/reference/engine/classes/AnimationClip.yaml
+++ b/content/en-us/reference/engine/classes/AnimationClip.yaml
@@ -15,7 +15,7 @@ description: |
Roblox's animation system, all such representations are their own instance
types but inherit from the `Class.AnimationClip` instance. Animation clips
published to Roblox via the [Animation Editor](../../../animation/editor.md)
- can be loaded into the Roblox Engine using an `Class.Animation` instance.
+ can be loaded into the Roblox engine using an `Class.Animation` instance.
code_samples:
inherits:
- Instance
diff --git a/content/en-us/reference/engine/classes/Camera.yaml b/content/en-us/reference/engine/classes/Camera.yaml
index 7682f2f03..e5404304b 100644
--- a/content/en-us/reference/engine/classes/Camera.yaml
+++ b/content/en-us/reference/engine/classes/Camera.yaml
@@ -394,7 +394,7 @@ properties:
- Players may experience motion sickness if an equivalent head tracking
solution is not added.
- - The Roblox Engine performs latency optimizations when `HeadLocked` is
+ - The Roblox engine performs latency optimizations when `HeadLocked` is
true.
##### See Also
diff --git a/content/en-us/reference/engine/classes/ContextActionService.yaml b/content/en-us/reference/engine/classes/ContextActionService.yaml
index 567cd4431..4a33bbecb 100644
--- a/content/en-us/reference/engine/classes/ContextActionService.yaml
+++ b/content/en-us/reference/engine/classes/ContextActionService.yaml
@@ -296,7 +296,7 @@ methods:
This function binds _functionToBind_ to input events such as key presses,
mouse movement, or controller input. The specific input types the engine
listens for are listed as parameters of BindAction. Whenever a player uses
- any of these input types, the Roblox Engine calls "functionToBind".
+ any of these input types, the Roblox engine calls "functionToBind".
BindAction sets the priorityLevel via `Enum.ContextActionPriority` to
Default.Value, which is 2000. Use `Class.ContextActionService:GetButton()`
to control the priority of bound events.
diff --git a/content/en-us/reference/engine/classes/Object.yaml b/content/en-us/reference/engine/classes/Object.yaml
index 6abf38767..8e7e9dc65 100644
--- a/content/en-us/reference/engine/classes/Object.yaml
+++ b/content/en-us/reference/engine/classes/Object.yaml
@@ -6,7 +6,7 @@ summary: |
Object is the base class for all classes in the Roblox class hierarchy.
description: |
Object is the base class for all classes in the Roblox class hierarchy. Every
- other class that the Roblox Engine defines inherits all of the members of
+ other class that the Roblox engine defines inherits all of the members of
Object. It is not possible to directly create Object.
code_samples: []
inherits: []
@@ -156,7 +156,7 @@ methods:
```lua
local Players = game:GetService("Players")
-
+
local function paintFigure(character, color)
-- Iterate over the child objects of the character
for _, child in character:GetChildren() do
diff --git a/content/en-us/reference/engine/classes/RunService.yaml b/content/en-us/reference/engine/classes/RunService.yaml
index ca2aaa86f..3a788b78c 100644
--- a/content/en-us/reference/engine/classes/RunService.yaml
+++ b/content/en-us/reference/engine/classes/RunService.yaml
@@ -206,7 +206,7 @@ methods:
The `priority` of the binding is an integer; it determines when during the
render step to call the custom function. The lower this number, the sooner
the custom function will be called. If two bindings have the same
- priority, the Roblox Engine will randomly pick one to run first. The
+ priority, the Roblox engine will randomly pick one to run first. The
default Roblox control scripts run with these specific priorities:
- Player Input: `100`
@@ -258,7 +258,7 @@ methods:
Priority of the binding as an integer; it determines when during the
render step to call the custom function. The lower this number, the
sooner the custom function will be called. If two bindings have the
- same priority the Roblox Engine will randomly pick one to run first.
+ same priority the Roblox engine will randomly pick one to run first.
- name: function
type: Function
default:
diff --git a/content/en-us/reference/engine/classes/SurfaceAppearance.yaml b/content/en-us/reference/engine/classes/SurfaceAppearance.yaml
index de552c48c..ffeb41450 100644
--- a/content/en-us/reference/engine/classes/SurfaceAppearance.yaml
+++ b/content/en-us/reference/engine/classes/SurfaceAppearance.yaml
@@ -45,7 +45,7 @@ properties:
pixels in the `Class.SurfaceAppearance.ColorMap` will render as completely
opaque in the 3D scene. This solves various problems for textures with
different transparent and opaque areas, such as foliage. When parts of the
- surface are fully opaque, the Roblox Engine can render them with proper
+ surface are fully opaque, the Roblox engine can render them with proper
depth-based occlusion. Opaque surfaces also generally work better with
depth-based effects like `Class.DepthOfFieldEffect`, glass and water
refraction, and water reflection.
diff --git a/content/en-us/reference/engine/classes/TouchTransmitter.yaml b/content/en-us/reference/engine/classes/TouchTransmitter.yaml
index 300a07c48..dcc221a37 100644
--- a/content/en-us/reference/engine/classes/TouchTransmitter.yaml
+++ b/content/en-us/reference/engine/classes/TouchTransmitter.yaml
@@ -23,6 +23,7 @@ description: |
the TouchTransmitter. Otherwise the connection will not be cleaned up which
can cause performance issues over time.
code_samples:
+ - TouchTransmitter
inherits:
- Instance
tags:
diff --git a/content/en-us/reference/engine/classes/Workspace.yaml b/content/en-us/reference/engine/classes/Workspace.yaml
index 0017751d1..d1c2e1c3d 100644
--- a/content/en-us/reference/engine/classes/Workspace.yaml
+++ b/content/en-us/reference/engine/classes/Workspace.yaml
@@ -271,7 +271,7 @@ properties:
Determines the height at which falling `Class.BasePart|BaseParts` and
their ancestor `Class.Model|Models` are removed from `Class.Workspace`.
description: |
- This property determines the height at which the Roblox Engine
+ This property determines the height at which the Roblox engine
automatically removes falling `Class.BasePart|BaseParts` and their
ancestor `Class.Model|Models` from `Class.Workspace` by parenting them to
`nil`. This is to prevent parts that have fallen off the map from
diff --git a/content/en-us/reference/engine/datatypes.md b/content/en-us/reference/engine/datatypes.md
index 422d1db6c..0261a57e4 100644
--- a/content/en-us/reference/engine/datatypes.md
+++ b/content/en-us/reference/engine/datatypes.md
@@ -1,11 +1,11 @@
---
-title: Roblox Engine data types
-description: Data types are types unique to the Roblox Engine. They can contain constructors, properties, and methods.
+title: Roblox Engine Data Types
+description: Data Types are types unique to the Roblox engine. They can contain constructors, properties, and methods.
---
-Data types are types unique to the Roblox Engine. They can contain constructors,
+Data Types are types unique to the Roblox engine. They can contain constructors,
properties, and methods.
-
+
diff --git a/content/en-us/reference/engine/datatypes/CFrame.yaml b/content/en-us/reference/engine/datatypes/CFrame.yaml
index 4cfd5d9e7..3d000914e 100644
--- a/content/en-us/reference/engine/datatypes/CFrame.yaml
+++ b/content/en-us/reference/engine/datatypes/CFrame.yaml
@@ -30,7 +30,7 @@ description: |
after the `x`, `y` and `z` positional values. This matrix is used internally
when doing calculations involving rotations, using **radians** as their unit
(for conversion from one to the other, use `Library.math.rad()` or
- `Library.math.deg()`). For more information on how the Roblox Engine performs
+ `Library.math.deg()`). For more information on how the Roblox engine performs
rotations, see `Enum.RotationOrder`.
The table below represents the components of a `Datatype.CFrame` object's
diff --git a/content/en-us/reference/engine/datatypes/SharedTable.yaml b/content/en-us/reference/engine/datatypes/SharedTable.yaml
index 58229b415..8a76e036b 100644
--- a/content/en-us/reference/engine/datatypes/SharedTable.yaml
+++ b/content/en-us/reference/engine/datatypes/SharedTable.yaml
@@ -19,7 +19,7 @@ description: |
Like a Luau table, a `Datatype.SharedTable` object stores a set of key-value
element pairs. Unlike a Luau table, only selected types of objects may be
stored in a SharedTable, similar to other restrictions you'll find elsewhere
- in the Roblox Engine.
+ in the Roblox engine.
Keys must either be (1) a string or (2) a nonnegative integer number less than
232. Other kinds of keys are not supported.
diff --git a/content/en-us/reference/engine/enums.md b/content/en-us/reference/engine/enums.md
index 6b8f9e592..d24b3225f 100644
--- a/content/en-us/reference/engine/enums.md
+++ b/content/en-us/reference/engine/enums.md
@@ -1,5 +1,5 @@
---
-title: Roblox Engine enums
+title: Roblox Engine Enums
description: Enums are groups of constants that define preset values that you can use with other APIs.
---
@@ -7,5 +7,5 @@ Enums are groups of constants that define preset values that you can use with
other APIs.
-
+
diff --git a/content/en-us/reference/engine/globals.md b/content/en-us/reference/engine/globals.md
index 539c12dd9..aaf1f7060 100644
--- a/content/en-us/reference/engine/globals.md
+++ b/content/en-us/reference/engine/globals.md
@@ -1,5 +1,5 @@
---
-title: Roblox Engine globals
+title: Roblox Engine Globals
description: Globals are functions or properties that you can use in any script. Lua globals are native to Lua while Roblox globals are found only on Roblox.
---
@@ -7,5 +7,5 @@ Globals are functions or properties that you can use in any script. Lua globals
are native to Lua while Roblox globals are found only on Roblox.
-
+
diff --git a/content/en-us/reference/engine/globals/LuaGlobals.yaml b/content/en-us/reference/engine/globals/LuaGlobals.yaml
index 3a94361a3..5ab449449 100644
--- a/content/en-us/reference/engine/globals/LuaGlobals.yaml
+++ b/content/en-us/reference/engine/globals/LuaGlobals.yaml
@@ -1,4 +1,4 @@
-name: Lua globals
+name: Lua Globals
type: global
summary: |
A list of functions and variables that are native to Lua.
diff --git a/content/en-us/reference/engine/globals/RobloxGlobals.yaml b/content/en-us/reference/engine/globals/RobloxGlobals.yaml
index 180224a8c..663c800b9 100644
--- a/content/en-us/reference/engine/globals/RobloxGlobals.yaml
+++ b/content/en-us/reference/engine/globals/RobloxGlobals.yaml
@@ -1,4 +1,4 @@
-name: Roblox globals
+name: Roblox Globals
type: global
summary: |
Built-in functions and constants unique to Roblox.
diff --git a/content/en-us/reference/engine/libraries.md b/content/en-us/reference/engine/libraries.md
index 48b981bc0..e0d667d37 100644
--- a/content/en-us/reference/engine/libraries.md
+++ b/content/en-us/reference/engine/libraries.md
@@ -1,5 +1,5 @@
---
-title: Roblox Engine libraries
+title: Roblox Engine Libraries
description: Libraries are groups of functions that you can use to manipulate built-in data types.
---
@@ -7,5 +7,5 @@ Libraries are groups of functions that you can use to manipulate built-in data
types.
-
+
diff --git a/content/en-us/reference/engine/overview.md b/content/en-us/reference/engine/overview.md
index 6dd527bfe..6b33df680 100644
--- a/content/en-us/reference/engine/overview.md
+++ b/content/en-us/reference/engine/overview.md
@@ -1,32 +1,32 @@
---
-title: Roblox Engine API reference
-description: This API reference documents all of Roblox's classes, data types, enumerations, functions, events, callbacks, and properties.
+title: Roblox Engine API Reference
+description: This API Reference documents all of Roblox's classes, data types, enumerations, functions, events, callbacks, and properties.
---
-**Build logic into your experiences with the Roblox Engine APIs.**
+**Build logic into your experiences with Roblox Engine APIs.**
-This API reference documents all of the classes, data types, enumerations,
+This API Reference documents all of the classes, data types, enumerations,
functions, events, callbacks, and properties that you can use when
creating on Roblox.
## Classes
-Classes represent core objects and services in the Roblox Engine. They contain
+Classes represent core objects and services in the Roblox engine. They contain
properties, methods, events, and callbacks.
-
+
-## Data types
+## Data Types
-Data Types are types unique to the Roblox Engine. They can contain constructors,
+Data Types are types unique to the Roblox engine. They can contain constructors,
properties, and methods.
-
+
@@ -36,7 +36,7 @@ Enums are groups of constants that define preset values that you can use with
other APIs.
-
+
@@ -46,7 +46,7 @@ Globals are functions or properties that you can use in any script. Lua globals
are native to Lua while Roblox globals are found only on Roblox.
-
+
@@ -56,6 +56,6 @@ Libraries are groups of functions that you can use to manipulate built-in data
types.
-
+
diff --git a/content/en-us/resources/battle-royale/building-system.md b/content/en-us/resources/battle-royale/building-system.md
index 201120b73..4b83d7ab9 100644
--- a/content/en-us/resources/battle-royale/building-system.md
+++ b/content/en-us/resources/battle-royale/building-system.md
@@ -1,5 +1,5 @@
---
-title: Building system
+title: Building System
comments:
description: Explains the process of creating a building system in the Battle Royale kit.
prev: /resources/battle-royale/pickup-system
@@ -18,7 +18,7 @@ To maintain an orderly and structured system:
- Each tile must connect to another existing tile or to the ground.
- Place all building tiles within a grid coordinated with the game world so that tiles connect properly and do not overlap.
-## Tile composition
+## Tile Composition
In order for users to build new tiles quickly and easily, the building system needs to understand which tiles are connected to each other and where new tiles can be placed on the grid.
@@ -38,7 +38,7 @@ Ensuring that a tile occupies the correct location in a grid system is important
-
Bit index
+
Bit Index
Meaning
@@ -113,7 +113,7 @@ width="75%" />
A building system object is considered connected to another building system object in the grid if they share at least 2 connectivity points on the surface of a cell.
-## Create new tile types
+## Creating New Tile Types
To create a new tile type:
@@ -141,7 +141,7 @@ ObjectTypeConfigurations.Wall = {
}
```
-## Work with terrain
+## Working With Terrain
If you would like to create a map with free-form [terrain](../../parts/terrain.md) that lines up perfectly with the building system, we recommend that you use the **heightmap import** system as outlined in [Environmental Terrain](../../parts/terrain.md) and that you observe the following details:
diff --git a/content/en-us/resources/battle-royale/core-scripts.md b/content/en-us/resources/battle-royale/core-scripts.md
index 921bbde9e..b618103f8 100644
--- a/content/en-us/resources/battle-royale/core-scripts.md
+++ b/content/en-us/resources/battle-royale/core-scripts.md
@@ -1,22 +1,22 @@
---
-title: Core scripts
+title: Core Scripts
comments:
description: Explains the two scripts responsible for the Battle Royale gameplay loop.
-prev: /resources/battle-royale/run-the-game
+prev: /resources/battle-royale/running-the-game
next: /resources/battle-royale/pickup-system
---
The core game loop in Roblox Battle Royale is generally handled by two scripts, specifically `ServerScriptService/Server` on the server and `StarterPlayer/StarterPlayerScripts/Client` on the client.
-## Initial setup
+## Initial Setup
The `ReplicatedFirst/InitialSetup` script configures a few engine-level systems — built-in UI, chat, etc. — and ensures that the client loads the assets referenced in `ReplicatedFirst/Configurations/AssetPreloads` before proceeding.
-## Game stages
+## Game Stages
The initialization and updating of specific systems is done differently depending on the current stage of the game. Most of these cases are handled by `ServerScriptService/Core/GameStageHandler` on the server and `ReplicatedStorage/Core/StageManager` on the client. When a stage is requested, a module of the same name is required and various setup functions called on it. If there is already a module handling the current stage, shutdown functions are called on it prior to the new stage handler being initialized.
-## Places/server roles
+## Places/Server Roles
Within `ReplicatedFirst/Configurations/MainConfiguration`, different gameplay modes are organized into lists of stages to be executed.
diff --git a/content/en-us/resources/battle-royale/index.md b/content/en-us/resources/battle-royale/index.md
index c33e164c0..7fac2d76d 100644
--- a/content/en-us/resources/battle-royale/index.md
+++ b/content/en-us/resources/battle-royale/index.md
@@ -29,7 +29,7 @@ At a high level, Roblox Battle Royale contains the following:
All of these systems are supported on a wide range of hardware, screen sizes, and game controllers, from mobile phones to Xbox to high-end desktop PCs. The code is designed to be performant and easy to read so anyone can learn how to build a game like this.
-## Play modes
+## Play Modes
There are 4 play modes included in this project:
diff --git a/content/en-us/resources/battle-royale/installation-and-setup.md b/content/en-us/resources/battle-royale/installation-and-setup.md
index 12eb465b4..04b897a3a 100644
--- a/content/en-us/resources/battle-royale/installation-and-setup.md
+++ b/content/en-us/resources/battle-royale/installation-and-setup.md
@@ -1,15 +1,15 @@
---
-title: Installation and setup
+title: Installation and Setup
description: Explains the installation and setup details for the Battle Royale game kit.
prev: /resources/battle-royale
-next: /resources/battle-royale/run-the-game
+next: /resources/battle-royale/running-the-game
---
To setup the Battle Royale experience, you must download [Studio](../../studio/setup.md) and the project [reference files](#reference-files).
-Additional configuration of the [place IDs](#copy-and-paste-place-ids), [server](#adjust-server-fill), and [publishing](#publish-additional-places) settings are also required before continuing on to [running the game](../../resources/battle-royale/run-the-game.md).
+Additional configuration of the [place IDs](#copy-and-paste-place-ids), [server](#adjust-server-fill), and [publishing](#publish-additional-places) settings are also required before continuing on to [running the game](../../resources/battle-royale/running-the-game.md).
-## Reference files
+## Reference Files
[RobloxBattleRoyale.zip](../../assets/resources/battle-royale/installation-and-setup/RobloxBattleRoyale.zip) consists of easily accessible `.rbxl` files which you can open in Roblox Studio and experiment with immediately.
@@ -36,7 +36,7 @@ Additional configuration of the [place IDs](#copy-and-paste-place-ids), [server]
-## Create a new game
+## Create a New Game
Roblox Battle Royale must be structured as a game with six unique places. To begin:
@@ -65,7 +65,7 @@ Roblox Battle Royale must be structured as a game with six unique places. To beg
5. For the **Creator** field, select "Me" to publish the place to your personal account, or select a group.
6. When ready, click the **Create** button.
-## Add additional places
+## Add Additional Places
Once the lobby place is published, you'll need to add **five additional places** to the game:
@@ -93,7 +93,7 @@ Once the lobby place is published, you'll need to add **five additional places**
5. Publish the game again (File → Publish to Roblox).
-## Copy and paste place IDs
+## Copy and Paste Place IDs
Each place must be cross-associated so that players can teleport from the lobby to various play mode queues and vice-versa. To achieve this, you'll need to gather the place IDs of the places you created above.
@@ -147,7 +147,7 @@ Each place must be cross-associated so that players can teleport from the lobby
Place
-
Table key
+
Table Key
@@ -192,7 +192,7 @@ Each place must be cross-associated so that players can teleport from the lobby
6. Publish the game again (**File** → **Publish to Roblox**).
-## Adjust server fill
+## Adjust Server Fill
By default, Roblox balances players/servers for an optimal social gameplay experience, but a battle royale should allow for bigger and more intense battles. To achieve this:
@@ -220,11 +220,11 @@ By default, Roblox balances players/servers for an optimal social gameplay exper
5. Click **Save** at the bottom of the window.
-## Publish aditional places
+## Publish Additional Places
Now you'll need to open the remaining `.rbxl` files from the downloaded bundle, modify their `_places` tables, and publish them.
-### Copy places table
+### Copy Places Table
1. Refer to the `_places` table in the lobby's **MainConfiguration** script:
@@ -250,7 +250,7 @@ local _places = {
src="../../assets/resources/battle-royale/installation-and-setup/Battle-Royale-Lobby-Close.png"
width="80%" />
-### Replace tables
+### Replace Tables
1. Open the `Gameplay.rbxl` file.
2. Open its **MainConfiguration** script within **ReplicatedFirst** → **Configurations**.
diff --git a/content/en-us/resources/battle-royale/minimap-system.md b/content/en-us/resources/battle-royale/minimap-system.md
index c05f7866c..6dd6fa7bf 100644
--- a/content/en-us/resources/battle-royale/minimap-system.md
+++ b/content/en-us/resources/battle-royale/minimap-system.md
@@ -1,5 +1,5 @@
---
-title: Minimap system
+title: Minimap System
comments:
description: Explains the minimap implementation details for the Battle Royale game kit.
prev: /resources/battle-royale/building-system
@@ -24,7 +24,7 @@ alt="Minimap Objects"
src="../../assets/resources/battle-royale/minimap-system/Battle-Royale-Minimap-Objects.png"
width="320" />
-## Add indicators
+## Adding Indicators
To add new indicators that show up on the minimap, complete these steps:
@@ -48,7 +48,7 @@ To add new indicators that show up on the minimap, complete these steps:
MinimapGui.addMapTag(tag, indicatorLabel)
```
-## Customize the minimap
+## Customizing the Minimap
To customize the minimap or use the minimap system with your own map and minimap image, you can change these values in `ReplicatedFirst/Configurations/MainConfiguration`:
diff --git a/content/en-us/resources/battle-royale/pickup-system.md b/content/en-us/resources/battle-royale/pickup-system.md
index c7b97d844..56b895828 100644
--- a/content/en-us/resources/battle-royale/pickup-system.md
+++ b/content/en-us/resources/battle-royale/pickup-system.md
@@ -1,5 +1,5 @@
---
-title: Pickup system
+title: Pickup System
comments:
description: Explains the pickup system for the Battle Royale game kit.
prev: /resources/battle-royale/core-scripts
@@ -46,7 +46,7 @@ There are several important folders related to the pickup system. Make sure that
src="../../assets/resources/battle-royale/pickup-system/Battle-Royale-Pickups.png"
width="320" />
-## Add new pickups
+## Adding New Pickups
As noted above, pickups require both a functional `Class.Tool` and a visual `Class.Model` that will be spawned in the game world.
diff --git a/content/en-us/resources/battle-royale/run-the-game.md b/content/en-us/resources/battle-royale/running-the-game.md
similarity index 82%
rename from content/en-us/resources/battle-royale/run-the-game.md
rename to content/en-us/resources/battle-royale/running-the-game.md
index 7b9cca339..c32667e73 100644
--- a/content/en-us/resources/battle-royale/run-the-game.md
+++ b/content/en-us/resources/battle-royale/running-the-game.md
@@ -1,5 +1,5 @@
---
-title: Run the game
+title: Running the Game
comments:
description: Explains the playtest instructions for the Battle Royale game kit.
prev: /resources/battle-royale/installation-and-setup
@@ -25,66 +25,66 @@ Once all six places are published, you're ready to playtest.
4. From the target page, click the large play button to test your game.
-## Game controls
+## Game Controls
The following are the various keyboard and mouse, mobile, and gamepad controls set for this project. See [Inputs](../../input/index.md) for more information on customizing your own controls.
-### General controls
+### General Controls
Action
-
Keyboard and mouse controls
-
Mobile controls
-
Controller controls
+
Keyboard and Mouse Controls
+
Mobile Controls
+
Controller Controls
-
Move forward
+
Move Forward
W or ↑
Move thumbstick forward
Move left analog stick forward
-
Move backward
+
Move Backward
S or ↓
Move thumbstick back
Move left analog stick back
-
Move (strafe) left
+
Move (Strafe) Left
A or ←
Move thumbstick left
Move left analog stick left
-
Move (strafe) right
+
Move (Strafe) Right
D or →
Move thumbstick right
Move left analog stick right
-
Look up
+
Look Up
Move mouse forward
Drag up on main screen area
Move right analog stick forward
-
Look down
+
Look Down
Move mouse backward
Drag down on main screen area
Move right analog stick back
-
Turn left
+
Turn Left
Move mouse left
Drag left on main screen area
Move right analog stick left
-
Turn right
+
Turn Right
Move mouse right
Drag right on main screen area
Move right analog stick right
@@ -108,7 +108,7 @@ The following are the various keyboard and mouse, mobile, and gamepad controls s
Right trigger
-
Shoot full auto
+
Shoot Full Auto
Hold left mouse button
Double-tap main screen area
Hold right trigger
@@ -120,7 +120,7 @@ The following are the various keyboard and mouse, mobile, and gamepad controls s
Left trigger
-
Select weapon
+
Select Weapon
1–9
Tap on-screen weapon button
Left or right bumper
@@ -132,25 +132,25 @@ The following are the various keyboard and mouse, mobile, and gamepad controls s
A
-
Take item
+
Take Item
E
Tap on item
X
-
Open door
+
Open Door
E
Tap on-screen door button
X
-
Toggle minimap
+
Toggle Minimap
M
Tap on-screen minimap display
Press up on DPad
-
Show/hide leaderboard
+
Show/Hide Leaderboard
Tab
Tap on-screen player count display
Press down on DPad
@@ -158,62 +158,62 @@ The following are the various keyboard and mouse, mobile, and gamepad controls s
-### Building controls
+### Building Controls
Action
-
Keyboard and mouse controls
-
Mobile controls
-
Controller controls
+
Keyboard and Mouse Controls
+
Mobile Controls
+
Controller Controls
-
Toggle build mode
+
Toggle Build Mode
Q
Tap on-screen toggle button
B
-
Select building tile
+
Select Building Tile
1–9
Tap on-screen tile button
-
Place building yile
+
Place Building Tile
Click left mouse button
Tap main screen area
Right trigger
-
Rotate building tile
+
Rotate Building Tile
R
Tap on-screen rotate button
Click right analog stick
-
Previous/next building tile
+
Previous/Next Building Tile
Click right mouse button
Tap on-screen previous/next arrow buttons
Left or right bumper
-
Wall tile
+
Wall Tile
Z
Tap on-screen tile button
-
Floor tile
+
Floor Tile
X
Tap on-screen tile button
-
Ramp tile
+
Ramp Tile
C
Tap on-screen tile button
@@ -221,50 +221,50 @@ The following are the various keyboard and mouse, mobile, and gamepad controls s
diff --git a/content/en-us/resources/battle-royale/the-storm.md b/content/en-us/resources/battle-royale/the-storm.md
index 418eac385..623c765c4 100644
--- a/content/en-us/resources/battle-royale/the-storm.md
+++ b/content/en-us/resources/battle-royale/the-storm.md
@@ -1,5 +1,5 @@
---
-title: The storm
+title: The Storm
comments:
prev: /resources/battle-royale/minimap-system
description: Explains the implementation details for the storm feature in the Battle Royale game kit.
@@ -19,11 +19,11 @@ Due to the part size limit, it's not possible to make the storm one huge cylinde
- `ServerScriptService/Core/ShrinkingBarrier`
- `ReplicatedStorage/Core/ShrinkingBarrierVisualization`
-## Customize the storm
+## Customizing the Storm
Within `ReplicatedFirst/Configurations/MainConfiguration`, the following variables can be adjusted to customize the storm:
-### Map offset
+### Map Offset
The default center of the storm is the center of the map, but you can change the `map_offset` value to force players toward another point as the storm boundary shrinks.
@@ -32,7 +32,7 @@ map_size = 2450 * 4,
map_offset = Vector3.new(4900, 0, 4900),
```
-### Storm options
+### Storm Options
Lower down, the `storm` table contains configuration values which determine how the storm behaves during matches, such as its radius, timing, and how much it shrinks.
diff --git a/content/en-us/resources/beyond-the-dark/building-architecture.md b/content/en-us/resources/beyond-the-dark/building-architecture.md
index a47fff029..67a1d3f9a 100644
--- a/content/en-us/resources/beyond-the-dark/building-architecture.md
+++ b/content/en-us/resources/beyond-the-dark/building-architecture.md
@@ -1,5 +1,5 @@
---
-title: Building architecture
+title: Building Architecture
description: Explains the design concepts for architecture in Beyond The Dark.
next: /resources/beyond-the-dark/custom-characters
prev: /resources/beyond-the-dark
@@ -14,7 +14,7 @@ Roblox packages let us achieve this modular design by letting us package togethe
src="../../assets/resources/beyond-the-dark/building-architecture/Architecture-Overview.jpeg"
width="100%" />
-## Flexible designs to final art
+## Flexible Designs to Final Art
When we first started, we didn't have complete understanding of what we wanted to be in the station, or how big it needed to be for 50 players.
@@ -44,7 +44,7 @@ The modular design allowed us to make such changes to the environment without ca
src="../../assets/resources/beyond-the-dark/building-architecture/Architecture_Example_4.jpeg"
width="80%" />
-## Modular design of Kerr-Newman DSR-14
+## Modular Design of Kerr-Newman DSR-14
The space station uses just a handful of modular palette pieces. Modular palette pieces are reusable assets, meaning we don't have to create each wall uniquely but instead can put together several smaller walls. This allows flexibility in layout as we're building.
@@ -79,7 +79,7 @@ The following screenshots show you various ways we used modular design to constr
src="../../assets/resources/beyond-the-dark/building-architecture/Architecture_Example_8.png"
width="80%" />
-## Create trim sheets
+## Creating Trim Sheets
1:1 textures are the way of the future, but they become costly in regards to memory budgets and time to create. For the space station, 90% of the architectural elements used a handful of swappable trim sheet sets, which are a set of texture maps that are laid out in either a vertical or horizontal fashion. Each row or column of the sheet has a unique look to it, giving you a bunch of different surface treatments to choose from when unwrapping a model, all while using one image sheet.
@@ -135,7 +135,7 @@ And here are examples of the same trim sheets being used on a large range of obj
If you want to learn more about Trim Sheet UV Mapping, just search the topic on the web; there are many great tutorials out there.
-## Apply surface appearances
+## Applying Surface Appearances
`Class.SurfaceAppearance` lets you specify new texture inputs to our Physically Based Rendering system for `Class.MeshPart|MeshParts` and lets you override the appearance of a mesh with advanced graphics options, including ColorMap, MetalnessMap, RoughnessMap, and NormalMap. It also makes use of the new dynamic cubemap system that Roblox uses for reflections in materials, such as chrome. For example, here's a side-by-side image of a mesh with SurfaceAppearance applied next to a mesh without it:
@@ -165,7 +165,7 @@ To apply `Class.SurfaceAppearance`:
For more information on Physically Based Rendering (PBR), see Adobe's Substance Designer documentation [Part 1](https://substance3d.adobe.com/tutorials/courses/the-pbr-guide-part-1) and [Part 2](https://substance3d.adobe.com/tutorials/courses/the-pbr-guide-part-2).
-## Increase efficiency with packages
+## Increasing Efficiency with Packages
Packages let you create object instances throughout your Roblox experiences, so that updates you make to the package are published to all instances of that package. We used packages for almost every object we put into the station, so we didn't have to hunt down each placement if we needed to make tweaks. For example, we used over 1,000 wall panel instances of a package and were able to publish updates to them instantly by modifying the package.
diff --git a/content/en-us/resources/beyond-the-dark/custom-characters.md b/content/en-us/resources/beyond-the-dark/custom-characters.md
index e2947f00c..290830858 100644
--- a/content/en-us/resources/beyond-the-dark/custom-characters.md
+++ b/content/en-us/resources/beyond-the-dark/custom-characters.md
@@ -1,5 +1,5 @@
---
-title: Custom characters
+title: Custom Characters
comments: |
1. Needs linking to Rigging / Skinning section in External Modeling.
2. Should also link to Modeling Requirements in end of Rigging section.
@@ -18,7 +18,7 @@ appearance)](/art/modeling/surface-appearance), and VFX to build one of our more
src="../../assets/resources/beyond-the-dark/custom-characters/Creature_Banner.png"
width="100%" />
-## Rig
+## Rigging
When we were rigging the Creature, we found it best to model the character in a neutral pose, because that pose is best suited to bending in multiple directions. If we modeled the Creature with its tentacles already curled, it would have led to stretching if we animated the tentacles to bend in the opposite direction. The following screenshots show the Creature in its natural state:
@@ -48,7 +48,7 @@ We found the following guidelines useful, so that the character mesh imports cor
- Mesh normals should face outward (the model shouldn't look inside-out).
- Skeletons shouldn't have any scale factor; all joints should be [1, 1, 1].
-## Skin
+## Skinning
When we finished the Creature's skeleton, the next step was to skin the mesh. Skinning can be an arduous task, so to make matters easier, it's best to be familiar with the different initial skinning settings of your DCC application to find the one you like.
Since this is an organic character, we skinned it with plenty of falloff on each joint and overlap between them. This way, the bending feels smooth and not sharp. The following screenshots show bad skinning and smooth skinning respectively:
@@ -71,7 +71,7 @@ We found the following guidelines produced the best outcomes for skinning:
- Any joint you want to import into Studio must have some influence on the model's skinning, otherwise the engine doesn't import it.
Whenever possible, skin your model in its original or "bind" pose.
-## Import the mesh to Studio
+## Importing the Mesh to Studio
Importing your custom characters into Studio is one of the more exciting parts of the process, because you get to see your creations in the experience you're building!
@@ -97,7 +97,7 @@ To import the mesh into Studio:
src="../../assets/resources/beyond-the-dark/custom-characters/Custom-Import-2.png"
width="80%" />
-## Make the creature glow
+## Making the Creature Glow
Once the Creature's model was stable and didn't require any more immediate import into Studio, we started putting together the SurfaceAppearance objects, lights, and visual effects. We did this to ensure that the quality of the model was good enough before proceeding to place and edit any one aspect of it.
@@ -134,7 +134,7 @@ In addition, we wanted the Creature's tentacles to emit some particles, so it wo
src="../../assets/resources/beyond-the-dark/custom-characters/Particle-Emitter.jpeg"
width="80%" />
-## Make the VFX follow the character
+## Making the VFX Follow the Character
The skinned character's mesh positions aren't updated when the Creature animates, so we needed a method to make sure the VFX, SFX, and lights all followed the Creature properly. To accomplish this, we created a VFX controller script and used CollectionService to inform the parts that contained the VFX where the creature's bones were and to follow them.
@@ -216,7 +216,7 @@ The skinned character's mesh positions aren't updated when the Creature animates
4. Finally, we added an **AttachedBoneName** custom attribute to the part we wanted to animate and added the precise name of the joint we wanted it to follow.
-## Texture the creature
+## Texturing the Creature
Next, we set up the PBR (Physically Based Rendered) texture maps. These powerful bitmaps give the creature the varied sheen and surface variations to make it look like it has a lot of small bumps and imperfections. This visual effect helps sell the appearance of the Creature when it's closer to the player.
@@ -251,7 +251,7 @@ Here's how we created the surface appearance texture maps:
- Make sure your maps are no bigger than 1024×1024.
- Your green channel may need to be flipped depending on the application you worked in.
-## Animate the creature
+## Animating the Creature
Animating is very subjective and has a personal style. Options include motion capture, hand "key frame" animating in your DCC application, or using Studio's powerful Animation Editor.
@@ -319,7 +319,7 @@ To import an animation:
Check the character after you've closed the Animation Editor to ensure that the **AnimSaves** folder was deleted, as its files are only useful during editing.
-## Final results
+## Final Results
After a few finishing tweaks to colors, light brightnesses, and some more particle effects to give it a stronger halo effect in front of windows, here's the final result in the space station!
diff --git a/content/en-us/resources/beyond-the-dark/index.md b/content/en-us/resources/beyond-the-dark/index.md
index 1b2d6e544..91104ce68 100644
--- a/content/en-us/resources/beyond-the-dark/index.md
+++ b/content/en-us/resources/beyond-the-dark/index.md
@@ -19,8 +19,8 @@ This document goes over how we put the most important parts of the Kerr-Newman D
You can follow the articles sequentially or jump between the following sections:
-- [Building architecture](../../resources/beyond-the-dark/building-architecture.md) explains how to build content in a modular way. This allows you to go from early layouts to a polished experience in the fastest way possible.
-- [Custom characters](../../resources/beyond-the-dark/custom-characters.md) explains how we built the creepy creatures in the station and best practices for building your skinned custom avatars to import into Studio. It also covers some tips for adding visual effects, sound effects, and lights to the character.
-- [Layered clothing](../../resources/beyond-the-dark/layered-clothing.md) shows how we used this new system to leverage the new cage deformer feature to fit suits to these characters.
-- [Sound design](../../resources/beyond-the-dark/sound-design.md) details how we set up Roblox's SoundService and place sounds for maximum immersion.
-- [User interface](../../resources/beyond-the-dark/user-interface.md) describes how to add a literal layer to the experience and digs into how we built the parallax effect on the map as well as the local holo-screens.
+- [Building Architecture](../../resources/beyond-the-dark/building-architecture.md) explains how to build content in a modular way. This allows you to go from early layouts to a polished experience in the fastest way possible.
+- [Custom Characters](../../resources/beyond-the-dark/custom-characters.md) explains how we built the creepy creatures in the station and best practices for building your skinned custom avatars to import into Studio. It also covers some tips for adding visual effects, sound effects, and lights to the character.
+- [Layered Clothing](../../resources/beyond-the-dark/layered-clothing.md) shows how we used this new system to leverage the new cage deformer feature to fit suits to these characters.
+- [Sound Design](../../resources/beyond-the-dark/sound-design.md) details how we set up Roblox's SoundService and place sounds for maximum immersion.
+- [User Interface](../../resources/beyond-the-dark/user-interface.md) describes how to add a literal layer to the experience and digs into how we built the parallax effect on the map as well as the local holo-screens.
diff --git a/content/en-us/resources/beyond-the-dark/layered-clothing.md b/content/en-us/resources/beyond-the-dark/layered-clothing.md
index aa7afaf0a..b4bd9058d 100644
--- a/content/en-us/resources/beyond-the-dark/layered-clothing.md
+++ b/content/en-us/resources/beyond-the-dark/layered-clothing.md
@@ -1,5 +1,5 @@
---
-title: Layered clothing example
+title: Layered Clothing Example
description: Explains the concepts for applying layered clothing in Beyond The Dark.
next: /resources/beyond-the-dark/sound-design
prev: /resources/beyond-the-dark/custom-characters
@@ -13,7 +13,7 @@ We recommend building a base body character upon which you can fit the layered c
For additional layered clothing resources, such as guides, example projects, and reference models, see [3D accessories](../../art/accessories#3d-accessories).
-## Build the custom character
+## Building the Custom Character
We wanted the users in our experience to embody someone sent to the station to investigate some disturbing events. We weren't sure early on what our actual character would be or if there would be multiple types of characters, but we wanted them to wear space suits. Because of this, we decided to make the clothing a separate component which would allow flexibility in our design.
@@ -24,7 +24,7 @@ We ultimately settled on a single character design that we named "The Visitor,"
src="../../assets/resources/beyond-the-dark/layered-clothing/Custom-Character-Example.png"
width="80%" />
-### Make the base body
+### Making the Base Body
The base body is essentially the lowest layer of the layered clothing system. This can be anything from our character's body in underwear, to a fishman or even a blocky avatar.
@@ -38,7 +38,7 @@ Layered Clothing Checklist:
- The poly budget for each part cannot exceed 10,000 triangles.
- Character size cannot exceed 2000×2000×2000 units.
-### Make the model
+### Making the Model
Layered Clothing lets clothes fit on almost any kind of body, whether it be a fishman, a rock golem, or a human space explorer. The only requirements are that they be bipedal humanoids.
@@ -75,7 +75,7 @@ To make sure the parts still appear contiguous, it's recommended you cap your me
src="../../assets/resources/beyond-the-dark/layered-clothing/Seams-Example-2.png"
width="80%" />
-### Texture
+### Texturing
Texturing your characters lets you bring them to life based on how you want them to look. For the space station, we wanted a character that was a similar level of realism as its surroundings and settled on the following character:
@@ -122,7 +122,7 @@ And the following images show skin tone transparency in action in Studio, and sh
src="../../assets/resources/beyond-the-dark/layered-clothing/Texture-Comparisons.png"
width="75%" />
-### Cage
+### Caging
Once we established the base body, we needed to cage it so that layered clothing could fit on it. Cages are the way that the clothing and body interact. Both the body and the clothing have the same cage, deformed by the user to define the clothing's fit. The body cage tells the clothing the shape of the character without all the fine details of the mesh itself. The clothing's inner cage defines how tight the clothing's fit is.
@@ -159,7 +159,7 @@ We decided that we wanted the outer cage to cover the skin, but not the gloves a
src="../../assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-6.png"
width="80%" />
-### Skin
+### Skinning
Skinning the character, similar to Custom Characters, is what gives the organic bending and twisting of your character when moving through the environment. We found the following guidelines useful, so that the character mesh imports correctly into Studio:
@@ -189,7 +189,7 @@ Skinning the character, similar to Custom Characters, is what gives the organic
-### Gloves and boots
+### Gloves and Boots
As you'll notice from the base body, we decided to include gloves and boots. You might want to do this temporarily as well, for the following reasons:
@@ -209,7 +209,7 @@ As you'll notice from the base body, we decided to include gloves and boots. You
src="../../assets/resources/beyond-the-dark/layered-clothing/Caging-With-Gloves.png"
width="80%" />
-## Build the suit
+## Building the Suit
Early on in the process, we decided that the suit should fit onto multiple characters, and that we wanted to release the assets to the Marketplace so others could enjoy the clothing. In addition to Layered Clothing, our character needed "hardpoint" items like a helmet and backpack as finishing touches. The following image shows how the space suit looks on a variety of characters.
@@ -262,7 +262,7 @@ With those guidelines in mind, here are the steps we followed to build the space
src="../../assets/resources/beyond-the-dark/layered-clothing/Clothing-Posing.png"
width="80%" />
-### Texture
+### Texturing
After we skinned the clothing, and it moved the way we intended, we moved to texturing.
@@ -293,7 +293,7 @@ When texturing your clothing, keep the following points in mind:
- Without metalness, the surface appearance defaults to 0 metalness, or a plastic surface.
- Without roughness, the surface appearance defaults to 0 roughness, or a smooth surface.
-### Skin
+### Skinning
Skinning clothing is required to have it bend properly with the base body. By skinning it, you're also telling the animations how the clothing should bend, including which parts are rigid or move with the character.
@@ -320,7 +320,7 @@ Since the gloves were going to be rigid, and the suit top stopped well above the
Once skinning on the suit top was done, we simply repeated the same procedure on the pants to get them ready for Studio and bringing into the engine!
-### Import to Studio
+### Importing to Studio
When the clothing looked good in our DCC application and in Studio, we were ready to import it into Studio and use the Accessory Tool, an upcoming release which will help you refine the clothing's cages to get the best fit possible. The tool can also export clothing as an accessory, which lets you add your clothing to a character.
@@ -331,7 +331,7 @@ In Studio, we named our Layered Clothing items with an LC\_ prefix, so we could
src="../../assets/resources/beyond-the-dark/layered-clothing/Accessories-In-Explorer.png"
width="320" />
-## Build the helmet
+## Building the Helmet
The helmet is an important element of the suit. We wanted users to see the character's face and also capture the sheen of the helmet's glass surface.
@@ -342,7 +342,7 @@ The helmet is an important element of the suit. We wanted users to see the chara
Accessories where we don't want deformation to fit the head, like this helmet, are best built as "hardpoint" accessories, which are the types of accessories that you currently find in the Marketplace. The main difference with the helmet and what you find in the Marketplace is that it uses `Class.SurfaceAppearance`, which creates convincing plastic and metal looks and gives the helmet visor some transparency.
-### Make the model
+### Making the Model
To build a helmet model:
@@ -367,7 +367,7 @@ To build a helmet model:
-### Import to Studio
+### Importing to Studio
When we had the helmet roughly fitted and placed in our DCC application, we could then import it into Studio with all the effects we wanted.
@@ -398,7 +398,7 @@ When we had the helmet roughly fitted and placed in our DCC application, we coul
src="../../assets/resources/beyond-the-dark/layered-clothing/Helmet-Attachments.jpeg"
width="80%" />
-### Introduce the accessory tool
+### Introducing the Accessory Tool
See [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) for more information on converting a mesh or model to an `Class.Accessory`.
diff --git a/content/en-us/resources/beyond-the-dark/sound-design.md b/content/en-us/resources/beyond-the-dark/sound-design.md
index 7e1f89081..645610918 100644
--- a/content/en-us/resources/beyond-the-dark/sound-design.md
+++ b/content/en-us/resources/beyond-the-dark/sound-design.md
@@ -1,5 +1,5 @@
---
-title: Sound design
+title: Sound Design
next: /resources/beyond-the-dark/user-interface
prev: /resources/beyond-the-dark/layered-clothing
description: Explains the design concepts for sound in Beyond The Dark.
@@ -20,7 +20,7 @@ The DSR-14 spaceship contains the following audio that were sent through a custo
- 10 scripted audio events
- 50 3D sounds
-## Design sound assets and effects
+## Designing Sound Assets and Effects
The space station's fish tank emits some of our favorite sounds in the experience. It's a perfect encapsulation of the design philosophy that we employed, using spot ambiences to make the space feel dynamic and fresh every time you enter or exit a distinct area. Other places we did this included neon light buzzes, fans, and the black hole rumble.
@@ -52,7 +52,7 @@ When we layer these sounds together, it fits the object and space very well. How
Other sound assets were created for multiple scripted sequences on the ship, for example the black hole triggering the anti-gravity effect. These assets were largely made from recordings of a toaster oven door, pitched down and run through various reverb and EQ effects. Pitching this source material down implies the large size of the ship, and the reverb does a great job of continuing to reinforce that effect, by making the whole thing feel like a cave. Some synthesized laser elements were also generated and added for additional accent and impact on the events.
-## The mix
+## The Mix
The mix uses a nested bus structure with sound groups, and two sidechain compressors. The main goal of the mix was to create clarity and listener interest.
diff --git a/content/en-us/resources/beyond-the-dark/user-interface.md b/content/en-us/resources/beyond-the-dark/user-interface.md
index 46b6cb181..c32b44fb9 100644
--- a/content/en-us/resources/beyond-the-dark/user-interface.md
+++ b/content/en-us/resources/beyond-the-dark/user-interface.md
@@ -1,12 +1,12 @@
---
-title: User interface
+title: User Interface
prev: /resources/beyond-the-dark/sound-design
description: Explains the design concepts for user-interface effects in Beyond The Dark.
---
We wanted to add an interactive map UI to let users consume information in the space station that looked and felt like it lived in this world. We decided to build the map inside the 3D space instead of on a screen that overlays the experience. This type of diegetic visualization allows for more immersion with the world as opposed to feeling like it is a completely separate experience.
-## Design the map
+## Designing the Map
To design the map:
@@ -23,7 +23,7 @@ To design the map:
src="../../assets/resources/beyond-the-dark/user-interface/UI-Export.png"
width="80%" />
-## Build the map
+## Building the map
Building the map inside Studio involved using `Class.Part|Parts` and `Class.SurfaceGui|SurfaceGuis`.
diff --git a/content/en-us/resources/builder-font-license.md b/content/en-us/resources/builder-font-license.md
index b71e5ffe0..b402fdc67 100644
--- a/content/en-us/resources/builder-font-license.md
+++ b/content/en-us/resources/builder-font-license.md
@@ -1,5 +1,5 @@
---
-title: Builder font license
+title: Builder Font License
description: License for using Roblox's Builder font.
---
diff --git a/content/en-us/resources/city-people-cars.md b/content/en-us/resources/city-people-cars.md
new file mode 100644
index 000000000..c4d34e342
--- /dev/null
+++ b/content/en-us/resources/city-people-cars.md
@@ -0,0 +1,25 @@
+---
+title: City People Cars
+description: A reference Roblox project that includes cars, buildings, and people.
+---
+
+City People Cars was originally built as an internal Roblox demo and is now available as a [public technical demo](https://www.roblox.com/games/6300375759/City-People-Cars). You can also [download](../assets/resources/city-people-cars/CityPeopleCars.rbxl) the `.rbxl` file directly.
+
+CPC features a living, breathing city — cars drive through the streets and obey traffic laws while people walk along the sidewalks. The city was built with a realistic art style, using high detail assets with [PBR textures and surface appearance](../art/modeling/surface-appearance.md) enabled, giving the surfaces additional depth.
+
+
+
+## Features
+
+At a high level, City People Cars contains the following:
+
+- 12,000×12,000 stud map with a large coastal city and outer rural areas.
+- [NPCs](../resources/npc-kit.md) that walk around or drive vehicles through the city.
+- Traffic system — pedestrians and vehicles obey traffic laws.
+- Behavior trees used to drive a variety of NPC behaviors.
+- Basic [weapon system](../resources/weapons-kit.md).
+- Customizable number of NPCs and vehicles/drivers that appear in the city.
+- Support for all platforms, controller types, and screen sizes.
diff --git a/content/en-us/resources/feature-packages/bundles.md b/content/en-us/resources/feature-packages/bundles.md
index d84a07684..262e1c731 100644
--- a/content/en-us/resources/feature-packages/bundles.md
+++ b/content/en-us/resources/feature-packages/bundles.md
@@ -1,5 +1,5 @@
---
-title: Bundles package
+title: Bundles Package
description: Learn about the bundles feature package.
---
@@ -13,7 +13,7 @@ Using the package's customization options, you can tailor your bundles to meet t
For information on how to strategically provide purchase opportunities to meet player needs at key stages of your experience, see [Contextual Purchases](../../production/game-design/contextual-purchases.md). For industry best practices on how implement starter pack bundles, see [Starter Pack Design](../../production/game-design/starter-pack-design.md).
-## Get package
+## Get Package
The **Creator Store** is a tab of the Toolbox that you can use to find all assets that are made by Roblox and the Roblox community for use within your projects, including model, image, mesh, audio, plugin, video, and font assets. You can use the Creator Store to add one or more assets directly into an open experience, including feature packages!
@@ -57,7 +57,7 @@ To get the packages from your inventory into your experience:
1. Navigate to the **Security** tab, then enable **Enable Studio Access to API Services**.
-## Define currencies
+## Defining Currencies
If you do not plan on charging in-experience currencies for any bundles, you can skip this section and configure bundles through `devProductId`.
@@ -141,7 +141,7 @@ end
Specifically, you need to fill out `awardInExperiencePurchase`, which is called by a loop through `Currencies` inside of the example `initializePurchaseHandlers` (i.e. each currencyId is connected to the handler through `Bundles.setInExperiencePurchaseHandler(currencyId, awardInExperiencePurchase)`).
-## Define bundles
+## Defining Bundles
All bundles offerable in your experience can be defined within `ReplicatedStorage.Bundles.Configs.Bundles`, with types exported from the `Types` script in the same folder.
@@ -253,7 +253,7 @@ For example, your entire bundle will likely look like this:
}
```
-## Integrate server logic
+## Integrating Server Logic
Take a look at `ReplicatedStorage.Bundles.Server.Examples.BundlesExample`, which shows how your server will interact with the **Bundles** feature package and the above methods on the `Class.ModuleScript`. The snippets below are from that script.
@@ -385,7 +385,7 @@ Consider the following best practice guidance on redundant recordings of Receipt
- This redundancy helps ensure that all purchase logic has been appropriately handled and that your DataStore+Bundles Feature Package's DataStore reaches eventual consistency, with the your data store being the source of truth.
-## Configure constants
+## Configuring Constants
Constants for the **Core** feature package live in two spots:
@@ -401,7 +401,7 @@ The main things you might want to adjust to meet the design requirements of your
Additionally, you can find strings for translation broken out into one location: `ReplicatedStorage.FeaturePackagesCore.Configs.TranslationStrings`.
-## Customize UI components
+## Customizing UI Components
By modifying the package objects, such as colors, font, and transparency, you can adjust the visual presentation of your bundle prompts. However, keep in mind that if you move any of the objects around hierarchically, the code will not be able to find them, and you'll need to make adjustments to your code.
@@ -417,7 +417,7 @@ The heads up display is also made up of two components:
If you want to have greater control over the heads up display, instead of just using the existing HUD UI within `ReplicatedStorage.Bundles.Objects.BundlesGui`, you can move things around to meet your own design requirements. Just be sure to update client script behavior in the `ReplicatedStorage.Bundles.Client.UIController` script.
-## API reference
+## API Reference
### Types
diff --git a/content/en-us/resources/feature-packages/index.md b/content/en-us/resources/feature-packages/index.md
index 7d06ddbf1..192f02482 100644
--- a/content/en-us/resources/feature-packages/index.md
+++ b/content/en-us/resources/feature-packages/index.md
@@ -1,5 +1,5 @@
---
-title: Feature packages
+title: Feature Packages
description: Feature Packages let you drag and drop fully functional, customizable features directly into your experiences.
---
@@ -43,7 +43,7 @@ style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
-
@@ -143,7 +143,7 @@ style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
diff --git a/content/en-us/resources/feature-packages/missions.md b/content/en-us/resources/feature-packages/missions.md
index 12a263e12..4d7434339 100644
--- a/content/en-us/resources/feature-packages/missions.md
+++ b/content/en-us/resources/feature-packages/missions.md
@@ -1,5 +1,5 @@
---
-title: Missions package
+title: Missions Package
description: Learn about the missions feature package.
---
@@ -17,7 +17,7 @@ Using the package's customization options, you can personalize all missions to m
For information on how to provide players with fresh goals and incentives so that they're motivated to play longer and increase their engagement, see [Introduction to Quest Design](../../production/game-design/introduction-to-quest-design.md).
-## Get package
+## Get Package
The **Creator Store** is a tab of the Toolbox that you can use to find all assets that are made by Roblox and the Roblox community for use within your projects, including model, image, mesh, audio, plugin, video, and font assets. You can use the Creator Store to add one or more assets directly into an open experience, including feature packages!
@@ -55,11 +55,11 @@ To get the packages from your inventory into your experience:
5. Click the **Feature Package Core** tile, then the **Missions Feature Package** tile. Both package folders display in the **Explorer** window.
6. Drag the package folders into **ReplicatedStorage**.
-## Define missions
+## Defining Missions
Each completeable mission includes a set of tasks that must be finished to complete the mission, configuration options, and optional display metadata, all of which can be defined within `ReplicatedStorage.Missions.Configs.Missions`, with types exported from the `Types` script in the same folder.
-### Required fields
+### Required Fields
The following fields are required for each mission.
@@ -90,7 +90,7 @@ The following fields are required for each mission.
-### Unlock conditions
+### Unlock Conditions
By default, missions are unlocked for players automatically and can be completed exactly once. However, you can use the following **optional** configuration options to alter this behavior.
@@ -202,7 +202,7 @@ Missions have metadata that specifies how they will be displayed in the Missions
-## Define tasks
+## Defining Tasks
Each mission can have zero or more tasks. If a mission has zero tasks, it is claimable immediately after it's unlocked; if a mission has one or more tasks, once the tasks are complete, the player can collect any rewards associated with the mission. Each task has a `taskId`, which is the key associated with the task for a given mission.
@@ -245,7 +245,7 @@ Both task types share the following fields:
-### Count tasks fields
+### Count Tasks Fields
Count tasks have a required value. When the task progress meets this amount, the task is complete.
@@ -266,7 +266,7 @@ Count tasks have a required value. When the task progress meets this amount, the
-### Time tasks fields
+### Time Tasks Fields
Time tasks have a target amount of time spent, and are started and stopped. When the target amount of time is met, the task is complete.
@@ -297,7 +297,7 @@ Time tasks have a target amount of time spent, and are started and stopped. When
-## Configure categories
+## Configuring Categories
Categories do not have to be explicitly defined to be used, as the category for a mission has default values that will be used. However, you can configure these values in `ReplicatedStorage.Missions.Configs.Categories` to add additional effects to the category. Categories are identified by unique `CategoryIds`, the same ones referenced in the missions config.
@@ -318,7 +318,7 @@ Categories do not have to be explicitly defined to be used, as the category for
-## Integrate server logic
+## Integrating Server Logic
Take a look at `ReplicatedStorage.Missions.Server.Examples.MissionsExample`, which shows how your server will interact with the **Missions** feature package.
@@ -366,7 +366,7 @@ You mainly need to hook up four things once dragging the **Missions** feature pa
Missions.unlockMission(player, "Manual")
```
-## Configure constants
+## Configuring Constants
Constants for the **Core** feature package live in two spots:
@@ -376,7 +376,7 @@ Constants for the **Core** feature package live in two spots:
Additionally, you can find strings for translation broken out into one location: `ReplicatedStorage.FeaturePackagesCore.Configs.TranslationStrings`.
-## Customize UI components
+## Customizing UI Components
By modifying the package objects, such as colors, font, and transparency, you can adjust the visual presentation of your missions UI. For example, in `ReplicatedStorage.Missions.Configs.Constants`, you can enable `SingleTaskMode` to display a progress bar for a task directly on the mission itself for missions that only have a single task.
diff --git a/content/en-us/resources/feedback-guidelines.md b/content/en-us/resources/feedback-guidelines.md
new file mode 100644
index 000000000..b12c600de
--- /dev/null
+++ b/content/en-us/resources/feedback-guidelines.md
@@ -0,0 +1,26 @@
+---
+title: Feedback Guidelines
+description: Provides guidelines for feedback on the documentation.
+---
+
+If you want to provide feedback on the documentation, first off, thank you! We rely on contributions and bug reports to help improve our content, and we of course love hearing about what we're doing well. Following our submission guidelines can help us quickly reproduce any issues you might have encountered.
+
+## Include Key Details
+
+- If some element of the site isn't working properly, list the steps that cause the problem and any relevant browser extensions.
+
+ If the behavior occurs inconsistently, note how often it occurs and the situations in which it seems to occur most often.
+
+- If the content is inaccurate or misleading, include the problematic text or section header. Feel free to suggest an improved wording.
+
+### Example Feedback
+
+> "The **Clothing** and **Environment** tabs on the PBR Textures page aren't working on Firefox for Windows."
+>
+> "The 3D Importer page says that it allows you to import `.fbx` files, but it also supports `.obj` files."
+>
+> "This page does an incredible job explaining the purpose of module scripts, but it was hard to find. Have you considered linking to it from the reference documentation?
+
+## Don't Include Personal Information
+
+We don't need or want your personal information! Please only include the information necessary to reproduce and troubleshoot your issue.
diff --git a/content/en-us/resources/limited-use-license.md b/content/en-us/resources/limited-use-license.md
index a92250ea6..1adc7b295 100644
--- a/content/en-us/resources/limited-use-license.md
+++ b/content/en-us/resources/limited-use-license.md
@@ -1,5 +1,5 @@
---
-title: Limited use license
+title: Limited Use License
comments: Referenced in some project example pages -- easier to have this as a separate doc.
description: Roblox's Limited Use License.
---
diff --git a/content/en-us/resources/modules/emote-bar.md b/content/en-us/resources/modules/emote-bar.md
index 1fc8043d8..ea12de1f0 100644
--- a/content/en-us/resources/modules/emote-bar.md
+++ b/content/en-us/resources/modules/emote-bar.md
@@ -7,7 +7,7 @@ Emotes are a core component of any social experience. The **EmoteBar** [develope
-## Module usage
+## Module Usage
### Installation
@@ -75,7 +75,7 @@ The module is preconfigured with 7 emotes and it can be easily customized with y
Also note that this developer module will modify the local user's emotes via `Class.HumanoidDescription:SetEmotes()`, meaning that calls to `Class.HumanoidDescription:GetEmotes()` will return values modified by this module.
-### Mega emotes
+### Mega Emotes
A **mega emote** is formed when multiple players in the same area perform the same emote at the same time. As more and more players join in, the mega emote grows larger. As players stop performing the emote, the mega emote grows smaller until eventually it disappears.
@@ -85,7 +85,7 @@ A **mega emote** is formed when multiple players in the same area perform the sa
An emote's **tempo** is the speed at which it plays when its button is tapped once. The default speed of an emote is determined by its `defaultTempo`. An emote's speed can be increased or decreased by tapping its button faster or slower.
-## API reference
+## API Reference
### Types
diff --git a/content/en-us/resources/modules/event-sequencer.md b/content/en-us/resources/modules/event-sequencer.md
index 04b224806..66ccc16a3 100644
--- a/content/en-us/resources/modules/event-sequencer.md
+++ b/content/en-us/resources/modules/event-sequencer.md
@@ -19,7 +19,7 @@ To see **EventSequencer** in action within an editable place, check out the [Con
-## Module usage
+## Module Usage
### Installation
@@ -47,17 +47,17 @@ To use the **EventSequencer** framework in an experience:
-### Framework modes
+### Framework Modes
-#### Replace mode
+#### Replace Mode
-The default framework mode is **replace mode** in which you design unique [scenes](#create-scenes) by placing [3D objects](../../parts/index.md), [terrain](../../parts/terrain.md), [lighting properties](../../environment/lighting.md), [environmental effects](../../environment/index.md#environment), and user interface objects into that scene's **Environment** folder. When a scene loads, those objects and properties get distributed into `Class.Workspace`, `Class.Terrain`, and `Class.Lighting`, **replacing** existing objects/properties to form a cloned space.
+The default framework mode is **replace mode** in which you design unique [scenes](#creating-scenes) by placing [3D objects](../../parts/index.md), [terrain](../../parts/terrain.md), [lighting properties](../../environment/lighting.md), [environmental effects](../../environment/index.md#environment), and user interface objects into that scene's **Environment** folder. When a scene loads, those objects and properties get distributed into `Class.Workspace`, `Class.Terrain`, and `Class.Lighting`, **replacing** existing objects/properties to form a cloned space.
This mode is best for **new** event experiences consisting of multiple sequential scenes, such as a pre-show venue to the main concert to a post-show party.
-#### Inline mode
+#### Inline Mode
An alternate framework mode is **inline mode** in which you similarly design unique [scenes](#creating-scenes) with scripting logic for their flow/events, but the framework will **not** destroy existing [3D objects](../../parts/index.md), [terrain](../../parts/terrain.md), [lighting properties](../../environment/lighting.md), [environmental effects](../../environment/index.md#environment), and user interface objects in order to clone assets/properties from a scene's **Environment** folder upon loading.
@@ -75,7 +75,7 @@ To enable inline mode:
-### Create scenes
+### Creating Scenes
A **scene** is essentially part of an overall event or a cutscene wrapped up in a series of folders. Each scene contains scripting logic that defines its flow/events, and a scene can store its own [3D objects](../../parts/index.md), [terrain](../../parts/terrain.md), [lighting properties](../../environment/lighting.md), [environmental effects](../../environment/index.md#environment), and user interface objects.
@@ -93,7 +93,7 @@ To get started quickly, you can find an empty scene inside the module's main fol
While developing an event, you can alternatively place scenes elsewhere in the [Explorer](../../studio/explorer.md) hierarchy and tag them with **SequencerScene** using the [Tags](../../studio/properties.md#instance-tags) section of their properties, or Studio's [Tag Editor](../../studio/view-tab.md#windows-and-tools) (**BlankScene** is already tagged as such). However, you'll need to move all event-ready scenes to **ReplicatedStorage** in order for them to work within the overall event flow.
-#### Time length
+#### Time Length
Each scene should have a **time length**, in seconds, defining its duration — just like a movie or concert has a set duration. Time length is defined as a numeric [attribute](../../studio/properties.md#instance-attributes) on the scene's folder named **TimeLength** which you can set directly in Studio or programmatically through `Class.Instance:SetAttribute()`.
@@ -159,11 +159,11 @@ This script executes [schema](#scene-schemas) logic on the client.
This script executes [schema](#scene-schemas) logic on the server.
-### Scene schemas
+### Scene Schemas
A scene's **schema** defines what happens at what point in the scene's timeline. You should define a scene's schema in both its [Client](#client) and [Server](#server) modules and include **lifecycle hooks** to manage when **configurations** occur.
-#### Lifecycle hooks
+#### Lifecycle Hooks
Schema [lifecycle hooks](#schema-lifecycle-hooks) let you manage when scene operations occur. A scene in production will typically run in the most simple flow:
@@ -185,7 +185,7 @@ Schema [configurations](#schema-configurations) define the core operations of a
You can use configurations in both the [Client](#client) and [Server](#server) module schemas, but it's recommended that you perform operations like [audio](#audio) and [animations](#animate) on the client side, just like in a typical experience.
-### Seek scenes
+### Seeking Scenes
A unique feature of **EventSequencer** is the ability to "seek" around scenes as you might seek through a video. In [Replace Mode](#replace-mode), you can also switch between scenes to preview an entire multi-scene event before deploying it to production.
@@ -229,9 +229,9 @@ A unique feature of **EventSequencer** is the ability to "seek" around scenes as
-## Scene manager plugin
+## Scene Manager Plugin
-The [Scene Manager](https://www.roblox.com/library/9995053698/Scene-Manager) plugin is a useful tool for loading and unloading scenes, [lighting](#save-and-load-lighting), and [terrain](#save-and-load-terrain). Unless you're using [Inline Mode](#inline-mode), it's highly recommended that you use this plugin instead of manually placing/editing scene objects and properties.
+The [Scene Manager](https://www.roblox.com/library/9995053698/Scene-Manager) plugin is a useful tool for loading and unloading scenes, [lighting](#saving-and-loading-lighting), and [terrain](#saving-and-loading-terrain). Unless you're using [Inline Mode](#inline-mode), it's highly recommended that you use this plugin instead of manually placing/editing scene objects and properties.
This plugin is not intended for usage with [Inline Mode](#inline-mode), as that mode expects you to use existing assets and global property settings for the place, not load in scene-specific assets/properties from the scene's [Environment](#environment) folder.
@@ -254,9 +254,9 @@ To install the plugin:
4. Click the plugin's icon to view its details and then click the **Install** button.
5. Once the plugin is installed, it appears in Studio's [Plugins](../../studio/plugins-tab.md) tab.
-### Load and unload scenes
+### Loading and Unloading Scenes
-As outlined in [creating scenes](#create-scenes), a scene's **Environment** folder contains everything that users see and hear, including [3D objects](../../parts/index.md). The plugin helps you quickly load a scene's assets into or out of organized folders within the workspace.
+As outlined in [Creating Scenes](#creating-scenes), a scene's **Environment** folder contains everything that users see and hear, including [3D objects](../../parts/index.md). The plugin helps you quickly load a scene's assets into or out of organized folders within the workspace.
Scenes must be tagged with **SequencerScene** for the plugin to recognize them (**BlankScene** is already tagged as such). A tool such as the **Tag Editor**, accessible from the [View](../../studio/view-tab.md) tab, may be helpful. If you've created a scene but it doesn't appear in the plugin, make sure that it's tagged, then save and reopen the place.
@@ -265,7 +265,7 @@ Scenes must be tagged with **SequencerScene** for the plugin to recognize them (
-
Plugin action
+
Plugin Action
Description
@@ -293,7 +293,7 @@ Scenes must be tagged with **SequencerScene** for the plugin to recognize them (
-### Save and load lighting
+### Saving and Loading Lighting
The top-level `Class.Lighting` service stores all of a place's lighting properties and visual effects. Since it's a top-level service, you cannot manually move it to a particular scene's **Environment**/**Server** or **Environment**/**Client** folder. Instead, you can utilize the plugin to copy its properties and children to the scene's **Environment**/**Lighting** folder.
@@ -326,7 +326,7 @@ The top-level `Class.Lighting` service stores all of a place's lighting properti
The framework also applies a **UseCurrentLighting** attribute to the top-level `Class.Lighting` service with a default of **false**. If set to **true**, the service's lighting overrides all scene-specific lighting during playtesting — however, scene lighting always takes precedence in a published event. As a real world analogy, this lets you stage a concert in full light before "turning down the lights" as the show begins.
-### Save and load terrain
+### Saving and Loading Terrain
Since `Class.Terrain` is a top-level class within `Class.Workspace`, you cannot manually move generated or sculpted terrain to a particular scene's **Environment**/**Server** or **Environment**/**Client** folder. Instead, you can utilize the plugin to copy it to the scene's **Environment**/**Terrain** folder.
@@ -345,9 +345,9 @@ Since `Class.Terrain` is a top-level class within `Class.Workspace`, you cannot
If a scene contains absolutely no terrain, you should still click **Save Terrain** for it. This saves an "empty" terrain region for the scene and effectively clears all terrain from any scene shown before it.
-## API reference
+## API Reference
-### Schema lifecycle hooks
+### Schema Lifecycle Hooks
#### OnSetup
@@ -449,7 +449,7 @@ end
In cases like a post-show venue which may be considered "endless," omit the **OnEndScene** lifecycle event and make the [TimeLength](#time-length) value as long as needed to accommodate all of your schema [configurations](#configurations). Also, do not [inform](#inform) anything to the schema, as those things will be cleaned up when the scene reaches its time length.
-### Schema configurations
+### Schema Configurations
#### audio
@@ -786,7 +786,7 @@ end
#### inform
-Informs the framework of any modules, UI objects, connections, etc. which are created in the [OnRun](#onrun) lifecycle hook, ensuring they are properly cleaned up when [seeking](#seek-scenes). Use cases include:
+Informs the framework of any modules, UI objects, connections, etc. which are created in the [OnRun](#onrun) lifecycle hook, ensuring they are properly cleaned up when [seeking](#seeking-scenes). Use cases include:
- Informing the framework of a temporary ad-hoc connection such as `Class.RunService.Heartbeat` so that the connection is cleaned up when seeking to an earlier point in the scene's duration.
@@ -859,7 +859,7 @@ Informs the framework of any modules, UI objects, connections, etc. which are cr
```
-While **inform** is critical for [seeking](#seek-and-switch-scenes) support, you should only use it to inform the framework of any module, UI object, connection, etc. that is created/initialized during the [OnRun](#onrun) lifecycle hook. If you want to reference something throughout the entirety of the scene, simply initialize it in [OnSetup](#onsetup) and clean it up in [OnEndScene](#onendscene).
+While **inform** is critical for [seeking](#seeking-and-switching-scenes) support, you should only use it to inform the framework of any module, UI object, connection, etc. that is created/initialized during the [OnRun](#onrun) lifecycle hook. If you want to reference something throughout the entirety of the scene, simply initialize it in [OnSetup](#onsetup) and clean it up in [OnEndScene](#onendscene).
### Functions
@@ -967,7 +967,7 @@ end)
setSeekingPermissions(permissions: `Library.table`)
-Grants seeking permission based on the event's `Class.DataModel.PlaceId|PlaceId` as well as specific `Class.Player.UserId|UserIds` and/or [groups](../../projects/groups.md) and roles within them. See [seek and switch scenes](#seek-scenes) for more information.
+Grants seeking permission based on the event's `Class.DataModel.PlaceId|PlaceId` as well as specific `Class.Player.UserId|UserIds` and/or [groups](../../projects/groups.md) and roles within them. See [Seeking and Switching Scenes](#seeking-scenes) for more information.
#### getCurrentSceneEnvironment
diff --git a/content/en-us/resources/modules/friends-locator.md b/content/en-us/resources/modules/friends-locator.md
index cfeb3532c..4a7fd4e80 100644
--- a/content/en-us/resources/modules/friends-locator.md
+++ b/content/en-us/resources/modules/friends-locator.md
@@ -7,7 +7,7 @@ It can be challenging to locate friends in-experience. The **FriendsLocator** [d
-## Module usage
+## Module Usage
### Installation
@@ -35,7 +35,7 @@ To use the **FriendsLocator** module in an experience:
-### Test in Studio
+### Testing in Studio
To test the module in Studio, the **FriendsLocator** module must be run in a multi-client simulation, since no friends will be present in a solo playtest.
@@ -69,14 +69,14 @@ To test the module in Studio, the **FriendsLocator** module must be run in a mul
- By default, clicking/tapping a friend's icon will teleport your character to that character's location. If you keep this default behavior and you find that streaming pause is occurring under the [instance streaming](../../workspace/streaming.md) architecture, you may want to [request area streaming](../../workspace/streaming.md#request-area-streaming) around the teleport location as shown in the [clicked](#clicked) event code sample.
+ By default, clicking/tapping a friend's icon will teleport your character to that character's location. If you keep this default behavior and you find that streaming pause is occurring under the [instance streaming](../../workspace/streaming.md) architecture, you may want to [request area streaming](../../workspace/streaming.md#requesting-area-streaming) around the teleport location as shown in the [clicked](#clicked) event code sample.
-### Connect to events
+### Connecting to Events
The **FriendsLocator** module exposes [events](#events) so that you can introduce custom behaviors when users interact with a locator icon.
-1. Make sure that you've created the **ConfigureFriendsLocator** script outlined in [testing in Studio](#test-in-studio).
+1. Make sure that you've created the **ConfigureFriendsLocator** script outlined in [Testing in Studio](#testing-in-studio).
2. Add lines 8 and 11-13 to the script:
```lua title='LocalScript - ConfigureFriendsLocator' highlight='8,11-13'
@@ -95,9 +95,9 @@ The **FriendsLocator** module exposes [events](#events) so that you can introduc
end)
```
-3. Conduct a [multi-client test](#test-in-studio) and click on another character's locator icon. Notice that your character does not teleport to that location, and the event triggers to allow for custom handling of icon clicks.
+3. Conduct a [multi-client test](#testing-in-studio) and click on another character's locator icon. Notice that your character does not teleport to that location, and the event triggers to allow for custom handling of icon clicks.
-### Custom locator UI
+### Custom Locator UI
If the default style does not fit your experience, you can replace the default avatar portrait UI with your own UI.
@@ -126,7 +126,7 @@ To replace the default UI:
The module will look for these items and display the friend's avatar portrait and/or display name respectively.
-## API reference
+## API Reference
### Functions
diff --git a/content/en-us/resources/modules/index.md b/content/en-us/resources/modules/index.md
index f28716b6c..422aa96bc 100644
--- a/content/en-us/resources/modules/index.md
+++ b/content/en-us/resources/modules/index.md
@@ -1,63 +1,63 @@
---
-title: Developer modules
-description: Developer modules let you easily add powerful social features to your experiences.
+title: Developer Modules
+description: Developer Modules let you easily add powerful social features to your experiences.
---
-**Developer modules** let you easily add powerful social features to your experiences. Each module is **designed to work out of the box**, so the moment you press play it will simply work. If this isn't your style, you can configure each module to work in different ways.
+**Developer Modules** let you easily add powerful social features to your experiences. Each module is **designed to work out of the box**, so the moment you press play it will simply work. If this isn't your style, you can configure each module to work in different ways.
-
+
Pose and capture memorable moments
-
+
Sell avatar assets and more in an experience
-
+
Easily spot your friends and teleport to them
-
+
Join an experience right next to your friends
-
+
Express yourself and have dance parties
-
+
Craft your identity within an experience
-
+
Strike a pose with a unique background
-
+
Literally leave your mark in an experience
-
+
Encourage players to explore your space
-
+
Add a touch of realism to your avatars
-
+
Build live events on a structured sequence
diff --git a/content/en-us/resources/modules/merch-booth.md b/content/en-us/resources/modules/merch-booth.md
index 5336dfd5f..45a4525e3 100644
--- a/content/en-us/resources/modules/merch-booth.md
+++ b/content/en-us/resources/modules/merch-booth.md
@@ -11,7 +11,7 @@ The **MerchBooth** [developer module](../../resources/modules/index.md) lets you
To offer assets created by third parties in the merch booth, make sure **Allow Third Party Sales** is enabled from the **Security** section of the [Game Settings](../../studio/game-settings.md) window. If this setting is disabled, you will not be able to sell UGC assets created by other users.
-## Module usage
+## Module Usage
### Installation
@@ -65,11 +65,11 @@ The module is preconfigured to work for most use cases, but it can be easily cus
-### Add items
+### Adding Items
What's a merch booth without merch? The following sections outline how to add [avatar assets](#avatar-assets), [passes](#passes), and [developer products](#developer-products) to your merch booth.
-#### Avatar assets
+#### Avatar Assets
Items such as [clothing and accessories](../../art/accessories/index.md) must be added through their **asset ID** located on the item's detail page in the [Avatar Shop](https://www.roblox.com/catalog).
@@ -183,7 +183,7 @@ Adding [passes](../../production/monetization/game-passes.md) requires pass IDs
end
```
-#### Developer products
+#### Developer Products
Adding [developer products](../../production/monetization/developer-products.md) requires product IDs which can be located in the [Creator Dashboard](https://create.roblox.com/dashboard/creations).
@@ -239,7 +239,7 @@ Adding [developer products](../../production/monetization/developer-products.md)
end
```
-### Custom catalog button
+### Custom Catalog Button
By default, a right-side **catalog button** lets players open the booth at any time.
@@ -268,7 +268,7 @@ In some cases, it may be useful to [remove](#togglecatalogbutton) this button an
end)
```
-### Shoppable regions
+### Shoppable Regions
A helpful way to drive purchases in your experience is to automatically show the merch booth when a player enters an area.
@@ -334,7 +334,7 @@ To create a shoppable region:
CollectionService:GetInstanceAddedSignal("ShopRegion"):Connect(setupRegion)
```
-### Proximity prompts
+### Proximity Prompts
As an alternative to the 2D catalog view, you can add **proximity prompts** over in-experience objects. This encourages players to discover items in the 3D environment, preview them on their own avatar, purchase them, and instantly equip them. See [addProximityButton](#addproximitybutton) for details.
@@ -344,7 +344,7 @@ As an alternative to the 2D catalog view, you can add **proximity prompts** over
If a player has opened an item view through a proximity prompt, it automatically closes when the player moves further away from the prompt object than its activation distance. If you want to keep the booth open regardless of the player's distance from the prompt, set `closeWhenFarFromPrompt` to `false` in a [configure](#configure) call.
-### Change the equip effect
+### Changing the Equip Effect
By default, the merch booth shows a generic sparkle effect when a player equips an item from it. To change the effect, set `particleEmitterTemplate` to your own instance of a `Class.ParticleEmitter` in a [configure](#configure) call.
@@ -365,7 +365,7 @@ MerchBooth.configure({
})
```
-### GUI visibility
+### GUI Visibility
By default, the merch booth hides all `Class.ScreenGui|ScreenGuis` and `Class.CoreGui|CoreGuis` when its UI appears, including the chat, leaderboard, and others included by Roblox. If you want to disable this behavior, set `hideOtherUis` to `false` in a [configure](#configure) call.
@@ -379,7 +379,7 @@ MerchBooth.configure({
})
```
-### Character movement
+### Character Movement
It can be advantageous to prevent a character from moving while they are in the merch booth. This can be done by setting `disableCharacterMovement` to `true` in a [configure](#configure) call.
@@ -393,7 +393,7 @@ MerchBooth.configure({
})
```
-## API reference
+## API Reference
### Types
diff --git a/content/en-us/resources/modules/photo-booth.md b/content/en-us/resources/modules/photo-booth.md
index 3c310a379..8ce4f46ff 100644
--- a/content/en-us/resources/modules/photo-booth.md
+++ b/content/en-us/resources/modules/photo-booth.md
@@ -7,7 +7,7 @@ Taking a photo is a perfect way to commemorate a great experience. The **PhotoBo
-## Module usage
+## Module Usage
### Installation
@@ -35,7 +35,7 @@ To use the **PhotoBooth** module in an experience:
-### Position the booth
+### Positioning the Booth
The module comes with one **PhotoBooth** model that you can position in the 3D world. This model is what players will interact with to set up a photo.
@@ -73,7 +73,7 @@ The module is preconfigured to work for most use cases, but it can be easily cus
-### Connect to events
+### Connecting to Events
Every time the photo booth displays a new screen to a local client, a corresponding event is fired. These events can be connected in a `Class.LocalScript` so that you can respond with your own custom logic.
@@ -95,7 +95,7 @@ PhotoBooth.promptShown:Connect(function()
end)
```
-### GUI visibility
+### GUI Visibility
By default, the photo booth hides all `Class.ScreenGui|ScreenGuis` and `Class.CoreGui|CoreGuis` when a photo is staged. If you want to override this auto-hiding behavior and programmatically decide which GUIs should remain visible, include the [hideOtherGuis](#hideotherguis) and [showOtherGuis](#showotherguis) callbacks and respond with your own custom logic.
@@ -149,7 +149,7 @@ PhotoBooth.showOtherGuis(function()
end)
```
-## API reference
+## API Reference
### Functions
diff --git a/content/en-us/resources/modules/profile-card.md b/content/en-us/resources/modules/profile-card.md
index 3a193f903..a82c4132d 100644
--- a/content/en-us/resources/modules/profile-card.md
+++ b/content/en-us/resources/modules/profile-card.md
@@ -7,7 +7,7 @@ It can be interesting to learn about other players. The **ProfileCard** [develop
-## Module usage
+## Module Usage
### Installation
@@ -88,7 +88,7 @@ Note that players under the age of 13 will only see the status message if it's a
-## API reference
+## API Reference
### Functions
diff --git a/content/en-us/resources/modules/scavenger-hunt.md b/content/en-us/resources/modules/scavenger-hunt.md
index c4c31c07f..4aa9bf84d 100644
--- a/content/en-us/resources/modules/scavenger-hunt.md
+++ b/content/en-us/resources/modules/scavenger-hunt.md
@@ -11,7 +11,7 @@ The **ScavengerHunt** [developer module](../../resources/modules/index.md) gives
This module utilizes [data stores](../../cloud-services/data-stores). To test it in Studio, make sure **Enable Studio Access to API Services** is enabled from the **Security** section of the [Game Settings](../../studio/game-settings.md) window.
-## Module usage
+## Module Usage
### Installation
@@ -39,7 +39,7 @@ To use the **ScavengerHunt** module in an experience:
-### Use tokens
+### Using Tokens
The scavenger hunt module uses **tokens** as the items which players search for and collect. The module comes with one token model that you can position in the 3D world.
@@ -79,7 +79,7 @@ Remember that each token must have a unique name as a means of tracking player p
The module will automatically disable the `Class.BasePart.CanCollide|CanCollide` property of tokens at runtime so that players do not physically collide with them. As such, all tokens should be **anchored** so they do not fall through the world geometry.
-### Use regions
+### Using Regions
Regions differ slightly from tokens, as large areas that are marked as "collected" once the player enters them. Additionally, when a player leaves the region, the flavor text modal automatically dismisses and the region itself is removed from the workspace.
@@ -113,7 +113,7 @@ The module is preconfigured to work for most use cases, but it can be easily cus
})
```
-### Collection events
+### Collection Events
Every time a player collects a token or enters a region, the [collected](#collected) event fires. You can listen to this event from a server-side `Class.Script` and respond accordingly. The connected function receives the `Class.Player` that collided with the token or entered the region and that token or region's name.
@@ -162,7 +162,7 @@ end)
When using custom modals, be sure to provide a way for players to close/hide them, or an automatic dismissal after a delay.
-### GUI visibility
+### GUI Visibility
By default, the scavenger hunt hides all `Class.ScreenGui|ScreenGuis` and `Class.CoreGui|CoreGuis` (except for the player list) when the info modal or completion modal appears. If you want to override this auto-hiding behavior and programmatically decide which GUIs should remain visible, include the [hideOtherGuis](#hideotherguis) and [showOtherGuis](#showotherguis) callbacks and respond with your own custom logic.
@@ -214,7 +214,7 @@ ScavengerHunt.showOtherGuis(function()
end)
```
-## API reference
+## API Reference
### Functions
diff --git a/content/en-us/resources/npc-kit.md b/content/en-us/resources/npc-kit.md
index 5c830b5f7..781d74fd9 100644
--- a/content/en-us/resources/npc-kit.md
+++ b/content/en-us/resources/npc-kit.md
@@ -1,5 +1,5 @@
---
-title: NPC kit
+title: NPC Kit
description: The NPC Kit provides several pre-built, customizable NPCs for use an any experience.
---
@@ -41,14 +41,14 @@ To use an NPC in your game:
5. Locate the NPC and click it to add it into the place.
-## Character structure
+## Character Structure
Each NPC model typically contains the following objects:
-
Object name or [Type]
+
Object Name or [Type]
Type
Description
@@ -120,7 +120,7 @@ Each NPC model typically contains the following objects:
**Square brackets []** refer to the object in general and the name doesn't matter. For example, [Model] refers to the weapon's `Class.Model` and you can rename it to whatever makes sense.
-### Design notes
+### Design Notes
When using the NPC kit, keep in mind the following design notes:
@@ -137,7 +137,7 @@ The Animate `Class.Script` in the NPC `Class.Model` handles [animation](../anima
-
Object name or [Type]
+
Object Name or [Type]
Type
Description
@@ -168,7 +168,7 @@ The BodyPart `Class.BasePart` in the NPC `Class.Model` represent the various cha
-
Object name or [Type]
+
Object Name or [Type]
Type
Description
@@ -214,7 +214,7 @@ Each NPC includes a `Class.Configuration` object within its hierarchy which acts
-
Object name or [Type]
+
Object Name or [Type]
Type
Description
@@ -273,7 +273,7 @@ Each NPC includes a `Class.Configuration` object within its hierarchy which acts
-## Assign tags
+## Assigning Tags
The **NPC** script uses `Class.CollectionService` tags to manage aggression toward other characters and players. Various tags from the following table can be assigned as follows:
diff --git a/content/en-us/resources/plant-reference-project.md b/content/en-us/resources/plant-reference-project.md
index 58ecf6ac1..3ac68a104 100644
--- a/content/en-us/resources/plant-reference-project.md
+++ b/content/en-us/resources/plant-reference-project.md
@@ -1,5 +1,5 @@
---
-title: Plant reference project
+title: Plant Reference Project
description: A deep dive into building of the Plant experience, a game where players plant seeds and harvest plants.
---
@@ -15,12 +15,12 @@ an experience on Roblox. Where applicable, you'll find notes on tradeoffs,
compromises, and the rationale of various implementation choices, so you can
make the best decision for your own experiences.
-## Get the file
+## Get the File
1. Navigate to the Plant experience page.
1. Click the **⋯** button and **Edit in Studio**.
-## Use cases
+## Use Cases
[Plant][planturl] covers the following use cases:
@@ -42,14 +42,14 @@ Note that there are several use cases in this experience that are too small, too
niche, or don't demonstrate a solution to an interesting design challenge; these
are not covered.
-## Project structure
+## Project Structure
The first decision when creating an experience is deciding how to structure the
[project](../projects/), which mainly includes where to place specific instances
in the [data model](../projects/data-model.md) and how to organize and structure
entry points for both client and server code.
-### Data model
+### Data Model
The following table describes which container services in the data model instances are placed in.
@@ -57,7 +57,7 @@ The following table describes which container services in the data model instanc
Service
-
Types of instances
+
Types of Instances
@@ -114,7 +114,7 @@ The following table describes which container services in the data model instanc
-### Entry points
+### Entry Points
Most projects organize code inside reusable `Class.ModuleScript|ModuleScripts`
that can be imported across the entire codebase.
@@ -133,12 +133,12 @@ entry provides greater control over the order in which systems are executed in.
The following lists describe the tradeoffs of both approaches:
-
+
- A single `Class.Script` and a single `Class.LocalScript` cover server and client code respectively.
- Greater control over the order in which different systems are started because all code is initialized from a single script.
- Can pass objects by reference between systems.
-
+
- New `Class.Script` or `Class.LocalScript` objects are created as needed.
- Greater ability to isolate code.
- Can take advantage of `Class.Actor|Actors` and [Multi-Threading](../scripting/multithreading.md).
@@ -146,7 +146,7 @@ The following lists describe the tradeoffs of both approaches:
-### High level systems architecture
+### High Level Systems Architecture
The top-level systems in the project are detailed below. Some of these systems
are substantially more complex than others, and in many cases their
@@ -316,7 +316,7 @@ presents a more streamlined interface for what is a high touch part of the
codebase.
-## Client-server communication
+## Client-Server Communication
Most Roblox experiences involve some element of communication between the client
and server. This can include the client requesting the server perform a certain
@@ -332,7 +332,7 @@ uses the following methods, in order of preference:
- Replication via [tags](#replication-via-tags).
- Messaging [directly](#messaging-directly-via-network-module) via the **Network** module.
-### Replication via player data system
+### Replication via Player Data System
The **player data system** allows data to be associated with the player which
persists between save sessions. This system provides replication from client to
@@ -355,7 +355,7 @@ Of course, this is only useful for server-to-client replication and for values t
- The amount of coins the player has
- The state of the player's farm
-### Replication via attributes
+### Replication via Attributes
In situations where the server needs to replicate a custom value to the client
that's specific to a given `Class.Instance`, you can use
@@ -377,7 +377,7 @@ method, and subscribe to changes with the
In the [Plant][planturl] project, this approach is used for, amongst other
things, replicating the current status of plants to clients.
-### Replication via tags
+### Replication via Tags
`Class.CollectionService` lets you apply a string tag to an `Class.Instance`.
This is useful for categorizing instances and replicating that categorization to
@@ -385,7 +385,7 @@ the client.
For example, the `CanPlant` tag is applied on the server to signify to the client that a given pot is able to receive a plant.
-### Message directly via network module
+### Messaging Directly via Network Module
For situations where none of the previous options apply, you can use custom network calls through the **Network** module. This is the only option in the project that allows client-to-server communication and is therefore most useful for transmitting client requests and receiving a server response.
@@ -400,7 +400,7 @@ bespoke configuration which can increase the complexity of the project, although
this has been avoided wherever possible, particularly for server-to-client
communication.
-## Classes and singletons
+## Classes and Singletons
Classes in the [Plant][planturl] project, like instances on Roblox, can be
created and destroyed. Its class syntax is inspired by the idiomatic Lua
@@ -420,7 +420,7 @@ functionality. A good example is `BeamBetween` which creates a `Class.Beam`
object between two given `Class.Attachment` objects and keeps those attachments
orientated so that the beam is always facing upwards. These instances could be cloned from a prefabricated version in `Class.ReplicatedStorage` or passed into `new()` as an argument and stored inside the object under `self`.
-### Corresponding instances
+### Corresponding Instances
As noted above, many classes in this project have a data model representation, an instance that corresponds with the class and is manipulated by it.
@@ -464,7 +464,7 @@ state is returned directly via the `Class.ModuleScript`. As singletons are not
instantiated, the `self` syntax is not used and methods are instead called
with a dot (`.`) rather than a colon (`:`).
-## Strict type inference
+## Strict Type Inference
[Luau](../luau/) supports gradual typing which means you're free to add optional
type definitions to some or all of your code. In this project, `strict` typechecking is used for every script. This is the least permissive option for
@@ -475,7 +475,7 @@ before runtime.
Strong typing is undoubtedly powerful, but it's still an evolving feature in the Luau language and Studio. As a result, there are a number of limitations that, at the time of writing, required workarounds detailed in the following sections.
-### Typed class syntax
+### Typed Class Syntax
The established approach to creating classes in Lua is [well documented](https://www.lua.org/pil/16.1.html), however it is not well suited to strong Luau typing. In Luau, the simplest approach for getting the type of a class is the `Global.RobloxGlobals.typeof()` method:
@@ -520,7 +520,7 @@ end
return MyClass
```
-### Cast types after logical guards
+### Casting Types After Logical Guards
At the time of writing, the type of a value is not narrowed after a guard conditional statement. For example, following the guard below, the type of `optionalParameter` is not narrowed to `number`.
@@ -552,7 +552,7 @@ local function foo(optionalParameter: number?)
end
```
-### Traverse DataModel hierarchies
+### Traversing DataModel Hierarchies
In some cases, the codebase needs to traverse the data model hierarchy of a tree
of objects that are created at runtime. This presents an interesting challenge
@@ -582,11 +582,11 @@ end
As the type engine's understanding of the data model evolves, it's possible that
patterns like this will no longer be necessary.
-## User interface
+## User Interface
[Plant][planturl] includes a variety of complex and simple 2D user interfaces. These include non-interactive heads up display (HUD) items like the coin counter and complex interactive menus like the shop.
-### UI approach
+### UI Approach
You can loosely compare Roblox [UI](../ui/) to the HTML DOM, because it's a
hierarchy of objects that describe what the user should be seeing. Approaches to
@@ -597,7 +597,7 @@ creating and updating a Roblox UI are broadly divided into **imperative** and
Approach
-
Advantages and drawbacks
+
Advantages and Drawbacks
@@ -623,18 +623,18 @@ creating and updating a Roblox UI are broadly divided into **imperative** and
[Plant][planturl] uses an **imperative** approach under the notion that showing the transformations directly gives a more effective overview of how UI is created and manipulated on Roblox. This would not be possible with a declarative approach. Some repeated UI structures and logic are also abstracted into reusable [components](#layer-and-components) to avoid a common pitfall in imperative UI design.
-### High-level architecture
+### High-Level Architecture
-### Layer and components
+### Layer and Components
In [Plant][planturl], all UI structures are either a `Layer` or a `Component`.
- `Layer` is defined as a top level grouping singleton that wraps prefabricated UI structures in `Class.ReplicatedStorage`. A layer may contain a number of components, or it may encapsulate its own logic entirely. Examples of layers are the inventory menu or the number of coins indicator in the heads up display.
- `Component` is a reusable UI element. When a new component object is instantiated, it clones a prefabricated template from `Class.ReplicatedStorage`. Components may in themselves contain other components. Examples of components are a generic button class or the concept of a list of items.
-### View handling
+### View Handling
A common UI management problem is view handling. This project has a range of menus and HUD items, some of which listen to user input, and careful management of when they are visible or enabled is required.
@@ -648,7 +648,7 @@ This approach is intuitive because it allows menus to be navigated with history.
UI layer singletons register themselves with the **UIHandler** and are provided with a signal that fires when its visibility should change.
-## Further reading
+## Further Reading
From this thorough overview of the [Plant][planturl] project, you may want to
explore the following guides which go further in depth on related concepts and
diff --git a/content/en-us/resources/roblox-connect.md b/content/en-us/resources/roblox-connect.md
index c697a6202..6619ba585 100644
--- a/content/en-us/resources/roblox-connect.md
+++ b/content/en-us/resources/roblox-connect.md
@@ -1,5 +1,5 @@
---
-title: Roblox Connect project
+title: Roblox Connect Project
description: Explore Roblox Connect, an experience where you can call a friend and have a conversation as your avatars, together in a shared immersive space.
---
@@ -9,11 +9,11 @@ description: Explore Roblox Connect, an experience where you can call a friend a
To run [Roblox Connect][robloxconnecturl], you and your friends need to be on client version 602 or higher. Additionally, to implement the current [methods and events](#api-implementation) in one of your own experiences, it must have been published to Roblox for at least one week.
-## Project overview
+## Project Overview
Developers can introduce synchronous avatar communication into any experience on Roblox utilizing current methods and events. Some of the noteworthy [Roblox Connect][robloxconnecturl] feature highlights and call privacy details are shared below.
-### Environment switcher
+### Environment Switcher
To provide a better immersive communicative experience, the project includes an **environment switcher** that allows players to move from environment to environment. When moving among environments in the same place, player characters are repositioned via `Class.PVInstance:PivotTo()|PivotTo()`. When moving to an environment in a different place, players are teleported via `Class.TeleportService` to their desired location.
@@ -23,13 +23,13 @@ In regards to the call, teleport is to a reserved server and all call participan
-### Camera modes
+### Camera Modes
[Roblox Connect][robloxconnecturl] introduces two unique camera modes in addition to the default camera mode, both of which you can utilize to enhance your own experiences. Furthermore, when switching between various camera modes, a camera transitioner makes switching between modes feel seamless.
-#### Picture-in-picture
+#### Picture-in-Picture
In **picture-in-picture** mode, camera focus is on your call partner and a small view of your character floats on the screen. This mode also includes head tracking, and the local player's movement is restricted.
@@ -45,7 +45,7 @@ The **cinematic** mode attempts to keep both player characters within your camer
The **freeplay** mode uses the default Roblox character camera, letting you move around while also talking to your call partner. Your partner's character will not necessarily be in view.
-### Emote bar
+### Emote Bar
The project's **emote bar** is a cloned version of the [EmoteBar](../resources/modules/emote-bar.md) developer module. Out of the box, the module contains a lot of key features, but [Roblox Connect][robloxconnecturl] requires a few specific changes such as returning the character to "idle" state after performing the emote once.
@@ -55,7 +55,7 @@ The project's **emote bar** is a cloned version of the [EmoteBar](../resources/m
If someone who is not in the call is added to the reserved server, or is already in the reserved server, the call is ended.
-## API implementation
+## API Implementation
[Roblox Connect][robloxconnecturl] takes advantage of new `Class.SocialService` and `Class.PlayerViewService` methods and events to build an immersive communication platform.
diff --git a/content/en-us/resources/the-mystery-of-duvall-drive/construct-the-house.md b/content/en-us/resources/the-mystery-of-duvall-drive/constructing-the-house.md
similarity index 97%
rename from content/en-us/resources/the-mystery-of-duvall-drive/construct-the-house.md
rename to content/en-us/resources/the-mystery-of-duvall-drive/constructing-the-house.md
index 36365285a..8d932557b 100644
--- a/content/en-us/resources/the-mystery-of-duvall-drive/construct-the-house.md
+++ b/content/en-us/resources/the-mystery-of-duvall-drive/constructing-the-house.md
@@ -1,7 +1,7 @@
---
-title: Construct the house
+title: Constructing the House
comments:
-next: /resources/the-mystery-of-duvall-drive/materialize-the-world
+next: /resources/the-mystery-of-duvall-drive/materializing-the-world
prev: /resources/the-mystery-of-duvall-drive
description: Explains the design process for house in The Mystery of Duvall Drive.
---
@@ -10,7 +10,7 @@ It took many iterations and rapid testing at the beginning of the process to mak
-## Begin with a 2D layout
+## Beginning with a 2D Layout
Since the house is both the majority of the playable area and an entire character unto itself, we wanted to give a lot of thought about how to make sure it remained both real and fun. We started with the idea that the house should contain several visual and audio gags, lore, and corrupt puzzle rooms, and we wanted players to initially approach the house with little knowledge of what was going on, learning what happened to the house and the family that lived there as they were playing.
@@ -50,7 +50,7 @@ While we wanted to eventually replace the temporary assets with our own, the onl
Early shot of the driveway approach.
-## Plan each room
+## Planning Each Room
The exterior was only meant to be a taste of the overall story to immerse the player and get them familiar with the world they were playing in. The main character was the house itself, and we wanted players to spend most of their gameplay inside it plumbing for secrets and finding surprises in every room. To do this, we needed to figure out what rooms the house should include, when we wanted players to run into them, and where they should exist within the house. We drew a 2D layout of the house, and the team bounced around ideas for cool things that could happen. No ideas were ignored at this point.
@@ -72,7 +72,7 @@ Each room had to work together, and we wanted to tell the story slowly and progr
-## Build a 3D layout
+## Building a 3D Layout
All the early planning and ideas in the world don't make a fun experience, so it was time to start making the idea 3D! The exterior layout was blocked out and we made space for the house to be expanded or contracted. Earliest iterations were done in another 3D application where we could make simple boxes and shapes to start turning that 2D image into a playable space. You may find that building the early versions in Studio and using simple parts is your favorite method. There's no wrong way, so long as you get your ideas into 3D and playable quickly!
@@ -109,13 +109,13 @@ We went through many small and large iterations to settle on what we have in the
Later iteration of the house layout. Most of the layout stayed the same as the early greybox!
-## Furniture and props
+## Furniture and Props
We needed a lot of furniture and props to fill a house of this size, so before we started to gray box any of its content, we made a document to track everything we could use that would compliment what type of room it was and the puzzles we were in the process of creating. By getting all of our thoughts down into one spot, we could organize, prioritize, and see where we could reuse content in different rooms. While this was a fair amount of up-front planning, it saved us from either making not enough content or too many unnecessary items.
-This list gave us a good understanding of what needed to take priority when gray boxing out the content and populating it throughout the house. By adding high-priority content early, we could easily see when assets were repetitious, had incorrect proportions, or when they would need a second variation or a texture swap when they were in certain rooms. Some content we blocked out early on ended up not being important to the experience and removed, but we didn't lose a lot of work in the process since they were only quick blockouts. For all the furniture and props we kept, we made them into [packages](#utilize-packages) in their blockout phase, and this made it easier for us to replace everything throughout the house with their final versions.
+This list gave us a good understanding of what needed to take priority when gray boxing out the content and populating it throughout the house. By adding high-priority content early, we could easily see when assets were repetitious, had incorrect proportions, or when they would need a second variation or a texture swap when they were in certain rooms. Some content we blocked out early on ended up not being important to the experience and removed, but we didn't lose a lot of work in the process since they were only quick blockouts. For all the furniture and props we kept, we made them into [packages](#utilizing-packages) in their blockout phase, and this made it easier for us to replace everything throughout the house with their final versions.
@@ -128,7 +128,7 @@ This list gave us a good understanding of what needed to take priority when gray
-Because of the sheer quantity of assets needed for this demo, reusing textures as much as we could was extremely important for keeping within our memory budget. A lot of the furniture shares the same trim or tileable sheets for wood, metal, stone, glass, and fabric, and we utilized transparent textures wherever we could. For example, we used a transparent texture for fabrics so we could have color variations without having to create a second Albedo texture. For more information on how to reuse textures, see [Planning, Reuse, and Budgets](../../resources/the-mystery-of-duvall-drive/materialize-the-world.md#plan-reuse-and-budgets).
+Because of the sheer quantity of assets needed for this demo, reusing textures as much as we could was extremely important for keeping within our memory budget. A lot of the furniture shares the same trim or tileable sheets for wood, metal, stone, glass, and fabric, and we utilized transparent textures wherever we could. For example, we used a transparent texture for fabrics so we could have color variations without having to create a second Albedo texture. For more information on how to reuse textures, see [Planning, Reuse, and Budgets](../../resources/the-mystery-of-duvall-drive/materializing-the-world.md#planning-reuse-and-budgets).
@@ -271,7 +271,7 @@ After we finalized our Albedo, Normal, Metalness, and Roughness PBR textures in
-## Utilize packages
+## Utilizing Packages
**[Packages](../../projects/assets/packages.md)** are a system that allows you to store and use a version of either a single object or a group of objects, and when you update that version, it updates all instances of that object or group at once. For example, if you make a tree object and place hundreds of that object within your experience, you only need to update the package in order for the hundreds of trees to update to your new version at once. We knew early on we would have **two states** of most rooms in the house, their normal state and their corrupted state, and we needed to maintain both copies of the house and their contents throughout the entire iteration process. For this reason, we decided on what objects needed to be shared in each house state and converted them into packages.
@@ -320,6 +320,6 @@ Instead of working entirely in the same place file as the experience, we built a
The asset storage place with every component within the demo.
-Packages allowed us more freedom to explore different ideas in 3D without having to do a lot of extra work. We could plan, test, or even [revert to any previous version](../../projects/assets/packages.md#revert-changes) of an asset if an experiment didn't pan out in practice or broke the experience. There were many times where hours worth of work were restored by going back a version in the packages. In the end, we couldn't have achieved the final level of polish in this demo without packages.
+Packages allowed us more freedom to explore different ideas in 3D without having to do a lot of extra work. We could plan, test, or even [revert to any previous version](../../projects/assets/packages.md#reverting-changes) of an asset if an experiment didn't pan out in practice or broke the experience. There were many times where hours worth of work were restored by going back a version in the packages. In the end, we couldn't have achieved the final level of polish in this demo without packages.
diff --git a/content/en-us/resources/the-mystery-of-duvall-drive/design-dark-soundscapes.md b/content/en-us/resources/the-mystery-of-duvall-drive/designing-dark-soundscapes.md
similarity index 89%
rename from content/en-us/resources/the-mystery-of-duvall-drive/design-dark-soundscapes.md
rename to content/en-us/resources/the-mystery-of-duvall-drive/designing-dark-soundscapes.md
index 19182fd1f..974aacc8d 100644
--- a/content/en-us/resources/the-mystery-of-duvall-drive/design-dark-soundscapes.md
+++ b/content/en-us/resources/the-mystery-of-duvall-drive/designing-dark-soundscapes.md
@@ -1,7 +1,7 @@
---
-title: Design dark soundscapes
+title: Designing Dark Soundscapes
comments:
-prev: /resources/the-mystery-of-duvall-drive/develop-a-moving-world
+prev: /resources/the-mystery-of-duvall-drive/developing-a-moving-world
description: Explains the design concepts for gloomy soundscapes in The Mystery of Duvall Drive.
---
@@ -11,7 +11,7 @@ Sound design for an experience with horror themes is a balancing act between emb
-## Volumetric audio
+## Volumetric Audio
**[Volumetric audio](../../sound/objects.md#volumetric)** is the most realistic audio option in Studio to how people perceive sound depending on its distance to their ears. This type of audio allows you to place a `Class.Sound` object on a `Class.BasePart`, then use that `Class.BasePart` to cover an entire area of where you want that audio to play. It's highly useful for large objects that make sound, such as waterfalls, vehicles, and large cities. When a player is within a `Class.BasePart` that has a child `Class.Sound` object with volumetric audio enabled, the audio plays all around the player, similar to music in headphones playing at the same volume in each speaker. When the user exits the object, audio gradually decreases in volume and becomes more directional per speaker, moving around the user's head when their listener rotates. This means that if the sound is emitting to the left of your listener, the sound plays louder in your left speaker than your right speaker.
@@ -66,11 +66,11 @@ When adding detail to our outdoor soundscape, it was important to make the rain
This process allowed the sound to emit from the entire surface of the invisible part. If the player was inside of the part, the raindrop audio would play all around the player's head. The larger you make your own volumetric audio emitters, the more spread and area the volumetric sound will cover, so experiment with different sizes and shapes for your emitter to get the soundscape you want for your own experiences!
-## Nested SoundGroup mixing
+## Nested SoundGroup Mixing
As human beings, we like to think we are great multitaskers, but in reality it's quite difficult for us to focus on more than 2 things at once, especially in regards to listening to multiple audio sources! In The Mystery Of Duvall Drive, there could be a dozen sounds playing at any given time, such as ambience, music, footsteps, rain, or UI notifications, but we needed a way to make sure that it didn't feel as though they were all competing for your attention. For this reason, we decided to nest `Class.SoundGroup|SoundGroups` in child/parent relationships so we could create an audio mix to ensure both the organization and consistency of the project's sound design.
-**[Nesting SoundGroups](../../sound/groups.md#nest-soundgroups)** is a new feature that allows you to organize `Class.SoundGroup|SoundGroups` together into meaningful categories under a mix tree for further audio functionality, such as being able to fine-tune the volume of many audio sources at once, or apply common audio effects at a lower CPU cost. As we took a very progression-oriented approach to the mix in this project, we wanted sounds that directly contribute to player progression in the puzzles (puzzle and key object interaction audio) to be given priority over sounds that don't contribute to their progression (wind, rain, footsteps, atmosphere audio). By nesting child `Class.SoundGroup|SoundGroups` into parent `Class.SoundGroup|SoundGroups` of different priority levels, we could then add a `Class.CompressorSoundEffect` that would lower the volume of low-priority `Class.SoundGroup|SoundGroups` in real time whenever audio from high-priority `Class.SoundGroup|SoundGroups` started playing. This process is called [ducking](../../sound/groups.md#ducking).
+**[Nesting SoundGroups](../../sound/groups.md#nesting-soundgroups)** is a new feature that allows you to organize `Class.SoundGroup|SoundGroups` together into meaningful categories under a mix tree for further audio functionality, such as being able to fine-tune the volume of many audio sources at once, or apply common audio effects at a lower CPU cost. As we took a very progression-oriented approach to the mix in this project, we wanted sounds that directly contribute to player progression in the puzzles (puzzle and key object interaction audio) to be given priority over sounds that don't contribute to their progression (wind, rain, footsteps, atmosphere audio). By nesting child `Class.SoundGroup|SoundGroups` into parent `Class.SoundGroup|SoundGroups` of different priority levels, we could then add a `Class.CompressorSoundEffect` that would lower the volume of low-priority `Class.SoundGroup|SoundGroups` in real time whenever audio from high-priority `Class.SoundGroup|SoundGroups` started playing. This process is called [ducking](../../sound/groups.md#ducking).
@@ -112,4 +112,4 @@ The `Class.CompressorSoundEffect` has five main properties we had to set in orde
-For more information on these properties and the whole process of prioritizing audio from different `Class.SoundGroup|SoundGroups`, see [Nesting SoundGroups](../../sound/groups.md#nest-soundgroups) and [Ducking](../../sound/groups.md#ducking).
+For more information on these properties and the whole process of prioritizing audio from different `Class.SoundGroup|SoundGroups`, see [Nesting SoundGroups](../../sound/groups.md#nesting-soundgroups) and [Ducking](../../sound/groups.md#ducking).
diff --git a/content/en-us/resources/the-mystery-of-duvall-drive/develop-a-moving-world.md b/content/en-us/resources/the-mystery-of-duvall-drive/developing-a-moving-world.md
similarity index 95%
rename from content/en-us/resources/the-mystery-of-duvall-drive/develop-a-moving-world.md
rename to content/en-us/resources/the-mystery-of-duvall-drive/developing-a-moving-world.md
index e00788b75..b7e56cf3f 100644
--- a/content/en-us/resources/the-mystery-of-duvall-drive/develop-a-moving-world.md
+++ b/content/en-us/resources/the-mystery-of-duvall-drive/developing-a-moving-world.md
@@ -1,8 +1,8 @@
---
-title: Develop a moving world
+title: Developing a Moving World
comments:
-next: /resources/the-mystery-of-duvall-drive/design-dark-soundscapes
-prev: /resources/the-mystery-of-duvall-drive/stream-in-immersion
+next: /resources/the-mystery-of-duvall-drive/designing-dark-soundscapes
+prev: /resources/the-mystery-of-duvall-drive/streaming-in-immersion
description: Explains the environmental design concepts used in The Mystery of Duvall Drive.
---
@@ -10,7 +10,7 @@ Creating movement in any environment within an experience helps it to instantly
-## Create the storm
+## Creating the Storm
The storm went through many iterations before we settled on what is live in The Mystery of Duvall Drive. Early on, we thought about the storm as a giant obsidian pillar, and in later iterations we considered it to be a giant portal to the corrupt space. After experimenting with many different storms with unique looks and feels to them, we settled on a storm with a smaller central "eye" because:
@@ -33,9 +33,9 @@ To make the storm feel dynamic, aggressive, and ever-changing within its environ
1. **[Particle Emitters](../../effects/particle-emitters.md)** - For debris flying up to the portal and flying around due to the wind blowing.
1. **[Animations](../../animation/index.md)** - For the trees that were blowing in the wind.
-### Add clouds with textures
+### Adding Clouds with Textures
-While [dynamic clouds](../../environment/clouds.md) are great for normal, high altitude realistic clouds, we needed something that felt dramatic and that we could more heavily direct and customize. To do this, we applied [surface appearance](../../art/modeling/surface-appearance.md) objects with semi-transparency to a series of heavily stacked and layered cloud meshes in order to fake cloud cover. Why did we stack them and layer them so heavily? Because when each cloud mesh moves at different speeds, they intersect and create cloud forms that go inside and out of each other. This process made the clouds feel a bit more dynamic and natural, despite just being spinning discs. It was also important that the clouds were [semi-transparent](../../resources/beyond-the-dark/layered-clothing.md#import-to-studio-1), because we wanted players to be able to peek through them to see something bright in the center prior to arriving at the house!
+While [dynamic clouds](../../environment/clouds.md) are great for normal, high altitude realistic clouds, we needed something that felt dramatic and that we could more heavily direct and customize. To do this, we applied [surface appearance](../../art/modeling/surface-appearance.md) objects with semi-transparency to a series of heavily stacked and layered cloud meshes in order to fake cloud cover. Why did we stack them and layer them so heavily? Because when each cloud mesh moves at different speeds, they intersect and create cloud forms that go inside and out of each other. This process made the clouds feel a bit more dynamic and natural, despite just being spinning discs. It was also important that the clouds were [semi-transparent](../../resources/beyond-the-dark/layered-clothing.md#importing-to-studio-1), because we wanted players to be able to peek through them to see something bright in the center prior to arriving at the house!
@@ -59,7 +59,7 @@ Unlike particle emitters or beams, meshes allowed us to be able to bounce light
Once we started adding lighting to it, we needed to add details to the meshes to make them react better to lighting!
-### Rotate cloud meshes
+### Rotating Cloud Meshes
After we were satisfied with the overall visual appearance of the clouds, we needed to get it moving! We had the general shapes of each cloud layer in place, but it took some trial and error to make sure the spinning effect looked good in practice. We initially tried using [constraints](../../physics/mechanical-constraints.md) to introduce velocity that would physically drive the clouds to move. This was more difficult than we wanted it to be to iterate later, and the player would never interact with it, so we didn't need it to be as accurate in its movement.
@@ -124,11 +124,11 @@ end
We checked for a valid `Class.Model.PrimaryPart` to be set to handle streaming. If an Update was called on our object while a `Class.Model.PrimaryPart` (that can point to a child mesh) wasn't streamed yet, we would just skip the update. The current system is a second iteration of object rotation, and the previous system worked differently: the values were 12 times different! To keep the same data, we converted it in our script, like "12 \* obj.Speed.Value".
-### Design lightning strikes
+### Designing Lightning Strikes
Because Studio doesn't offer an out of the box lightning generator, and the particle system had some limitations that wouldn't work for the hero lightning strikes, we had to get creative with a solution for the hero lightning strikes. We decided on two main systems to make up the lightning: textured beams for the hero lightning strikes coming from the eye of the storm are scripted textured beams that reveal and sync with audio and post process effects, and a simple particle effect for the distant cloud-to-cloud lightning.
-#### Texture beams
+#### Texturing Beams
We'd typically either use a sequencer or timeline tool to drive the timing of a lighting bolt strike effect like this, but since Studio doesn't offer this functionality yet, we decided to write scripts that would control lighting bolt timing. The scripting of this effect is fairly simple, but it accomplishes the following important goals:
@@ -207,7 +207,7 @@ To check if a player is in corrupt areas, we invoke a helper `gameStateInfoFunc`
-#### Utilize particle emitter systems
+#### Utilizing Particle Emitter Systems
The hero lightning strikes are supported by a particle system that suggests distant lightning by creating the impression of a layer of clouds in the background catching light from distant strikes, or cloud-to-cloud lighting. We achieved this effect through a very simple particle system which flashes a cloud billboard on the periphery of the main storm cloud. The system emits a cloud particle periodically with a randomized transparency curve:
@@ -215,9 +215,9 @@ The hero lightning strikes are supported by a particle system that suggests dist
-### Make trees blow in the wind
+### Making Trees Blow in the Wind
-After we had the clouds and the lightning working the way we wanted it to, we then needed to add two other major components of a storm: the wind and the rain! These elements presented a few challenges, including needing to work within Studio's current limitations of our physics and special effects systems. For example, making trees move with actual wind isn't possible in today's engine, so we utilized [particle emitter](../../effects/particle-emitters.md) effects and [custom character animations](../../animation/editor.md#create-an-animation) for the trees.
+After we had the clouds and the lightning working the way we wanted it to, we then needed to add two other major components of a storm: the wind and the rain! These elements presented a few challenges, including needing to work within Studio's current limitations of our physics and special effects systems. For example, making trees move with actual wind isn't possible in today's engine, so we utilized [particle emitter](../../effects/particle-emitters.md) effects and [custom character animations](../../animation/editor.md#creating-an-animation) for the trees.
We knew to really sell the effect of the wind and rain, we needed the trees themselves to move. There are a few ways you can do this within the engine, including moving parts using [plugins](../../studio/plugins.md) that are publicly available, using `Class.TweenService`, or animating models directly. For our purposes, animations gave us the ability to control the motion we wanted out of our trees, and it allowed us to use a single animation we could share among all trees within the experience.
@@ -232,7 +232,7 @@ We started by skinning several trees from the [Endorse Model Pack - Forest Asset
The Forest pack contains several tree types, which can save you time in your own experiences.
-After we picked our trees, we knew we needed to skin them. [Skinning a mesh](../../art/modeling/rigging.md) is the act of adding joints (or bones) to a mesh in another 3D modeling application, such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview), then applying influence to those joints/bones to move the mesh. This is most commonly used in [humanoid characters](../../art/modeling/skin-a-humanoid-model.md), but with [custom characters](../../art/modeling/skin-a-simple-mesh.md), you can skin pretty much anything.
+After we picked our trees, we knew we needed to skin them. [Skinning a mesh](../../art/modeling/rigging.md) is the act of adding joints (or bones) to a mesh in another 3D modeling application, such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview), then applying influence to those joints/bones to move the mesh. This is most commonly used in [humanoid characters](../../art/modeling/skinning-a-humanoid-model.md), but with [custom characters](../../art/modeling/skinning-a-simple-mesh.md), you can skin pretty much anything.
We knew we wanted to save time and reuse the same animation, so we built our first tree rig and made sure the joint names were generic because we wanted to use these same names in the rigs for the other trees. We also knew we needed to include primary, secondary, and tertiary joints/bones for the trunks to bend with the wind, the branches to swing, and the leaves to seem like they were shaking in response. For this process, we needed to create a **secondary motion**, which is an animation concept where any action causes other parts of the object to react to that action and appear to catch up with the initial movement.
@@ -241,7 +241,7 @@ We knew we wanted to save time and reuse the same animation, so we built our fir
The trees have primary, secondary, and tertiary joints so that we could have believable movement from being blown around by the wind.
-Once we had created our joints/bones, it was time to create a test animation to move around all the joints and bones in Studio to see if it moved the way we wanted it to. To do this, we had to [import the tree into Studio](../../resources/beyond-the-dark/custom-characters.md#import-the-mesh-to-studio) through the **Custom Rig** setting in the **3D Importer**, then move/animate the mesh using the [Animation Editor](../../resources/beyond-the-dark/custom-characters.md#import-the-mesh-to-studio). We set up the materials and textures after these tests, but you can see the result below.
+Once we had created our joints/bones, it was time to create a test animation to move around all the joints and bones in Studio to see if it moved the way we wanted it to. To do this, we had to [import the tree into Studio](../../resources/beyond-the-dark/custom-characters.md#importing-the-mesh-to-studio) through the **Custom Rig** setting in the **3D Importer**, then move/animate the mesh using the [Animation Editor](../../resources/beyond-the-dark/custom-characters.md#importing-the-mesh-to-studio). We set up the materials and textures after these tests, but you can see the result below.
@@ -276,7 +276,7 @@ Once we had all the tree types we wanted animated, we made each into [packages](
We used animated trees immediately around the house where the vortex was strongest and the visual effect would be the most impactful for players.
-### Make storm debris
+### Making Storm Debris
We wanted the rain to appear heavy, and for the fog and debris to blow through the trees. To do this, we set up a few invisible parts to act as particle volumes with child [particle emitters](../../effects/particle-emitters.md) immediately below the large storm clouds. Because of the particle count limit in Studio, we couldn't use one particle emitter for the entire space. Instead we added several that were the same size as each other in a grid pattern over the playable area space, because the presence of the trees means the players wouldn't be able to see very far.
@@ -333,7 +333,7 @@ The result was some great action between the trees moving, the window blowing, a
src="../../assets/resources/mystery-of-duvall-drive/developing-a-moving-world/movement-example.mp4"
width="100%">
-### Set up the eye of the storm
+### Setting up the Eye of the Storm
The fractured stone eye with a glowing core is meant to give players the first hint that there is something sinister and arcane occurring at the house that they should explore further. Since our scene is dark and the eye is far up in the sky, it was important to create a believable fractured stone silhouette, but it wasn't as important to create believable stone surface details because players wouldn't be able to see that. Knowing what is realistic for your players to see within your scene's lighting before putting in a ton of time into unnecessary details can save you many resources in the development process.
@@ -371,14 +371,14 @@ In order to add a supernatural feeling to the eye and to emphasize its presence,
Another challenge we ran into when creating the eye was imposed by our use of [streaming](../../workspace/streaming.md) combined with the eye's distance from the player. Given the centrality of this structure, we wanted it to always be visible despite its distance but, without any hacks to its mesh, players were not able to see the eye unless they were in the solarium. We were able to force the eye's constant presence in the scene by adding some geometry to the eye and its rings. This geometry sits right below the terrain's surface, and this is enough to trick the engine into thinking the sphere is closer to the player than it is and always streaming it in. This should be done pretty sparingly though as forcing too many large objects to be streamed in could negate the benefits of streaming enabled and negatively impact game performance.
-We were able to add movement to the eye and its rings thanks to the same script we used to [rotate the cloud meshes](#rotate-cloud-meshes). For a final touch, we decided to add a hint to the presence of another world beyond the clouds, but we had to take a creative approach in order to avoid adding more geometry to the scene and additionally having to deal with the previously mentioned hurdles posed by streaming enabled. We created a scene that had a lot of depth due to the relative size and distance of objects, rendered an image of this scene, then used said image as a [decal](../../parts/textures-decals.md) on a part placed just behind the eye of the storm. We used the same method for rotating this part as we used for the eye and its rings.
+We were able to add movement to the eye and its rings thanks to the same script we used to [rotate the cloud meshes](#rotating-cloud-meshes). For a final touch, we decided to add a hint to the presence of another world beyond the clouds, but we had to take a creative approach in order to avoid adding more geometry to the scene and additionally having to deal with the previously mentioned hurdles posed by streaming enabled. We created a scene that had a lot of depth due to the relative size and distance of objects, rendered an image of this scene, then used said image as a [decal](../../parts/textures-decals.md) on a part placed just behind the eye of the storm. We used the same method for rotating this part as we used for the eye and its rings.
The image we used to create an illusion of a world beyond the clouds. When players are far away from something, a simple image might be enough to create the illusion of more depth and complexity in your scene!
-## Make the expanding pantry
+## Making the Expanding Pantry
One of the most fun things to produce were the corrupt spaces, where we could subvert players expectations of reality by literally changing it around them. For example, in the father's puzzle we wanted to emulate a moment similar to a nightmare where no matter how fast you run, the room feels like it keeps getting longer. We decided to make an expanding pantry that would run away from players as they were looking for ingredients to turn the room back into its normal state.
@@ -506,7 +506,7 @@ end
Once we had the false wall moving to the back of the room, we needed the rest of the content to move with it. To do that, we needed all loose items on the pantry to be welded to the wall as it moved. Using [Weld Constraints](../../physics/mechanical-constraints.md#weldconstraint), we were quickly able to weld all objects to the pantry wall to move as a single object. Doing this meant we had the option to unweld these items so players could bump into them and knock them around!
-## Make the corrupted treehouse
+## Making the Corrupted Treehouse
Studio is a fantastic physically-based engine that you can use to create everything from a swinging gate to a spinning platform. With our demo, we wanted to use physics to create a sense of realism in an otherwise unrealistic set of environments. Using just a few **constraints**, you can create some fun and challenging obstacle courses within your own experiences!
diff --git a/content/en-us/resources/the-mystery-of-duvall-drive/foundational-gameplay-systems.md b/content/en-us/resources/the-mystery-of-duvall-drive/foundational-gameplay-systems.md
index 4f182ea24..30f6a87e2 100644
--- a/content/en-us/resources/the-mystery-of-duvall-drive/foundational-gameplay-systems.md
+++ b/content/en-us/resources/the-mystery-of-duvall-drive/foundational-gameplay-systems.md
@@ -1,5 +1,5 @@
---
-title: Foundational gameplay systems
+title: Foundational Gameplay Systems
comments:
next: /resources/the-mystery-of-duvall-drive/supporting-systems
prev: /resources/the-mystery-of-duvall-drive/main-design-requirements
@@ -22,7 +22,7 @@ We implemented it as a simple state machine (Update function), and the states ar
GameStates is mostly server-side, but when the client needs to do something, such as show countdown, lore, or disable streaming pause UI, server and client (GameStatesClient) communicate via a remote event called `GameStateEvent`. As with most cases, the event payload has event "type" (Config.GameEvents) as the first parameter, and event specific data after that.
-### Teleportation game states
+### Teleportation Game States
There is a group of 3 game states that run three unique cutscenes that hide the teleportation to the corrupt room: Warmup, InFlight, and Cooldown. **Warmup** runs for the whole duration and ends with an almost black screen in which the 3D world is no longer visible. During this time, we clone the room, get desired player positions in the corrupt room for each player, call `Class.Player.RequestStreamAroundAsync`, and transport players to a specific assigned `Datatype.CFrame` coordinate within the corrupt room. This type of teleportation might trigger a streaming pause. When a streaming pause occurs, the client displays a warning message. We disabled this default UI to keep the experience immersive.
@@ -34,11 +34,11 @@ While streaming is being handled, **InFlight** runs, keeping a slightly pulsing
A similar set of Warmup, InFlight, and Cooldown cutscenes occur when we teleport the player back to the normal state of the room, **TeleportWarmupBack**, **TeleportInFlightBack**, and **TeleportCooldownBack**, and at the end of the experience, we also run **TeleportWarmupFinal**, **TeleportInFlightFinal**, and **TeleportCooldownFinal** to teleport players into the foyer for the finishing cutscene.
-### Lighting and atmosphere game states
+### Lighting and Atmosphere Game States
We knew that we wanted each room's normal and corrupt state to have a different visual appearance so it could give players clear visual feedback that they were in a completely different location. Game states allowed us to change the lighting and atmosphere properties for normal and corrupt rooms, in which the GameStateManager selected which instances to use based on if players are teleporting from the normal to the corrupt state of the room (`TeleportWarmup`), or vice versa (`TeleportWarmupBack`). Events playing during the teleport make the whole screen either dark or white, so we decided to change the `Class.Lighting` and `Class.Atmosphere` instances at those moments to hide the process from players. To make it simple to change, **DemoConfig** includes maps that define what instances under these services need to change.
-### Locking doors game states
+### Locking Doors Game States
We wanted to be able to keep players in certain rooms while they finished missions, so we created game states to lock doors: `InMission` and `CanGetSeal`. `InMission` locks players in their active mission room, and `CanGetSeal` keeps the mission room's door locked until they pick up the "restored" seal. We mostly used this to have the doors lock when players return from a mission so that they have an incentive to pick up the seal. After they pick up the seal, doors unlock so they can place it within the seal's location in the foyer. The last mission is unique to this typical process, as the door to the room with its seal is locked until players solve every other puzzle (`EnableRegularMissionDoors`, `EnableOneMissionDoors` functions).
@@ -130,7 +130,7 @@ Parameters allowed us to refer to objects that do not even exist in the beginnin
}}
```
-### Run events, event instances, and connect to triggers
+### Running Events, Event Instances, and Connecting to Triggers
To run an event, we would either use a remote event from clients, or a function from the server. In the following example, we passed a couple of parameters to the `RootObject` and `isEnabled` events. Internally, an instance of the event description was created, params resolved to actual objects, and the function returned an id for the event instance.
@@ -152,13 +152,13 @@ Interpolants or other actions that are "cosmetic" (do not change simulation for
To easily connect running an event to a trigger, we used helper functions `ConnectTriggerToEvent` or `ConnectSpawnedTriggerToEvent`, the latter of which finds the trigger by name. To allow the same event to be triggered using different triggers, we could call `eventManagerFunc` with a "Setup" key and a set of trigger volumes. For an example of a trigger volume in action, see [Making the Expanding Pantry](../../resources/the-mystery-of-duvall-drive/developing-a-moving-world.md#making-the-expanding-pantry).
-#### Event parameters
+#### Event Parameters
In addition to custom event parameters passed from scripts, other data that can be optionally passed when creating an event includes player, callback (to be called when event ends), and callback parameters. Some events should run only for one player (events with actions running on client), while others should run for all. To make it run for only one player, we used `onlyTriggeredPlayer = true` in the params.
Events can have cooldowns defined by `minCooldownTime` and `maxCooldownTime`. The min and max provide a range for scaling based on player count, but we didn't use it in this demo. If we were to have needed cooldown needs to be per player, we had the capability to use `perPlayerCooldown = true`. Each Event has a duration in seconds, and cooldown timings and callbacks are based on it. To inform about finishing an event, invoking code could pass a callback and parameters it will get.
-#### Call scripts
+#### Calling Scripts
We could call `Class.Script|Scripts` at specific keyframes in the **Scripts** section. For example:
@@ -180,7 +180,7 @@ RegisterFunction must be called in the client script for functions called on the
local function EnablePlayerControls(eventInst, params)
```
-#### Play audio
+#### Playing Audio
We have limited support for playing [non-positional audio](../../sound/objects.md#volumetric) at keyframes in the **Sounds** section, for example:
@@ -192,7 +192,7 @@ sounds = {
Note that the event finishing callbacks fire when event duration expires, but audio actions might be still playing after.
-#### Run camera shakes
+#### Running Camera Shakes
We could define camera shakes in the **cameraShakes** section, like so:
@@ -204,7 +204,7 @@ cameraShakes = {
"targets" can be initiated only for the player who triggered the event, allPlayer, or playersInRadius to the triggering player. We used a 3rd party script for camera shakes, and the shakes were pre-defined: `eventManagerDemo.bigShake` and `eventManagerDemo.smallShake`. `sustainDuration` could also be passed.
-## Missions logic
+## Missions Logic
There are 7 missions total, and only 6 of them use seals. Most missions have common parameters, though some are only for missions with seals and teleporting to corrupt rooms. Each mission has an entry in the **DemoConfig** script with a set of parameters in the **Config.Missions** map:
diff --git a/content/en-us/resources/the-mystery-of-duvall-drive/immersive-narrative.md b/content/en-us/resources/the-mystery-of-duvall-drive/immersive-narrative.md
index 902edc04f..6ff028e5b 100644
--- a/content/en-us/resources/the-mystery-of-duvall-drive/immersive-narrative.md
+++ b/content/en-us/resources/the-mystery-of-duvall-drive/immersive-narrative.md
@@ -1,16 +1,16 @@
---
-title: Immersive narrative
+title: Immersive Narrative
comments:
-next: /resources/the-mystery-of-duvall-drive/stream-in-immersion
-prev: /resources/the-mystery-of-duvall-drive/materialize-the-world
+next: /resources/the-mystery-of-duvall-drive/streaming-in-immersion
+prev: /resources/the-mystery-of-duvall-drive/materializing-the-world
description: Explains the narrative concepts used in The Mystery of Duvall Drive.
---
Like the [Beyond the Dark](../../resources/beyond-the-dark/index.md) demo, one of our earliest decisions was to have as much of the gameplay and story told diegetically within the world itself. This can be a difficult process when you want to balance both communicating progress to the player through the user interface while also making them feel as though they really are within the world you've built. To meet these goals for our experience, we broke the way we communicate information to players down into four techniques:
-1. **Visual cues** - Objects, images, or arrangement of assets that passively reinforce story or give hints to the player when it makes sense for the world.
+1. **Visual Cues** - Objects, images, or arrangement of assets that passively reinforce story or give hints to the player when it makes sense for the world.
2. **Lore** - When a player clicks/taps on specific items in the house, important story information displays **on the entire screen**. This narrative is only visible to the player that clicked/tapped the object. The tone is always informational in tone and phrasing.
-3. **Thought bubbles** - When a player clicks/taps on specific items in the house, a text dialogue "reaction" displays **near the object**. This narrative is only visible to the player that clicked/tapped the object. The tone is always first person and observational.
+3. **Thought Bubbles** - When a player clicks/taps on specific items in the house, a text dialogue "reaction" displays **near the object**. This narrative is only visible to the player that clicked/tapped the object. The tone is always first person and observational.
4. **Announcements** - When a player clicks/taps on a corrupted item in the house, third-person dialogue displays on **every player's screen at once**. This narrative sometimes transitions all players to the corrupted state of the room they are in.
In this section, we will demonstrate how we used these techniques and specific features to immerse players into our narrative while still encouraging exploration, communicating progress, and keeping gameplay both intimate to the individual player and fair in a multiplayer experience.
@@ -28,7 +28,7 @@ In this section, we will demonstrate how we used these techniques and specific f
-## Visual cues
+## Visual Cues
A visual cue is an important tool to both reinforce narrative and tell players what they need to know about their objective **without using words**. Using an arrangement of assets, such as chalkboards, statues, and wallpaper, we were able to passively provide a depth of information about the main characters of Duvall Drive, as well as guidance on how to complete puzzles without having to include invasive UI elements. We began this process by first figuring out what we wanted to communicate to the player, then how it would make sense to communicate that within the world of our experience. For example, we wanted players to understand how obsessed the grandfather was in his mission to defy death, so we left his room in disarray with a lot of his research and several walls with his scribbled thoughts.
@@ -81,7 +81,7 @@ We knew that players would be accessing this experience from a variety of device
-## Thought bubbles
+## Thought Bubbles
We needed a way for the player's character to communicate ideas to the player, such as providing additional narrative flavor or reinforcing what they needed to do. Our solution was to display thought bubbles, or **text reactions from the player's character**, near non-lore objects whenever the player selected them. This narrative only displays to the player that clicked or tapped the object, and the tone is always first person and observational.
diff --git a/content/en-us/resources/the-mystery-of-duvall-drive/index.md b/content/en-us/resources/the-mystery-of-duvall-drive/index.md
index fac8a95b2..2563131da 100644
--- a/content/en-us/resources/the-mystery-of-duvall-drive/index.md
+++ b/content/en-us/resources/the-mystery-of-duvall-drive/index.md
@@ -1,7 +1,7 @@
---
title: The Mystery of Duvall Drive
comments:
-next: /resources/the-mystery-of-duvall-drive/construct-the-house
+next: /resources/the-mystery-of-duvall-drive/constructing-the-house
description: The Mystery of Duvall Drive is a showcase demo with accompanying documentation on the concepts and processes used during development.
---
@@ -16,14 +16,14 @@ Similar to the previous [Beyond the Dark](../../resources/beyond-the-dark/index.
- **`Class.MaterialService`** and custom materials
- **Packages** and their ability to streamline processes
-- **Volumetric audio** and `Class.SoundService`
-- **Streaming enabled** for complex experiences
+- **Volumetric Audio** and `Class.SoundService`
+- **Streaming Enabled** for complex experiences
You can follow the articles sequentially or jump between the following sections:
-- **[Construct the house](../../resources/the-mystery-of-duvall-drive/construct-the-house.md)** explores the transformation from a simple blueprint to the final environment, including the process to ensure the environment was fun from start to finish.
-- **[Materialize the world](../../resources/the-mystery-of-duvall-drive/materialize-the-world.md)** details how both `Class.MaterialService` and `Class.SurfaceAppearance` create the look and feel of each room's normal and corrupted state.
-- **[Immersive narrative](../../resources/the-mystery-of-duvall-drive/immersive-narrative.md)** demonstrates how to utilize UI features to build lore throughout the playable area.
-- **[Stream in immersion](../../resources/the-mystery-of-duvall-drive/stream-in-immersion.md)** explains how we both code and constructed the experience to take advantage of Streaming Enabled capabilities.
-- **[Develop a moving world](../../resources/the-mystery-of-duvall-drive/develop-a-moving-world.md)** describes how and why movement can give the world a sense of life and reactiveness.
-- **[Design dark soundscapes](../../resources/the-mystery-of-duvall-drive/design-dark-soundscapes.md)** details how `Class.SoundService` and [volumetric audio](../../sound/objects.md#volumetric) craft the distinct soundscapes of the normal and corrupted worlds.
+- **[Constructing the House](../../resources/the-mystery-of-duvall-drive/constructing-the-house.md)** explores the transformation from a simple blueprint to the final environment, including the process to ensure the environment was fun from start to finish.
+- **[Materializing the World](../../resources/the-mystery-of-duvall-drive/materializing-the-world.md)** details how both `Class.MaterialService` and `Class.SurfaceAppearance` create the look and feel of each room's normal and corrupted state.
+- **[Immersive Narrative](../../resources/the-mystery-of-duvall-drive/immersive-narrative.md)** demonstrates how to utilize UI features to build lore throughout the playable area.
+- **[Streaming in Immersion](../../resources/the-mystery-of-duvall-drive/streaming-in-immersion.md)** explains how we both code and constructed the experience to take advantage of Streaming Enabled capabilities.
+- **[Developing a Moving World](../../resources/the-mystery-of-duvall-drive/developing-a-moving-world.md)** describes how and why movement can give the world a sense of life and reactiveness.
+- **[Designing Dark Soundscapes](../../resources/the-mystery-of-duvall-drive/designing-dark-soundscapes.md)** details how `Class.SoundService` and [volumetric audio](../../sound/objects.md#volumetric) craft the distinct soundscapes of the normal and corrupted worlds.
diff --git a/content/en-us/resources/the-mystery-of-duvall-drive/main-design-requirements.md b/content/en-us/resources/the-mystery-of-duvall-drive/main-design-requirements.md
index b9e76fcf6..7fac28d43 100644
--- a/content/en-us/resources/the-mystery-of-duvall-drive/main-design-requirements.md
+++ b/content/en-us/resources/the-mystery-of-duvall-drive/main-design-requirements.md
@@ -1,5 +1,5 @@
---
-title: Main design requirements
+title: Main Design Requirements
comments:
next: /resources/the-mystery-of-duvall-drive/foundational-gameplay-systems
prev: /resources/the-mystery-of-duvall-drive/technical-overview
@@ -10,13 +10,13 @@ The following list provides an overview of the main technical design requirement
## Missions
-There are several types of missions players must solve in order to progress through the experience, including navigating a [series of spinning platforms](../../resources/the-mystery-of-duvall-drive/developing-a-moving-world.md#make-the-corrupted-treehouse) until players are able to retrieve a special item, or finding different ingredients in an [expanding pantry](../../resources/the-mystery-of-duvall-drive/develop-a-moving-world.md#make-the-expanding-pantry) and placing them into a boiling pot. To organize the scripting process of creating and debugging missions, we created a mission framework and a debug version.
+There are several types of missions players must solve in order to progress through the experience, including navigating a [series of spinning platforms](../../resources/the-mystery-of-duvall-drive/developing-a-moving-world.md#making-the-corrupted-treehouse) until players are able to retrieve a special item, or finding different ingredients in an [expanding pantry](../../resources/the-mystery-of-duvall-drive/developing-a-moving-world.md#making-the-expanding-pantry) and placing them into a boiling pot. To organize the scripting process of creating and debugging missions, we created a mission framework and a debug version.
-### Mission framework
+### Mission Framework
To ensure that we unified each step of the mission throughout the experience, we designed a **simple puzzle mission framework** for each mission which consisted of hooks for the start and finish of the puzzle, a spot to read configuration data, and a button to complete the puzzle for [debugging purposes](#debug-version). For more detailed information on this process and its parameters, see [Missions Logic](../../resources/the-mystery-of-duvall-drive/foundational-gameplay-systems.md#missions-logic).
-#### Seals and game states
+#### Seals and Game States
When players entered specific rooms, we wanted them to interact with special small objects known as **seals** to trigger missions. After they solved the mission, we wanted them to grab the seal and place it in a predefined location within the foyer in order to progress through the overall gameplay. After they placed the seal in the correct location, they could then continue to another room within the house and start the next mission by clicking on that room's special object.
@@ -39,7 +39,7 @@ To implement this, we created **game states**, which would specify the period of
Game states largely control the flow of the experience and how players interact with the experience's [narrative](../../resources/the-mystery-of-duvall-drive/immersive-narrative.md). For more information, see [GameStateManager](../../resources/the-mystery-of-duvall-drive/foundational-gameplay-systems.md#gamestatemanager).
-#### Normal and corrupt rooms
+#### Normal and Corrupt Rooms
We wanted to have two states of six rooms in the house: a normal state and a corrupted state. When a player would touch a corrupted seal in a room to trigger the room's corrupted state, the environment would change to a darker atmosphere with modified lighting, environmental objects, and special effects. Players would then have to solve the mission in order to return to the room's normal state.
@@ -56,7 +56,7 @@ We wanted to have two states of six rooms in the house: a normal state and a cor
To implement this, we prepared a special space in the experience that was very far from the house, about 6,500 studs away in the **X** direction that could accommodate the corrupt state of a room. When a player triggers any corrupted state, the corrupt state of that specific room clones into this area from `Class.ServerStorage` to the **TempStorage/Cloned** folder, then players [teleport](#teleportation) into that room. Small `Class.Part|Parts` exist within each normal and corrupt room that serve as spawn points for players when entering or leaving rooms. After they solve the mission, we simultaneously teleport players back into the normal state of the room, and destroy all objects in the corrupt state of the room. For more information on the game states that control this teleportation process, see [GameStateManager](../../resources/the-mystery-of-duvall-drive/foundational-gameplay-systems.md#gamestatemanager).
-### Debug version
+### Debug Version
To assist us in periodically debugging missions, we created a version of the experience where we wouldn't have to wait in the lobby or for cutscenes. This version had keyboard-based cheats and buttons that would allow us to automatically complete missions so we could quickly test aspects of the experience. We would periodically copy and publish this version into the version we planned to release that had the proper gameplay flow. To distinguish these two versions, we made a **DemoGlobalSettings** script to check the placeID, see if it's running in Studio, and enable/disable various gameplay cheats and buttons. For more information, see [Missions Logic](../../resources/the-mystery-of-duvall-drive/foundational-gameplay-systems.md#missions-logic) and [Configuration Scripts](../../resources/the-mystery-of-duvall-drive/supporting-systems.md#configuration-scripts).
@@ -66,9 +66,9 @@ There are three types of teleportation that occur within the experience:
1. Teleporting players from the simple lobby to the main gameplay area in a [reserved server](#reserved-servers).
1. Teleporting players from a room's normal state to the corrupt state, then back again while showing a [cutscene](#cutscenes).
-1. Teleporting players within some puzzles, or when they [respawn](#respawn-players) after falling off the gameplay area.
+1. Teleporting players within some puzzles, or when they [respawn](#respawning-players) after falling off the gameplay area.
-### Reserved servers
+### Reserved Servers
We decided to group players into groups of five in a **simple lobby** before teleporting them over to a **reserved server** for the main gameplay area of the house. The lobby provided time for additional players to join and play together, and reserved servers prevented additional players from missing aspects of the gameplay and narrative from joining the experience late. This teleportation only happens once.
@@ -80,22 +80,22 @@ We wanted to be able to transport players throughout the game whenever they acco
-### Respawn players
+### Respawning Players
The third type of teleportation we wanted to implement was a short teleport with only a player `Datatype.CFrame` coordinate change within some puzzles and when players fall and respawn. Unlike the previous two types of teleportation, this type doesn't explicitly request async streaming.
-## Gameplay scripting
+## Gameplay Scripting
-Scripting allowed us to execute on specific gameplay elements, such as fading UI elements, creating trigger volumes for key events, and highlighting objects when they were in focus with the player's cursor. Many of these systems relied on tagging objects to perform custom behavior, then using a variety of client or server scripts to contain specific workflows depending on what action needed to happen at set points in the experience. For more information on how we implemented these systems, see [Foundational gameplay systems](../../resources/the-mystery-of-duvall-drive/foundational-gameplay-systems.md) and [Supporting Systems](../../resources/the-mystery-of-duvall-drive/supporting-systems.md).
+Scripting allowed us to execute on specific gameplay elements, such as fading UI elements, creating trigger volumes for key events, and highlighting objects when they were in focus with the player's cursor. Many of these systems relied on tagging objects to perform custom behavior, then using a variety of client or server scripts to contain specific workflows depending on what action needed to happen at set points in the experience. For more information on how we implemented these systems, see [Foundational Gameplay Systems](../../resources/the-mystery-of-duvall-drive/foundational-gameplay-systems.md) and [Supporting Systems](../../resources/the-mystery-of-duvall-drive/supporting-systems.md).
-### Custom behavior with tags
+### Custom Behavior with Tags
We wanted a way to add custom behavior for objects, such as locking doors so players would have to stay within the room until they completed the active mission. To implement this, we decided to use tags for specific objects, then we used `Class.CollectionService` to find these objects and connect any corresponding `Class.Script|Scripts` to add custom behavior. We had one `Class.Script` for each tag category that acted as a manager to handle all objects tagged under that category so we could keep the `Class.Script` in a single location rather than being copied many times in `Class.DataModel`. For more information, see [DoorManager](../../resources/the-mystery-of-duvall-drive/supporting-systems.md#doormanager), [MasterAnimator](../../resources/the-mystery-of-duvall-drive/supporting-systems.md#masteranimator), [DrawerManager](../../resources/the-mystery-of-duvall-drive/supporting-systems.md#drawermanager), [KillVolumes](../../resources/the-mystery-of-duvall-drive/supporting-systems.md#killvolumes), [PlayerMissionRespawn](../../resources/the-mystery-of-duvall-drive/supporting-systems.md#playermissionrespawn), and [PianoManager](../../resources/the-mystery-of-duvall-drive/supporting-systems.md#pianomanager).
The "manager" `Class.Script` uses an `Init` function to find any objects tagged when the experience starts, and connect a custom behavior to them. For example, DoorManager finds any object tagged with **Door**, then it attaches the correct behavior to the door objects (moves the door open when clicked, plays a door swing sound effect, etc.). However, any objects that are added or removed during runtime, such as any objects that are added to a corrupted room after a player interacts with a corrupted seal, miss this initial call and never get the expected behavior. To solve this, we use `Class.CollectionService.GetInstanceAddedSignal` and `Class.CollectionService.GetInstanceRemovedSignal` to grant the same behavior to new objects that are tagged and untagged, respectively.
-### Client and server scripts
+### Client and Server Scripts
We wanted to reduce bandwidth for different aspects of gameplay that would be expensive on performance. We decided that when object functionality can affect simulation for other players, such as moving object through collision, we would run this on the **server**, but if something is more related to environment design, such as lights, environmental animations that don't affect gameplay, special effects, and audio, we would run them on **clients**. This would reduce bandwidth, and keep both movement and environment changes smoother on user devices.
diff --git a/content/en-us/resources/the-mystery-of-duvall-drive/materialize-the-world.md b/content/en-us/resources/the-mystery-of-duvall-drive/materializing-the-world.md
similarity index 94%
rename from content/en-us/resources/the-mystery-of-duvall-drive/materialize-the-world.md
rename to content/en-us/resources/the-mystery-of-duvall-drive/materializing-the-world.md
index f492251fa..8031c564f 100644
--- a/content/en-us/resources/the-mystery-of-duvall-drive/materialize-the-world.md
+++ b/content/en-us/resources/the-mystery-of-duvall-drive/materializing-the-world.md
@@ -1,24 +1,24 @@
---
-title: Materialize the world
+title: Materializing the World
comments:
next: /resources/the-mystery-of-duvall-drive/immersive-narrative
-prev: /resources/the-mystery-of-duvall-drive/construct-the-house
+prev: /resources/the-mystery-of-duvall-drive/constructing-the-house
description: Explains the use of materials and textures in The Mystery of Duvall Drive.
---
-We use [materials](../../parts/materials.md) and [surface appearance](../../art/modeling/surface-appearance.md) objects to create an immersive and realistic indoor and outdoor environment. Without materials, this scene could still have some interesting depth, silhouettes, and lighting, but with our materials and texture systems, we can really bring the room to life and add a dimension of realism to the world.
+We use [materials](../../parts/materials.md) and [Surface Appearance](../../art/modeling/surface-appearance.md) objects to create an immersive and realistic indoor and outdoor environment. Without materials, this scene could still have some interesting depth, silhouettes, and lighting, but with our materials and texture systems, we can really bring the room to life and add a dimension of realism to the world.
These [physically-based rendering](../../art/modeling/surface-appearance.md) (PBR) materials are what makes surfaces like wood look, react, and reflect the way wood does in the real world. In this section, we will go over some of the decisions and processes we went through to create the palette of materials used in the demo. As in the [Beyond the Dark](../../resources/beyond-the-dark/index.md) demo, we wanted a realistic look and feel for our materials and we achieved it through a few different approaches.
You can break down the process of building all our textures and materials into three areas:
-- Surface appearance objects for 1:1 or unique materials for meshes, such as a marble statue.
-- Surface appearance objects for shared trim maps for `Class.MeshPart|MeshParts`, such as repeatable wood trim details on furniture.
+- Surface Appearance objects for 1:1 or unique materials for meshes, such as a marble statue.
+- Surface Appearance objects for shared trim maps for `Class.MeshPart|MeshParts`, such as repeatable wood trim details on furniture.
- [Material variants](../../parts/materials.md#custom-materials) for shared materials on Parts or terrain, such as flagstone replacing cobblestone for both fireplaces and ground.
-## Plan, reuse, and budgets
+## Planning, Reuse, and Budgets
When starting any project, give some thought about material art direction for consistency and reuse. Every platform and device has a limit on the amount of memory you can use for textures so some upfront planning goes a long way to help keep a handle on the number of textures in your experience.
@@ -36,9 +36,9 @@ Distilled down to its basics, [American Craftsman](https://en.wikipedia.org/wiki
Wood Trim Texture Set
-## Surface appearance and trim maps
+## Surface Appearance and Trim Maps
-Trim maps are simple repeatable textures that can be applied to a wide variety of assets. Trim maps do a lot of heavy lifting in experiences and fill the gap between completely tiling textures and creating a 1:1 texture set that you would get from painting an object in a program like [Substance Painter](https://www.adobe.com/products/substance3d-painter) or using [photogrammetry](../../resources/the-mystery-of-duvall-drive/construct-the-house.md#photogrammetry). The wood material shown previously was set up as a trim map which means that it could be reused on many different meshes, each mesh taking advantage of the same trim textures just by laying out its UVs creatively.
+Trim maps are simple repeatable textures that can be applied to a wide variety of assets. Trim maps do a lot of heavy lifting in experiences and fill the gap between completely tiling textures and creating a 1:1 texture set that you would get from painting an object in a program like [Substance Painter](https://www.adobe.com/products/substance3d-painter) or using [photogrammetry](../../resources/the-mystery-of-duvall-drive/constructing-the-house.md#photogrammetry). The wood material shown previously was set up as a trim map which means that it could be reused on many different meshes, each mesh taking advantage of the same trim textures just by laying out its UVs creatively.
@@ -75,7 +75,7 @@ For an example of over-detail, say we wanted to add some grime to our BaseColor
Notice how the extra detail of stain on the furniture on the left stands out for repetition and incorrect direction compared to the cleaner set on the right.
-If an asset really needs heavy staining, wear, and/or dirt buildup it would be better to use a 1:1 map unique for that specific mesh. For additional information on working with trim maps, see the [Create trim sheets](../../resources/beyond-the-dark/building-architecture.md#create-trim-sheets) section in the Beyond the Dark documentation.
+If an asset really needs heavy staining, wear, and/or dirt buildup it would be better to use a 1:1 map unique for that specific mesh. For additional information on working with trim maps, see the [Creating Trim Sheets](../../resources/beyond-the-dark/building-architecture.md#creating-trim-sheets) section in the Beyond the Dark documentation.
You can package a single Surface Appearance node with these trim maps and apply the trim to all of the assets shown below.
@@ -140,7 +140,7 @@ These two maps were then sent to an Alpha Merge Node to create the final RGBA us
-## Texture sizes
+## Texture Sizes
Along with heavily reusing textures, you can apply other techniques to keep your texture memory usage down. You can reduce texture sizes based on usage. For example, you can often drop the resolution of your Surface Appearance object's `Class.SurfaceAppearance.ColorMap`, `Class.SurfaceAppearance.RoughnessMap`, and `Class.SurfaceAppearance.MetalnessMap` down by 1 or 2 times without losing any visual fidelity. Many times the `Class.SurfaceAppearance.MetalnessMap` can be left blank, which results in a pure black/non-metallic surface.
@@ -172,7 +172,7 @@ When importing custom meshes into Studio, base textures included with your model
When a packaged Surface Appearance is applied for reuse, make sure to delete the textureID within the properties of the mesh to prevent this issue. This is a known behavior and Roblox is looking into improving this flow.
-## Base materials
+## Base Materials
Since we used [parts](../../parts/index.md), [terrain](../../parts/terrain.md), and [meshes](../../parts/meshes.md) side-by-side in this demo we chose to utilize the default [built-in materials](../../parts/materials.md#asset-ids-for-built-in-materials), [Material Variants](../../parts/materials.md#custom-materials), and the newly released [Material Manager](../../parts/materials.md#material-manager) tool to ensure our various parts and terrain surfaces match the look and feel of our PBR-textured meshes.
@@ -183,9 +183,9 @@ Base materials are available for use as-is or to modify as a new variant. In man
Example of a mesh in the foreground using a Surface Appearance node and CSG (constructive solid geometry) objects built in Studio with Parts and using the standard Wood material colored to match.
-## Material variants
+## Material Variants
-Since the experience includes an outdoor environment during a downpour, we knew we wanted our ground to feel wet and muddy to match our stormy pacific northwest art direction. We accomplished this by creating a handful of new [Custom Materials](../../parts/materials.md#custom-materials) using [Material Variants](../../parts/materials.md#create-a-custom-material-in-the-explorer) that we could override the base materials with. We use them to paint down things like mulch, large and small gravel, mud, as well as a shallow puddled version of each.
+Since the experience includes an outdoor environment during a downpour, we knew we wanted our ground to feel wet and muddy to match our stormy pacific northwest art direction. We accomplished this by creating a handful of new [Custom Materials](../../parts/materials.md#custom-materials) using [Material Variants](../../parts/materials.md#creating-a-custom-material-in-the-explorer) that we could override the base materials with. We use them to paint down things like mulch, large and small gravel, mud, as well as a shallow puddled version of each.
Material Variants allow the user to redefine textures that are used for any given default material, adding a lot of opportunities to customize materials used in terrain and parts.
diff --git a/content/en-us/resources/the-mystery-of-duvall-drive/stream-in-immersion.md b/content/en-us/resources/the-mystery-of-duvall-drive/streaming-in-immersion.md
similarity index 85%
rename from content/en-us/resources/the-mystery-of-duvall-drive/stream-in-immersion.md
rename to content/en-us/resources/the-mystery-of-duvall-drive/streaming-in-immersion.md
index 2969bc004..0f6835ea9 100644
--- a/content/en-us/resources/the-mystery-of-duvall-drive/stream-in-immersion.md
+++ b/content/en-us/resources/the-mystery-of-duvall-drive/streaming-in-immersion.md
@@ -1,7 +1,7 @@
---
-title: Stream in immersion
+title: Streaming in Immersion
comments:
-next: /resources/the-mystery-of-duvall-drive/develop-a-moving-world
+next: /resources/the-mystery-of-duvall-drive/developing-a-moving-world
prev: /resources/the-mystery-of-duvall-drive/immersive-narrative
description: Explains the use of instance streaming The Mystery of Duvall Drive.
---
@@ -13,13 +13,13 @@ Roblox Studio is a powerful engine that can create experiences on a wide variety
Streaming enabled on the workspace itself, with default settings
-## Technical considerations
+## Technical Considerations
When enabling streaming on your experience, there are a few things to consider to ensure that your experience runs well and that you maximize the benefits of the streaming feature:
1. **Are there scripts or elements that are reliant on another piece of content?** If so, one or more of your dependencies may not be loaded at certain times.
2. **Are there scripts that scan the workspace when the experience starts?** Client scripts should not rely on finding all instances they require at the time an experience starts and this is not a recommended practice.
-3. **Does your experience suffer visually if some content doesn't display at the correct time?** There are various techniques and tricks to create a [streaming-friendly environment](#streaming-friendly-level-design) and ways to use [perspective](#play-with-perspective) to your advantage.
+3. **Does your experience suffer visually if some content doesn't display at the correct time?** There are various techniques and tricks to create a [streaming-friendly environment](#streaming-friendly-level-design) and ways to use [perspective](#playing-with-perspective) to your advantage.
When creating The Mystery of Duvall Drive, we encountered all three of these problems and were able to work around them by using a combination of careful script design and cleverly applied set dressing and world layout. When working with streaming on your own experience, remember you can tune your streaming min/max distance to what suits your experience and adjust a variety of [highly customizable options](../../workspace/streaming.md#streaming-properties).
@@ -34,7 +34,7 @@ When creating The Mystery of Duvall Drive, we encountered all three of these pro
-## Streaming-friendly level design
+## Streaming-Friendly Level Design
To create an immersive environment, players have to be consistently surrounded by the world we built for them. When using instance streaming, we had to make sure that players wouldn't see unexpected content, such as seeing the "end of the world" if there weren't any visual assets loaded in their instance streaming range.
@@ -45,9 +45,9 @@ Since distant trees behind the house and other blocking geometry like hills and
The player starts surrounded by nearby trees and bushes to help hide the fact distant content hasn't loaded yet. The winding path keeps much of the content hidden until players are close enough to load the asset.
-## Play with perspective
+## Playing with Perspective
-There are some cases where content that a player would expect to see from far away is too far from the camera, such as our [storm in the sky](../../resources/the-mystery-of-duvall-drive/develop-a-moving-world.md#create-the-storm). We wanted players to see this large phenomenon, but it would break the immersion if the sky storm didn't exist when the player was too far away to load the asset. It would also be jarring to see a large asset suddenly load in when the player got close enough to an object that they should've seen further away. We tried to minimize this by playing with perspective and making sure the models in the sky were large enough to be within the bounds of the player's streaming distance.
+There are some cases where content that a player would expect to see from far away is too far from the camera, such as our [storm in the sky](../../resources/the-mystery-of-duvall-drive/developing-a-moving-world.md#creating-the-storm). We wanted players to see this large phenomenon, but it would break the immersion if the sky storm didn't exist when the player was too far away to load the asset. It would also be jarring to see a large asset suddenly load in when the player got close enough to an object that they should've seen further away. We tried to minimize this by playing with perspective and making sure the models in the sky were large enough to be within the bounds of the player's streaming distance.
diff --git a/content/en-us/resources/the-mystery-of-duvall-drive/supporting-systems.md b/content/en-us/resources/the-mystery-of-duvall-drive/supporting-systems.md
index aaea0e7f3..6a13c31dd 100644
--- a/content/en-us/resources/the-mystery-of-duvall-drive/supporting-systems.md
+++ b/content/en-us/resources/the-mystery-of-duvall-drive/supporting-systems.md
@@ -1,5 +1,5 @@
---
-title: Supporting systems
+title: Supporting Systems
comments:
prev: /resources/the-mystery-of-duvall-drive/foundational-gameplay-systems
description: Explains the supporting systems and functions in The Mystery of Duvall Drive.
@@ -31,7 +31,7 @@ Note that we use `Class.Camera.ViewportPointToRay` or `Class.Camera.ScreenPointT
ThoughtBubbles are overall similar, using a raycast to check if a mesh or its parents have a **ThoughtBubble** tag. It also uses the ThoughtText attribute for text, and a **ThoughtBubble** tag to point to a placeholder object used for positioning the UI in the world. Thought bubbles that use the same positional object but have different text have different cooldowns.
-### Special cases
+### Special Cases
Lore has a couple of special cases, one of which is the corrupted seals. When a player clicks a corrupted seal, it displays lore UI, and it waits for a click to start a mission, which affects the game flow. This is handled by the [`GameStateClient`](../../resources/the-mystery-of-duvall-drive/foundational-gameplay-systems.md#gamestatemanager) that uses a bindable `LoreManagerFunc` to request lore UI. A callback is provided to the Lore system by `GameStateClient` to know when lore is "closed" by the player. Another special case is when **ThoughtBubbles** and **Lore** tags are on the same object. In this case, to avoid an overlap of lore and thought bubble text, we run the thought bubble after the lore is closed.
@@ -89,7 +89,7 @@ The **PlayerMissionRespawn** script uses a **RespawnVolume** tag and `Class.Coll
When processing `GameEvents.PlayerRespawn`, the script can use `RespawnPositions`, if mission config provides it. If not, it uses `TeleportPositions` for the specific mission. We don't have a "checkpoint" system, so `CalcClosestTeleportPos` just selects closest **Respawn** or **Teleport** spots from where the player hit the `RespawnVolume`, using the only horizontal, "2D" distance.
-## Small helper systems
+## Small Helper Systems
### PianoManager
@@ -113,7 +113,7 @@ P1.Touched:Connect(function(otherPart) utils.ProcessPortal(otherPart, P2) end)
**ProcessPortal** handles checking that otherPart is a human, teleporting the player through a `Datatype.CFrame` coordinate change, and invoking a small cutscene to hide the transition using a **Teleport_Jump** event in [**EventManager**](../../resources/the-mystery-of-duvall-drive/foundational-gameplay-systems.md#eventmanager).
-### Configuration scripts
+### Configuration Scripts
We have several configuration, data definition, and common functionality scripts:
diff --git a/content/en-us/resources/the-mystery-of-duvall-drive/technical-overview.md b/content/en-us/resources/the-mystery-of-duvall-drive/technical-overview.md
index 9a6f524b6..dcd687009 100644
--- a/content/en-us/resources/the-mystery-of-duvall-drive/technical-overview.md
+++ b/content/en-us/resources/the-mystery-of-duvall-drive/technical-overview.md
@@ -1,5 +1,5 @@
---
-title: Technical overview
+title: Technical Overview
comments:
next: /resources/the-mystery-of-duvall-drive/main-design-requirements
description: Explains the fundamental design and gameplay systems in The Mystery of Duvall Drive.
@@ -9,6 +9,6 @@ The following document is a technical overview of the main design requirements a
You can follow the reference articles sequentially or jump between the following sections:
-- **[Main design requirements](../../resources/the-mystery-of-duvall-drive/main-design-requirements.md)** covers a high-level overview of the essential systems we created, including a mission framework, three types of teleportation, and gameplay scripting.
-- **[Foundational gameplay systems](../../resources/the-mystery-of-duvall-drive/foundational-gameplay-systems.md)** digs more into the implementation of the main gameplay systems that meet the main design requirements.
-- **[Supporting systems](../../resources/the-mystery-of-duvall-drive/supporting-systems.md)** explores any smaller systems made to assist the foundational systems.
+- **[Main Design Requirements](../../resources/the-mystery-of-duvall-drive/main-design-requirements.md)** covers a high-level overview of the essential systems we created, including a mission framework, three types of teleportation, and gameplay scripting.
+- **[Foundational Gameplay Systems](../../resources/the-mystery-of-duvall-drive/foundational-gameplay-systems.md)** digs more into the implementation of the main gameplay systems that meet the main design requirements.
+- **[Supporting Systems](../../resources/the-mystery-of-duvall-drive/supporting-systems.md)** explores any smaller systems made to assist the foundational systems.
diff --git a/content/en-us/resources/weapons-kit.md b/content/en-us/resources/weapons-kit.md
index 2155d22f0..3a6e2ee89 100644
--- a/content/en-us/resources/weapons-kit.md
+++ b/content/en-us/resources/weapons-kit.md
@@ -1,5 +1,5 @@
---
-title: Weapons kit
+title: Weapons Kit
description: The Weapons Kit assists in creating competitive combat-based experiences.
---
@@ -62,7 +62,7 @@ To use an endorsed weapon in your experience:
-## System folder structure
+## System Folder Structure
The **WeaponsSystem** folder is a unified folder that contains assets, configurations, and scripts that power all endorsed weapons in the experience. If located in **ServerScriptService**, it overrides any equivalent **WeaponsSystem** folders that may reside within individual weapons.
@@ -92,16 +92,16 @@ Within the **WeaponsSystem** folder, different aspects are controlled by the fol
Aspect
-
Handled primarily within...
+
Handled Primarily Within...
-
Weapons functionality
+
Weapons Functionality
[WeaponsSystem](#system-folder-structure)
**Libraries**/**BaseWeapon**
**WeaponTypes**/**BulletWeapon**
**WeaponTypes**/**BowWeapon**
-
[Shoulder camera](#shoulder-camera)
+
[Shoulder Camera](#shoulder-camera)
**Libraries**/**ShoulderCamera**
@@ -111,15 +111,15 @@ Within the **WeaponsSystem** folder, different aspects are controlled by the fol
-## Weapon structure
+## Weapon Structure
Endorsed weapons are `Class.Tool|Tools` and are named as they will appear in the player's backpack. Each weapon is structured with a similar hierarchy.
-### Weapon type
+### Weapon Type
The **WeaponType** `Class.StringValue` corresponds with the `Class.ModuleScript` for the weapon in the **WeaponsSystem**/**WeaponTypes** folder. The two base values are **BulletWeapon** and **BowWeapon**.
-### Weapon model
+### Weapon Model
Each weapon contains a `Class.Model` made up of one or more `Class.BasePart|BaseParts` to form the physical weapon. One of these should be set as the model's `Class.Model.PrimaryPart|PrimaryPart`.
@@ -133,11 +133,11 @@ The model also includes the following important descendants which may be parente
- **Reload** – `Class.Sound` that plays when the weapon is reloaded.
- Additional descendants for any [specialized options](#specialized-options).
-### Weapon handle
+### Weapon Handle
The **Handle** part determines where a player character holds the weapon. This must be a `Class.Part`, it must be named **Handle**, and it must be a direct child of the weapon (tool).
-### Configuration folder
+### Configuration Folder
The **Configuration** folder contains specific "value" types for weapon behavior. Beyond the defaults, you can add additional configuration items for [specialized options](#specialized-options) when applicable.
@@ -280,11 +280,11 @@ As follows are the base configurations and their default values:
-## Specialized options
+## Specialized Options
You can add/modify the following options for any weapon. These customizations require modifying either the weapon's `Class.Model`, the weapon's `Class.Configuration`, or both. Some configurations are dependent on others, such as [Muzzle Particles](#muzzle-particles) which require the necessary children for [Projectile/Hit Effects and Sounds](#projectilehit-effects-and-sounds).
-### Bolt animations and sounds
+### Bolt Animations and Sounds
A weapon's **bolt** is the part that moves back and forth each time it's fired.
@@ -346,7 +346,7 @@ A weapon's **bolt** is the part that moves back and forth each time it's fired.
-### Eject bullet casings
+### Ejecting Bullet Casings
Weapons can include physical bullet casings that eject upon firing and fall to the ground.
@@ -402,7 +402,7 @@ Weapons can include physical bullet casings that eject upon firing and fall to t
-### Projectile/hit effects and sounds
+### Projectile/Hit Effects and Sounds
You can configure physical projectiles for any weapon, along with `Sounds`, `Beams`, and `ParticleEmitters` for hit effects and other special effects.
@@ -517,7 +517,7 @@ You can configure physical projectiles for any weapon, along with `Sounds`, `Bea
-#### Muzzle particles
+#### Muzzle Particles
This option emits particles from the specified `Class.ParticleEmitter` at the weapon's **TipAttachment** `Class.Attachment` when it's fired.
@@ -533,7 +533,7 @@ For the specified shot effect, add a ParticleEmitter asset within `WeaponsSystem
-### Muzzle flashes
+### Muzzle Flashes
This option creates a `Class.Beam` flash effect when the weapon is fired.
@@ -555,7 +555,7 @@ Configuration descendants:
- **MuzzleFlashSize0** (`Class.NumberValue`) (optional) — Minimum size of muzzle flash; default is **1**.
- **MuzzleFlashSize1** (`Class.NumberValue`) (optional) — Maximum size of muzzle flash; default is **1**.
-### Particle trails
+### Particle Trails
This option creates a trail of varying length from the weapon to the projectile impact point.
@@ -567,7 +567,7 @@ Configuration descendants:
- **TrailLengthFactor** (`Class.NumberValue`) (optional) — The trail length will be set to this value multiplied by the distance the bullet/projectile traveled in the last frame; default is **1**. Note that this will be overridden if you include **TrailLength**.
- **ShowEntireTrailUntilHit** (`Class.BoolValue`) (optional) — Set to **true** to render the trail from the weapon tip all the way to wherever the projectile is; this will override both **TrailLength** and **TrailLengthFactor** and the trail will only disappear once the projectile hits something. Set to **false** to use one of the above two options to calculate trail length. Default is **false**.
-### Hit marks
+### Hit Marks
This visual addition appears on the surface where projectiles hit and is useful for arrows, bullet holes, scorch marks, etc.
@@ -589,7 +589,7 @@ You can add the following optional asset within `WeaponsSystem/Assets/Effects/Hi
- **Impact** (`Class.ImageLabel`) (optional) — Direct child of **ImpactBillboard**; this begins fully opaque, grows to the full size of the **ImpactBillboard** over 0.1 seconds, then shrinks to half its size and fades to full transparency over 0.1 seconds.
- Any `Class.Part`/`Class.MeshPart`/`Class.SpecialMesh` that you want to appear as a physical projectile (optional). For example, including an arrow `Class.MeshPart` and setting **AlignHitMarkToNormal** noted above to **false** will make the arrow stick out of the surface from the direction you shot it.
-### Exploding projectiles
+### Exploding Projectiles
Projectiles can include an Explosion object to damage player characters in an area around the impact point.
@@ -602,7 +602,7 @@ Configuration descendants:
- **BlastPressure** (`Class.NumberValue`) (optional) — BlastPressure of explosion; default is **10000**.
- **BlastDamage** (`Class.NumberValue`) (optional) — Damage dealt to things in the center of the explosion. Note that the explosion does less damage the farther away hit objects are from the center of the explosion. Default is **100**.
-### Charging weapon
+### Charging Weapon
A charging weapon like the Railgun must be charged up between shots before it can fire again.
@@ -631,7 +631,7 @@ Configuration descendants:
- **NumChargeCompleteParticles** (`Class.IntValue`) (optional) — Number of particles the - ChargeCompleteParticles emitter will emit once the weapon is fully charged. Default is **25**.
- **NumDischargeCompleteParticles** (`Class.IntValue`) (optional) — Number of particles the - **DischargeCompleteParticles** emitter will emit when the weapon is completely discharged. Default is **25**.
-### Bow weapon
+### Bow Weapon
A bow weapon like the Crossbow can include a realistic string and arms construction, as well as a visual arrow nocked to the string.
@@ -663,7 +663,7 @@ Model descendants:
- **LooseScale** (`Class.Vector3Value`) (optional) — Scale of the `Class.SpecialMesh` when the bow is at rest.
- **TightScale** (`Class.Vector3Value`) (optional) — Scale of the `Class.SpecialMesh` when the bow is fully drawn.
-## Weapons system GUI
+## Weapons System GUI
The core weapons system interfaces with this system to update the GUI based on things like spread of the gun, indicators for when you get hit or hit others, etc.
@@ -674,7 +674,7 @@ The **WeaponsSystemGui** is a `Class.ScreenGui` object in `WeaponsSystem/Assets`
- [Scope](#scope) - A `Class.Frame` for zooming in with weapons that use a scope.
- [SmallTouchscreen](#smalltouchscreen) - A `Class.Frame` for buttons on small touchscreens.
-### Scaling elements
+### Scaling Elements
ScalingElements is a `Class.Folder` parented under WeaponsSystemGui with the following descendants:
@@ -682,7 +682,7 @@ ScalingElements is a `Class.Folder` parented under WeaponsSystemGui with the fol
Name
-
Instance type
+
Instance Type
Description
@@ -722,7 +722,7 @@ Scope is a `Class.Frame` that contains **ScopeImage** (`Class.ImageLabel`) which
Name
-
Instance type
+
Instance Type
Description
@@ -742,7 +742,7 @@ SmallTouchScreen is a `Class.Frame` containing buttons that display on small tou
- AimButton (`Class.ImageButton`)
- FireButton (`Class.ImageButton`)
-### Create a directional indicator
+### Create a Directional Indicator
Directional indicators are used to show the direction of something around the player's crosshair. For example, if someone shoots you, a red semi-circle can show up around your crosshair in the direction the shot came from. Other examples include indicators to show the direction of footsteps, indirect gunfire, or even environmental objects such as chests.
@@ -752,7 +752,7 @@ To create a new indicator, add a new Indicator `Class.Frame` in `WeaponsSystemGu
Name
-
Instance type
+
Instance Type
Description
@@ -787,7 +787,7 @@ If an indicator is activated an additional time before it has had time to fade c
You can also activate directional indicators from outside of WeaponsGui by replacing self in the above code with the instance of `WeaponsGui` in your code. However, it's recommended that you activate it from inside `WeaponsGui` and trigger it via a `Class.RemoteEvent` or a `Class.BindableEvent`. For reference, see how `DamageIndicator` is activated within `WeaponsGui`.
-#### Indicator configuration
+#### Indicator Configuration
The DirectionalIndicators can be further modified by adjusting the `Class.Configuration` object parented under the `[Indicator]`. All of these settings have a default value, so there is no need to set configurations when not modifying a setting.
@@ -797,7 +797,7 @@ The following configurations can be set:
Name
-
Instance type
+
Instance Type
Description
@@ -835,7 +835,7 @@ The following configurations can be set:
-### Show damage billboard
+### Show Damage Billboard
The damage billboard is used to show little numbers above a character's head when they are damaged. These will only show up for the player that damaged another player's character, not for spectating players.
@@ -845,11 +845,11 @@ Damage billboards are handled in `WeaponsSystem/Libraries/DamageBillboardHandler
DamageBillboardHandler:ShowDamageBillboard(damage, adornmentPart)
```
-## Shoulder camera
+## Shoulder Camera
The shoulder camera is a third-person camera that looks over the player character's right shoulder. To customize the shoulder camera, modify the variables under the -- Configuration parameters (constants) comment in the `ShoulderCamera.new()` function of `WeaponsSystem/Libraries/ShoulderCamera`. You can modify things such as field of view, offset from the character, walk speed while [sprinting or zooming](#sprint-and-zoom-control), etc.
-## Sprint and zoom control
+## Sprint and Zoom Control
By default, the weapons system adds "sprint" capability, so players can sprint by holding the Shift key, pushing fully up on the dynamic thumbstick (mobile), or pushing fully up on the left joystick (gamepad). If you want to disable sprinting, set the value of **SprintEnabled** within **WeaponsSystem**/**Configuration** to **false**.
diff --git a/content/en-us/scripting/attributes.md b/content/en-us/scripting/attributes.md
index f1a4302f9..fcc4311f3 100644
--- a/content/en-us/scripting/attributes.md
+++ b/content/en-us/scripting/attributes.md
@@ -1,5 +1,5 @@
---
-title: Properties and attributes
+title: Properties and Attributes
description: How to use scripts to manipulate object properties and attributes.
---
@@ -9,11 +9,11 @@ Making experiences interactive often means manipulating object properties and at
- Attributes are essentially custom properties that you define. For example, the [Plant](../resources/plant-reference-project.md) reference project uses attributes to set the purchase price for seeds and the maximum plant size that a pot can hold.
-## Replication order
+## Replication Order
Before you begin retrieving and manipulating objects, you must have an understanding of replication order.
-The Roblox Engine doesn't guarantee the order in which objects are replicated from the server to the client, which makes the `Class.Instance:WaitForChild()` method essential for accessing objects in client scripts, particularly objects in the `Class.Workspace`. Still, some aspects of the process are predictable:
+The Roblox engine doesn't guarantee the order in which objects are replicated from the server to the client, which makes the `Class.Instance:WaitForChild()` method essential for accessing objects in client scripts, particularly objects in the `Class.Workspace`. Still, some aspects of the process are predictable:
1. The client loads the contents of `Class.ReplicatedFirst`, such as a loading screen, assets, and scripts.
1. `Class.LocalScript|LocalScripts` (and `Class.Script|Scripts` with a `Class.Script.RunContext|RunContext` of `Enum.RunContext.Client|Client`) in `ReplicatedFirst` run. These scripts can safely get objects from `ReplicatedFirst` without using `WaitForChild()`:
@@ -44,9 +44,9 @@ The Roblox Engine doesn't guarantee the order in which objects are replicated fr
1. `LocalScripts` in `StarterCharacterScripts` run.
-If your experience uses [instance streaming](../workspace/streaming.md) (`Class.Workspace.StreamingEnabled`), some or most objects might not have loaded into the workspace, so using `WaitForChild()` to access workspace objects becomes an even more important safety measure. In particular, see [Streaming In](../workspace/streaming.md#stream-in) and [Per-Model Streaming Controls](../workspace/streaming.md#per-model-streaming-controls) for additional information on loading and tuning streaming behavior.
+If your experience uses [instance streaming](../workspace/streaming.md) (`Class.Workspace.StreamingEnabled`), some or most objects might not have loaded into the workspace, so using `WaitForChild()` to access workspace objects becomes an even more important safety measure. In particular, see [Streaming In](../workspace/streaming.md#streaming-in) and [Per-Model Streaming Controls](../workspace/streaming.md#per-model-streaming-controls) for additional information on loading and tuning streaming behavior.
-## Get objects
+## Getting Objects
The first step to modifying object properties and attributes is to get a reference to the object. The simplest solution is to make the script a child of the object in the Explorer and use `script.Parent` to reference the object.
@@ -67,7 +67,7 @@ local signsFolder = ReplicatedStorage:WaitForChild("Signs")
local sign = signsFolder:WaitForChild("InteractiveSign")
```
-## Modify properties
+## Modifying Properties
Properties are straightforward to access — just use a `.` after the object reference — although if you're working with a model, you might need to choose an individual part rather than the model itself.
@@ -80,7 +80,7 @@ local chair = ReplicatedStorage:WaitForChild("Chair")
chair.LeftArmRest.Size = Vector3.new(10, 1, 10)
```
-## Create attributes
+## Creating Attributes
Although you can create attributes programmatically, the more common solution is to create them with default values in the Studio user interface. Then you can use scripts to modify their values in response to player actions.
@@ -88,7 +88,7 @@ Although you can create attributes programmatically, the more common solution is
For information on creating attributes in Studio, see [Instance Attributes](../studio/properties.md#instance-attributes).
-## Set attributes
+## Setting Attributes
To modify an attribute's value, call `Class.Instance:SetAttribute()` with a name and value.
@@ -100,7 +100,7 @@ cabbage:SetAttribute("Harvestable", true)
If the attribute doesn't already exist, this method creates it.
-## Get attribute values
+## Getting Attribute Values
To get the value of one existing attribute, call `Class.Instance:GetAttribute()` on the instance.
@@ -127,7 +127,7 @@ for k, v in cabbageAttributes do
end
```
-## Delete attributes
+## Deleting Attributes
To delete an attribute, set its value to nil.
@@ -137,7 +137,7 @@ local cabbage = script.Parent
cabbage:SetAttribute("GrowthRate", nil)
```
-## Detect changes
+## Detecting Changes
There are several ways to listen for changes to properties and attributes:
diff --git a/content/en-us/scripting/capabilities.md b/content/en-us/scripting/capabilities.md
index 6a7b6affa..132d8b87c 100644
--- a/content/en-us/scripting/capabilities.md
+++ b/content/en-us/scripting/capabilities.md
@@ -1,5 +1,5 @@
---
-title: Script capabilities
+title: Script Capabilities
description: Script Capabilities is a system that controls which actions scripts can perform.
---
@@ -7,19 +7,19 @@ description: Script Capabilities is a system that controls which actions scripts
This page describes a feature that is still experimental and is available as a client beta. Features described here might undergo additional changes based on developer feedback and/or bug fixes.
-**Script capabilities** is a system that offers control over actions that scripts can perform inside the `Class.DataModel` subtree. It provides better control over experience scripts rather than being an "all or nothing" system where any script can do anything that other scripts can.
+Script Capabilities is a system that offers control over actions that scripts can perform inside the `Class.DataModel` subtree. It provides better control over experience scripts rather than being an "all or nothing" system where any script can do anything that other scripts can.
- This system lets you limit what models taken from the toolbox can do and makes it easier to include user-generated content inside the experience, even those that contain scripts.
- It can also help ensure better security of experiences that allow players to run their own code, which is often executed in a restricted or emulated environment.
- It can also be used to share libraries that restrict what they can do themselves. For example, a library providing additional math methods can be restricted to the smallest set of capabilities it needs so that other developers using that library don't have to validate the entire codebase to make sure it doesn't include malicious code.
-## Enable script capabilities
+## Enabling Script Capabilities
To enable this feature, change the `Class.Workspace.SandboxedInstanceMode|SandboxedInstanceMode` setting from `Default` to `Experimental` in the Explorer.
When the client beta test is completed, this step will no longer be required.
-## Sandboxed container
+## Sandboxed Container
This system introduces a concept of a **sandboxed container**.
An instance of type `Class.Model`, `Class.Folder`, `Class.Script`, or descendants of any of those classes have a `Class.Instance.Sandboxed|Sandboxed` property available in the Studio **Properties** window, under the **Permissions** section.
@@ -47,7 +47,7 @@ The current thread cannot call 'Clone' (lacking capability CreateInstances)
The current thread cannot call 'GetSecret' (lacking capability Network)
```
-### Execution control
+### Execution Control
This set includes two capabilities:
@@ -64,7 +64,7 @@ When a script fails to start because the execution control capability is missing
Cannot start server script 'Script' (lacking capability RunServerScript)
```
-### Instance access control
+### Instance Access Control
This set includes only a single capability:
@@ -76,15 +76,15 @@ Additionally, any Roblox API event that passes in an `Class.Instance` instead pa
Avoid setting this capability; sandboxing guarantees are weaker when scripts can interact with any instance in an experience.
-#### Access to services
+#### Access to Services
Even without **AccessOutsideWrite**, scripts in the sandboxed container can still access to `game`, `workspace`, and services. This access is provided so that scripts can still call useful methods of those globals, like `Class.DataModel.GetService`, but access to their child instances is still validated.
-#### Internally passed instances
+#### Internally Passed Instances
If an instance is passed through a function call that doesn't go through Roblox APIs, the reference is preserved. However, if a `Class.ModuleScript` is passed in this way, it can't be required without **AccessOutsideWrite**. This is because the return of the `Class.ModuleScript` is often mutable and can be modified by a script in a sandboxed container.
-### Script functionality control
+### Script Functionality Control
This set of capabilities controls some general aspects of scripts:
@@ -97,7 +97,7 @@ Keep in mind that default function restrictions still apply. Even if **LoadStrin
To create new instances, aside from **CreateInstances**, an additional Engine API capability providing access to that instance is required.
-### Engine API access control
+### Engine API Access Control
This last group of capabilities controls script access to various Engine APIs:
@@ -123,13 +123,13 @@ There are also instances that are available without any capabilities aside from
If an instance property or method is accessed without a required capability, an error is reported describing the missing capability.
-Finally, capabilities do not cover every instance in the Roblox Engine today. Instances not listed in this section or the following one are not available for interaction from a sandboxed container and throw an error saying that an **Unassigned** capability is not available to the current script.
+Finally, capabilities do not cover every instance in the Roblox engine today. Instances not listed in this section or the following one are not available for interaction from a sandboxed container and throw an error saying that an **Unassigned** capability is not available to the current script.
An additional limitation is that `Global.LuaGlobals.getfenv` and `Global.LuaGlobals.setfenv` functions are not available for scripts in a sandboxed container.
Only script access to instances is limited. The instances themselves can still exist and operate by themselves inside a sandboxed container. Lights still shine, user interfaces are still visible, and audio setups that are already wired play sounds.
-#### Engine API capability assignments
+#### Engine API Capability Assignments
This feature is currently in the experimental stage, so the assignments of the APIs are not final. The capability of each instance is displayed on the documentation page for that instance.
@@ -222,9 +222,9 @@ Here is the list of instances and methods (if different from the instance capabi
- `Class.BaseRemoteEvent`, `Class.RemoteEvent`, `Class.UnreliableRemoteEvent`
- `Class.RemoteFunction`
-## Interactions between containers
+## Interactions Between Containers
-### Nested containers
+### Nested Containers
When one sandboxed container is nested inside another one, the instances of the inner container are accessible to the outer one.
@@ -233,7 +233,7 @@ For example, if the outer container has capabilities of **Basic**, **Audio** and
If there are no capabilities in common between the inner and outer containers, the resulting capability set is empty.
-### Bindable functions and events
+### Bindable Functions and Events
`Class.BindableEvent` and `Class.BindableFunction` provide the best way to communicate with the container or allow it to run callbacks with capabilities it itself is not allowed to use directly.
@@ -241,14 +241,14 @@ When an event or a function is fired, connections are executed in the context of
It is important to note that even with the **AccessOutsideWrite** capability, scripts in sandboxed containers cannot invoke events or functions outside their containers if they have a larger capability set than the container itself.
-### Module require
+### Module Require
Inner `Class.ModuleScript|ModuleScripts` can be required by the sandboxed container as usual.
However, if the target instance is outside the container, the `Class.ModuleScript` can only be required if the capability set that is available to it is smaller or equal to the capabilities available to the container.
This limitation does not apply to **RunClientScript** and **RunServerScript** capabilities. If the `Class.ModuleScript` is placed in a container with only **RunClientScript** but is required from a script that has the **RunServerScript** capability, it is allowed to succeed and run those functions on the server.
-### Directly called functions
+### Directly Called Functions
If a `Class.ModuleScript` in a sandboxed container is required from outside the container, some of the protections are not available. In particular, the target function is able to access all instances available to the caller. If the caller is not in a sandboxed container, the call acts as if **AccessOutsideWrite** is available to it.
@@ -261,7 +261,7 @@ If required, it is recommended to assign table members using `Global.LuaGlobals.
The overall recommendation is to communicate with `Class.BindableEvent` and `Class.BindableFunction` whenever possible.
-### Movement of instances
+### Movement of Instances
Most instances do not have restrictions on movement between containers. Script instances, however, can only be moved into a container that has the same set of capabilities or a subset of those capabilities.
diff --git a/content/en-us/scripting/debounce.md b/content/en-us/scripting/debounce.md
index f6e7da949..3c6ffe4e2 100644
--- a/content/en-us/scripting/debounce.md
+++ b/content/en-us/scripting/debounce.md
@@ -1,11 +1,11 @@
---
-title: Debounce patterns
+title: Debounce Patterns
description: Debounce patterns are coding techniques that prevent a function from running too many times.
---
A **debounce** pattern is a coding technique that prevents a function from running too many times or an input from triggering multiple times. The following scripting scenarios illustrate debounce as a best practice.
-## Detect collisions
+## Detecting Collisions
Suppose you want to create a hazardous trap part that inflicts 10 damage when touched. An initial implementation might use a basic `Class.BasePart.Touched` connection and a `damagePlayer` function like this:
@@ -52,7 +52,7 @@ end
part.Touched:Connect(damagePlayer)
```
-## Trigger sounds
+## Triggering Sounds
Debounce is also useful when working with sound effects, such as playing a sound when two parts collide (`Class.BasePart.Touched|Touched`), or playing a sound on the `Class.GuiButton.Activated|Activated` event when a user interacts with an on-screen button. In both cases, calling `Class.Sound:Play()` starts playback from the beginning of its track and — without a debounce system — the sound may play multiple times in quick succession.
@@ -88,11 +88,11 @@ end
button.Activated:Connect(onButtonActivated)
```
-## Pickup effects
+## Pickup Effects
Experiences often include collectible pickups in the 3D world such as medkits, ammo packs, and more. If you design these pickups to remain in the world for players to grab again and again, a "cooldown" time should be added before the pickup refreshes and reactivates.
-Similar to [detecting collisions](#detect-collisions), you can manage the debounce state with an [instance attribute](../studio/properties.md#instance-attributes), and visualize the cooldown period by changing the part's `Class.BasePart.Transparency|Transparency`.
+Similar to [detecting collisions](#detecting-collisions), you can manage the debounce state with an [instance attribute](../studio/properties.md#instance-attributes), and visualize the cooldown period by changing the part's `Class.BasePart.Transparency|Transparency`.
```lua title='Script - Health Pickup Using Debounce' highlight='10, 11, 13, 15-17'
local part = script.Parent
diff --git a/content/en-us/scripting/events/bindable.md b/content/en-us/scripting/events/bindable.md
index 783673a17..4c92f0f68 100644
--- a/content/en-us/scripting/events/bindable.md
+++ b/content/en-us/scripting/events/bindable.md
@@ -1,5 +1,5 @@
---
-title: Bindable events and callbacks
+title: Bindable Events and Callbacks
description: Bindable events and callbacks allow for back-and-forth communication on the same side of the client-server boundary.
---
@@ -15,7 +15,7 @@ Depending on how your experience works, bindable events can help make your code
To communicate between scripts **across** the client-server boundary, see [Remote Events](remote.md).
-## Bindable events
+## Bindable Events
The `Class.BindableEvent` object enables custom events through asynchronous, one-way communication between scripts.
@@ -55,7 +55,7 @@ bindableEvent:Fire("Round started!")
You can connect multiple functions to the same `Class.BindableEvent`, but Luau executes them in an unpredictable order. To ensure that functions execute in a particular order, combine them into a single function and connect it to the event.
-## Custom callbacks
+## Custom Callbacks
The `Class.BindableFunction` object allows for synchronous, two-way communication between scripts. You can use it to define a custom callback function and invoke it manually by calling `Class.BindableFunction:Invoke()`. The code invoking the function **yields** until the corresponding callback is found, and the callback receives the arguments that you passed to `Class.BindableFunction:Invoke()|Invoke()`. If the callback was never set, the script that invokes it doesn't resume execution.
@@ -97,11 +97,11 @@ print(sum) --> 6
Each `Class.BindableFunction` can only utilize one `Class.BindableFunction.OnInvoke|OnInvoke` callback. If you make multiple definitions, only the last one assigned runs. Also note that if the `Class.BindableFunction.OnInvoke|OnInvoke` callback does not have a `return` statement, the invocation returns `nil`.
-## Argument limitations
+## Argument Limitations
When you fire a `Class.BindableEvent` or invoke a `Class.BindableFunction`, it forwards any arguments that you pass with the event or to the callback function. You can pass any type of Roblox object (`Datatype.Enum`, `Class.Instance`, etc.), as well as Luau types like numbers, strings, and booleans, although you should carefully consider the following limitations.
-### Non-string indices
+### Non-String Indices
If any **indices** of a passed table are non-string types, such as an `Class.Instance`, [userdata](../../luau/userdata.md), or [function](../../luau/functions.md), Roblox automatically converts those indices to strings.
@@ -131,7 +131,7 @@ bindableEvent:Fire({
})
```
-### Table indexing
+### Table Indexing
If you pass a table of data, do not pass a mixed table of numeric and string keys. Instead, pass a table that consists **entirely** of key-value pairs (a dictionary) or **entirely** of numeric indices (an array).
@@ -178,7 +178,7 @@ bindableEvent:Fire(inventoryData)
bindableEvent:Fire(characterData)
```
-### Table identities
+### Table Identities
Tables passed as arguments to bindable events and callbacks are copied, meaning they will not be exactly equivalent to those provided when firing the event or invoking the callback. Nor will tables returned to the invoker be exactly equivalent to those provided. You can demonstrate this by running the following script on a `Class.BindableFunction` and observing how the table identities differ.
diff --git a/content/en-us/scripting/events/deferred.md b/content/en-us/scripting/events/deferred.md
index 29f8e7e89..5ca7270e4 100644
--- a/content/en-us/scripting/events/deferred.md
+++ b/content/en-us/scripting/events/deferred.md
@@ -1,5 +1,5 @@
---
-title: Deferred engine events
+title: Deferred Engine Events
description: Deferred engine events defer event handlers until certain resumption points.
---
@@ -20,7 +20,7 @@ The total time taken does not change, but the ordering is different.
"Re-entrancy" prevents events from continuously firing one another when they reach a certain depth. The current limit for this is 10.
-## Deferred event benefits
+## Deferred Event Benefits
The `Immediate` behavior has some disadvantages. For every instance added to your game, property that changes, or some other trigger that is invoked, the engine needs to run Lua code before anything else happens.
@@ -35,7 +35,7 @@ By having specific portions of the engine life cycle in which Lua can run, the e
- Performance-critical systems don't need to yield to Lua, which leads to performance gains.
- Unless the engine itself changes it, the place never changes outside of a resumption point.
-## Resumption points
+## Resumption Points
After being deferred, an event handler is resumed at the next resumption point. Currently, the set of resumption points includes:
@@ -49,11 +49,11 @@ After being deferred, an event handler is resumed at the next resumption point.
- `Class.RunService.Heartbeat`
- `Class.DataModel.BindToClose`
-## Common affected code patterns
+## Common Affected Code Patterns
With remote events, the following examples either stop working correctly or have subtly different behavior; they rely on events being resumed immediately.
-### Trigger and catch events mid-execution
+### Triggering and Catching Events Mid-Execution
In this example, `false` is always returned when deferred events are enabled because the callback has not run. To work correctly, the thread must yield until at least when the event should have fired.
@@ -66,7 +66,7 @@ doSomethingToTriggerEvent() -- Causes `event` to fire
return success
```
-### Listen for the first occurrence of an event
+### Listening for the First Occurrence of an Event
```lua
connection = event:Connect(function ()
@@ -83,7 +83,7 @@ Any other method of disconnection besides `Class.Instance.Disconnect()|Disconnec
Alternatively, use `Datatype.RBXScriptSignal.Once()|Once()` as a more convenient method for connecting to an event that you only need the first invocation of.
-### Events that change ancestry or properties
+### Events That Change Ancestry or Properties
Deferred events cause events that handle a change in ancestry or a property to fire after the ancestry or property is changed:
diff --git a/content/en-us/scripting/events/index.md b/content/en-us/scripting/events/index.md
index 8e2749a3f..8d058f24f 100644
--- a/content/en-us/scripting/events/index.md
+++ b/content/en-us/scripting/events/index.md
@@ -15,7 +15,7 @@ You don't have to listen for events or take any action in response to them, but
Deferred events can help you ensure more performant and consistent event handling. See [Deferred Events](deferred.md) for more information.
-## Connect functions to events
+## Connecting Functions to Events
You connect a function to an event using `Datatype.RBXScriptSignal.Connect()|Connect()` to execute code each time the event fires. Most events pass arguments to their connected functions. For example, the `Class.BasePart.Touched` event passes the object that touched the part (such as a left hand or car wheel), and the `Class.Players.PlayerAdded` event passes the `Class.Player` that joined your experience.
@@ -54,7 +54,7 @@ Players.PlayerAdded:Connect(function(player)
end)
```
-## Disconnect functions from events
+## Disconnecting Functions from Events
The `Datatype.RBXScriptSignal.Connect()|Connect()` method returns an `Datatype.RBXScriptConnection` object. If you connect a function to an event, but don't want to call the function the next time an event fires (such as after some condition is met), disconnect it by calling `Datatype.RBXScriptConnection:Disconnect()|Disconnect()` on the `Datatype.RBXScriptConnection` object.
@@ -85,7 +85,7 @@ If you only want to connect a function to an event once—that is, only run the
When Luau destroys an event's object, such as the `Class.Player` object when a user leaves the experience, all of its ([non-deferred](deferred.md)) connections disconnect automatically.
-## Wait for events to fire
+## Waiting for Events to Fire
If you want a script to yield until a specific event fires, use the `Datatype.RBXScriptSignal:Wait()|Wait()` method. This method returns the event's arguments, which you can assign to variables for later use:
diff --git a/content/en-us/scripting/events/remote.md b/content/en-us/scripting/events/remote.md
index b47850a0c..c0d24a9e1 100644
--- a/content/en-us/scripting/events/remote.md
+++ b/content/en-us/scripting/events/remote.md
@@ -1,5 +1,5 @@
---
-title: Remote events and callbacks
+title: Remote Events and Callbacks
description: Remote network events and callbacks allow for back-and-forth communication across the client-server boundary.
---
@@ -16,14 +16,14 @@ Unlike [Bindable Events](bindable.md), which have more limited utility, the use
- **Gameplay** - Basic gameplay, such as a player reaching the end of a level, can require a remote event. A client script notifies the server, and server scripts reset the player's position.
- **Server verification** - If a player tries to drink a potion, do they actually _have_ that potion? To ensure fairness, the server has to be the source of truth for an experience. A client script can use a remote event to notify the server that the player is drinking a potion, and then server scripts can decide whether the player actually has that potion and whether to confer any benefits.
- **User interface updates** - As the game state changes, server scripts can use remote events to notify clients of changes to scores, objectives, etc.
-- **In-experience Marketplace purchases** - For an example implementation that uses remote functions, see [Prompting Subscription Purchases](../../production/monetization/subscriptions.md#prompt-subscription-purchases).
+- **In-experience Marketplace purchases** - For an example implementation that uses remote functions, see [Prompting Subscription Purchases](../../production/monetization/subscriptions.md#prompting-subscription-purchases).
-## Quick reference
+## Quick Reference
The following tables serve as a quick reference for how to use `Class.RemoteEvent|RemoteEvents` and `Class.RemoteFunction|RemoteFunctions` to communicate between the client and server.
-
+
[Client → Server](#client-server)
@@ -66,7 +66,7 @@ The following tables serve as a quick reference for how to use `Class.RemoteEven
-
+
[Client → Server → Client](#client-server-client)
@@ -93,7 +93,7 @@ The following tables serve as a quick reference for how to use `Class.RemoteEven
-## Remote events
+## Remote Events
A `Class.RemoteEvent` object facilitates asynchronous, one-way communication across the client-server boundary without yielding for a response.
@@ -130,7 +130,7 @@ Once you've created a `Class.RemoteEvent`, it can facilitate one-way communicati
Clients cannot communicate directly with other clients, although you can effectively dispatch an event from one client to another by using the `Class.RemoteEvent:FireServer()` method, then calling `Class.RemoteEvent:FireClient()|FireClient()` or `Class.RemoteEvent:FireAllClients()|FireAllClients()` in the event handler for `Class.RemoteEvent.OnServerEvent|OnServerEvent`.
-### Client → server
+### Client → Server
You can use a `Class.LocalScript` to trigger an event on the [server](../../projects/client-server.md) by calling the `Class.RemoteEvent:FireServer()|FireServer()` method on a `Class.RemoteEvent`. If you pass arguments to `Class.RemoteEvent:FireServer()|FireServer()`, they pass to the event handler on the server with certain [limitations](#argument-limitations). Note that the first parameter of the event handler on the server is always the `Class.Player` object of the client that calls it, and additional parameters follow.
@@ -175,7 +175,7 @@ local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
remoteEvent:FireServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))
```
-### Server → client
+### Server → Client
You can use a `Class.Script` to trigger an event on a [client](../../projects/client-server.md) by calling the `Class.RemoteEvent:FireClient()|FireClient()` method on a `Class.RemoteEvent`. The first argument for `Class.RemoteEvent:FireClient()|FireClient()` is the `Class.Player` object of the client that you want to respond to the event, and additional arguments pass to the client with certain [limitations](#argument-limitations). Note that the event handler doesn't need to include the `Class.Player` object as its first argument because you can determine the player on the client with `Class.Players.LocalPlayer`.
@@ -225,7 +225,7 @@ end
Players.PlayerAdded:Connect(onPlayerAdded)
```
-### Server → all clients
+### Server → All Clients
You can use a `Class.Script` to trigger an event on all clients by calling the `Class.RemoteEvent:FireAllClients()|FireAllClients()` method on a `Class.RemoteEvent`. Unlike `Class.RemoteEvent:FireClient()|FireClient()`, the `Class.RemoteEvent:FireAllClients()|FireAllClients()` method doesn't require a `Class.Player` object because it fires the `Class.RemoteEvent` to all clients.
@@ -271,7 +271,7 @@ for timeRemaining = -1, countdown do
end
```
-## Remote callbacks
+## Remote Callbacks
A `Class.RemoteFunction` object facilitates synchronous, two-way communication across the client-server boundary. The sender of a remote function will yield until it receives a response from the recipient.
@@ -298,7 +298,7 @@ Once you've created a `Class.RemoteFunction`, it can facilitate two-way communic
-### Client → server → client
+### Client → Server → Client
You can use a `Class.LocalScript` to call a function on the [server](../../projects/client-server.md) by calling the `Class.RemoteFunction:InvokeServer()|InvokeServer()` method on a `Class.RemoteFunction`. Unlike a [remote event](#remote-events), the `Class.LocalScript` that invokes the `Class.RemoteFunction` yields until the callback returns. Arguments that you pass to `Class.RemoteFunction:InvokeServer()|InvokeServer()` pass to the `Class.RemoteFunction.OnServerInvoke|OnServerInvoke` callback of the `Class.RemoteFunction` with certain [limitations](#argument-limitations). Note that if you define multiple callbacks to the same `Class.RemoteFunction`, only the last definition executes.
@@ -348,7 +348,7 @@ local newPart = remoteFunction:InvokeServer(Color3.fromRGB(255, 0, 0), Vector3.n
print("The server created the requested part:", newPart)
```
-### Server → client → server
+### Server → Client → Server
You can use a `Class.Script` to call a function on the client by calling the `Class.RemoteFunction:InvokeClient()|InvokeClient()` method on a `Class.RemoteFunction`, but it has serious risks as follows:
@@ -358,11 +358,11 @@ You can use a `Class.Script` to call a function on the client by calling the `Cl
For actions that don't require two-way communications, such as updating a GUI, use a `Class.RemoteEvent` and communicate from [server to client](#server-client).
-## Argument limitations
+## Argument Limitations
When you fire a `Class.RemoteEvent` or invoke a `Class.RemoteFunction`, it forwards any arguments that you pass with the event or to the callback function. Any type of Roblox object such as an `Datatype.Enum`, `Class.Instance`, or others can be passed, as well as Luau types such as numbers, strings, and booleans, although you should carefully explore the following limitations.
-### Non-string indices
+### Non-String Indices
If any **indices** of a passed table are non-string types such as an `Class.Instance`, [userdata](../../luau/userdata.md), or [function](../../luau/functions.md), Roblox automatically converts those indices to strings.
@@ -398,7 +398,7 @@ end
Players.PlayerAdded:Connect(onPlayerAdded)
```
-### Passed functions
+### Passed Functions
Functions included as arguments for a `Class.RemoteEvent` or `Class.RemoteFunction` will **not** be replicated across the [client-server](../../projects/client-server.md) boundary, making it impossible to pass functions remotely. Instead, the resulting argument on the receiving side will be `nil`.
@@ -427,7 +427,7 @@ end
remoteEvent:FireAllClients(testFunction)
```
-### Table indexing
+### Table Indexing
If you pass a table of data, do not pass a mixed table of numeric and string keys. Instead, pass a table that consists **entirely** of key-value pairs (dictionary) or **entirely** of numeric indices.
@@ -473,7 +473,7 @@ remoteEvent:FireServer(inventoryData)
remoteEvent:FireServer(characterData)
```
-### Table identities
+### Table Identities
Tables passed as arguments to remote events/callbacks are copied, meaning they will not be exactly equivalent to those provided when firing the event or invoking the callback. Nor will tables returned to the invoker be exactly equivalent to those provided. You can demonstrate this by running the following script on a `Class.RemoteFunction` and observing how the table identities differ.
@@ -544,7 +544,7 @@ setmetatable(truck, Car)
remoteEvent:FireServer(truck)
```
-### Non-replicated instances
+### Non-Replicated Instances
If a `Class.RemoteEvent` or `Class.RemoteFunction` passes a value that's only visible to the sender, Roblox doesn't replicate it across the client-server boundary and passes `nil` instead of the value. For example, if a `Class.Script` passes a descendant of `Class.ServerStorage`, the client listening to the event will receive a `nil` value because that object isn't replicable for the client.
diff --git a/content/en-us/scripting/index.md b/content/en-us/scripting/index.md
index 2fbe817cf..82d6ddece 100644
--- a/content/en-us/scripting/index.md
+++ b/content/en-us/scripting/index.md
@@ -18,9 +18,9 @@ Roblox scripts use the [Luau](https://luau-lang.org) programming language, which
- Compared to Lua 5.1, Luau adds performance enhancements and many useful features, including an optional typing system, string interpolation, and generalized iteration for tables.
- All valid Lua 5.1 code is valid Luau code, but the opposite is not true.
-Most books and online resources for Lua are still broadly applicable to Luau. For a detailed summary of differences, see [Compatibility](https://luau-lang.org/compatibility) in the Luau documentation. For language syntax, see the [Luau reference](../luau/index.md).
+Most books and online resources for Lua are still broadly applicable to Luau. For a detailed summary of differences, see [Compatibility](https://luau-lang.org/compatibility) in the Luau documentation. For language syntax, see the [Luau Reference](../luau/index.md).
-### Luau basics
+### Luau Basics
Luau is gradually typed, so you don't need to specify a type when you create a variable. You can use `Global.LuaGlobals.type()` to check object type:
@@ -92,7 +92,7 @@ for key, value in myDictionary do -- Luau generalized iteration
end
```
-## Your first script
+## Your First Script
1. In Roblox Studio, hover over **ServerScriptService** in the [Explorer](../studio/explorer.md) window and click **+**.
1. Select **Script** to add a new script.
@@ -123,7 +123,7 @@ end
world
```
-## Get comfortable
+## Getting Comfortable
A big part of adapting to a new development environment is configuring it to meet your needs and understanding the tools at your disposal:
@@ -135,7 +135,7 @@ A big part of adapting to a new development environment is configuring it to mee
For more information about configuring Studio for scripting, see [Script Editor](../studio/script-editor.md). For information on using your favorite text editor and version control system, see [External Tools](../projects/external-tools.md).
-## Your second script
+## Your Second Script
1. In Roblox Studio, add a script to **ReplicatedStorage** in the [Explorer](../studio/explorer.md) window and rename it to `OhNo`.
1. Add the following code to the file:
diff --git a/content/en-us/scripting/locations.md b/content/en-us/scripting/locations.md
index 3d64bdc05..5c1cc2973 100644
--- a/content/en-us/scripting/locations.md
+++ b/content/en-us/scripting/locations.md
@@ -1,5 +1,5 @@
---
-title: Script types and locations
+title: Script Types and Locations
description: How scripts run in Roblox, and how location impacts that behavior.
---
@@ -9,7 +9,7 @@ For many developers, the fundamental challenge of adapting to Roblox scripting i
The reason for this complexity is that Roblox experiences are multiplayer by default. Scripts need the ability to only run on the server, only run on the client, or be shared across both. The evolution of the Roblox platform over time has further complicated the situation.
-## Script types
+## Script Types
Roblox has three types of scripts:
@@ -37,7 +37,7 @@ To change a script run context, select it in the [Explorer](../studio/explorer.m
- To share code between server and client scripts, use `Class.ModuleScript|ModuleScripts` in `ReplicatedStorage`.
- Use `Class.LocalScript|LocalScripts` in `StarterCharacterScripts`, `StarterPlayerScripts`, `StarterGui`, and `StarterPack`.
-## Script locations
+## Script Locations
@@ -45,7 +45,7 @@ This image shows which Explorer window locations can contain client scripts. Rem
-## Example project structure
+## Example Project Structure
The [Plant](../resources/plant-reference-project.md) reference project shows how you might organize your code in a large, complex experience.
diff --git a/content/en-us/scripting/module.md b/content/en-us/scripting/module.md
index 70040c6e9..a8a4ae127 100644
--- a/content/en-us/scripting/module.md
+++ b/content/en-us/scripting/module.md
@@ -1,11 +1,11 @@
---
-title: Reuse code
+title: Reusing Code
description: How to use module scripts to reuse code.
---
After creating a few scripts, it's never long before you want to reuse some code between them. Depending on [location](location.md), `Class.ModuleScript|ModuleScripts` let you reuse code between scripts on different sides of the client-server boundary or the same side of the boundary.
-## Create module scripts
+## Creating Module Scripts
You can put module scripts anywhere that you put scripts, but `Class.ReplicatedStorage` is a popular location; storing module scripts here lets you reuse code between the server and clients.
@@ -14,7 +14,7 @@ You can put module scripts anywhere that you put scripts, but `Class.ReplicatedS
1. Right-click the script and rename it to `PickupManager`.
1. Double-click the script to open it in the [Script Editor](../studio/script-editor.md).
-## Anatomy of a module script
+## Anatomy of a Module Script
Each `Class.ModuleScript` starts with the following code:
@@ -57,7 +57,7 @@ return PickupManager
Adding the function to a table isn't strictly necessary—you could just return the function itself—but it's a good pattern to follow; it gives you an easy-to-understand syntax when you call the function from another script and lets you easily add more functions to the module script over time.
-## Require module scripts
+## Requiring Module Scripts
To load a module script, you call the `Global.LuaGlobals.require()` function. In `ReplicatedStorage`, add a new script, and change its `RunContext` to `Client`. Then add the following code to call the `PickupManager.getPickupBonus` function:
@@ -97,7 +97,7 @@ Module scripts have some common patterns that you can use to simplify your code
Most of these patterns require an understanding of events. If you're not familiar with them, see [Events](events.md).
-### Data sharing
+### Data Sharing
To associate data with individual objects, you can assign attributes to them or create `Class.Configuration` folders with value objects such as `Class.StringValue` or `Class.IntValue`. However, both approaches are troublesome if you want to add or modify dozens of objects or data values. They also don't store tables or functions.
@@ -122,7 +122,7 @@ GunConfig.Damage = {
return GunConfig
```
-### Custom events
+### Custom Events
Custom events enable scripts to communicate with each other, but having to keep track of references to individual `Class.BindableEvent` objects can clutter your code.
diff --git a/content/en-us/scripting/multithreading.md b/content/en-us/scripting/multithreading.md
index 9c793fa4f..c84c3ead0 100644
--- a/content/en-us/scripting/multithreading.md
+++ b/content/en-us/scripting/multithreading.md
@@ -7,23 +7,23 @@ With the **Parallel Luau** programming model, you can run code on multiple threa
-## Parallel programming model
+## Parallel Programming Model
-By default, scripts execute sequentially. If your experience has complex logic or content, such as non-player characters (NPCs), raycasting validation, and procedural generation, then sequential execution might cause lag for your users. With the parallel programming model, you can [split tasks into multiple scripts](#split-code-into-multiple-threads) and run them in parallel. This makes your experience code run faster, which improves the user experience.
+By default, scripts execute sequentially. If your experience has complex logic or content, such as non-player characters (NPCs), raycasting validation, and procedural generation, then sequential execution might cause lag for your users. With the parallel programming model, you can [split tasks into multiple scripts](#splitting-code-into-multiple-threads) and run them in parallel. This makes your experience code run faster, which improves the user experience.
The parallel programming model also adds safety benefits to your code. By splitting code into multiple threads, when you edit code in one thread, it doesn't affect other code running in parallel. This reduces the risk of having one bug in your code corrupting the entire experience, and minimizes the delay for users in live servers when you push an update.
-Adopting the parallel programming model doesn't mean to put everything in multiple threads. For example, the [server-side raycasting validation](#server-side-raycasting-validation) sets each individual user a remote event in parallel but still requires the initial code to run serially to change global properties, which is a common pattern for parallel execution.
+Adopting the parallel programming model doesn't mean to put everything in multiple threads. For example, the [Server-side Raycasting Validation](#server-side-raycasting-validation) sets each individual user a remote event in parallel but still requires the initial code to run serially to change global properties, which is a common pattern for parallel execution.
-Most times you need to combine serial and parallel phases to achieve your desired output, since currently there are some operations not supported in parallel that can prevent scripts from running, such as modifying instances in parallel phases. For more information on the level of usage of APIs in parallel, see [thread safety](#thread-safety).
+Most times you need to combine serial and parallel phases to achieve your desired output, since currently there are some operations not supported in parallel that can prevent scripts from running, such as modifying instances in parallel phases. For more information on the level of usage of APIs in parallel, see [Thread Safety](#thread-safety).
-## Split code into multiple threads
+## Splitting Code Into Multiple Threads
To run your experience's scripts in multiple threads concurrently, you need to split them into logical chunks under different **actors** in the [data model](../projects/data-model.md). Actors are represented by `Class.Actor` instances inheriting from `Class.DataModel`. They work as units of execution isolation that distribute the load across multiple cores running simultaneously.
-### Place actor instances
+### Placing Actor Instances
-You can put actors in proper containers or use them to replace the top-level instance types of your 3D entities such as NPCs and raycasters, then add corresponding scripts.
+You can put actors in proper containers or use them to replace the top-level instance types of your 3D entities such as NPCs and raycasters, then add corresponding [scripts](../scripting/index.md).
@@ -31,7 +31,7 @@ For most situations, you shouldn't put an actor as a child of another actor in t
-### Desynchronize threads
+### Desynchronizing Threads
Though putting scripts under actors grants them the capability for parallel execution, by default the code still runs on the single thread serially, which doesn't improve the runtime performance. You need to call the `Library.task.desynchronize()`, a yieldable function that suspends the execution of the current coroutine for running code in parallel and resumes it at the next parallel execution opportunity. To switch a script back to serial execution, call `Library.task.synchronize()`.
@@ -53,7 +53,7 @@ end)
You can't use `require()` in a desynchronized parallel phase. Require scripts you want to use first in a serial context.
-Scripts that are part of the same actor always execute sequentially with respect to each other, so you need multiple actors. For example, if you put all parallel-enabled behavior scripts for your NPC in one actor, they still run serially on a single thread, but if you have multiple actors for different NPC logic, each of them runs in parallel on its own thread. For more information, see [Best practices](#best-practices).
+Scripts that are part of the same actor always execute sequentially with respect to each other, so you need multiple actors. For example, if you put all parallel-enabled behavior scripts for your NPC in one actor, they still run serially on a single thread, but if you have multiple actors for different NPC logic, each of them runs in parallel on its own thread. For more information, see [Best Practices](#best-practices).
@@ -66,18 +66,18 @@ Scripts that are part of the same actor always execute sequentially with respect
-### Thread safety
+### Thread Safety
-During the parallel execution, you can access most instances of the `DataModel` hierarchy as usual, but some API properties and functions aren't safe to read or write. If you use them in your parallel code, Roblox Engine can automatically detect and prevent these accesses from occurring.
+During the parallel execution, you can access most instances of the `DataModel` hierarchy as usual, but some API properties and functions aren't safe to read or write. If you use them in your parallel code, Roblox engine can automatically detect and prevent these accesses from occurring.
API members have a thread safety level that indicates whether and how you can use them in your parallel code, as the following table shows:
-
Safety level
-
For properties
-
For functions
+
Safety Level
+
For Properties
+
For Functions
@@ -110,19 +110,19 @@ You can find thread safety tags for API members on the [API reference](/referenc
If an API member doesn't specify a thread safety level, by default its thread safety level is **Unsafe**.
-## Cross-thread communication
+## Cross-Thread Communication
Under the multithreading context, you can still allow scripts in different actors to communicate with each other to exchange data, coordinate tasks, and synchronize activities. The engine supports the following mechanisms for cross-thread communication:
-- [Actor messaging](#actor-messaging) API for sending messages to an actor using scripts.
-- [Shared table](#shared-table) data structure for efficiently sharing a large amount of data between multiple actors on a shared state.
-- [Direct data model communication](#direct-data-model-communication) for simple communication with restrictions.
+- [Actor Messaging](#actor-messaging) API for sending messages to an actor using scripts.
+- [Shared Table](#shared-table) data structure for efficiently sharing a large amount of data between multiple actors on a shared state.
+- [Direct Data Model Communication](#direct-data-model-communication) for simple communication with restrictions.
You can support multiple mechanisms to accommodate your cross-thread communication needs. For example, you can send a shared table through the Actor Messaging API.
-### Actor messaging
+### Actor Messaging
-The **actor messaging** API allows a script, either in a serial or parallel context, to send data to an actor in the same data model. Communication through this API is asynchronous, in which the sender doesn't block until the receiver receives the message.
+The **Actor Messaging** API allows a script, either in a serial or parallel context, to send data to an actor in the same data model. Communication through this API is asynchronous, in which the sender doesn't block until the receiver receives the message.
When sending messages using this API, you need to define a **topic** for categorizing the message. Each message can only be sent to a single actor, but that actor can internally have multiple callbacks bound to a message. Only scripts that are descendants of an actor can receive messages.
@@ -157,19 +157,19 @@ end)
print("Bound to messages")
```
-### Shared table
+### Shared Table
`Datatype.SharedTable` is a table-like data structure accessible from scripts running under multiple actors. It's useful for situations that involve a large amount of data and require a common shared state between multiple threads. For example, when multiple actors work on a common world state that is not stored in the data model.
Sending a shared table to another actor doesn't make a copy of the data. Instead, shared tables allow safe and atomic updates by multiple scripts simultaneously. Every update to a shared table by one actor is immediately visible to all actors. Shared tables can also be cloned in a resource-efficient process that utilizes structural sharing instead of copying the underlying data.
-### Direct data model communication
+### Direct Data Model Communication
You can also facilitate communication between multiple threads directly using the data model, in which different actors can write and subsequently read properties or attributes. However, to maintain the thread-safety, scripts running in parallel generally can't write to the data model. So directly using the data model for communication comes with restrictions and may force scripts to synchronize frequently, which can impact performance of your scripts.
## Examples
-### Server-side raycasting validation
+### Server-Side Raycasting Validation
For a fighting and battle experience, you need to enable [raycasting](../workspace/raycasting.md) for your users' weapons. With the client simulating the weapons to achieve good latency, the server has to confirm the hit, which involves doing raycasts and some amount of heuristics that compute expected character velocity, and look at past behavior.
@@ -225,7 +225,7 @@ end
remoteEventConnection = remoteEvent.OnServerEvent:Connect(onRemoteMouseEvent)
```
-### Server-side procedural terrain generation
+### Server-Side Procedural Terrain Generation
To create a vast world for your experience, you can populate the world dynamically. Procedural generation typically creates independent terrain chunks, with the generator performing relatively intricate calculations for object placement, material usage, and voxel filling. Running generation code in parallel can enhance efficiency of the process. The following code sample serves as an example.
@@ -313,7 +313,7 @@ actor:BindToMessageParallel("GenerateChunk", function(x, y, z, seed)
end)
```
-## Best practices
+## Best Practices
To apply the maximum benefits of parallel programming, refer to the following best practices when adding your Lua code:
diff --git a/content/en-us/scripting/scheduler.md b/content/en-us/scripting/scheduler.md
index 43977bc1c..ec2f7687b 100644
--- a/content/en-us/scripting/scheduler.md
+++ b/content/en-us/scripting/scheduler.md
@@ -1,11 +1,11 @@
---
-title: Schedule code
+title: Scheduling Code
description: Explains how to schedule code so it executes after a specific action or cycle has completed.
---
-Scheduling code is useful in many situations, such as ensuring code executes after a specific action or cycle has completed, or delaying code for a specific duration of time. You can use the `Library.task` library to optimize Roblox's [task scheduler](../studio/microprofiler/task-scheduler.md) to manage and schedule code. You can also use a similar library called `Library.coroutine` to schedule code which has some additional functionality.
+Scheduling code is useful in many situations, such as ensuring code executes after a specific action or cycle has completed, or delaying code for a specific duration of time. You can use the `Library.task` library to optimize Roblox's [Task Scheduler](../studio/microprofiler/task-scheduler.md) to manage and schedule code. You can also use a similar library called `Library.coroutine` to schedule code which has some additional functionality.
-### Common methods
+### Common Methods
The following are the most common `Library.task` methods used to schedule code. You should use the task methods over legacy scheduling methods, such as `Global.RobloxGlobals.wait()`, to ensure that your code runs optimally.
@@ -15,7 +15,7 @@ Certain legacy global methods, such as (`Global.RobloxGlobals.spawn()`, `Global.
The following table lists the relevant legacy global methods and their preferred, more optimized counterparts:
-| Legacy global methods | Task methods | Additional alternatives |
+| Legacy Global Methods | Task Methods | Additional Alternatives |
| :-------------------------------------- | :------------------------------------------------- | :------------------------------------------------- |
| `wait()` | `Library.task.wait()` | `Class.RunService.Heartbeat` |
| `wait(n)` | `Library.task.wait()\|task.wait(n)` | |
diff --git a/content/en-us/scripting/scripts.md b/content/en-us/scripting/scripts.md
index 9bae5d6e5..fa40d10d9 100644
--- a/content/en-us/scripting/scripts.md
+++ b/content/en-us/scripting/scripts.md
@@ -21,7 +21,7 @@ Scripts need to reside in **script containers** in the data model. Based on the
You can also use `Class.LocalScript` objects for client-side scripts, but we recommend using regular scripts with the run context setting to specify whether the script runs on the client or server.
-## Module scripts
+## Module Scripts
`Class.ModuleScript` objects are reusable modules that script objects
load by calling the `Global.LuaGlobals.require()` function. Module scripts must return exactly one
@@ -111,7 +111,7 @@ If you `Global.LuaGlobals.require()` a `Class.ModuleScript` from both sides of t
Module scripts have some common patterns that you can use to simplify your code and provide more flexibility over the features Roblox Studio provides. By incorporating these patterns into your development, you can avoid common pitfalls as your Roblox experience grows in size and complexity.
-#### Data sharing
+#### Data Sharing
To associate data with individual objects, you can assign attributes to them or create `Class.Configuration` folders with value objects such as `Class.StringValue` or `Class.IntValue`. However, both approaches are troublesome if you want to add or modify dozens of objects or data values. They also don't store tables or functions.
@@ -137,7 +137,7 @@ GunConfig.Damage = {
return GunConfig
```
-#### Custom events
+#### Custom Events
Custom events enable scripts to communicate with each other, but having to keep track of references to individual `Class.BindableEvent` objects may clutter your code.
@@ -271,7 +271,7 @@ NetworkManagerServer.GetServerEventSignal("RequestA"):Connect(function(player, .
end)
```
-## Create scripts
+## Creating Scripts
To create script objects in the Studio **Explorer** window:
diff --git a/content/en-us/scripting/security/security-tactics.md b/content/en-us/scripting/security/security-tactics.md
index a62497061..85ed5c0fa 100644
--- a/content/en-us/scripting/security/security-tactics.md
+++ b/content/en-us/scripting/security/security-tactics.md
@@ -1,5 +1,5 @@
---
-title: Security tactics and cheat mitigation
+title: Security Tactics and Cheat Mitigation
description: Explore security tactics and cheat mitigation tactics for Roblox experiences.
---
@@ -13,7 +13,7 @@ Collectively, this means that a skilled exploiter can potentially execute code t
While you can implement limited [design defenses](#defensive-design-tactics) to catch common attacks, it's highly recommended that you implement more reliable [server-side mitigation tactics](#server-side-mitigation), as the server is the ultimate authority for any running experience.
-## Defensive design tactics
+## Defensive Design Tactics
Basic design decisions can serve as "first step" security measures to discourage exploits. For example, in a shooter game where players get points for killing other players, an exploiter may create a bunch of bots that teleport to the same place so they can be quickly killed for points. Given this potential exploit, consider two approaches and their predictable outcome:
@@ -21,7 +21,7 @@ Basic design decisions can serve as "first step" security measures to discourage
Approach
-
Predictable outcome
+
Predictable Outcome
@@ -46,13 +46,13 @@ Basic design decisions can serve as "first step" security measures to discourage
While defensive design obviously isn't a perfect or comprehensive solution, it can contribute to a broader security approach, along with [server-side mitigation](#server-side-mitigation).
-## Server-side mitigation
+## Server-Side Mitigation
As much as possible, the **server** should cast the final verdict on what is "true" and what the current state of the world is. Clients can, of course, request the server to make changes or perform an action, but the server should **validate and approve** each of these changes/actions before the results are replicated to other players.
With the exception of certain physics operations, changes to the data model on the client do not replicate to the server, so the main attack path is often via the network events you've declared with `Class.RemoteEvent|RemoteEvents` and `Class.RemoteFunction|RemoteFunctions`. Remember that an exploiter running their own code on your client can invoke these with whatever data they want.
-### Remote runtime type validation
+### Remote Runtime Type Validation
One attack path is for an exploiter to invoke `Class.RemoteEvent|RemoteEvents` and `Class.RemoteFunction|RemoteFunctions` with arguments of the incorrect type. In some scenarios, this may cause code on the server listening to these remotes to error in a way that's advantageous to the exploiter.
@@ -105,7 +105,7 @@ end
remoteFunction.OnServerInvoke = createPart
```
-### Data validation
+### Data Validation
Another attack that exploiters might launch is to send [technically valid types](#remote-runtime-type-validation) but make them extremely large, long, or otherwise malformed. For example, if the server has to perform an expensive operation on a string that scales with length, an exploiter could send an incredibly large or malformed string to bog down the server.
@@ -169,11 +169,11 @@ end
buyItemEvent.OnServerInvoke = buyItem
```
-### Value validation
+### Value Validation
In addition to validating [types](#remote-runtime-type-validation) and [data](#data-validation), you should validate the **values** passed through `Class.RemoteEvent|RemoteEvents` and `Class.RemoteFunction|RemoteFunctions`, ensuring they are valid and logical in the context being requested. Two common examples are an [in-experience shop](#in-experience-shop) and a [weapon targeting](#weapon-targeting) system.
-#### In-experience shop
+#### In-Experience Shop
Consider an in-experience shop system with a user interface, for instance a product selection menu with a "Buy" button. When the button is pressed, you can invoke a `Class.RemoteFunction` between the client and the server to request the purchase. However, it's important that the **server**, the most reliable manager of the experience, confirms that the user has enough money to buy the item.
@@ -182,7 +182,7 @@ Consider an in-experience shop system with a user interface, for instance a prod
Example purchase flow from client to server through a `Class.RemoteFunction`
-#### Weapon targeting
+#### Weapon Targeting
Combat scenarios warrant special attention on validating values, particularly through aiming and hit validation.
@@ -200,7 +200,7 @@ Imagine a game where a player can fire a laser beam at another player. Rather th
- Confirm that the hit player is alive.
- Store weapon and player state on the server and confirm that a firing player is not blocked by a current action such as reloading or a state like sprinting.
-#### Data store manipulation
+#### DataStore Manipulation
In experiences using `Class.DataStoreService` to save player data, exploiters may take advantage of invalid [data](#data-validation), and more obscure methods, to prevent a `Class.DataStore` from saving properly. This can be especially abused in experiences with item trading, marketplaces, and similar systems where items or currency leave a player's inventory.
@@ -211,11 +211,11 @@ Ensure that any actions performed through a `Class.RemoteEvent` or `Class.Remote
- Table indices cannot be `NaN` or `nil`. Iterate over all tables passed by the client and verify all indices are valid.
- `Class.DataStore|DataStores` can only accept valid UTF-8 characters, so you should sanitize all strings provided by the client via `Library.utf8|utf8.len()` to ensure they are valid. `Library.utf8|utf8.len()` will return the length of a string, treating unicode characters as a single character; if an invalid UTF-8 character is encountered it will return `nil` and the position of the invalid character. Note that invalid UTF-8 strings can also be present in tables as keys and values.
-### Remote throttling
+### Remote Throttling
If a client is able to make your server complete a computationally expensive operation, or access a rate-limited service like `Class.DataStoreService` via a `Class.RemoteEvent`, it's critical that you implement **rate limiting** to ensure the operation is not called too frequently. Rate limiting can be implemented by tracking when the client last invoked a remote event and rejecting the next request if it's called too soon.
-### Movement validation
+### Movement Validation
For competitive experiences, you may wish to validate player character movements on the server to ensure they aren't teleporting around the map or moving faster than acceptable.
diff --git a/content/en-us/scripting/services.md b/content/en-us/scripting/services.md
index fb7f978b3..a0c4f321a 100644
--- a/content/en-us/scripting/services.md
+++ b/content/en-us/scripting/services.md
@@ -1,9 +1,9 @@
---
title: Services
-description: Services provide pre-built functionality in the Roblox Engine.
+description: Services provide pre-built functionality in the Roblox engine.
---
-In [Reuse code](module.md), you might have noticed frequent use of the `game:GetService()` method. Roblox services let you access the built-in features of the engine, like selling in-experience items, enabling chat, playing sounds, animating objects, and managing instances.
+In [Reusing Code](module.md), you might have noticed frequent use of the `game:GetService()` method. Roblox services let you access the built-in features of the engine, like selling in-experience items, enabling chat, playing sounds, animating objects, and managing instances.
In fact, services are the first step in **the most fundamental, common pattern of Roblox development**:
@@ -47,12 +47,12 @@ Some key details include:
Rather than comparing [standard libraries](/reference/engine/libraries), [global functions and variables](/reference/engine/globals), or third-party libraries, a big part of Roblox development is identifying which of the many, many services can help you add the desired functionality to your experiences. In the example above, instead of using a standard I/O library to write to disk, you use [cloud services](#cloud-services) to store data.
-## Container services
+## Container Services
Container services can contain and influence other objects. These container
services reside at the root of the data model and are visible in Studio's
Explorer window. Collectively, these container services
-form a structured hierarchy for the data model, so the Roblox Engine can
+form a structured hierarchy for the data model, so the Roblox engine can
properly interpret and render your place. The following table includes some common container services.
Service | Description
@@ -70,9 +70,9 @@ To further examine the data model, you can use these methods:
For more information on container services, see the [data
model](/projects/data-model#object-organization) documentation.
-## Scripting services
+## Scripting Services
-Scripting services provide standard functionality in the Roblox Engine that you
+Scripting services provide standard functionality in the Roblox engine that you
call within scripts. The following table includes some common scripting services.
Service | Description
@@ -84,7 +84,7 @@ Service | Description
`Class.SoundService` | Controls various global aspects of how audio plays in an experience, such as the doppler scale and volumetric audio. Can also contain sound groups to control the volume and dynamic effects properties of multiple audio signals at once.
`Class.CollectionService` | Manages groups (collections) of instances with tags that replicate from the server to the client, letting you more easily assign and work with groups of related instances.
-## Cloud services
+## Cloud Services
Roblox also has special cloud services for handling tasks and processes
that occur in the Roblox cloud. The following table includes some common cloud services.
diff --git a/content/en-us/sound/assets.md b/content/en-us/sound/assets.md
index b5ee8f3bd..d2dcd9802 100644
--- a/content/en-us/sound/assets.md
+++ b/content/en-us/sound/assets.md
@@ -1,11 +1,11 @@
---
-title: Audio assets
+title: Audio Assets
description: Explore how to find and import audio assets for use in your experiences.
---
-You can [explore](#explore-assets) a wide variety of free‑to‑use audio assets in the [Toolbox](../projects/assets/toolbox.md), or you can [upload](#import-audio) audio assets that you're certain you have permission to use, such as audio files you make yourself. The [asset privacy](../projects/assets/privacy.md) system automatically ensures that the IDs of your uploaded audio can't be accessed by users without the proper permissions.
+You can [explore](#exploring-assets) a wide variety of free‑to‑use audio assets in the [Toolbox](../projects/assets/toolbox.md), or you can [upload](#importing-audio) audio assets that you're certain you have permission to use, such as audio files you make yourself. The [asset privacy](../projects/assets/privacy.md) system automatically ensures that the IDs of your uploaded audio can't be accessed by users without the proper permissions.
-## Explore assets
+## Exploring Assets
The [Toolbox](../projects/assets/toolbox.md) contains a wide variety of audio assets made by Roblox and the Roblox community for creators to use within their experiences, including more than 100,000 professionally-produced sound effects and music tracks from top audio and music partners.
@@ -25,7 +25,7 @@ The [Toolbox](../projects/assets/toolbox.md) contains a wide variety of audio as
See [Sound Objects](../sound/objects.md) for details on how to use `Class.Sound` instances in an experience.
-## Import audio
+## Importing Audio
### Requirements
@@ -40,7 +40,7 @@ You can import custom audio as long as it meets the following requirements:
If you're [ID verified](../production/publishing/account-verification.md), you can import 100 free audio assets per 30 days; if you're unverified, you can upload 10 free audio assets per 30 days. Studio assigns each new audio asset a **unique asset ID** that you can use within your experiences to [play the audio](../sound/objects.md).
-### Upload
+### Uploading
You can upload audio through the [Asset Manager](../projects/assets/manager.md), the [Creator Dashboard](https://create.roblox.com/dashboard/creations), or the [Open Cloud API](../cloud/open-cloud/usage-assets.md). To upload through the [Asset Manager](../projects/assets/manager.md):
diff --git a/content/en-us/sound/dynamic-effects.md b/content/en-us/sound/dynamic-effects.md
index ccaa37837..fc5bc98d3 100644
--- a/content/en-us/sound/dynamic-effects.md
+++ b/content/en-us/sound/dynamic-effects.md
@@ -1,11 +1,11 @@
---
-title: Dynamic effects
+title: Dynamic Effects
description: Dynamic Effects modify or enhance the audio of your experience.
---
Dynamic effects modify or enhance the audio of individual `Class.Sound` objects or an entire `Class.SoundGroup`. You can apply these effects to make your audio more immersive within your experience, such as using `Class.ReverbSoundEffect` in large rooms to make them feel massive.
-## Apply dynamic effects
+## Applying Dynamic Effects
Each dynamic effect you apply has additional properties you can adjust until you achieve the type of sound you desire. For more information on these properties, see each dynamic effect's API page.
@@ -13,12 +13,12 @@ To apply a dynamic effect:
1. In the **Explorer** window, insert a new dynamic effect into a `Class.Sound` or `Class.SoundGroup` object.
- 1. Hover over the object and click the ⊕ button. A contextual menu displays.
- 2. From the menu, insert a **dynamic effect**.
+ 1. Hover over the audio object and click the ⊕ button. A contextual menu displays.
+ 1. From the menu, insert a **dynamic effect**.
-
+
-2. **(Optional)** In the **Properties** window, select the new dynamic effect and adjust its properties.
+2. (Optional) In the **Properties** window, select the new dynamic effect and adjust its properties.
diff --git a/content/en-us/sound/groups.md b/content/en-us/sound/groups.md
index 0c9aa2dfe..540c90391 100644
--- a/content/en-us/sound/groups.md
+++ b/content/en-us/sound/groups.md
@@ -1,42 +1,47 @@
---
-title: Sound groups
+title: Sound Groups
description: Sound Groups are audio mixers that group multiple audio objects so you can control the properties of multiple audio signals at once.
---
A `Class.SoundGroup` is an **audio mixer** that groups multiple audio objects, such as `Class.Sound` objects or additional `Class.SoundGroup|SoundGroups`, allowing you to control the volume and dynamic effects properties of multiple audio signals at once. Useful applications include:
-- [Assigning audio](#assign-audio-objects-to-soundgroups) to **SoundEffects** and **BackgroundMusic** sound groups so that you can adjust each group's master volume for optimal audio balancing.
-- [Nesting sound groups](#nest-soundgroups) into meaningful categories under a mix tree.
+- [Assigning audio](#assigning-audio-objects-to-soundgroups) to **SoundEffects** and **BackgroundMusic** sound groups so that you can adjust each group's master volume for optimal audio balancing.
+- [Nesting sound groups](#nesting-soundgroups) into meaningful categories under a mix tree.
- Grouping all sounds that need a specific [dynamic effect](../sound/dynamic-effects.md). For example, you can group all sounds inside a cave to a **Cave** sound group, then apply a `Class.ReverbSoundEffect` to simulate the sounds reflecting off of the cave's environment.
-When creating `Class.SoundGroup|SoundGroups`, it's best to keep them all in a single location for organizational purposes as you continue to add and edit audio within your experience. The following example stores the new `Class.SoundGroup` under `Class.SoundService`, as this service determines how `Class.Sound` objects play in experiences.
+## Creating SoundGroups
-## Create sound groups
+When creating `Class.SoundGroup|SoundGroups`, it's best to keep them all in a single location of the Workspace for organization purposes as you continue to add and edit audio within your experience. The following example stores the new `Class.SoundGroup` under `Class.SoundService`, as this service determines how `Class.Sound` objects play in experiences.
-To create a `Class.SoundGroup`:
+To create a SoundGroup:
-1. In the **Explorer** window, hover over `Class.SoundService` and click the ⊕ button. A contextual menu displays.
-2. From the menu, insert a `Class.SoundGroup`.
+1. In the **Explorer** window, insert a new SoundGroup into SoundService.
-
+ 1. Hover over **SoundService** and click the ⊕ button. A contextual menu displays.
+ 1. From the menu, insert a **SoundGroup**.
-3. Triple-click the new sound group and rename it according to its purpose, such as **SoundEffects** or **BackgroundMusic**.
+
-## Assign audio objects to sound groups
+2. Triple-click the new sound group and rename it according to its purpose, such as **SoundEffects** or **BackgroundMusic**.
-`Class.SoundGroup|SoundGroups` don't have the typical parent-child behavior of other forms of object grouping like `Class.Model|Models` and `Class.Folder|Folders`. Instead, you must **assign** each `Class.Sound` object to its applicable `Class.SoundGroup` object, regardless of either object's location in the workspace hierarchy, because where you place the `Class.Sound` object changes where audio emits from, not the `Class.SoundGroup` object itself. For more information, see [sound objects](../sound/objects.md).
+## Assigning Audio Objects to SoundGroups
-To assign a `Class.Sound` object to a `Class.SoundGroup`:
+`Class.SoundGroup|SoundGroups` don't have the typical parent-child behavior of other forms of object grouping like `Class.Model|Models` and `Class.Folder|Folders`. Instead, you must assign each `Class.Sound` object to its applicable `Class.SoundGroup` object, regardless of either object's location in the workspace hierarchy, because where you place the `Class.Sound` object changes where audio emits from, not the `Class.SoundGroup` object itself. For more information, see [Creating Sound Objects](../sound/objects.md#creating-sound-objects).
+
+To assign a Sound object to a SoundGroup:
1. In the **Explorer** window, select a sound object.
2. In the **Properties** window, click the **SoundGroup** property field. Your cursor changes.
+
+
+
3. In the **Explorer** window, click on the sound group object you want to assign your sound object to. The sound object's **SoundGroup** property updates accordingly.
-
+
-## Nest sound groups
+## Nesting SoundGroups
-You can nest `Class.SoundGroup|SoundGroups` together into meaningful categories under a mix tree for organization and scripting purposes. When you're planning the parent-child relationships in your mix, consider the different sound categories in your experience, and how important they should be for the listener. For example, player ability sounds are likely much more important to gameplay than environmental sounds. If you group them into separate parent `Class.SoundGroup|SoundGroups`, you can easily access and [adjust their volume levels](#adjust-volume) as you add more `Class.Sound` objects to your experience.
+You can nest `Class.SoundGroup|SoundGroups` together into meaningful categories under a mix tree for organization and scripting purposes. When you're planning the parent-child relationships in your mix, consider the different sound categories in your experience, and how important they should be for the listener. For example, player ability sounds are likely much more important to gameplay than environmental sounds. If you group them into separate parent `Class.SoundGroup|SoundGroups`, you can easily access and [adjust their volume levels](#adjusting-volume) as you add more `Class.Sound` objects to your experience.
To nest `Class.SoundGroup|SoundGroups`:
@@ -44,11 +49,11 @@ To nest `Class.SoundGroup|SoundGroups`:
2. Drop the sound group. It displays as a child of the sound group you nested it under.
-## Adjust volume
+## Adjusting Volume
-There are two main ways to think about a sound's volume: how loud the sound is by itself, and how loud it is in relation to other sounds. For example, a waterfall sounds loud when you play it by itself, but when you compare it to other sound effects like tires screeching, it likely sounds much quieter. To ensure that each sound plays at the correct volume for your experience, you can either [add multipliers](#add-multipliers) to `Class.SoundGroup|SoundGroups`, or prioritize audio from one `Class.SoundGroup` over another through the process of [ducking](#ducking).
+There are two main ways to think about a sound's volume: how loud the sound is by itself, and how loud it is in relation to other sounds. For example, a waterfall sounds loud when you play it by itself, but when you compare it to other sound effects like tires screeching, it likely sounds much quieter. To ensure that each sound plays at the correct volume for your experience, you can either [add multipliers](#adding-multipliers) to `Class.SoundGroup|SoundGroups`, or prioritize audio from one `Class.SoundGroup` over another through the process of [ducking](#ducking).
-### Add multipliers
+### Adding Multipliers
The `Class.SoundGroup.Volume|Volume` property of a `Class.SoundGroup` lets you apply a **volume multiplier** between `0` and `10` to each of its child audio objects while they retain their relative volumes. This means that if a `Class.Sound` object has a volume of `0.5` and you child it to a `Class.SoundGroup` that has a volume multiplier of `0.5`, the effective volume of the `Class.Sound` object is `0.25`.
@@ -60,7 +65,7 @@ You can prioritize audio from one `Class.SoundGroup` over another through the `C
The sounds that you choose to duck depend on the needs of your specific experience. For example, one experience might benefit from reducing the volume of background music whenever a GUI notification plays, while others might benefit from reducing the volume of GUI notifications whenever dialogue plays. The following reference mix tree prioritizes `Class.Sound` objects in the high-priority **GUI Notifications** and **Weapons** `Class.SoundGroup|SoundGroups` while de-prioritizing `Class.Sound` objects in low-priority **3D** and **2D Ambience** `Class.SoundGroup|SoundGroups`.
-
+
The `Class.CompressorSoundEffect` has four main properties you must set in order to duck audio whenever your high priority audio plays:
@@ -105,4 +110,4 @@ To prioritize `Class.SoundGroup|SoundGroups` through the `Class.CompressorSoundE
6. In the **Attack** property field, input how quickly you want audio to duck.
7. In the **Release** property field, input how quickly you want the audio to stop ducking.
8. In the **Ratio** property field, input the ratio of how much compression you want to occur between the audio object that ducks and the audio object that Studio prioritizes.
-9. **(Optional)** Play test your experience to see if the audio sounds correct. If not, adjust the **CompressorSoundEffect** properties accordingly.
+9. (Optional) Play test your experience to see if the audio sounds correct. If not, adjust the **CompressorSoundEffect** properties accordingly.
diff --git a/content/en-us/sound/index.md b/content/en-us/sound/index.md
index cf69e46b9..ad220dcf7 100644
--- a/content/en-us/sound/index.md
+++ b/content/en-us/sound/index.md
@@ -1,24 +1,24 @@
---
-title: Sound and music
+title: Sound and Music
description: An overview of sound and music features on Roblox
---
Sound effects and music enhance your experiences and make them more immersive. You can import your own [audio assets](#audio-assets) or search for free-to-use audio in the [Creator Store](../production/creator-store.md), play audio through `Class.Sound` or objects, and enhance audio playback through [dynamic effects](#dynamic-effects).
-## Audio assets
+## Audio Assets
You can import [audio assets](../sound/assets.md) that you're certain you have permission to use, such as audio you make yourself. If you are uncertain whether you have permission to use an audio file, the [Creator Store](../production/creator-store.md) contains a wide variety of free-to-use audio, including more than 100,000 professionally-produced sound effects and music tracks from top audio and music partners.
-## Sound objects
+## Sound Objects
A [sound object](../sound/objects.md) emits audio within an experience. Roblox assigns each [audio asset](../sound/assets.md) a unique ID that you can assign to `Class.Sound` objects to play a specific sound effect or music track. You can either set this audio to play automatically at runtime, or trigger it to play from scripts.
The location of where you place a `Class.Sound` object in the [Explorer](../studio/explorer.md) hierarchy affects how users hear audio. If you want users to only hear audio near a specific position, you must parent the `Class.Sound` object to a 3D object or `Class.Attachment` to behave as positional audio. If you want users to hear audio regardless of their position, you must insert the `Class.Sound` object directly into `Class.Workspace` or `Class.SoundService` to behave as background audio.
-## Sound groups
+## Sound Groups
A [sound group](../sound/groups.md) acts as an audio mixer for multiple audio objects, such as `Class.Sound` objects or additional `Class.SoundGroup|SoundGroups`, allowing you to control the volume and dynamic effects properties of multiple audio signals at once.
-## Dynamic effects
+## Dynamic Effects
[Dynamic effects](../sound/dynamic-effects.md) modify or enhance the audio of individual `Class.Sound` objects or an entire `Class.SoundGroup`. You can apply these effects to make audio more immersive within the experience, such as using `Class.EqualizerSoundEffect` to make rain sound muffled, `Class.CompressorSoundEffect` to control a sound's maximum volume, or `Class.ReverbSoundEffect` to add more realistic reflections of sound in interior spaces.
diff --git a/content/en-us/sound/objects.md b/content/en-us/sound/objects.md
index 77d3adbe5..e016f8602 100644
--- a/content/en-us/sound/objects.md
+++ b/content/en-us/sound/objects.md
@@ -1,13 +1,13 @@
---
-title: Sound objects
+title: Sound Objects
description: Sound objects are instances that emit audio within an experience.
---
-Audio playback occurs through `Class.Sound` objects which emit audio within an experience. Roblox assigns each [audio asset](../sound/assets.md) a unique ID that you can assign to `Class.Sound` objects to play a specific sound effect or music track. You can either set this audio to play automatically at runtime, or trigger it to [play from scripts](#script-sound-objects).
+Audio playback occurs through `Class.Sound` objects which emit audio within an experience. Roblox assigns each [audio asset](../sound/assets.md) a unique ID that you can assign to `Class.Sound` objects to play a specific sound effect or music track. You can either set this audio to play automatically at runtime, or trigger it to [play from scripts](#scripting-sound-objects).
To modify playback of multiple `Class.Sound` objects, you can assign them to a [sound group](../sound/groups.md) and control the entire group's volume, as well as apply [dynamic effects](../sound/dynamic-effects.md).
-## Create sound objects
+## Creating Sound Objects
There are three locations you can create a `Class.Sound` object, and each location determines how audio emits and volume changes in relation to the user's position within the experience.
@@ -15,8 +15,8 @@ There are three locations you can create a `Class.Sound` object, and each locati
Location
-
How audio emits
-
How volume changes
+
How Audio Emits
+
How Volume Changes
@@ -38,7 +38,7 @@ There are three locations you can create a `Class.Sound` object, and each locati
-### Positional audio
+### Positional Audio
Positional audio is audio that users can only hear near a specific position within the experience. There are two types of positional audio you can utilize: volumetric and point source.
@@ -60,13 +60,16 @@ To create a `Class.Sound` object for volumetric audio:
2. In the **Properties** window, navigate to the **VolumetricAudio** property, then set it to **Enabled**.
3. In the **Explorer** window, hover over a `Class.BasePart`, then click the ⊕ button. A contextual menu displays.
4. From the menu, insert a **Sound**.
+
+
+
5. In the **Properties** window, navigate to the **SoundId** property and input a valid [audio asset ID](../sound/assets.md).
-
+
6. **(Optional)** If you want the audio to start playing when the experience begins, enable the **Playing** property.
-#### Point source
+#### Point Source
Contrary to volumetric audio, point source audio only emits from a single point source. This type of audio is useful for explosions, impact noises, electronic devices, and dialogue.
@@ -76,10 +79,13 @@ To create a `Class.Sound` object for point source audio:
1. In the **Explorer** window, hover over an attachment, truss, wedge, or corner wedge, then click the ⊕ button. A contextual menu displays.
2. From the menu, insert a **Sound**.
+
+
+
3. In the **Properties** window, navigate to the **SoundId** property and input a valid [audio asset ID](../sound/assets.md).
4. **(Optional)** If you want the audio to start playing when the experience begins, enable the **Playing** property.
-### Background audio
+### Background Audio
Background audio plays at the same volume no matter where the user travels within your experience. This type of audio is useful for music that you want to play for users, especially when you want to create a soundtrack of multiple audio files.
@@ -89,11 +95,14 @@ To create a `Class.Sound` object for background audio:
1. In the **Explorer** window, hover over **SoundService**, then click the ⊕ button. A contextual menu displays.
2. From the menu, insert a **Sound**.
+
+
+
3. In the **Properties** window, navigate to the **SoundId** property and input a valid [audio asset ID](../sound/assets.md).
4. **(Optional)** If you want the audio to start playing when the experience begins, enable the **Playing** property.
5. **(Optional)** If this `Class.Sound` object is the only track you want to play in the place, enable its **Looped** property.
-## Customize sound objects
+## Customizing Sound Objects
`Class.Sound` object properties work together to influence how users experience your audio, such as:
@@ -233,9 +242,9 @@ end)
The `Class.Sound.Looped|Looped` property allows you to repeat audio after it has finished playing. When set to `true`, the `Class.Sound` object's audio plays again. This is useful to apply to [background audio](#background-audio) to ensure your experience never has abrupt silence.
-## Script sound objects
+## Scripting Sound Objects
-### Play audio contextually
+### Playing Audio Contextually
Aside from auto-playing audio through the `Class.Sound` object's `Class.Sound.Playing|Playing` property, you can play audio contextually from a `Class.LocalScript` by calling `Class.Sound:Play()|Play()` on the corresponding `Class.Sound` object. For example:
@@ -258,7 +267,7 @@ if musicTrack not musicTrack.IsPlaying then
end
```
-### Play interface audio
+### Playing Interface Audio
You can play interface audio for `Class.GuiObject|GuiObjects` such as [buttons](../ui/buttons.md) by hooking up a `Class.Sound` object to the `Class.GuiButton.Activated|Activated` event listener. This lets you provide auditory feedback to users, such as when they hover over or press it.
diff --git a/content/en-us/studio/avatar-tab.md b/content/en-us/studio/avatar-tab.md
index 9accb0010..361bfed5f 100644
--- a/content/en-us/studio/avatar-tab.md
+++ b/content/en-us/studio/avatar-tab.md
@@ -1,5 +1,5 @@
---
-title: Avatar tab
+title: Avatar Tab
description: The Avatar tab contains specialized tools for working with avatars and accessories.
---
@@ -7,7 +7,7 @@ The **Avatar** tab contains the standard [transform tools](../studio/model-tab.m
-## Accessory tools
+## Accessory Tools
The **Accessory** section contains tools for creating layered or rigid [accessories](../art/accessories/index.md) from imported custom meshes.
diff --git a/content/en-us/studio/build-studio-widgets.md b/content/en-us/studio/building-studio-widgets.md
similarity index 97%
rename from content/en-us/studio/build-studio-widgets.md
rename to content/en-us/studio/building-studio-widgets.md
index 9707d332f..6d8d049e8 100644
--- a/content/en-us/studio/build-studio-widgets.md
+++ b/content/en-us/studio/building-studio-widgets.md
@@ -1,11 +1,11 @@
---
-title: Build Studio widgets
+title: Building Studio Widgets
description: Building custom widgets in Studio allows you to customize workflows and views.
---
Studio gives you the power to create custom **widgets** and use them as Studio tools and extensions. These widgets behave as custom windows/panels in Studio, and you can dock them inside of your interface or have them float as separate windows.
-## Create widget UIs
+## Creating Widget UIs
All Studio widgets begin as `Class.DockWidgetPluginGui` objects which you can fill with `Class.GuiObject|GuiObjects`, such as text labels and buttons. To create an empty widget GUI, call the `Class.Plugin:CreateDockWidgetPluginGui()|CreateDockWidgetPluginGui()` function, passing in an ID and a `Datatype.DockWidgetPluginGuiInfo` object.
@@ -87,7 +87,7 @@ testWidget.Title = "Test Widget" -- Optional widget title
You cannot use the `Class.Plugin:CreateDockWidgetPluginGui()|CreateDockWidgetPluginGui()` function in game scripts. You can only call it from the command bar or a [plugin](../studio/plugins.md) script.
-### Customize widget UI
+### Customizing Widget UI
Once you create a widget, you can customize its user interface with `Class.GuiObject|GuiObjects` such as informative `Class.TextLabel|TextLabels` or interactive `Class.ImageButton|ImageButtons`. For example, the following code adds a basic `Class.TextButton` to the GUI window:
@@ -116,7 +116,7 @@ testButton.Parent = testWidget
To help you build consistent, effective Studio widgets, Roblox provides a [GitHub repo](https://github.com/Roblox/StudioWidgets) that contains GUI elements with a standard "Studio" look and feel. These include checkboxes, radio buttons, and input fields which have a Studio style, and they all support dark theme.
-### Change Studio color themes
+### Changing Studio Color Themes
Effective Studio widgets ideally match the Studio **theme** setting and dynamically adjust when the theme changes. For instance, if a developer is using the dark theme, the widget's background color, images, and text labels should look nice alongside Studio's native theme colors.
@@ -144,7 +144,7 @@ end
syncGuiColors({testButton})
```
-### Customize mouse cursors
+### Customizing Mouse Cursors
To improve the expected interaction with widget elements, you can set system-specific **mouse cursors** to GUI events, such as `Class.GuiObject.MouseEnter|MouseEnter` and `Class.GuiObject.MouseLeave|MouseLeave`. The following code demonstrates how to connect a function to the `Class.GuiObject.MouseEnter|MouseEnter` and `Class.GuiObject.MouseLeave|MouseLeave` events of `testButton` to change the mouse cursor:
@@ -259,7 +259,7 @@ Reference the following table for a list of mouse cursors and their potential us
Note that these cursor looks are only an approximation — the actual cursors match your default operating system cursors.
-## Gather user input
+## Gathering User Input
UI elements such as `Class.TextBox` and `Class.TextButton` work normally in Studio widgets, and you can build interfaces just like you normally would on Roblox. However, `Class.UserInputService` and `Class.ContextActionService` don't work since these services expect the main game window to be in focus.
@@ -278,11 +278,11 @@ end
frame.InputBegan:Connect(onInputBegan)
```
-## Drag-and-drop interaction
+## Drag-and-Drop Interaction
Using drag-and-drop interactions for your widgets is a simple way to improve the flow of data. To create this interaction, you must define the element to drag, initiate the drag, create a drop target, and process the drop action.
-### Create drag source
+### Creating a Drag Source
You can start a drag action by calling
`Class.Plugin:StartDrag()` when the user
@@ -304,7 +304,7 @@ dragButton.Text = "Drag me!"
dragButton.Parent = dragSourceWidget
```
-### Initiate the drag
+### Initiating the Drag
When the user clicks on the
`Class.TextButton`, you can initiate drag through the `Class.GuiButton.MouseButton1Down|MouseButton1Down()` event which fires as soon as the user presses the mouse button.
@@ -330,7 +330,7 @@ end
dragButton.MouseButton1Down:Connect(onButton1Down)
```
-### Create drop target
+### Creating a Drop Target
The `Class.PluginGui.PluginDragDropped`
event fires when the user releases their mouse on a window during a drag. When
@@ -348,7 +348,7 @@ textLabel.Text = "Drop here..."
textLabel.Parent = dragTargetWidget
```
-### Process the drop action
+### Processing the Drop Action
After creating a drop target, connect the `Class.PluginGui.PluginDragDropped` event on the drop target widget:
diff --git a/content/en-us/studio/debugging.md b/content/en-us/studio/debugging.md
index d83995670..b27cfe457 100644
--- a/content/en-us/studio/debugging.md
+++ b/content/en-us/studio/debugging.md
@@ -10,24 +10,24 @@ tags:
- Breakpoints
---
-Studio offers many debugging tools commonly found in Integrated Development Environments (IDEs). These tools help you resolve errors and inspect scripts line-by-line as they run. Debugging info is displayed in the [Watch](#watch), [Call Stack](#call-stack), [Breakpoints](#breakpoints-window), and [Output](#output) windows for you to inspect.
+Studio offers many debugging tools commonly found in Integrated Development Environments (IDEs). These tools help you resolve errors and inspect scripts line-by-line as they run. Debugging info is displayed in the **Watch**, **Call Stack**, **Breakpoints**, and [Output](../studio/output.md) windows for you to inspect.
-## General workflow
+## General Workflow
If you notice a problem in your experience or want to verify that it works as you intend, you can debug the code related to it as follows:
-1. [Insert breakpoints](#insert-breakpoints) on the lines of codes that you want to examine.
+1. [Insert breakpoints](#inserting-breakpoints) on the lines of codes that you want to examine.
2. In the [Script](../studio/script-tab.md) tab, click **Play** or **Run** in the test tab to start a playtest session, also known as a debugging session.
-3. When a script hits a breakpoint, the playtest session pauses. Inspect the [Watch](#watch), [Call Stack](#call-stack), and [Output](#output) windows to help you diagnose and understand the problem.
-4. Insert additional breakpoints on lines of code that haven't executed yet to inspect additional data. [Disable](#disable-breakpoints) or [delete](#delete-breakpoints) breakpoints that you don't need anymore.
+3. When a script hits a breakpoint, the playtest session pauses. Step through the code. Inspect the **Watch**, **Call Stack**, and **Output** windows to help you diagnose and understand the problem.
+4. Insert additional breakpoints on lines of code that haven't executed yet to inspect additional data. [Disable](#disabling-breakpoints) or [delete](#deleting-breakpoints) breakpoints that you don't need anymore.
5. In the **Script** tab, click **Stop** to end the debugging session.
-Repeat the previous steps until you solve the problem or find its root cause. As you learn the general workflow, you can configure the breakpoints to break only if certain conditions are met, to print a message to the [Output](#output) window, and to run only on the client or server. For more information, see [Breakpoint Configurations](#breakpoint-configurations).
+Repeat the previous steps until you solve the problem or find its root cause. As you learn the general workflow, you can configure the breakpoints to break only if certain conditions are met, to print a message to the **Output** window, and to run only on the client or server. For more information, see [Breakpoint Configurations](#breakpoint-configurations).
-### Insert breakpoints
+### Inserting Breakpoints
Breakpoints are checkpoints that pause or "break" the execution of your scripts at specific lines. You can use the pauses to inspect and debug your experience, [watch](#watch-window) variables, and inspect the [call stack](#call-stack-window). Breakpoints are one of the most effective ways to debug functions, so they're one of the most important debugging tools. You can insert a breakpoint at any line of executable code.
@@ -35,7 +35,7 @@ To insert a standard breakpoint at a line of code, left-click the margin to the
-### Step through code
+### Stepping Through Code
If you insert a breakpoint at a line in a script, the script pauses before it executes that line. A yellow arrow called the "debugger" indicates which line of code executes next.
@@ -78,11 +78,11 @@ The following table summarizes the three ways to step through code. To continue
-### Inspect code
+### Inspecting Code
-When a breakpoint pauses the experience during a playtest, you can inspect the [Watch](#watch-window) window, [Call Stack](#call-stack-window) window, [Output](#output) window, and [Script Editor](#script-editor) to find information about variable values and function executions. With this information, you can find the root cause of the problem in your experience.
+When a breakpoint pauses the experience during a playtest, you can inspect the [Watch](#watch-window) window, [Call Stack](#call-stack-window) window, [Output](#output-window) window, and [Script Editor](#script-editor) to find information about variable values and function executions. With this information, you can find the root cause of the problem in your experience.
-#### Watch
+#### Watch Window
The **Watch** window has two tabs: **Variables** and **My Watches**. The **Variables** tab shows information about the current variables in scope, and the **My Watches** tab shows the value of variables or expressions that you define. Both tabs show information before the line executes.
@@ -113,7 +113,7 @@ To inspect code in the Watch window:
4. Compare the values of variables and expressions from what you expect and what you see in the Watch window. If there's a difference between how you expect the variables to change and how they actually change, then the variables or the functions interacting with them might be causing problems or bugs.
-#### Call Stack
+#### Call Stack Window
The **Call Stack** window shows which line of code is going to execute next when the debugger reaches a breakpoint. The Call Stack indicates which line you call a function from and, if you call the function in other functions, the order of function calls and which lines you call the other functions. The top function of the Call Stack is the last called and first to execute. You can use the Call Stack to check whether the order of function calls in your scripts matches your mental model of the function calls.
@@ -136,7 +136,7 @@ To inspect code in the Call Stack window during a debugging session:
4. Compare the order of function calls that you thought of in step 2 and the actual order from step 3. If there are any differences, then there's a difference between how you expect the code to behave and how it actually behaves, thereby causing potential problems and bugs.
-#### Output
+#### Output window
The [Output](./output.md) window, accessible from the [View](./view-tab.md) tab, displays errors captured from running scripts, messages from Roblox Engine, log messages, messages from calls to `print()`, and errors from calls to `warn()`.
@@ -146,11 +146,11 @@ The Debugger is integrated with the [Script Editor](../studio/script-editor.md).
-## Breakpoint configurations
+## Breakpoint Configurations
-You can configure breakpoints to break only if certain conditions are met, to print a message to the [Output](#output) window, and to run only on the client or server. You can also mix these configurations together to best suit your debugging needs.
+You can configure breakpoints to break only if certain conditions are met, to print a message to the Output window, and to run only on the client or server. You can also mix these configurations together to best suit your debugging needs.
-### Edit breakpoints
+### Editing Breakpoints
You can edit the configuration of a breakpoint at any time, including during playtest sessions. If you edit breakpoints during a playtest session, the edits persist even after you finish it. You can also edit a breakpoint that's actively pausing your playtest session, but changes don't apply until the next playtest session.
@@ -164,13 +164,13 @@ To edit the configuration of a breakpoint:
-#### Condition, log message, and options
+#### Condition, Log Message, and Options
For each breakpoint, you can set its **Condition**, **Log Message**, **Continue Execution**, and **Context**.
The **Condition** is the expression that determines whether the breakpoint activates. The Condition is optional. If the Condition is empty, the breakpoint always activates. If the Condition exists, then the breakpoint activates only if the condition is true. For example, if you want the breakpoint to activate only if the variable `n` equals `42`, then set the Condition as `n == 42`. Conditions are useful for debugging how functions execute when certain variables have certain values or if you want to break only on certain executions in a loop.
-The **Log Message** is the expression that prints to the [Output](#output) window when the condition is true. The format of the Log Message is the same as the argument for a `print()` statement. For example, set the Log Message as `"The value of n:", n` to print the same message as `print("The value of n:", n)`. You can add and remove Log Messages without having to stop the execution, unlike print statements.
+The **Log Message** is the expression that prints to the Output window when the condition is true. The format of the Log Message is the same as the argument for a `print()` statement. For example, set the Log Message as `"The value of n:", n` to print the same message as `print("The value of n:", n)`. You can add and remove Log Messages without having to stop the execution, unlike print statements.
The **Continue Execution** option determines whether the breakpoint pauses the script if it activates. It's useful if you want to log values of variables or expressions without stopping execution. This option is disabled by default.
@@ -178,17 +178,19 @@ The **Context** of a breakpoint determines whether the breakpoint should activat
-#### Conditional breakpoints and logpoints
+#### Conditional Breakpoints and Logpoints
Studio offers named variations of breakpoints to make breakpoint insertion faster. To insert a named variation, right-click the margin to the right of its line number, then click the variant you want to insert.
-A **Conditional breakpoint** is a breakpoint with a **Condition** and **Continued Execution** disabled. Conditional Breakpoints pause your script only if a condition is true, so they're useful for debugging how functions execute when certain variables have certain values. Conditional Breakpoints use the values of the variables before the line executes. When you insert a Conditional Breakpoint, your cursor focuses on the **Condition** option for you to set quickly.
+A **Conditional Breakpoint** is a breakpoint with a **Condition** and **Continued Execution** disabled. Conditional Breakpoints pause your script only if a condition is true, so they're useful for debugging how functions execute when certain variables have certain values. Conditional Breakpoints use the values of the variables before the line executes. When you insert a Conditional Breakpoint, your cursor focuses on the **Condition** option for you to set quickly.
-A **Logpoint** is a breakpoint with a **Log Message** and **Continued Execution** enabled. Logpoints log messages to the [Output](#output) window without pausing your scripts, so they're useful for debugging variable values. Logpoints use the values of the variables before the line executes. When you insert a Logpoint, your cursor focuses on the **Log Message** for you to set it quickly.
+A **Logpoint** is a breakpoint with a **Log Message** and **Continued Execution** enabled. Logpoints log messages to the Output window without pausing your scripts, so they're useful for debugging variable values. Logpoints use the values of the variables before the line executes. When you insert a Logpoint, your cursor focuses on the **Log Message** for you to set it quickly.
-### Disable breakpoints
+Logpoints are often more efficient for debugging variables than `print()` statements because they allow you to log messages to the Output window without having to stop or restart the active playtest session. Compared to `print()` statements, they keep your code clean while debugging and are easier to remove after you finish debugging.
+
+### Disabling Breakpoints
There are many ways to disable and reenable a breakpoint:
@@ -196,7 +198,7 @@ There are many ways to disable and reenable a breakpoint:
- Edit the breakpoint and toggle its Enabled checkbox.
- Right-click the breakpoint icon and click Disable Breakpoint or Enable Breakpoint.
-### Delete breakpoints
+### Deleting Breakpoints
To delete a breakpoint, middle-click its icon. You can also right-click its icon and click **Delete Breakpoint**.
@@ -204,7 +206,7 @@ To delete a breakpoint, middle-click its icon. You can also right-click its icon
Deleting a breakpoint deletes its Condition and Log Message. If you want to keep the Condition or Log Message for future debugging, disable the breakpoint instead.
-### Breakpoints window
+### Breakpoints Window
The Breakpoints window shows all the breakpoints in your experience. To open the Breakpoints window, click the View tab at the top of Studio, then click Breakpoints.
@@ -237,7 +239,7 @@ You can enable and disable breakpoints by clicking its breakpoint icon in the En
-### Breakpoint icons
+### Breakpoint Icons
The icon of a breakpoint depends on whether it's enabled, has a condition, and has a log message. If a breakpoint has a log message, then it appears as a logpoint regardless of whether it has a condition.
@@ -306,7 +308,7 @@ The icon of a breakpoint depends on whether it's enabled, has a condition, and h
-## Additional debugging tools
+## Additional Debugging Tools
In addition to the debugger, Studio offers additional debugging tools for you to fix problems and bugs in your experience.
@@ -318,7 +320,7 @@ The **Command Bar** allows you to run Luau commands while the experience is runn
The **Developer Console** provides a wide array of details including client and server output, memory usage, network performance, and more. To open the Developer Console while testing or playing an experience, type `/console` into the chat or press F9. For more information, see [Developer Console](../studio/developer-console.md).
-### Log files
+### Log Files
When a script prints or errors in Studio or the Player app, the app records the message in a log file in the local file system. These files are located in different places depending on the operating system.
diff --git a/content/en-us/studio/developer-console.md b/content/en-us/studio/developer-console.md
index 53cfdeb22..1b48d72db 100644
--- a/content/en-us/studio/developer-console.md
+++ b/content/en-us/studio/developer-console.md
@@ -7,9 +7,11 @@ import OpeningSteps from '../includes/developer-console/opening-developer-consol
The **Developer Console** is a tool for debugging your experience when testing in Studio or running it in production. It shows log messages and errors similar to the [Output](../studio/output.md) window and detailed information on [Memory](#memory), [Network](#network), and more.
+## Opening the Console
+
-## Console sections
+## Console Sections
The shortcut bar at the top of the console shows the number of critical errors and warnings, client memory usage, and average ping time; click any of these to jump to its corresponding section in the console. Below the shortcut bar is a series of tools as outlined below.
@@ -22,7 +24,7 @@ The **Log** tool shows diagnostic messages from scripts.
-
+
Using the client-server switch, you can toggle between **Client** and **Server** views:
@@ -30,7 +32,7 @@ Using the client-server switch, you can toggle between **Client** and **Server**
- The **Server** view shows output from server-side `Class.Script|Scripts` (`Class.Script.RunContext|RunContext` set to `Enum.RunContext.Client` or `Enum.RunContext.Legacy`). Only the experience owner or [group](../projects/groups.md) members with editing permission can view server output messages.
-
+
Using the checkboxes, you can filter output messages in the log:
@@ -56,7 +58,7 @@ Using the checkboxes, you can filter output messages in the log:
-
+
The **Server** view also includes a command bar that lets users with editing permissions run arbitrary Luau code. Unlike the [Command Bar](../studio/ui-overview.md#command-bar) in Studio, this console command bar has the same security restrictions as `Class.Script|Scripts` and `Class.LocalScript|LocalScripts`, so it can't run protected functions.
@@ -69,7 +71,7 @@ The **Server** view also includes a command bar that lets users with editing per
- **Memory** — View real-time memory consumption by usage categories, including memory usage by both your custom components and the engine internal processes.
-- **Luau heap** — Create snapshots on the heap memory, which refers to the memory allocation to your scripts. This tool provides various memory allocation views to help you identify current memory allocation and issues from different perspectives, such as object types and engine classes. It also allows you to create multiple snapshots to compare differences in memory usage over time.
+- **Luau Heap** — Create snapshots on the heap memory, which refers to the memory allocation to your scripts. This tool provides various memory allocation views to help you identify current memory allocation and issues from different perspectives, such as object types and engine classes. It also allows you to create multiple snapshots to compare differences in memory usage over time.
For more information, see [Memory Usage](../studio/optimization/memory-usage.md)
diff --git a/content/en-us/studio/explorer.md b/content/en-us/studio/explorer.md
index 9b990bcca..ee67979d0 100644
--- a/content/en-us/studio/explorer.md
+++ b/content/en-us/studio/explorer.md
@@ -1,5 +1,5 @@
---
-title: Explorer window
+title: Explorer Window
description: The Explorer window shows a hierarchical list of every instance inside an experience.
---
@@ -7,7 +7,7 @@ The **Explorer** window shows a hierarchical list of every instance inside an ex
-## Parent-child hierarchy
+## Parent-Child Hierarchy
Roblox uses the concept of **parenting** to organize objects. All children of a parent object appear under its branch when [expanded](#expanding-and-collapsing-branches).
@@ -16,7 +16,7 @@ Roblox uses the concept of **parenting** to organize objects. All children of a
Camera, Terrain, Block, and SignModel as children of Workspace; Board and Post as children of SignModel
-## Expand and collapse branches
+## Expanding and Collapsing Branches
Clicking the arrow next to a parent branch, or pressing → or ← when a parent is selected, expands or collapses only that branch (nested child branches remain in their current state). To expand or collapse **all** branches within a multi-nested hierarchy, hold Shift when clicking the arrow.
@@ -32,9 +32,9 @@ Clicking the arrow next to a parent branch, or pressing → or
-## Insert and parent
+## Inserting and Parenting
-### Insert new object
+### Insert New Object
Some objects like primitive [parts](../parts/index.md) can be inserted from the [Model](../studio/model-tab.md) tab, but a full array of objects can be inserted through any of the following methods:
@@ -58,7 +58,7 @@ You can further customize the behavior of the insertion workflow as follows:
- **Select object after insert** automatically selects new objects after you insert them.
- **Show only recommended objects** limits the list of objects to those which are logical or functional within the parent.
-### Paste from clipboard
+### Paste From Clipboard
For an object copied to the clipboard, you can paste it as a new child to the `Class.Workspace`, or into one or more existing parents.
@@ -84,7 +84,7 @@ For an object copied to the clipboard, you can paste it as a new child to the `C
If you select multiple objects and right-click, the options above will appear as **Paste Into Selected \[\]**, and completing the operation will paste the clipboard item(s) into **all** of the selected parents. This is a convenient way to paste the same child into multiple parents, such as a common `Class.Texture` into several different `Class.Part|Parts`.
-### Change parents
+### Changing Parents
To change the parent of one or more children (reparent), simply drag and drop them onto the new parent.
@@ -93,7 +93,7 @@ To change the parent of one or more children (reparent), simply drag and drop th
Reparent BlockB from Workspace to SignModel
-## Organize by folders
+## Organizing by Folders
Like directories/folders on a computer, the `Class.Folder` object is a useful way to organize objects. For instance, if you want to store all environmental sounds in a logical place, you can create a folder and place multiple `Class.Sound` objects within it.
@@ -105,7 +105,7 @@ You can organize objects into folders as follows:
- Select multiple objects, right-click them, and then select **Group as a Folder** from the context menu or press AltCtrlG on Windows or ⌥⌘G on Mac.
-## Filter instances
+## Filtering Instances
Through the **Filter Workspace** input near the top of the window, You can filter instances by [name](#name-filter), [property](#property-filters), class/subclass/tag [bespoke](#bespoke-filters) queries, and [ancestry](#ancestry-filters) queries. You can also [combine parameters](#combining-parameters) for advanced logical filtering.
@@ -132,7 +132,7 @@ Through the **Filter Workspace** input near the top of the window, You can filte
Refresh filtered results
-### Name filter
+### Name Filter
Typing in a basic string yields **name** matched instances. For example, filtering by the keyword "script" finds all instances containing it, such as **ServerScriptService** and **StarterPlayerScripts**.
@@ -143,7 +143,7 @@ A name is a sequence of characters that are alphanumeric, `_`, `-`, or `.`.
In all of the following filtering methods, exercise caution when filtering for instances whose names contain spaces, as the filter logic may confuse spaces for a [combined filter](#combining-parameters). When filtering for names with spaces, you should surround the full name with double quotes, for example `tag:"Light Source"` to filter by the full tag name of **Light Source**.
-### Property filters
+### Property Filters
You can filter by property equality or value comparisons. Most properties are supported, and the filter works with partial matches, ignores spacing, and is non-case-sensitive.
@@ -152,7 +152,7 @@ You can filter by property equality or value comparisons. Most properties are su
-
Example filter
+
Example Filter
Result
@@ -173,7 +173,7 @@ You can filter by property equality or value comparisons. Most properties are su
-
Example filter
+
Example Filter
Result
@@ -194,7 +194,7 @@ You can filter by property equality or value comparisons. Most properties are su
-
Example filter
+
Example Filter
Result
@@ -215,7 +215,7 @@ You can filter by property equality or value comparisons. Most properties are su
-
Example filter
+
Example Filter
Result
@@ -231,7 +231,7 @@ You can filter by property equality or value comparisons. Most properties are su
-### Bespoke filters
+### Bespoke Filters
Classes, and subclasses, and tags are filtered through various bespoke queries, including:
@@ -239,7 +239,7 @@ Classes, and subclasses, and tags are filtered through various bespoke queries,
- `is:[SubClass]` finds everything that is a **subclass** of `[SubClass]`. For example, `is:BasePart` finds everything that is a subclass of `Class.BasePart`, such as `Class.Part` and `Class.MeshPart`.
- `tag:[TagName]` finds everything with a `Class.CollectionService` tag of `[TagName]`. For example, `tag:LightSource` finds everything that is tagged **LightSource**. You can add tags using the [Tags](../studio/properties.md#instance-tags) section of an instance's properties, or Studio's [Tag Editor](../studio/view-tab.md#windows-and-tools), and tag names will autocomplete.
-### Ancestry filters
+### Ancestry Filters
You can filter within a specific scope using the `.` operator, chain operators together for highly specific filters, or use `*` as a wildcard.
@@ -250,7 +250,7 @@ You can filter within a specific scope using the `.` operator, chain operators t
-
Example filter
+
Example Filter
Result
@@ -276,7 +276,7 @@ You can filter within a specific scope using the `.` operator, chain operators t
- `[Parent].**` finds all descendants of a parent. For example, `CarModel.**` finds all descendants of **CarModel**.
-### Combine parameters
+### Combining Parameters
For advanced logical searches, you can combine filters through unions and grouping.
@@ -285,7 +285,7 @@ For advanced logical searches, you can combine filters through unions and groupi
-
Example filter
+
Example Filter
Result
@@ -326,11 +326,11 @@ For advanced logical searches, you can combine filters through unions and groupi
-## Select filtered results
+## Selecting Filtered Results
Within a [filtered](#filtering-instances) hierarchy, certain key shortcuts and mouse operations behave differently than they do within a non-filtered hierarchy.
-### Select all
+### Select All
Within a non-filtered hierarchy, pressing CtrlA on Windows or ⌘A on Mac selects all objects. Within a [filtered](#filtering-instances) hierarchy, the same shortcut or the "select all" button selects only the **filter-matching** objects.
@@ -349,7 +349,7 @@ Within a non-filtered hierarchy, pressing CtrlA on Windows
-### Shift-select
+### Shift-Select
Within a non-filtered hierarchy, clicking an object and then Shift-clicking another object selects everything within the range.
@@ -370,7 +370,7 @@ Within a [filtered](#filtering-instances) hierarchy, if both the initially click
-### Drag select
+### Drag Select
Clicking and dragging from the right side of the window initiates a selection box. Within a non-filtered hierarchy, everything within the box is selected.
@@ -391,7 +391,7 @@ Within a [filtered](#filtering-instances) hierarchy, only filter-matching object
-## Additional key shortcuts
+## Additional Key Shortcuts
diff --git a/content/en-us/studio/home-tab.md b/content/en-us/studio/home-tab.md
index 2cdd74b5b..68fd7721d 100644
--- a/content/en-us/studio/home-tab.md
+++ b/content/en-us/studio/home-tab.md
@@ -1,5 +1,5 @@
---
-title: Home tab
+title: Home Tab
description: The Home tab contains basic tools for building and testing your experience.
---
@@ -47,7 +47,7 @@ The first section from left contains tools for copying, cutting, pasting, and du
-## Transform tools
+## Transform Tools
The primary transform tools include **Select**, **Move**, **Scale**, and **Rotate**. When you choose a tool, visual draggers display on the selected object in the viewport.
@@ -76,7 +76,7 @@ If the selected object and its visual draggers are not currently in view within
### Mode
-The **Mode** selector toggles between standard geometric transformations and [simulation of mechanical constraints](../physics/mechanical-constraints.md#simulate-constraints) while moving or rotating parts.
+The **Mode** selector toggles between standard geometric transformations and [simulation of mechanical constraints](../physics/mechanical-constraints.md#simulating-constraints) while moving or rotating parts.
@@ -86,7 +86,7 @@ The **Collisions** checkbox toggles the collisions state when you're transformin
-### Transform coordinates
+### Transform Coordinates
CtrlL on Windows or ⌘L on Mac toggles between transforming an object relative to **world** coordinates or the object's **local** coordinates. When in local mode, an **L** symbol appears to the lower-right of the object.
@@ -111,13 +111,13 @@ The [Toolbox](../projects/assets/toolbox.md) includes all of the models, images,
-## Part insertion
+## Part Insertion
The **Part** button inserts a new part into the workspace. Clicking the small dropdown arrow on the button lets you select either **Block**, **Sphere**, **Wedge**, **Corner Wedge**, or **Cylinder**. For more information, see [Parts](../parts/index.md).
-## UI designer
+## UI Designer
The **UI** button opens a tab which lets you quickly insert, resize, and reposition common on-screen UI objects, such as [labels](../ui/labels.md), [frames](../ui/frames.md), and [buttons](../ui/buttons.md).
@@ -131,7 +131,7 @@ The **Import 3D** tool allows you to import nearly any type of `.fbx` or `.obj`
-## Color widget
+## Color Widget
Clicking the small dropdown arrow on the **Color** widget reveals a hexagonal color picker.
@@ -145,7 +145,7 @@ By default, clicking the overall **Color** button applies the chosen color to an
For alternative ways to apply custom colors, see [Coloring Parts](../parts/index.md#colors-popup).
-## Material widget
+## Material Widget
Clicking the small dropdown arrow on the **Material** widget reveals a [material](../parts/materials.md) picker.
@@ -155,7 +155,7 @@ By default, clicking the overall **Material** button applies the chosen material
-## Group tools
+## Group Tools
You can group objects into a [model](../parts/models.md) by selecting them and clicking the **Group** button. This action has a default shortcut of CtrlG (Windows) or ⌘G (Mac).
@@ -165,7 +165,7 @@ To **ungroup** an existing model or folder, click the small arrow next to the bu
-## Lock tools
+## Lock Tools
You can enable the **Lock Tool** by clicking the small arrow next to the **Lock** button and selecting **Lock Tool**. This action has a default shortcut of AltL (Windows) or ⌥L (Mac).
@@ -175,13 +175,13 @@ To unlock all objects, click the small arrow next to the button and select **Unl
-## Anchor toggle
+## Anchor Toggle
The **Anchor** toggle controls whether the part will be **immovable** by physics. When `Class.BasePart.Anchored|Anchored`, a part will never change position due to gravity, other parts collisions, overlapping other parts, or any other physics-related causes. This action has a default shortcut of AltA (Windows) or ⌥A (Mac).
-## Playtest options
+## Playtest Options
There are three common options for playtesting an experience. Clicking the button starts a playtest of the currently selected mode, and clicking the small arrow below the button lets you choose a different mode.
diff --git a/content/en-us/studio/index.md b/content/en-us/studio/index.md
index 9312867be..518bb6280 100644
--- a/content/en-us/studio/index.md
+++ b/content/en-us/studio/index.md
@@ -8,7 +8,7 @@ Roblox Studio is an all-in-one IDE that lets you create experiences that run on
Roblox. It's free to use and lets you reach millions of users using
the Roblox app on console, desktop, and mobile devices.
-## Powerful 3D building tools
+## Powerful 3D Building Tools
Create almost anything you can imagine by combining [parts](../parts/index.md) and [meshes](../parts/meshes.md) into models with built-in [materials](../parts/materials.md) or your own textures.
@@ -28,7 +28,7 @@ Build or generate large scale [terrains](../parts/terrain.md) consisting of wate
-## Integrated scripting, debugging, and testing
+## Integrated Scripting, Debugging, and Testing
Roblox comes with a host of built-in features like matchmaking and [physics](../physics/index.md), but scripting specific features is essential to making your experiences unique. Studio provides full access to the [Roblox Engine APIs](/reference/engine) through a full-featured [script editor](../studio/script-editor.md) with modern conveniences like autocompletion and code highlighting.
@@ -44,7 +44,7 @@ Finally, you can test directly in Studio through multiple [testing and emulation
Contribute your Luau scripts for AI training can help enhance Luau-focused AI tools in Studio. For more information, see [Empower Luau creation](https://create.roblox.com/data-collection).
-## Fast publishing and updating
+## Fast Publishing and Updating
Roblox not only provides the engine and tooling, but gives you access to a large social network of users on a broad array of devices. Just click to [publish](../production/publishing/publishing-experiences-and-places.md) and your experiences are automatically available to this network with built-in [discovery](../discovery.md) and [monetization](../production/monetization/index.md) opportunities. Want to iterate on your experience? Make the changes and update them immediately for all users in an instant.
@@ -52,7 +52,7 @@ Roblox not only provides the engine and tooling, but gives you access to a large
-## Collaborative and extensible
+## Collaborative and Extensible
Studio has built-in [collaboration](../projects/collaboration.md) tools so you and your co-creators can build on your own time or together in real-time. Drag and drop parts to a shared workspace where changes appear to everyone at the same time, chat with your team in real-time, and have all your changes saved and managed in the cloud.
diff --git a/content/en-us/studio/material-generator.md b/content/en-us/studio/material-generator.md
index 05d5a9207..d0a6864f0 100644
--- a/content/en-us/studio/material-generator.md
+++ b/content/en-us/studio/material-generator.md
@@ -5,7 +5,7 @@ description: The Material Generator is designed to create material variants from
The **Material Generator** is designed to create material variants from text entries. Using it, you can type any phrase and hit **Generate** to see results within a few seconds. Once you find a satisfying result, you can instantly save it as a new custom material.
-## Generate materials
+## Generating Materials
To generate materials, click **Generate** from the [Material Picker](../parts/materials.md#material-widget) dropdown.
@@ -72,7 +72,7 @@ With the tool's window open:
4. When ready, choose a **Base Material** to apply that material's [default physical properties](../parts/materials.md#default-physical-properties) to your custom material. Then click the **Save & Apply Variant** button to save the custom material to the [Material Manager](../parts/materials.md#material-manager).
-## Best practices
+## Best Practices
Generating satisfying materials can be an iterative process requiring a longer list of descriptors to help focus in on the material you want. Here are some tips:
diff --git a/content/en-us/studio/microprofiler/index.md b/content/en-us/studio/microprofiler/index.md
index 6e1e9844e..01245b71a 100644
--- a/content/en-us/studio/microprofiler/index.md
+++ b/content/en-us/studio/microprofiler/index.md
@@ -3,12 +3,12 @@ title: MicroProfiler
description: The MicroProfiler is a Studio and client tool for optimizing your experience.
---
-The **MicroProfiler** is an optimization tool available in Roblox Studio and the Roblox client that provides detailed timing information for [task scheduler](../../studio/microprofiler/task-scheduler.md) tasks called **tags**.
+The **MicroProfiler** is an optimization tool available in Roblox Studio and the Roblox client that provides detailed timing information for [Task Scheduler](../../studio/microprofiler/task-scheduler.md) tasks called **tags**.
-- For a list of common tasks, refer to the [tag reference](../../studio/microprofiler/tag-table.md).
-- For a step-by-step example of using the MicroProfiler to identify a performance issue, see the [MicroProfiler walkthrough](../../studio/microprofiler/use-microprofiler.md).
+- For a list of common tasks, refer to the [Tag Reference](../../studio/microprofiler/tag-table.md).
+- For a step-by-step example of using the MicroProfiler to identify a performance issue, see the [MicroProfiler Walkthrough](../../studio/microprofiler/using-microprofiler.md).
-## MicroProfiler basics
+## MicroProfiler Basics
To open the MicroProfiler, press CtrlAltF6 (⌘⌥F6) in Studio or the client. You can also use the settings menu in the client.
@@ -22,7 +22,7 @@ Bars should generally be around the middle of the graph, but you might see sudde
To pause the recording of frames, press CtrlP (⌘P) or click **Pause** in the menu bar. While paused, a timeline appears, and you can navigate through frames by clicking or dragging on the graph.
-For a full summary of the various views and how to navigate the MicroProfiler interface, see [MicroProfiler modes](modes.md).
+For a full summary of the various views and how to navigate the MicroProfiler interface, see [MicroProfiler Modes](modes.md).
## Threads
@@ -42,7 +42,7 @@ There are three main thread types:
- Perform: Issue rendering commands, including 2D interfaces.
- Present: Synchronizes with the GPU.
-## Custom profiles
+## Custom Profiling
If your scripts are running complicated tasks, you can profile critical portions of the code to ensure that they're not taking too long. Wrap code in `Library.debug.profilebegin()` and `Library.debug.profileend()` to time everything done between those function calls and create a label on the MicroProfiler timeline.
@@ -81,7 +81,7 @@ When you run the experience and pause the MicroProfiler (CtrlP
From its duration on the timeline, you can tell that the function is using a lot of processing time compared to other operations.
-## Save frame data
+## Saving Frame Data
If you want to save a set of frame data for later review (or to share with someone else), use the **Dump** menu. The engine saves the frame data to a file named `microprofile--
-## Advanced options
+## Advanced Options
The **Advanced** section contains tools to insert advanced objects, services, and scripts, as well as configure [collision filtering](../workspace/collisions.md#collision-filtering).
diff --git a/content/en-us/studio/optimization/memory-usage.md b/content/en-us/studio/optimization/memory-usage.md
index f0cdab132..f827dcaa7 100644
--- a/content/en-us/studio/optimization/memory-usage.md
+++ b/content/en-us/studio/optimization/memory-usage.md
@@ -1,5 +1,5 @@
---
-title: Memory usage
+title: Memory Usage
description: Use Memory and Luau Heap tools within the Developer Console to monitor the memory usage of your experience.
---
@@ -9,7 +9,9 @@ Every building and scripting component that you add to your experience consumes
- [Memory](#memory) — View real-time memory consumption by usage categories, including memory usage by both your custom components and the engine internal processes.
-- [Luau heap](#luau-heap) — Create snapshots on the heap memory, which refers to the memory allocation to your scripts. This tool provides various memory allocation views to help you identify current memory allocation and issues from different perspectives, such as object types and engine classes. It also allows you to create multiple snapshots to compare differences in memory usage over time.
+- [Luau Heap](#luau-heap) — Create snapshots on the heap memory, which refers to the memory allocation to your scripts. This tool provides various memory allocation views to help you identify current memory allocation and issues from different perspectives, such as object types and engine classes. It also allows you to create multiple snapshots to compare differences in memory usage over time.
+
+## Opening Developer Console
@@ -19,7 +21,7 @@ The **Memory** tool categorizes and displays real-time memory usage. It displays
To view memory allocation:
-1. [Open](#open-developer-console) **Developer Console**.
+1. [Open](#opening-developer-console) **Developer Console**.
1. Expand the tools dropdown to select **Memory**.
@@ -32,7 +34,7 @@ To view memory allocation:
- PlaceMemory reference
+ PlaceMemory Reference
@@ -140,21 +142,21 @@ To view memory allocation:
- **PlaceScriptMemory** — Memory usage of your scripts with insights into how individual scripts and custom memory tags contribute to overall memory usage.
- **CoreScriptMemory** — Memory usage by internal engine scripts that you don't have direct control over.
- Among these categories, **PlaceMemory** and **PlaceScriptMemory** are the most important ones for performance optimization, because they help you understand how your building and scripting choices affect memory consumption and potential areas for optimization. For more insights into **PlaceScriptMemory**, you can use the [Luau heap](#luau-heap) tool to create snapshots and analyze memory allocation by different metrics.
+ Among these categories, **PlaceMemory** and **PlaceScriptMemory** are the most important ones for performance optimization, because they help you understand how your building and scripting choices affect memory consumption and potential areas for optimization. For more insights into **PlaceScriptMemory**, you can use the [Luau Heap](#luau-heap) tool to create snapshots and analyze memory allocation by different metrics.
-For more information on common memory usage problems and best practices, see [Performance Optimization](../../performance-optimization/improve.md#memory-usage).
+For more information on common memory usage problems and best practices, see [Performance Optimization](../../performance-optimization/improving.md#memory-usage).
-## Luau heap
+## Luau Heap
-The **Luau heap** tool allows you to create snapshots on the current allocation of heap memory, which refers to the memory allocation to Luau scripts for storing variables, tables, functions, and other runtime data structures. This tool provides various memory allocation views to help you identify memory allocation and issues from different perspectives, such as object types and engine classes. It also allows you to create multiple snapshots to compare differences in memory usage over time.
+The **Luau Heap** tool allows you to create snapshots on the current allocation of heap memory, which refers to the memory allocation to Luau scripts for storing variables, tables, functions, and other runtime data structures. This tool provides various memory allocation views to help you identify memory allocation and issues from different perspectives, such as object types and engine classes. It also allows you to create multiple snapshots to compare differences in memory usage over time.
-### Create snapshots
+### Creating Snapshots
To create a snapshot of your memory allocation:
-1. [Open](#open-developer-console) **Developer Console**.
+1. [Open](#opening-developer-console) **Developer Console**.
1. Expand the tools dropdown to select **LuauHeap**.
@@ -162,7 +164,7 @@ To create a snapshot of your memory allocation:
1. Expand the client-server dropdown to select **Client** or **Server**.
1. Click the **Create Snapshot** button.
-### Analyze memory usage
+### Analyzing Memory Usage
The tool provides five views that you can select from to view your Luau memory allocation based on different views:
@@ -174,7 +176,7 @@ The tool provides five views that you can select from to view your Luau memory a
#### Graph
-The **Graph** view is the most detailed and complex view among all Luau heap views. It shows an aggregated memory usage tree with each node representing an object with memory allocated. The tree shows how objects connect to each other and derives the shortest path between object references. It has the following columns of memory size:
+The **Graph** view is the most detailed and complex view among all Luau Heap views. It shows an aggregated memory usage tree with each node representing an object with memory allocated. The tree shows how objects connect to each other and derives the shortest path between object references. It has the following columns of memory size:
Size — The self memory usage plus the memory usage by contents within the data structure.
Self — The memory directly allocated for the data structure itself, excluding the memory usage by any content it contains.
@@ -188,7 +190,7 @@ The root of the tree graph is `registry`, which stores all engine and Luau refer
- `Module @Path.To.Module` is the table returned by a module script.
- `name:123 =Path.To.Module` is a function inside a specified script. Anonymous functions don't have names. The top level node often refers to the global script function. Anonymous functions don't have names. Example: `:1= Workspace.[Username].Animate`.
-- `upvalue` is a reference for captured functions. See [Capture local scope](../../luau/scope.md#capture) for more information.
+- `upvalue` is a reference for captured functions. See [Capturing Local Scope](../../luau/scope.md#capturing) for more information.
- `env` refers to the environment of a function. For most cases, it's a table representing the global scope of a script.
- `globals` refers to the environment of a thread.
- `[key]` represents objects that serve as table keys.
@@ -196,11 +198,11 @@ The root of the tree graph is `registry`, which stores all engine and Luau refer
- `stack` refers to the array that stores all function locals.
- `constants` represents all constant values that functions use.
-#### Memory categories
+#### Memory Categories
The **Memory Categories** view shows memory sizes and counts by memory categories, which the engine assigns to objects at allocation time. By default, the memory category has the same name as the script, or you can assign custom memory category names using the `debug.setmemorycategory` function.
-#### Unique references
+#### Unique References
The **Unique References** view shows memory usage of instances that don't have a parent in the data model and are only reachable by scripts, along with all paths that pin the instance object. This view has two metrics:
diff --git a/content/en-us/studio/optimization/scriptprofiler.md b/content/en-us/studio/optimization/scriptprofiler.md
index cfafddc5f..67f43778b 100644
--- a/content/en-us/studio/optimization/scriptprofiler.md
+++ b/content/en-us/studio/optimization/scriptprofiler.md
@@ -9,7 +9,7 @@ description: Script Profiler is a tool within the Developer Console that records
Script Profiler only records function calls that consume CPU resources, so it doesn't record threads that sleep or wait for results.
-## Record profiling sessions
+## Recording Profiling Sessions
Before recording, you need to select the recording environment from:
@@ -64,7 +64,7 @@ To record a new profiling session:
6. Click **Start** to begin the profiling session. If you set a duration, Script Profiler displays a countdown timer with the remaining time in the session.
7. Click **Stop** or wait until the recording finishes to display the profiling data.
-## Read profiling data
+## Reading Profiling Data
After a session stops, Script Profiler generates a table showing how much time each function call costs in CPU time. The table sorts function calls from the most-time-spent to least-time-spent, and allows you to search for specific functions by their name. It provides the following two views:
@@ -100,7 +100,7 @@ You can also select from the following display options to tailor your debugging
-## Export profiling data
+## Exporting Profiling Data
Script Profiler allows you to export recorded profiling data as a JSON file. To export recorded data after a profiling session:
diff --git a/content/en-us/studio/output.md b/content/en-us/studio/output.md
index 2eb038c2a..c5e068f32 100644
--- a/content/en-us/studio/output.md
+++ b/content/en-us/studio/output.md
@@ -1,15 +1,15 @@
---
title: Output Window
-description: The Output Window in Roblox Studio displays error messages, calls to print(), and calls to warn().
+description: The Output window in Roblox Studio displays error messages, calls to print(), and calls to warn().
---
-The **output** window, accessible from the [View](./view-tab.md) tab, displays errors captured from running scripts, messages from Roblox Engine, messages from calls to `print()`, and errors from calls to `warn()`.
+The **Output** window, accessible from the [View](./view-tab.md) tab, displays errors captured from running scripts, messages from Roblox engine, messages from calls to `print()`, and errors from calls to `warn()`.
-Plugins can interact with the Output Window through `Class.LogService`, which can record and clear the Output Window contents. You can customize the output through the following elements:
+Plugins can interact with the output window through `Class.LogService`, which can record and clear the output window contents. You can customize the output through the following elements:
-
+
diff --git a/content/en-us/studio/pivot-tools.md b/content/en-us/studio/pivot-tools.md
index 3742551ce..d2e7310e7 100644
--- a/content/en-us/studio/pivot-tools.md
+++ b/content/en-us/studio/pivot-tools.md
@@ -1,11 +1,11 @@
---
-title: Pivot tools
+title: Pivot Tools
description: Pivot tools and properties give you full control over the points around which objects rotate and translate.
---
-The **pivot** tools and related properties give you full control over the points around which objects rotate and translate.
+The **Pivot** tools and related properties give you full control over the points around which objects rotate and translate.
-## Interactive Studio tools
+## Studio Tools
The interactive Studio tools are located in the [Model](./model-tab.md) tab.
@@ -81,7 +81,7 @@ The **Snap** checkbox toggles whether the pivot point snaps to **hotspots** such
The **Reset** button moves the pivot point to the **center** of an object or model's bounding box. This operation is useful after you've changed the composition of a model and wish to place its pivot point at the center of its new bounding box.
-## Pivot properties
+## Pivot Properties
In addition to the interactive tools, pivot values can be directly set in the [Properties](../studio/properties.md) window.
@@ -122,7 +122,7 @@ In addition to the interactive tools, pivot values can be directly set in the [P
1 Changing this property will not move or rotate the object.
-## Manipulate pivots in scripts
+## Scripting Pivots
Beyond the Studio tools, pivot points can be accessed and manipulated in scripts.
diff --git a/content/en-us/studio/plugins-tab.md b/content/en-us/studio/plugins-tab.md
index 5993cfb88..77c065c30 100644
--- a/content/en-us/studio/plugins-tab.md
+++ b/content/en-us/studio/plugins-tab.md
@@ -1,15 +1,15 @@
---
-title: Plugins tab
+title: Plugins Tab
description: The Plugins tab lets you install and manage community-made and Roblox plugins.
---
-The **plugins** tab contains tools for managing [plugins](../studio/plugins.md), configuring localization, and discovering audio used throughout a place. Any installed plugins may also add buttons to this tab.
+The **Plugins** tab contains tools for managing [plugins](../studio/plugins.md), configuring localization, and discovering audio used throughout a place. Any installed plugins may also add buttons to this tab.
-## Manage Plugins
+## Studio Plugins
-The **Manage Plugins** button lets you enable/disable, update, or uninstall plugins you've [installed](../production/creator-store.md#find-assets) from the Creator Store, while the
+The **Manage Plugins** button lets you enable/disable, update, or uninstall plugins you've [installed](../production/creator-store.md#finding-assets) from the Creator Store, while the
**Plugins Folder** button opens the local system folder containing plugins you've [created](../studio/plugins.md) or manually installed.
diff --git a/content/en-us/studio/plugins.md b/content/en-us/studio/plugins.md
index 7ada6e8ea..14a1d0cc0 100644
--- a/content/en-us/studio/plugins.md
+++ b/content/en-us/studio/plugins.md
@@ -3,11 +3,11 @@ title: Plugins
description: Explains how to create, publish, and monetize extensions to Studio that add custom functionality.
---
-A **plugin** is an extension that adds additional features or functionality to Studio. You can [install](../production/creator-store.md#find-assets) community-made plugins from the Creator Store, or you can [create](#create-new-plugins) and [publish](#upload-distribute-and-monetize-plugins) your own to the [Toolbox](../projects/assets/toolbox.md) to use across your experiences.
+A **plugin** is an extension that adds additional features or functionality to Studio. You can [install](../production/creator-store.md#finding-assets) community-made plugins from the Creator Store, or you can [create](#creating-new-plugins) and [publish](#uploading-distributing-and-monetizing-plugins) your own to the [Toolbox](../projects/assets/toolbox.md) to use across your experiences.
-If you choose to also distribute your plugins to the Creator Store, you can either offer them for free or sell them for **United States Dollars** (the minimum price is $4.99). Roblox offers a market-leading revenue share for these sales, as only taxes and payment processing fees are deducted. For more information on selling plugins, see [Selling on the Creator Store](../production/sell-on-creator-store.md).
+If you choose to also distribute your plugins to the Creator Store, you can either offer them for free or sell them for **United States Dollars** (the minimum price is $4.99). Roblox offers a market-leading revenue share for these sales, as only taxes and payment processing fees are deducted. For more information on selling plugins, see [Selling on the Creator Store](../production/selling-on-creator-store.md).
-## Create new plugins
+## Creating New Plugins
You can create your own plugins to improve your workflow in Studio. The following code sample is a plugin called **EmptyScriptAdder** that inserts an empty script as the child of an object or in `Class.ServerScriptService`. The following sections explain the major parts to creating this plugin.
@@ -42,7 +42,7 @@ end
newScriptButton.Click:Connect(onNewScriptButtonClicked)
```
-### Save plugin scripts
+### Saving a Plugin Script
Plugins start from scripts. To create a plugin, create a `Class.Script` and save it as a plugin using the [Explorer](../studio/explorer.md). For example, to create the **EmptyScriptAdder Plugin**:
@@ -59,28 +59,28 @@ Plugins start from scripts. To create a plugin, create a `Class.Script` and save
Make sure to delete the original script in `Class.ServerStorage` and work from the plugin inside `Class.PluginDebugService`, otherwise you may end up applying changes to the wrong script.
-### Reload and save changes
+### Reloading and Saving Changes
With your `Class.Plugin` inside `Class.PluginDebugService`, you can easily update the plugin by right-clicking it and then selecting **Save and Reload Plugin** from the context menu. If you simply want to reload the plugin, for example to step through a section of code using a breakpoint without saving the plugin, you can
alternatively select **Reload Plugin**.
-### Add toolbar buttons
+### Adding a Toolbar Button
To add a button for your plugin to the **Plugins** tab of the Studio toolbar, use the `Class.Plugin:CreateToolbar()` and `Class.PluginToolbar:CreateButton()` methods. In the code for **EmptyScriptAdder**, line 5 creates a new section in the toolbar named **Custom Script Tools** and line 8 creates a button named **Create Empty Script**.
-### Execute code on click
+### Executing Code on Click
To make the plugin execute code when a user clicks the toolbar button, connect a function to the button's `Class.PluginToolbarButton.Click` event. In the code for **EmptyScriptAdder**, the connecting function is `onNewScriptButtonClicked()`.
-### Check user selection
+### Checking User Selection
To modify a plugin's behavior based on what the user has selected, use the `Class.Selection` service. The `onNewScriptButtonClicked()` function checks if the user has anything selected and creates the new script as its child instead of inside `Class.ServerScriptService`. If the user doesn't have anything selected, it creates the new script in `Class.ServerScriptService`.
-### Support undo and redo
+### Supporting Undo and Redo
Use `Class.ChangeHistoryService` to allow users to undo and redo changes made by a plugin within an experience. In your script, set the plugin to call `Class.ChangeHistoryService:TryBeginRecording()` and store the identifier assigned to the API call before making changes. Then set the plugin to call `Class.ChangeHistoryService:FinishRecording()` after making changes, so it captures any changes made during the recording session for undo and redo.
@@ -128,7 +128,7 @@ button.Click:Connect(function()
end)
```
-## Upload, distribute and monetize plugins
+## Uploading, Distributing and Monetizing Plugins
As with [models](../parts/models.md), [meshes](../parts/meshes.md), [images](../parts/textures-decals.md), and [animations](../animation/editor.md#creating-an-animation), you can distribute plugins to Roblox to make them easy to reuse from the [Toolbox](../projects/assets/toolbox.md). You can choose to make them publicly available to all other creators on the [Creator Store](../production/creator-store.md), or to distribute them privately for your own use. If you choose to distribute your plugin publicly, you can set a price at which to sell it to other creators.
diff --git a/content/en-us/studio/properties.md b/content/en-us/studio/properties.md
index 04971b68b..1339ed5fc 100644
--- a/content/en-us/studio/properties.md
+++ b/content/en-us/studio/properties.md
@@ -1,13 +1,13 @@
---
-title: Properties window
+title: Properties Window
description: The Properties window lets you adjust properties of a selected object to change how it looks and behaves.
---
-The **properties** window, accessible from the [View](../studio/view-tab.md) tab, allows you to adjust certain properties of a selected object to change how the object looks and behaves. Additionally, you can manage [tags](#instance-tags) and configure instance [attributes](#instance-attributes) at the bottom of the window.
+The **Properties** window, accessible from the [View](../studio/view-tab.md) tab, allows you to adjust certain properties of a selected object to change how the object looks and behaves. Additionally, you can manage [tags](#instance-tags) and configure instance [attributes](#instance-attributes) at the bottom of the window.
-## Header bar
+## Header Bar
When you select an object, the window's header bar changes to reflect both the class and name of the object.
@@ -26,7 +26,7 @@ When you select an object, the window's header bar changes to reflect both the c
-## Section organization
+## Section Organization
The **Properties** window divides an object's properties into sections. For example, a `Class.MeshPart` includes sections like **Appearance** and **Transform** which respectively allow you to change its appearance and transform its `Class.BasePart.Size|Size`, `Class.BasePart.CFrame|CFrame`, and origin.
@@ -36,7 +36,7 @@ You can collapse or expand any section or subsection by clicking the small arrow
-## Expand inputs
+## Expanding Inputs
Some properties are collapsed by default, but you can expand them by clicking the small arrow next to its name. For instance, `Class.BasePart|BaseParts` contain a **Position** property which represents an X, Y, Z coordinate in the 3D world. In Studio, these coordinates can be entered in two ways:
@@ -55,13 +55,13 @@ Some properties are collapsed by default, but you can expand them by clicking th
After you expand or collapse a property, it remains expanded or collapsed for other objects of the same class, as well as related objects that share the same property.
-## Filter properties
+## Filtering Properties
You can filter properties by typing a search query into the **Filter Properties** input near the top of the window. For example, filtering by the letters "velo" finds all properties containing them, such as **AssemblyLinearVelocity** and **AssemblyAngularVelocity**. Quickly access this input by pressing CtrlShiftP (⌘ShiftP).
-## Instance tags
+## Instance Tags
The **Tags** section allows you to apply specific tags for use with `Class.CollectionService`. Tags are sets of strings applied to instances that replicate from the server to the client. They are also serialized when places are saved.
@@ -79,7 +79,7 @@ To add tags to an instance through the **Properties** window:
-## Instance attributes
+## Instance Attributes
**Attributes** allow you to customize instances with your own data. They are similar to built-in object properties, but you can create and modify your own attributes for any instance. Key features include:
@@ -105,7 +105,7 @@ Examples of attribute usage include:
-### Supported types
+### Supported Types
You can store the following types/values in attributes:
@@ -144,7 +144,7 @@ You can store the following types/values in attributes:
-### Studio usage
+### Studio Usage
New attributes can be created and modified in Studio as follows:
diff --git a/content/en-us/studio/quick-access.md b/content/en-us/studio/quick-access.md
index 33fd4fe27..b582902bb 100644
--- a/content/en-us/studio/quick-access.md
+++ b/content/en-us/studio/quick-access.md
@@ -1,9 +1,9 @@
---
-title: Quick access toolbar
+title: Quick Access Toolbar
description: The Quick Access Toolbar contains shortcuts to various Studio actions and commands.
---
-The **quick access toolbar** contains shortcuts to various Studio actions and commands.
+The **Quick Access Toolbar** contains shortcuts to various Studio actions and commands.
diff --git a/content/en-us/studio/rig-builder.md b/content/en-us/studio/rig-builder.md
index df3f4cd07..42d1d0e43 100644
--- a/content/en-us/studio/rig-builder.md
+++ b/content/en-us/studio/rig-builder.md
@@ -1,9 +1,9 @@
---
-title: Rig builder
+title: Rig Builder
description: The Rig Builder is a built-in plugin that lets you insert pre-built character models.
---
-The **rig builder** tool allows you to quickly insert basic pre-built character rigs into your experience for use in animation, clothing testing, and other applications. You can also insert a rig of your account's avatar character, including character customizations and accessories. The rig builder generates character `Class.Model|Models` with the appropriate joints and humanoid structure to support [animation](../animation/index.md), [accessories](../art/accessories/index.md), and [character customizations](../characters/appearance.md).
+The **Rig Builder** tool allows you to quickly insert basic pre-built character rigs into your experience for use in animation, clothing testing, and other applications. You can also insert a rig of your account's avatar character, including character customizations and accessories. The rig builder generates character `Class.Model|Models` with the appropriate joints and humanoid structure to support [animation](../animation/index.md), [accessories](../art/accessories/index.md), and [character customizations](../characters/appearance.md).
@@ -11,15 +11,15 @@ The **rig builder** tool allows you to quickly insert basic pre-built character
At this time, the rig builder tool doesn't generate character rigs compatible with facial animation.
-## Rig types
+## Rig Types
-There are two types of default rigs you can [insert](#insert-a-pre-built-rig) into your experience with the rig builder. An **R6** rig is a legacy rig made up of 6 mesh objects, while an **R15** rig is a model with 15 mesh objects, significantly expanding the R6's limited motion range. When creating rigs for use in your experience, use a rig type that is consistent with the rig types you intend to support in your experience.
+There are two types of default rigs you can [insert](#inserting-a-pre-built-rig) into your experience with the rig builder. An **R6** rig is a legacy rig made up of 6 mesh objects, while an **R15** rig is a model with 15 mesh objects, significantly expanding the R6's limited motion range. When creating rigs for use in your experience, use a rig type that is consistent with the rig types you intend to support in your experience.
Note that you can only equip clothing and other layerable accessories to **R15** models.
-## Insert pre-built rigs
+## Inserting a Pre-Built Rig
You can insert all pre-built rig types directly from the **Rig Builder** into your viewport.
diff --git a/content/en-us/studio/script-editor.md b/content/en-us/studio/script-editor.md
index 3472923ea..c1ee82a60 100644
--- a/content/en-us/studio/script-editor.md
+++ b/content/en-us/studio/script-editor.md
@@ -1,9 +1,9 @@
---
-title: Script editor
+title: Script Editor
description: Roblox's built-in, fully-featured script editor includes modern conveniences like autocomplete, code highlighting, and multi-cursor editing.
---
-The **script editor** in Studio is the primary tool for scripting on Roblox. It's a self-improving environment that can help you write high-impact code, shorten your development time, and iterate on your experiences. It can improve your scripting experience by:
+The **Script Editor** in Studio is the primary tool for scripting on Roblox. It's a self-improving environment that can help you write high-impact code, shorten your development time, and iterate on your experiences. It can improve your scripting experience by:
- Formatting and highlighting syntax in your code.
- Offering ways to [autocomplete](#autocomplete-features) phrases in your code as you type.
@@ -17,7 +17,7 @@ The Script Editor supports all types of [scripts](../scripting/index.md) and ope
You can [customize](#editor-settings) the Script Editor to suit your preferences and workflows, including font family/size, formatting behavior, and colors for syntax highlighting. You can also toggle features such as [autocomplete](#autocomplete), [signature help](#signature-help), and [script analysis](#script-analysis).
-## Autocomplete features
+## Autocomplete Features
The Script Editor's autocomplete features generate code-related information that can improve your programming efficiency, such as:
@@ -35,7 +35,7 @@ The Script Editor's autocomplete features generate code-related information that
- **Documentation pop-ups with code samples** that are similar to those on the [Engine API Reference](/reference/engine), giving you context on the API's usage.
-
+
- **On-hover tooltips** that you can customize with your own defined documentation.
@@ -49,21 +49,21 @@ The Script Editor's autocomplete features generate code-related information that
-## Code navigation
+## Code Navigation
-### Go to declaration
+### Go to Declaration
You can jump to the declaration of a function or variable by holding Ctrl on Windows or ⌘ on Mac when clicking the call, or by right-clicking its call and clicking **Go to Declaration**.
-### Script function filter
+### Script Function Filter
The **Script Function Filter** displays a list of all functions declared in a script. To open it, press AltF on Windows or ⌥F on Mac. With the list open, you can browse the signatures for each function, filter through them by name, and double-click one to jump to its declaration.
-## Find and replace
+## Find and Replace
The **Find/Replace** widget lets you find and replace code in an open script. The widget supports matching case, matching the whole word, and searching by regular expressions. To open it, press CtrlF on Windows or ⌘F on Mac.
@@ -73,7 +73,7 @@ The **Find/Replace** widget lets you find and replace code in an open script. Th
For broader searches, the **Find All / Replace All** window lets you find/replace code across multiple scripts in the experience. To open it, press CtrlShiftF on Windows or ⌘ShiftF on Mac.
-## Real-time feedback
+## Real-Time Feedback
### Script Analysis
@@ -88,9 +88,9 @@ The **Script Analysis** window, accessible from the [View](./view-tab.md) tab, p
Errors explained in Script Analysis window
-### Output
+### Output Window
-The **Output** window, accessible from the [View](./view-tab.md) tab, displays errors captured from running scripts, messages from Roblox Engine, messages from calls to `print()`, and errors from calls to `warn()`. For details on configuring it for your workflow, see [Output](../studio/output.md).
+The **Output** window, accessible from the [View](./view-tab.md) tab, displays errors captured from running scripts, messages from Roblox engine, messages from calls to `print()`, and errors from calls to `warn()`. For details on configuring it for your workflow, see [Output Window](../studio/output.md).
@@ -109,7 +109,7 @@ Press Tab to accept a suggestion, or ignore it by continuing to type.
**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.
-### Improve suggestions
+### Improving Suggestions
To get more accurate and relevant suggestions, it's recommended that you follow clean coding practices, regardless of assistance, and:
@@ -134,13 +134,13 @@ The tool helps automate basic coding tasks but it does not always suggest perfec
- The suggestion may be incomplete due to the limited length of output from the learning models.
- There's a daily cap for the number of suggestions and, once the cap is reached, you will get no suggestions until the next day.
-### Code privacy
+### Code Privacy
Currently, Roblox does not use any non-public data to train the learning models. The tool only uses a small subset of free marketplace assets for tuning large language models and the subset has passed various checks for quality and safety filters.
Furthermore, all suggestions are generated **by** the AI model and do not transfer from one user to another. Since your code is not used for model training, it won't be suggested to other users of **Code Assist**, with the one exception of code being posted to free marketplace items.
-## Multi-cursor
+## Multi-Cursor
The Script Editor supports usage of multiple cursors to make edits simultaneously. You can add cursors based on your needs with a mouse click or keyboard shortcut. The initial cursor is called the **primary cursor** and additional cursors are called **secondary cursors**.
@@ -160,42 +160,42 @@ The following table summarizes multi-cursor workflows and their shortcuts.
-
**Add/remove cursor at mouse location**
+
**Add/Remove Cursor at Mouse Location**
Alt + click
⌥ + click
-
**Remove most recently added cursor**
+
**Remove Most Recently Added Cursor**
CtrlU
⌘U
-
**Add/modify cursor on mouse drag**
+
**Add/Modify Cursor on Mouse Drag**
Alt + drag
⌥ + drag
-
**Add cursor above/below**
+
**Add Cursor Above/Below**
CtrlAlt↑ / CtrlAlt↓
⌘⌥↑ / ⌘⌥↓
-
**Add cursor to next matching selection**
+
**Add Cursor to Next Matching Selection**
CtrlD
⌘D
-
**Add cursor to every matching selection**
+
**Add Cursor to Every Matching Selection**
ShiftAltL
Shift⌥L
-
**Column/block select**
+
**Column/Block Select**
ShiftAlt + drag
Shift⌥ + drag
-
**Split selections into lines**
+
**Split Selections Into Lines**
ShiftAltI
Shift⌥I
@@ -206,11 +206,11 @@ The following table summarizes multi-cursor workflows and their shortcuts.
To remove all secondary cursors, exit multi-cursor editing, and return to the primary cursor, press Esc.
-### Add cursors
+### Adding Cursors
You can add cursors with a combination of keyboard shortcuts and mouse maneuvers. Cursors merge if they occupy the same space, such as if you add cursors with arrow keys or delete all the characters between cursors.
-#### At mouse location
+#### At Mouse Location
To add a cursor at your mouse pointer location:
@@ -219,12 +219,12 @@ To add a cursor at your mouse pointer location:
-#### With mouse drag
+#### With Mouse Drag
You can drag the mouse to add a cursor to a selection, split a multi-line selection into lines, or select columns and blocks of code/whitespace.
-
+
To add a cursor to a selection of code through dragging:
1. Hold Alt on Windows or ⌥ on Mac.
@@ -233,13 +233,13 @@ To add a cursor to a selection of code through dragging:
-
+
To split a multi-line selection into lines and add a cursor at the end of each line, press ShiftAltI on Windows or Shift⌥I on Mac.
-
+
To select columns and blocks of code or whitespace, drag the mouse while holding ShiftAlt on Windows or Shift⌥ on Mac. As you drag, a cursor will be added on each highlighted line.
@@ -247,7 +247,7 @@ To select columns and blocks of code or whitespace, drag the mouse while holding
-#### Above and below primary cursor
+#### Above and Below Primary Cursor
To add a cursor directly above or below the primary cursor:
@@ -256,12 +256,12 @@ To add a cursor directly above or below the primary cursor:
-#### To matching selections
+#### To Matching Selections
You can add cursors to all matches of a selection or to the next/previous match, and optionally toggle whether matches are case-sensitive and/or match the whole word.
-
+
To add a cursor to all matches of a selected portion:
1. Select the code that you want to search for matches of.
@@ -270,7 +270,7 @@ To add a cursor to all matches of a selected portion:
-
+
To add a cursor to the **next** matching selection:
1. Select the code that you want to search for matches of.
@@ -290,7 +290,7 @@ There is no default shortcut for adding a cursor to the **previous** matching se
4. Confirm your setting by clicking **OK** in the bottom-right corner of the window.
-
+
For each of the matching-related workflows above, you can match **case** and/or **whole word** as follows:
1. Open the Find/Replace tool (CtrlF on Windows or ⌘F on Mac).
@@ -305,11 +305,11 @@ For each of the matching-related workflows above, you can match **case** and/or
-### Remove cursors
+### Removing Cursors
You can remove cursors with the following keyboard shortcuts and mouse maneuvers. Alternatively, you can exit multi-cursor editing by pressing Esc.
-#### At mouse location
+#### At Mouse Location
To remove a cursor:
@@ -318,13 +318,13 @@ To remove a cursor:
-#### Most recently added
+#### Most Recently Added
To remove the most recently added cursor, press CtrlU on Windows or ⌘U on Mac.
-### Copy and paste cursors
+### Copying and Pasting Cursors
Copying a selection of code includes the cursors within it. The behavior of the paste depends on the number of cursors at the source and the number of cursors at the destination:
@@ -333,14 +333,14 @@ Copying a selection of code includes the cursors within it. The behavior of the
-### On-type formatting
+### On-Type Formatting
Pressing enter/return will auto-indent each cursor at the new line relative to
the previous line. If the previous line starts with an incomplete block, the formatter will try to complete it.
-## Editor settings
+## Editor Settings
Many customization options are accessible via **File** 〉 **Studio Settings** (AltS on Windows; ⌥S on Mac).
@@ -361,30 +361,30 @@ Commonly modified options include:
Font face and size for code in the editor.
-
**Tab width**
+
**Tab Width**
Number of spaces representing a Tab indent.
-
**Indent using spaces**
+
**Indent Using Spaces**
If enabled, spaces equal to **Tab Width** are inserted with Tab press.
-
**Text wrapping**
+
**Text Wrapping**
If enabled, longer lines of code wrap to the next line.
-
**Script Editor color preset**
+
**Script Editor Color Preset**
Color preset for code elements, selection colors, and more. After choosing a preset, you can set specific colors for options like **Selection Color** and **Comment Color**.
-## Keyboard shortcuts
+## Keyboard Shortcuts
The Script Editor has the following keyboard shortcuts. You can also access many commands from the [Script](../studio/script-tab.md) tab which appears in the Studio toolbar whenever you're viewing or editing a script.
-
+
@@ -395,44 +395,44 @@ The Script Editor has the following keyboard shortcuts. You can also access many
-
**Close script**
+
**Close Script**
CtrlW
⌘W
-
**Reopen last closed script**
+
**Reopen Last Closed Script**
CtrlShiftT
⌘ShiftT
-
**Quick open**
+
**Quick Open**
CtrlP
⌘P
-
**Show script in Explorer**
+
**Show Script in Explorer**
CtrlAltK
⌘⌥K
-
**Zoom in**
+
**Zoom In**
Ctrl=
⌘=
-
**Zoom out**
+
**Zoom Out**
Ctrl-
⌘-
-
**Reset script zoom**
+
**Reset Script Zoom**
Ctrl0
⌘0
-
+
@@ -468,7 +468,7 @@ The Script Editor has the following keyboard shortcuts. You can also access many
Shift⌘Z
-
**Select all**
+
**Select All**
CtrlA
⌘A
@@ -478,56 +478,56 @@ The Script Editor has the following keyboard shortcuts. You can also access many
⌘F
-
**Find all** / **replace all**
+
**Find All** / **Replace All**
CtrlShiftF
⌘ShiftF
-
**Indent** / **unindent**
+
**Indent** / **Unindent**
Ctrl\] / Ctrl\[
⌘\] / ⌘\[
-
**Toggle comment**
+
**Toggle Comment**
Ctrl/
⌘/
-
**Expand all folds**
+
**Expand All Folds**
CtrlE
⌘E
-
**Collapse all folds**
+
**Collapse All Folds**
CtrlShiftE
⌘ShiftE
-
**Delete line**
+
**Delete Line**
CtrlShiftK
⌘ShiftK
-
**Delete to start of line**
+
**Delete to Start of Line**
CtrlShiftBackspace
⌘Delete
-
**Move line up/down**
+
**Move Line Up/Down**
Alt↑ / Alt↓
⌥↑ / ⌥↓
-
**Go to declaration**
+
**Go to Declaration**
CtrlF12
⌘F12
-
**Open script function filter**
+
**Open Script Function Filter**
AltF
⌥F
-
**Format selection**
+
**Format Selection**
AltShiftF
⌥ShiftF
@@ -545,42 +545,42 @@ The Script Editor has the following keyboard shortcuts. You can also access many
-
**Add/remove cursor at mouse location**
+
**Add/Remove Cursor at Mouse Location**
Alt + click
⌥ + click
-
**Remove most recently added cursor**
+
**Remove Most Recently Added Cursor**
CtrlU
⌘U
-
**Add/modify cursor on mouse drag**
+
**Add/Modify Cursor on Mouse Drag**
Alt + drag
⌥ + drag
-
**Add cursor above/below**
+
**Add Cursor Above/Below**
CtrlAlt↑ / CtrlAlt↓
⌘⌥↑ / ⌘⌥↓
-
**Add cursor to next matching selection**
+
**Add Cursor to Next Matching Selection**
CtrlD
⌘D
-
**Add cursor to every matching selection**
+
**Add Cursor to Every Matching Selection**
ShiftAltL
Shift⌥L
-
**Column/block select**
+
**Column/Block Select**
ShiftAlt + drag
Shift⌥ + drag
-
**Split selections into lines**
+
**Split Selections Into Lines**
ShiftAltI
Shift⌥I
diff --git a/content/en-us/studio/script-tab.md b/content/en-us/studio/script-tab.md
index 5df5c3fe5..daed234ed 100644
--- a/content/en-us/studio/script-tab.md
+++ b/content/en-us/studio/script-tab.md
@@ -1,9 +1,9 @@
---
-title: Script tab
+title: Script Tab
description: The Script tab contains tools for writing, testing, and debugging scripts.
---
-The **script** tab contains tools for writing and testing scripts. You can only access this tab when you're viewing or editing a script.
+The **Script** tab contains tools for writing and testing scripts. You can only access this tab when you're viewing or editing a script.
@@ -108,13 +108,13 @@ The **Format** section lets you format sections or the entirety of the script fo
-## Pause and resume scripts
+## Pausing & Resuming Scripts
-While playtesting, the **Pause Scripts** and **Resume Scripts** buttons are useful for pausing both scripts and rendering, without [pausing physics](../studio/test-tab.md#pause-and-resume-physics).
+While playtesting, the **Pause Scripts** and **Resume Scripts** buttons are useful for pausing both scripts and rendering, without [pausing physics](../studio/test-tab.md#pausing--resuming-physics).
-## Debugging tools
+## Debugging Tools
The **Debugger** section lets you control the [debugger](../studio/debugging.md).
@@ -172,7 +172,7 @@ In the neighboring **Debug Errors** section, you can opt to treat script errors
-## Other actions
+## Other Actions
The **Actions** section at the furthest right contains miscellaneous script actions.
diff --git a/content/en-us/studio/setup.md b/content/en-us/studio/setup.md
index fa511efb2..0f3cc77f1 100644
--- a/content/en-us/studio/setup.md
+++ b/content/en-us/studio/setup.md
@@ -1,11 +1,11 @@
---
-title: Roblox Studio setup
+title: Roblox Studio Setup
description: Explains how to install Roblox Studio on your system.
---
Create immersive 3D experiences on Roblox with **Roblox Studio**, a free application available on Windows and Mac.
-## System requirements
+## System Requirements
The following system specifications ensure that Studio runs smoothly:
@@ -19,7 +19,7 @@ The following system specifications ensure that Studio runs smoothly:
¹ When installing [WebView2](https://developer.microsoft.com/en-us/microsoft-edge/webview2/#download-section) for Windows 10 or earlier, try the **Evergreen Standalone Installer** if the **Evergreen Bootstrapper** installation fails.
-## Installation
+## Installing Studio
To install Roblox Studio on your Windows or Mac computer:
@@ -47,17 +47,17 @@ Many customization options are accessible via **File** 〉 **Studio Sett
-In addition to general settings, you can customize Studio's [window layout](../studio/ui-overview.md#layout-customization) to best suit your workflows.
+In addition to general settings, you can customize Studio's [window layout](../studio/ui-overview.md#customizing-the-layout) to best suit your workflows.
-## Updates
+## Updating Studio
-In contrast to certain other engines, every experience runs on the latest version of the Roblox Engine. You should keep Studio up-to-date to utilize the latest APIs and features.
+In contrast to certain other engines, every experience runs on the latest version of the Roblox engine. You should keep Studio up-to-date to utilize the latest APIs and features.
If your current version of Studio is outdated, you'll see an **Update Available** button in the upper-right corner. Clicking the button will prompt you to save/close the currently open place so that Studio can automatically update and restart.
-## Beta features
+## Beta Features
Many beta features are available through Studio's **File** 〉 **Beta Features** menu. Once you've enabled beta features, click the **Save** button and you'll be prompted to restart Studio for the features to take effect.
diff --git a/content/en-us/studio/shortcuts.md b/content/en-us/studio/shortcuts.md
index 6bc144719..5b4a8a773 100644
--- a/content/en-us/studio/shortcuts.md
+++ b/content/en-us/studio/shortcuts.md
@@ -1,11 +1,11 @@
---
-title: Studio shortcuts
+title: Studio Shortcuts
description: Explains Studio default shortcuts and key commands that make development quicker and easier.
---
Studio has many default shortcuts and key commands that make development quicker and easier. You can customize every shortcut and bind many actions without defaults to any key through **File** → **Advanced** → **Customize Shortcuts**.
-## Files and publishing
+## Files and Publishing
@@ -86,7 +86,7 @@ Studio has many default shortcuts and key commands that make development quicker
-## Camera controls
+## Camera Controls
@@ -143,7 +143,7 @@ Studio has many default shortcuts and key commands that make development quicker
-## Select and edit
+## Selecting and Editing
@@ -376,7 +376,7 @@ Studio has many default shortcuts and key commands that make development quicker
-## Interface controls
+## Interface Controls
@@ -457,7 +457,7 @@ Studio has many default shortcuts and key commands that make development quicker
-## Testing and diagnostics
+## Testing and Diagnostics
diff --git a/content/en-us/studio/terrain-editor.md b/content/en-us/studio/terrain-editor.md
index 78ebef3f6..a5cff191a 100644
--- a/content/en-us/studio/terrain-editor.md
+++ b/content/en-us/studio/terrain-editor.md
@@ -11,7 +11,7 @@ The **Terrain Editor**, accessible from the [Home](../studio/home-tab.md) or [Vi
For detailed instructions on working with terrain, see the [Terrain](../parts/terrain.md) guide.
-## Create tab
+## Create Tab
The **Create** tab includes the [Import](#import), [Generate](#generate), and [Clear](#clear) tools.
@@ -41,7 +41,7 @@ The **Import** tool imports a [heightmap](../parts/terrain.md#heightmaps-and-col
-
Selection settings
+
Selection Settings
@@ -51,7 +51,7 @@ The **Import** tool imports a [heightmap](../parts/terrain.md#heightmaps-and-col
-
Heightmap settings
+
Heightmap Settings
@@ -81,7 +81,7 @@ The **Generate** tool procedurally generates terrain within a selected region. T
-
Selection settings
+
Selection Settings
@@ -91,7 +91,7 @@ The **Generate** tool procedurally generates terrain within a selected region. T
-
Biome settings
+
Biome Settings
@@ -124,7 +124,7 @@ The **Clear** tool reveals a button that clears all terrain within the entire pl
-## Edit tab
+## Edit Tab
The **Edit** tab includes the [Select](#select), [Transform](#transform), [Fill](#fill), [Sea Level](#sea-level), [Draw](#draw), [Sculpt](#sculpt), [Smooth](#smooth), [Paint](#paint), and [Flatten](#flatten) tools.
@@ -137,7 +137,7 @@ The **Select** tool is a universal tool for selecting rectangular regions of ter
-
Selection settings
+
Selection Settings
@@ -219,7 +219,7 @@ The **Transform** tool manipulates entire [selected](#select) regions to a new p
-
Transform settings
+
Transform Settings
@@ -272,7 +272,7 @@ The **Fill** tool fills an entire [selected](#select) region with a specific mat
-
Selection settings
+
Selection Settings
@@ -282,7 +282,7 @@ The **Fill** tool fills an entire [selected](#select) region with a specific mat
-
Material settings
+
Material Settings
@@ -306,7 +306,7 @@ The **Fill** tool fills an entire [selected](#select) region with a specific mat
Selected region filled with Salt material
-### Sea level
+### Sea Level
The **Sea Level** tool lets you create a consistent water level or remove all water within a region.
@@ -317,7 +317,7 @@ The **Sea Level** tool lets you create a consistent water level or remove all wa
-
Sea level settings
+
Sea Level Settings
@@ -347,7 +347,7 @@ The **Draw** tool **adds** or **subtracts** terrain using the brush. This tool f
-
Brush settings
+
Brush Settings
@@ -386,7 +386,7 @@ The **Draw** tool **adds** or **subtracts** terrain using the brush. This tool f
-
Material settings
+
Material Settings
@@ -613,7 +613,7 @@ The **Flatten** tool flattens terrain to a consistent level across a visualized
-## Studio shortcuts
+## Studio Shortcuts
For tools which use the **brush** ([Draw](#draw), [Sculpt](#sculpt), [Smooth](#smooth), [Flatten](#flatten), [Paint](#paint)), Studio supports the following keyboard and mouse shortcuts.
diff --git a/content/en-us/studio/test-tab.md b/content/en-us/studio/test-tab.md
index 829c069e7..b16ac43e1 100644
--- a/content/en-us/studio/test-tab.md
+++ b/content/en-us/studio/test-tab.md
@@ -1,5 +1,5 @@
---
-title: Test tab
+title: Test Tab
description: The Test tab contains tools for testing, simulating multiple clients, and other emulations.
---
@@ -9,15 +9,15 @@ import ControllerEmulator from '../includes/studio/controller-emulator.md'
import PauseResumePhysics from '../includes/studio/pause-resume-physics.md'
import BetaAlert from '../includes/beta-features/beta-alert.md'
-The **test** tab contains tools for testing and debugging an experience, simulating multiple clients, and emulating different devices or users with regional content policies.
+The **Test** tab contains tools for testing and debugging an experience, simulating multiple clients, and emulating different devices or users with regional content policies.
-## Playtest options
+## Playtest Options
-## Pause and resume physics
+## Pausing & Resuming Physics
@@ -27,23 +27,23 @@ Using the **Clients and Servers** options, you can launch multiple sessions of S
-## Device emulation
+## Device Emulation
-## Controller emulation
+## Controller Emulation
-## Player emulator
+## Player Emulator
The **Player** emulator lets you test various [localization](../production/localization/index.md) and content policies. See [Player Emulation](../studio/testing-modes.md#player-emulation) for details.
-## Mute audio
+## Audio Mute
The **Mute** button allows you to mute in-experience [sounds and music](../sound/index.md).
diff --git a/content/en-us/studio/testing-modes.md b/content/en-us/studio/testing-modes.md
index 8cd6f00b6..29459908f 100644
--- a/content/en-us/studio/testing-modes.md
+++ b/content/en-us/studio/testing-modes.md
@@ -1,5 +1,5 @@
---
-title: Studio testing modes
+title: Studio Testing Modes
description: Explore the built-in Studio testing modes for experiences.
---
@@ -9,15 +9,15 @@ import ControllerEmulator from '../includes/studio/controller-emulator.md'
import PauseResumePhysics from '../includes/studio/pause-resume-physics.md'
import BetaAlert from '../includes/beta-features/beta-alert.md'
-Because of the underlying [client-server model](../projects/client-server.md) of the Roblox Engine, it's important that you test your experience in various modes before [releasing it to the public](../production/publishing/publish-experiences-and-places.md#release-to-the-public). All of the testing options are accessible from the [Test](../studio/test-tab.md) tab.
+Because of the underlying [client-server model](../projects/client-server.md) of the Roblox engine, it's important that you test your experience in various modes before [releasing it to the public](../production/publishing/publishing-experiences-and-places.md#releasing-to-the-public). All of the testing options are accessible from the [Test](../studio/test-tab.md) tab.
-## Playtest options
+## Playtest Options
-### Toggle client/server
+### Client/Server Toggle
When testing in either **Play** or **Play Here** mode, Studio runs two separate simulations — one **client** simulation and one **server** simulation — which can provide a more accurate impression of how the experience will execute in production.
@@ -25,7 +25,7 @@ While playing solo, you can toggle between **Client** and **Server** modes by cl
-#### Controls and camera
+#### Controls and Camera
Depending on the mode, control of your character and the camera changes as follows:
@@ -44,7 +44,7 @@ Depending on the mode, control of your character and the camera changes as follo
-#### Explorer window
+#### Explorer Window
Within the [Explorer](../studio/explorer.md) window hierarchy, certain objects only exist in their expected containers.
@@ -59,19 +59,19 @@ Within the [Explorer](../studio/explorer.md) window hierarchy, certain objects o
-#### Output
+#### Output Window
In the [Output](../studio/output.md) window, messages are labeled **blue** (client) or **green** (server), indicating their origin from either the client or server. For messages output from `Class.ModuleScript|ModuleScripts`, the label color is determined by whether the module was called from a client-side `Class.LocalScript` or from a server-side `Class.Script`.
-### Pause and resume physics
+### Pausing & Resuming Physics
-## Multi-client simulation
+## Multi-Client Simulation
-Using the **clients and servers** options, you can launch multiple sessions of Studio, one acting as the server and each other acting as a client. This testing mode is a valuable tool for comparing how a client "sees" other clients within the experience.
+Using the **Clients and Servers** options, you can launch multiple sessions of Studio, one acting as the server and each other acting as a client. This testing mode is a valuable tool for comparing how a client "sees" other clients within the experience.
1. Make sure **Local Server** is selected in the upper box, then select the number of player sessions to test. Usually 1–2 players is sufficient, although you can simulate up to eight.
1. Press the **Start** button to begin the client-server simulation.
@@ -82,7 +82,7 @@ Using the **clients and servers** options, you can launch multiple sessions of S
-## Collaborative testing
+## Collaborative Testing
If you're working on an experience with others in [Collaboration](../projects/collaboration.md) mode, you can test with other creators as follows:
@@ -98,21 +98,21 @@ If you're working on an experience with others in [Collaboration](../projects/co
Only one team test session can run at any given time. To close a session and kick out all testers, click the **Shutdown Server** button.
-## Device emulation
+## Device Emulation
-## Controller emulation
+## Controller Emulation
-## VR emulation
+## VR Emulation
-**VR emulation** lets you test VR experiences in Studio without a physical headset. Just like emulating any other device, use the [device selector](#device-emulation) menu to choose the **Meta Quest 2** or **Meta Quest 3**. The [controller emulator](#controller-emulation) automatically selects the appropriate controller for the headset.
+**VR emulation** lets you test VR experiences in Studio without a physical headset. Just like emulating any other device, use the [Device Selector](#device-emulation) menu to choose the **Meta Quest 2** or **Meta Quest 3**. The [Controller Emulator](#controller-emulation) automatically selects the appropriate controller for the headset.
@@ -125,7 +125,7 @@ The combination of a headset and multiple controllers, each with motion tracking
- Use Shift← or Shift→ to switch between the headset, left controller, and right controller. For example, you might use the **Headset** option to look around as you walk forward with the left controller button, but then switch to the **Right Controller** when you need to use motion controls to aim at a target.
-## VR headsets
+## VR Headsets
If you'd like to support virtual reality (VR) headsets for your experience, make sure to test or [emulate](#vr-emulation) VR in Studio. Studio supports testing for all VR headsets that are compatible with [OpenXR](https://www.khronos.org/openxr/), the open‑source industry standard providing access to VR.
@@ -133,7 +133,7 @@ If you'd like to support virtual reality (VR) headsets for your experience, make
Currently, testing in VR is only supported on Windows.
-### Headset configuration
+### Headset Configuration
To enable Studio testing in VR, you must connect your headset to your PC and configure the OpenXR runtime **before** launching Studio. If you've already launched Studio, quit and complete the configuration steps first.
@@ -176,7 +176,7 @@ When using Oculus VR, ensure the following:
-### Roblox Quest app
+### Roblox Quest App
You can test your experience in the Roblox app on Quest without linking your headset to your computer. Use the following steps to access your experience on your headset in this mode:
@@ -186,7 +186,7 @@ You can test your experience in the Roblox app on Quest without linking your hea
4. Using your headset, open the standalone Roblox app.
5. Scroll down to the **Favorites** section in the home page and run your experience.
-### Studio VR mode
+### Studio VR Mode
After [configuring your headset](#headset-configuration), you can turn on the Studio VR testing mode through the following steps:
@@ -196,7 +196,7 @@ After [configuring your headset](#headset-configuration), you can turn on the St
You can now test your experience using your VR headset using any of the available [playtest options](#playtest-options). During a VR testing session, if your headset cable disconnects or you close the Roblox Studio Beta app on the headset, you'll need to restart Studio to re-run testing.
-## Player emulation
+## Player Emulation
For detailed emulation of experience [localization](../production/localization/index.md) and content policies, you can test through the **Player** emulator.
diff --git a/content/en-us/studio/texture-generator.md b/content/en-us/studio/texture-generator.md
index f74097bc3..781c7c79f 100644
--- a/content/en-us/studio/texture-generator.md
+++ b/content/en-us/studio/texture-generator.md
@@ -30,7 +30,7 @@ The **Texture Generator** tool is designed to quickly create custom textures for
1 When generating a texture for a `Class.Model` group of `Class.MeshPart|MeshParts`, the meshes should be arranged in a sensible way such that a unified body is formed. Avoid generating a texture for an arbitrary group of meshes scattered about the model's bounds, or for more than one identical mesh in the same operation.
-## Generate textures
+## Generating Textures
To begin generating textures, navigate to the [Model](../studio/model-tab.md) tab and open the **Texture Generator** tool.
@@ -88,7 +88,7 @@ With the tool's window open:
Final generated textures will be a close match to what you observe in the preview pane, but may not be an exact match. You can continue to iterate on a style prompt and compare previous versions as outlined in [Managing Textures](#managing-textures).
-## Manage textures
+## Managing Textures
Generated textures appear in the **Saved Textures** section of the tool's window. For each texture, you can click the **⋯** to access various options.
@@ -121,23 +121,23 @@ Generated textures appear in the **Saved Textures** section of the tool's window
-## Advanced options
+## Advanced Options
Expanding the **Advanced Options** section in the tool's window allows you to configure the following aspects.
-### Seed control
+### Seed Control
You can choose to either randomize the seed or set a specific seed for texture generation. Setting a specific seed before generating a texture ensures you get consistent results each time you use a specific prompt.
-### Generation angle
+### Generation Angle
Allows you to set a primary generation angle to prioritize during the preview generation phase to ensure the most important areas of your mesh are visible and able to be textured. This angle is also controlled by clicking and dragging the mesh in the preview window.
See [Best Practices](#best-practices) for detailed recommendations on choosing a generation angle.
-### Smart UV unwrap
+### Smart UV Unwrap
In 3D modeling, a **UV map** is a 2D representation of the surface of a 3D model, allowing 2D textures to be accurately applied to the 3D model. UV coordinates **U** and **V** refer to the horizontal and vertical axes of this 2D space, similar to the **X** and **Y** axes in a 2D graph.
@@ -145,7 +145,7 @@ For the texture generator tool to create well-formed textures, your mesh's under
Selecting the **Smart UV Unwrap** option will take a mesh with no UVs (or incompatible UVs) and apply the necessary UV coordinates for texturing. If your UVs are compatible, they won't be affected and you can use your mesh as‑is.
-### Specify front view
+### Specify Front View
When this setting is enabled, the [generation angle](#generation-angle) selected during the preview stage is specified as the "front" of your mesh. This allows the tool to better texture meshes with a clear front and back by identifying each side, resulting in more consistent and coherent textures. This is particularly helpful for objects with a clear front and back, like avatars, animals, and clothing.
@@ -182,10 +182,10 @@ Same prompt with **Specify Front View** enabled, yielding correct "front" and "b
-## Best practices
+## Best Practices
-
+
The following prompting tips enable the tool to provide better and more consistent results.
- Provide as much detail as possible in your prompt. Short, vague prompts will lead to inconsistent or unexpected results.
@@ -193,14 +193,14 @@ The following prompting tips enable the tool to provide better and more consiste
- Use descriptive phrases instead of single words for key items, for example "worn leather" instead of just "leather."
- Add styling cues like "cinematic," "photorealistic," "cartoon," or "low poly" to influence the overall look.
-
+
The [generation angle](#generation-angle) sets the most important view of your mesh which will be prioritized during generation. Changing this angle can often help eliminate inconsistencies in textures.
- Setting the generation angle to highlight the meaningful faces of your mesh will result in better generations.
- For flat objects like plates, swords, and fences, make sure the generation angle displays a view with a high surface area.
- For humanoid and animal meshes, experiment with different generation angles, such as a head-on view of the face and a side view profile, to find the most consistent and coherent texture.
-
+
Generating the most suitable textures is an iterative process. It helps to preview often and tweak prompts incrementally to reach your vision.
- If a texture doesn't meet your expectations, identify what to change instead of starting over. For example, tweak the color or pattern description.
diff --git a/content/en-us/studio/ui-overview.md b/content/en-us/studio/ui-overview.md
index 9b2160053..9b884c83d 100644
--- a/content/en-us/studio/ui-overview.md
+++ b/content/en-us/studio/ui-overview.md
@@ -1,5 +1,5 @@
---
-title: Studio interface
+title: Studio Interface
description: User interface overview for Roblox Studio, the essential building tool for Roblox experiences.
---
@@ -49,7 +49,7 @@ The **toolbar** resides at the top of Studio. The buttons and tools visible in t
-## 3D viewport
+## 3D Viewport
The 3D viewport represents the `Class.Workspace` of a place. From here, you can move the camera around the virtual world, manipulate objects with the mouse, and playtest an experience without leaving Studio.
@@ -60,9 +60,9 @@ The 3D viewport represents the `Class.Workspace` of a place. From here, you can
3D viewport in Roblox Studio
-### Camera controls
+### Camera Controls
-Inside the viewport, you can move the camera with the following controls. See also [Studio shortcuts](../studio/shortcuts.md#camera-controls) for additional key shortcuts.
+Inside the viewport, you can move the camera with the following controls. See also [Studio Shortcuts](../studio/shortcuts.md#camera-controls) for additional key shortcuts.
@@ -82,7 +82,7 @@ Inside the viewport, you can move the camera with the following controls. See al
Shift
-
In combination with any movement key, changes the camera speed. If desired, you can [customize](../studio/setup.md#customization) the camera speed within Studio's settings.
+
In combination with any movement key, changes the camera speed. If desired, you can [customize](../studio/setup.md#customizing-studio) the camera speed within Studio's settings.
F
@@ -102,18 +102,18 @@ Inside the viewport, you can move the camera with the following controls. See al
**Right Mouse Button** & **Mouse Scroll Wheel**
-
Pressing the right mouse button and scrolling the mouse wheel **up** increases the camera scroll speed. Conversely, pressing the right mouse button and scrolling the mouse wheel **down** reduces the camera scroll speed.Camera scroll speed is also adjustable from the [visualization options](#visualization-options) menu in the upper‑right corner of the 3D viewport.
+
Pressing the right mouse button and scrolling the mouse wheel **up** increases the camera scroll speed. Conversely, pressing the right mouse button and scrolling the mouse wheel **down** reduces the camera scroll speed.Camera scroll speed is also adjustable from the [Visualization Options](#visualization-options) menu in the upper‑right corner of the 3D viewport.
-### Object selection
+### Selecting Objects
As you hover over parts and models in the viewport, they are outlined to indicate their potential selection. You can select an outlined object by clicking it, or you can select multiple objects by holding Shift, Ctrl, or ⌘ as you hover over and click them.
-
Selection cycling
+
Selection Cycling
In more complex environments or when zoomed in, objects will commonly be hidden from your view by other objects in front. To select hidden objects without moving the camera around, hold Alt or ⌥ and click to perform **selection cycling** to the next further object behind the currently selected object.
@@ -122,11 +122,11 @@ In more complex environments or when zoomed in, objects will commonly be hidden
Selection cycling
-
Children or parents
+
Children or Parents
When one or more objects or [models](../parts/models.md) are selected in the [Explorer](../studio/explorer.md) window, you can select all of their **children** by right-clicking and choosing **Select Children** from the context menu. Similarly, right-clicking and choosing **Select Parent(s)** selects the **direct parents** of those objects.
-
Selection style
+
Selection Style
To display **outlines** and/or **bounding boxes** around selected objects, choose an option from the **Selection Style** menu in the [View](../studio/view-tab.md) tab.
@@ -134,13 +134,13 @@ To display **outlines** and/or **bounding boxes** around selected objects, choos
-### Visualization options
+### Visualization Options
In the upper-right corner of the 3D viewport, you can quickly toggle or set common visualization options related to [on‑screen UI](../ui/on-screen-containers.md) overlays, [light sources](../effects/light-sources.md), physics simulation, character [pathfinding](../characters/pathfinding.md), and more. The menu also contains a control for viewing/setting the camera scroll speed.
-## Common windows
+## Commonly Used Windows
You can toggle on commonly used windows through the [View](../studio/view-tab.md) tab, including the [Explorer](../studio/explorer.md) window, [Properties](../studio/properties.md) window, [Asset Manager](../projects/assets/manager.md), [Toolbox](../projects/assets/toolbox.md), and many others.
@@ -182,9 +182,9 @@ The [Toolbox](../projects/assets/toolbox.md) contains a selection of models, ima
-### Output
+### Output Window
-The [Output](../studio/output.md) window, accessible from the [View](../studio/view-tab.md) tab, displays errors captured from running scripts, messages from Roblox Engine, messages from calls to `print()`, and errors from calls to `warn()`.
+The **Output** window, accessible from the [View](../studio/view-tab.md) tab, displays errors captured from running scripts, messages from Roblox engine, messages from calls to `print()`, and errors from calls to `warn()`. See [Output Window](../studio/output.md) for further details.
@@ -194,11 +194,11 @@ The **Command Bar**, accessible from the [View](../studio/view-tab.md) tab, lets
-## Layout customization
+## Customizing the Layout
Studio's drag-and-drop interface lets you easily customize window layout to best suit your workflows.
-### Reposition windows
+### Repositioning Windows
You can reposition any window by click-dragging its **header bar**. As you begin dragging the window, the interface reveals **empty docking area** regions. If you drag the mouse pointer into any empty region, a floating **position selector** appears in that region. Dragging the pointer over the "center" of the floating selector targets the empty region as the dragged window's destination, indicated by the region darkening and becoming outlined.
@@ -210,47 +210,74 @@ You can reposition any window by click-dragging its **header bar**. As you begin
If you drag the mouse pointer into a **populated** region such as the 3D viewport, a floating position selector appears with multiple options for the window's destination. For example, dragging the pointer over the "left" icon will position the window on the region's left side.
-
+
-
+
-### Group windows
+### Grouping Windows
-If you drag a window into a **populated** region and choose the "center" icon of the [position selector](#reposition-windows), the dragged window will group into that region as a tab. This allows you to set up tab groups of commonly used windows.
+If you drag a window into a **populated** region and choose the "center" icon of the [position selector](#repositioning-windows), the dragged window will group into that region as a tab. This allows you to set up tab groups of commonly used windows.
Three windows grouped together as tabs
-### Pin windows
+### Pinning Windows
-To maximize screen space for the 3D viewport, you can **pin** windows (or an entire [group](#group-windows) of windows) to the edges of the overall Studio window. Once pinned, you can temporarily open any window by clicking its tab — this does not disturb other windows, and the expanded window will automatically collapse when you click in another window or click its tab again.
+To maximize screen space for the 3D viewport, you can **pin** windows (or an entire [group](#grouping-windows) of windows) to the edges of the overall Studio window. Once pinned, you can temporarily open any window by clicking its tab — this does not disturb other windows, and the expanded window will automatically collapse when you click in another window or click its tab again.
Three windows pinned to the right side of the Studio window
-To pin a window or an entire [group](#group-windows) of windows, click the "collapse" button. Alternatively, to un‑pin a pinned window/group, open it by clicking its tab, then click the "expand" button.
+To pin a window or an entire [group](#grouping-windows) of windows, click the "collapse" button. Alternatively, to un‑pin a pinned window/group, open it by clicking its tab, then click the "expand" button.
-### Float windows
+### Floating Windows
-To float a window freely of other windows, simply drag‑and‑drop it without selecting any icon from the floating [position selector](#reposition-windows).
+To float a window freely of other windows, simply drag‑and‑drop it without selecting any icon from the floating [position selector](#repositioning-windows).
-## In-Studio testing
+## Saving & Publishing
-Studio offers a suite of options for testing an experience before [releasing it to the public](../production/publishing/publish-experiences-and-places.md#release-to-the-public). All of the testing options are accessible from the [Test](../studio/test-tab.md) tab.
+Options to save and [publish](../production/publishing/publishing-experiences-and-places.md) can be found in the **File** menu in the top left of Studio.
-- [Rapid paytesting](../studio/testing-modes.md#playtest-options) — Provides a close simulation of the experience running on the Roblox application.
-- [Multi-client simulation](../studio/testing-modes.md#multi-client-simulation) — Compares how each client "sees" other clients within the experience.
-- [Device emulation](../studio/testing-modes.md#device-emulation) — Provides insight on how controls operate on a mobile device or how on-screen UI displays on different screens and aspect ratios.
-- [Controller emultation](../studio/testing-modes.md#controller-emulation) — Accurately emulates [gamepad input](../input/gamepad.md) directly in Studio.
+
+
+
+
Option
+
Action
+
+
+
+
+
**Save to File**
+
Save the experience locally to your computer in **.rbxl** format.
+
+
+
**Save to Roblox**
+
Save the experience to Roblox's cloud storage. Unlike Publish to Roblox, this does **not** update the current live version of the experience.
+
+
+
**Publish to Roblox**
+
Save and publish the experience to Roblox so other users can play. For more information, see [Publishing Experiences and Places](../production/publishing/publishing-experiences-and-places.md).
+
+
+
+
+## In-Studio Testing
+
+Studio offers a suite of options for testing an experience before [releasing it to the public](../production/publishing/publishing-experiences-and-places.md#releasing-to-the-public). All of the testing options are accessible from the [Test](../studio/test-tab.md) tab.
+
+- [Rapid Playtesting](../studio/testing-modes.md#playtest-options) — Provides a close simulation of the experience running on the Roblox application.
+- [Multi-Client Simulation](../studio/testing-modes.md#multi-client-simulation) — Compares how each client "sees" other clients within the experience.
+- [Device Emulation](../studio/testing-modes.md#device-emulation) — Provides insight on how controls operate on a mobile device or how on-screen UI displays on different screens and aspect ratios.
+- [Controller Emultation](../studio/testing-modes.md#controller-emulation) — Accurately emulates [gamepad input](../input/gamepad.md) directly in Studio.
-See [Studio testing modes](../studio/testing-modes.md) for more information on each testing option.
+See [Studio Testing Modes](../studio/testing-modes.md) for more information on each testing option.
diff --git a/content/en-us/studio/view-tab.md b/content/en-us/studio/view-tab.md
index 8193d1ef1..5aea97c00 100644
--- a/content/en-us/studio/view-tab.md
+++ b/content/en-us/studio/view-tab.md
@@ -1,13 +1,13 @@
---
-title: View tab
+title: View Tab
description: The View tab lets you toggle various windows in Studio and customize display options.
---
-The **view** tab lets you toggle various windows in Studio, toggle the [view selector](#view-selector), and customize [display options](#display-options).
+The **View** tab lets you toggle various windows in Studio, toggle the [view selector](#view-selector), and customize [display options](#display-options).
-## Windows and tools
+## Windows and Tools
The **Show** section lets you toggle specific windows and tools within Studio. Commonly accessed windows/tools include:
@@ -73,9 +73,9 @@ The **View Selector** widget lets you easily navigate between 14 views in 3D spa
-## Display options
+## Display Options
-### Grid and wireframe
+### Grid and Wireframe
A visual grid or wireframe view can be toggled through the buttons in the **Settings** section.
@@ -87,19 +87,19 @@ A visual grid or wireframe view can be toggled through the buttons in the **Sett
-
+ The **Show Grid** button toggles a 3D grid on the **Y** plane, as well as an axis indicator at (**0**, **0**, **0**). If showing, the radio buttons directly to the left of the button set the grid lines to be 2, 4, or 16 studs apart.
-
+ For 3D objects without an applied `Class.Texture`, the **Grid Material** button overlays a flat "grid material" on all surfaces.
-
+
The **Wireframe Rendering** button changes the editor view to wireframe rendering mode.
@@ -114,15 +114,15 @@ Toggles the visibility of on-screen user interface elements in the 3D viewport.
-
+
-
+
-### Selection style
+### Selection Style
To display **outlines** and/or **bounding boxes** around selected objects, choose an option from the **Selection Style** menu. You can also customize the thickness, color, and other aspects of outlines and bounding boxes through the **Studio Settings** menu.
@@ -134,7 +134,7 @@ To display **outlines** and/or **bounding boxes** around selected objects, choos
While in a [collaborative session](../projects/collaboration.md) in Studio, bounding boxes only appear to you, not to others in the session.
-## Stats
+## Diagnostic Stats
The **Stats** section contains buttons which toggle on-screen diagnostic information.
diff --git a/content/en-us/tutorials/curriculums/core/building/apply-polished-assets.md b/content/en-us/tutorials/curriculums/core/building/apply-polished-assets.md
index 2246a37e3..1ccfe46df 100644
--- a/content/en-us/tutorials/curriculums/core/building/apply-polished-assets.md
+++ b/content/en-us/tutorials/curriculums/core/building/apply-polished-assets.md
@@ -1,5 +1,5 @@
---
-title: Apply polished assets
+title: Apply Polished Assets
description: Explains how to finish your scene by replacing simple parts with complex, imported models.
prev: /tutorials/curriculums/core/building/customize-global-lighting
comments: The links to the Materials and PBR Modeling guides must be replaced by a single link to the Environmental Art curriculum once that is published. The link at the end should also be changed to link to the next sets of tutorials.
@@ -13,7 +13,7 @@ comments: The links to the Materials and PBR Modeling guides must be replaced by
Using the [Island Jump - Final](https://www.roblox.com/games/14238807008/Island-Jump-Completed-Sample) `.rbxl` file as a reference, this section of the tutorial teaches you how to use the Creator Store to find and add a sample asset library into your project, continue your organization structure to sort your new assets into meaningful categories, and apply the asset library to the 3D space.
-## Get asset library
+## Get Asset Library
The **Creator Store** is a tab of the Toolbox that you can use to find all assets that are made by Roblox and the Roblox community for use within your projects, including model, image, mesh, audio, plugin, video, and font assets. You can use the Creator Store to add an individual asset or asset library directly into an open experience.
@@ -75,19 +75,19 @@ To get the asset library from your inventory into your experience:
-## Continue organization structure
+## Continue Organization Structure
-Before you apply your asset library to your greybox geometry, it's important to continue the organization structure you started in [Greybox a playable area](../../core/building/greybox-a-playable-area.md) by creating new container objects for the new assets you're about to add to your environment. This process keeps your Workspace organized and easy to scan, allowing you to easily make quick updates to specific groupings of assets.
+Before you apply your asset library to your greybox geometry, it's important to continue the organization structure you started in [Greybox a Playable Area](../../core/building/greybox-a-playable-area.md) by creating new container objects for the new assets you're about to add to your environment. This process keeps your Workspace organized and easy to scan, allowing you to easily make quick updates to specific groupings of assets.
To add in additional container objects to your organization structure:
1. In the **Explorer** window, insert two new folders into the **World** folder.
2. Rename the folders **Platforms** and **Mountains**, respectively.
-3. Insert a new model into the **Platforms** folder for each sea stack platform in your environment, and rename them according to sea stack level naming you created in [Greybox a playable area](../../core/building/greybox-a-playable-area.md). For example, the sample experience has 18 individual model containers for every platform in the environment.
+3. Insert a new model into the **Platforms** folder for each sea stack platform in your environment, and rename them according to sea stack level naming you created in [Greybox a Playable Area](../../core/building/greybox-a-playable-area.md). For example, the sample experience has 18 individual model containers for every platform in the environment.
-## Apply asset library
+## Apply Asset Library
The following instructions provide two different instructional paths: you can either apply the asset library to your own unique environment, or you can apply the asset library in a way that exactly recreates the final environment within the sample [Island Jump - Final](https://www.roblox.com/games/14238807008/Island-Jump-Completed-Sample) experience.
@@ -116,7 +116,7 @@ Both platform types are `Class.Model` objects that include two `Class.MeshPart`
-
+
To apply the asset library to your platforms:
@@ -133,7 +133,7 @@ To apply the asset library to your platforms:
-
+
To exactly recreate the sea stack platforms within the sample [Island Jump - Final](https://www.roblox.com/games/14238807008/Island-Jump-Completed-Sample) experience:
@@ -143,8 +143,8 @@ To exactly recreate the sea stack platforms within the sample [Island Jump - Fin
2. In the **Platforms** folder, paste **PlatformA** into the **Level_1** model.
3. In the **Properties** window,
- 1. Set **Origin.Position** to `-30, 3, 9`.
- 1. Set **Scale** to `2.2`.
+ 1. Set **Origin.Position** to **-30, 3, 9**.
+ 1. Set **Scale** to **2.2**.
@@ -273,7 +273,7 @@ To exactly recreate the sea stack platforms within the sample [Island Jump - Fin
-### Sea stacks
+### Sea Stacks
The sample asset library includes two types of sea stack rock formations you can stack in creative ways to form the pillars of your sea stack platforms:
@@ -292,7 +292,7 @@ Both platform types are `Class.MeshPart` objects.
-
+
To apply the asset library to your sea stacks:
@@ -309,7 +309,7 @@ To apply the asset library to your sea stacks:
1. Delete your placeholder greybox sea stack platforms.
-
+
To exactly recreate the sea stacks within the sample [Island Jump - Final](https://www.roblox.com/games/14238807008/Island-Jump-Completed-Sample) experience:
@@ -419,7 +419,7 @@ To exactly recreate the sea stacks within the sample [Island Jump - Final](https
-
Sea stack type
+
Sea Stack Type
Size
CFrame.Position
CFrame.Orientation
@@ -864,7 +864,7 @@ You can place these objects anywhere you set your initial placeholder coins, or
-
+
To apply the asset library to your coins:
@@ -878,15 +878,15 @@ To apply the asset library to your coins:
1. Delete your placeholder coins.
-
+
To exactly recreate the coins within the sample [Island Jump - Final](https://www.roblox.com/games/14238807008/Island-Jump-Completed-Sample) experience:
1. In the **Explorer** window, navigate to the asset library and copy **Coin**.
2. In the **Platforms** folder, paste **Coin** into the **Coins** folder.
3. In the **Properties** window,
- 1. Set **CFrame.Position** to `-121, 3, 6`.
- 1. Set **CFrame.Orientation** to `0, -105, 0`.
+ 1. Set **CFrame.Position** to **-121, 3, 6**.
+ 1. Set **CFrame.Orientation** to **0, -105, 0**.
4. Repeat this process, adding and configuring the following **coin** assets wherever you set your initial coin placeholder objects:
@@ -1046,7 +1046,7 @@ The sample asset library includes a single **MountainMesh** asset you can use to
-
+
To apply the asset library to your mountains:
@@ -1058,16 +1058,16 @@ To apply the asset library to your mountains:
-
+
To exactly recreate the mountains within the sample [Island Jump - Final](https://www.roblox.com/games/14238807008/Island-Jump-Completed-Sample) experience:
1. In the **Explorer** window, navigate to the asset library and copy **MountainMesh**.
2. In the **Platforms** folder, paste **MountainMesh** into the **Mountains** folder.
3. In the **Properties** window,
- 1. Set **Size** to `2048, 334, 2048`.
- 2. Set **CFrame.Position** to `-1243, 115, -1402`.
- 3. Set **CFrame.Orientation** to `0, 46, 0`.
+ 1. Set **Size** to **2048, 334, 2048**.
+ 2. Set **CFrame.Position** to **-1243, 115, -1402**.
+ 3. Set **CFrame.Orientation** to **0, 46, 0**.
4. Repeat this process, adding and configuring the following mountain assets along the border of your water terrain:
@@ -1177,7 +1177,7 @@ To playtest your experience:
-Congratulations on completing the Core Curriculum! Now that you have experience creating a simple experience from start to finish, you can extend your project with new gameplay features or additional levels, explore Studio's additional [features](../../../../platform.md), or follow additional tutorial curricula, such as the [Environmental art curriculum](../../environmental-art/index.md) that teaches you how to create a high-quality laser tag environment. Happy creating!
+Congratulations on completing the Core Curriculum! Now that you have experience creating a simple experience from start to finish, you can extend your project with new gameplay features or additional levels, explore Studio's additional [features](../../../../platform.md), or follow additional tutorial curricula, such as the [Environmental Art Curriculum](../../environmental-art/index.md) that teaches you how to create a high-quality laser tag environment. Happy creating!
We're interested in hearing from you about your experience following the Core Curriculum. If you have any questions, concerns, or additional feedback on the process, please comment on our [Core Curriculum Q&A](https://devforum.roblox.com/t/feedback-on-core-curriculum/2592219).
diff --git a/content/en-us/tutorials/curriculums/core/building/create-a-project.md b/content/en-us/tutorials/curriculums/core/building/create-a-project.md
index 5ab3c273b..616647ec9 100644
--- a/content/en-us/tutorials/curriculums/core/building/create-a-project.md
+++ b/content/en-us/tutorials/curriculums/core/building/create-a-project.md
@@ -1,5 +1,5 @@
---
-title: Create a project
+title: Create a Project
description: This part of the tutorial gets you started with creating a project.
prev: /tutorials/curriculums/core/
next: /tutorials/curriculums/core/building/create-an-environment-with-terrain
diff --git a/content/en-us/tutorials/curriculums/core/building/create-an-environment-with-terrain.md b/content/en-us/tutorials/curriculums/core/building/create-an-environment-with-terrain.md
index adb74ec03..416f6ad72 100644
--- a/content/en-us/tutorials/curriculums/core/building/create-an-environment-with-terrain.md
+++ b/content/en-us/tutorials/curriculums/core/building/create-an-environment-with-terrain.md
@@ -1,5 +1,5 @@
---
-title: Create an environment with terrain
+title: Create an Environment with Terrain
description: Explains how to create the island where players spawn using Studio's terrain tools.
next: /tutorials/curriculums/core/building/greybox-a-playable-area
prev: /tutorials/curriculums/core/building/create-a-project
@@ -13,7 +13,7 @@ prev: /tutorials/curriculums/core/building/create-a-project
Before you begin, it's important to note that sculpting terrain is an art form, and it's difficult to exactly recreate brush strokes and subtle material edits. As long as your terrain meets the needs of your own experience, it's normal and expected for your environment to look and feel different from the sample [Island Jump](https://www.roblox.com/games/14239096301/) experience.
-## Create the island
+## Create the Island
The first step in creating your environment is to create a small island that players will spawn to when they start the experience, and when their health reaches zero after they fall off a platform. Using the Terrain Editor's **Draw** tool, you can click and drag anywhere within the viewport to generate a large sphere of terrain to start the island, which you can later shape and flatten for a wide surface area.
@@ -49,7 +49,7 @@ To create the island:
If you cannot see the sphere, try zooming your camera out until your spawn location is smaller.
-## Shape the island
+## Shape the Island
If you keep the island in its current shape, players would have a difficult time navigating without falling off the island. Using the Terrain Editor's **Flatten** tool, you can click and drag on the sphere to evenly level the terrain on a fixed plane, and provide players a relatively flat surface as they start your experience. While this shape initially looks unnatural, you can also use the Terrain Editor's **Sculpt** tool around the edges of the island to ensure it looks organic and realistic.
@@ -66,9 +66,9 @@ To shape the island:
- - Set **Brush Size** to `18`.
+ - Set **Brush Size** to **18**.
- Set **Flatten Plane** to **Fixed**. New settings display.
- - Set **Fixed Y Plane** to `0`.
+ - Set **Fixed Y Plane** to **0**.
@@ -97,7 +97,7 @@ To shape the island:
grows or erodes existing terrain.
-## Create water
+## Create Water
While there are multiple ways to generate a large body of water, the following instructions utilize the
Terrain Editor's **Fill** tool. This method allows you to replace any material in a specific region with another
@@ -110,8 +110,8 @@ To create the water around the island:
1. In the **Selection Settings** section,
- 1. Set **Position** to `0, -15, 0` to ensure the water fills below the top of the island.
- 1. Set **Size** to `1800, 5, 1800` to ensure the water fills toward the horizon of your experience.
+ 1. Set **Position** to **0, -15, 0** to ensure the water fills below the top of the island.
+ 1. Set **Size** to **1800, 5, 1800** to ensure the water fills toward the horizon of your experience.
1. In the **Material Settings** section, configure the tool with the following settings:
@@ -131,7 +131,7 @@ To create the water around the island:
-## Apply materials
+## Apply Materials
Now that you have the basis of your island, you can customize its appearance with different materials. Using the Terrain Editor's **Paint** tool,
you can click and drag on your terrain to apply both a grassy surface and blades of grass to the middle of the island's surface.
@@ -161,13 +161,13 @@ To apply materials to the island:
1. Navigate back to the **Terrain Editor** window, then in the **Brush Settings** and **Material Settings** sections,
- 1. Set **Brush Size** to `3`.
+ 1. Set **Brush Size** to **3**.
1. Set **Material** to **Grass**.
1. In the viewport, drag along the edges of the island to apply blades of grass, leaving space in the middle of the island for
the spawn location and the initial platforms.
1. In the **Explorer** window, select the **SpawnLocation** object.
1. In the **Home** tab, select the **Move** tool.
-1. In the viewport, move the spawn location toward the edge of the island to make space for the first platform. The sample [Island Jump - Building](https://www.roblox.com/games/14239096301/Island-Jump-Building) `.rbxl` file uses a position of `-127, -3, 9`.
+1. In the viewport, move the spawn location toward the edge of the island to make space for the first platform. The sample [Island Jump - Building](https://www.roblox.com/games/14239096301/Island-Jump-Building) `.rbxl` file uses a position of **-127, -3, 9**.
1. Select this block part, then in the **Properties** window,
1. Set **Name** to **VFX_Flare**.
- 1. Set **Transparency** to `1` so the part is invisible.
+ 1. Set **Transparency** to **1** so the part is invisible.
1. Enable **Anchored** so the physics system doesn't move the part when the experience starts.
1. Add an attachment to this part.
1. In the **Explorer** window, hover over the block part and click the **⊕** button. A contextual menu displays.
@@ -58,12 +58,12 @@ To create a flare:
-### Configure the flare
+### Configure the Flare
Now that you have a particle emitter in your experience, you can customize its properties so that it emits a glowing flare that
-faces players when they start the experience. To learn more about how each property affects the resulting visual effect, see `Class.ParticleEmitter|ParticleEmitter` and [Customizing particles](../../../../effects/particle-emitters.md#customize-particles).
+faces players when they start the experience. To learn more about how each property affects the resulting visual effect, see `Class.ParticleEmitter|ParticleEmitter` and [Customizing Particles](../../../../effects/particle-emitters.md#customizing-particles).
-#### Particle image
+#### Particle Image
Each particle displays an image set by the `Class.ParticleEmitter.Texture|Texture` property. To use your own image, you need to upload the image to Roblox and get an asset ID. See [Assets](../../../../projects/assets/index.md) for more on this process and how to do it yourself.
@@ -72,7 +72,7 @@ You can use Roblox's pre-made flare image for the `Class.ParticleEmitter.Texture
1. In the **Explorer** window, select **Emitter_Flare**.
1. In the **Properties** window, set **Texture** to `rbxassetid://8983307836`.
-#### Basic properties
+#### Basic Properties
`Class.ParticleEmitter.Rate` determines the amount of particles emitted per second. A rate of `5` means that a particle will emit every `1/5 = 0.2` seconds. Higher values of `Class.ParticleEmitter.ZOffset` means the particles render in front of other objects, while negative values mean they render behind other objects.
@@ -85,15 +85,15 @@ To configure the basic properties of the particle emitter:
1. In the **Explorer** window, select **Emitter_Flare**.
1. In the **Properties** window,
- 1. Set **Color** to `127, 84, 59`, or to a color you prefer for the flare.
- 1. Set **LightEmission** to `1` to use additive blending.
- 1. Set **ZOffset** to `1` to ensure it appears as expected in relation to the camera.
- 1. Set **Lifetime** to `10, 10`.
- 1. Set **Rate** to `0.45`.
- 1. Set **RotSpeed** to `20` to rotate each particle 20 degrees per second.
- 1. Set **Speed** to `0` to prevent the particle from moving.
+ 1. Set **Color** to **127, 84, 59**, or to a color you prefer for the flare.
+ 1. Set **LightEmission** to **1** to use additive blending.
+ 1. Set **ZOffset** to **1** to ensure it appears as expected in relation to the camera.
+ 1. Set **Lifetime** to **10, 10**.
+ 1. Set **Rate** to **0.45**.
+ 1. Set **RotSpeed** to **20** to rotate each particle 20 degrees per second.
+ 1. Set **Speed** to **0** to prevent the particle from moving.
-#### Lifetime and NumberSequence values
+#### Lifetime and NumberSequence Values
Some properties such as `Class.ParticleEmitter.Size` and `Class.ParticleEmitter.Transparency` use a `Datatype.NumberSequence` to automate changes in the value of the property for a particle throughout its `Class.ParticleEmitter.Lifetime|Lifetime`. For example, the sequences for the flare's `Class.ParticleEmitter.Size|Size` and `Class.ParticleEmitter.Transparency|Transparency` create a pulsing effect each time a particle emits.
@@ -130,12 +130,12 @@ A `Class.PointLight` is best for this to emit light spherically from the part at
1. Add a **PointLight** to **Emitter_Flare**.
1. Select the **PointLight** object, then in the **Properties** window,
- 1. Set **Brightness** to `2` to make the light brighter.
- 1. Set **Range** to `36` to increase the light's range.
+ 1. Set **Brightness** to **2** to make the light brighter.
+ 1. Set **Range** to **36** to increase the light's range.
-## Create the dust particles
+## Create the Dust Particles
The second type of particle emitter the sample [Island Jump - Final](https://www.roblox.com/games/14238807008/Island-Jump-Completed-Sample) uses to add dynamic movement to the experience is one that dust particles throughout the atmosphere. These particles surround the player, adding a sense of texture and depth to the air itself.
@@ -162,7 +162,7 @@ To create dust particles:
1. Select this block part, then in the **Properties** window,
1. Set **Name** to **VFX_DustMotes**.
- 1. Set **Transparency** to `1` so the part is invisible.
+ 1. Set **Transparency** to **1** so the part is invisible.
1. Disable **CanCollide** so players don't collide with the part as they move through the playable area.
1. Enable **Anchored** so the physics system doesn't move the part when the experience starts.
@@ -170,7 +170,7 @@ To create dust particles:
-### Configure the dust particles
+### Configure the Dust Particles
The dust particle emitter requires some new properties to change. `Class.ParticleEmitter.Acceleration` determines how a particle's `Class.ParticleEmitter.Speed` changes throughout its lifetime. Acceleration is often used to apply a gravity effect to particles with a negative `Y` value.
@@ -178,12 +178,12 @@ The dust particle emitter requires some new properties to change. `Class.Particl
For each point in a `Datatype.NumberSequence`, you can set an _envelope_ using the number input at the bottom of the window. An envelope sets the range from which Studio picks a random value higher or lower than the point's value each time a particle emits. The size of the envelope determines the range of the random selection. The sequence for `Class.ParticleEmitter.Transparency` includes an envelope so that each particle's visibility is unpredictable.
-Here are the values for all other previously explained properties. Refer back to [Configure the flare](#configure-the-flare) for these explanations.
+Here are the values for all other previously explained properties. Refer back to [Configure the Flare](#configure-the-flare) for these explanations.
1. In the **Explorer** window, select **Emitter_DustMotes**.
1. In the **Properties** window,
- 1. Set **Color** to `192, 241, 255`.
+ 1. Set **Color** to **192, 241, 255**.
1. Set **Size** to the following `Datatype.NumberSequence`:
@@ -199,13 +199,13 @@ Here are the values for all other previously explained properties. Refer back to
Begins fully transparent, becomes randomly more opaque (envelope of 0.1), then slowly fades out
- 1. Set **ZOffset** to `-5` so that they appear behind players and other objects.
- 1. Set **Lifetime** `1, 10`.
- 1. Set **Rate** to `50000`. This is a fast rate, but because the volume of the particle emitter's parent part is so large, it appears sparse.
- 1. Set **Rotation** to `-45, 45`.
- 1. Set **RotSpeed** to `-60`.
- 1. Set **Speed** to `1, 5`.
- 1. Set **Acceleration** to `1, -1, 1` to make the particles gently float upwards.
+ 1. Set **ZOffset** to **-5** so that they appear behind players and other objects.
+ 1. Set **Lifetime** **1, 10**.
+ 1. Set **Rate** to **50000**. This is a fast rate, but because the volume of the particle emitter's parent part is so large, it appears sparse.
+ 1. Set **Rotation** to **-45, 45**.
+ 1. Set **RotSpeed** to **-60**.
+ 1. Set **Speed** to **1, 5**.
+ 1. Set **Acceleration** to **1, -1, 1** to make the particles gently float upwards.
diff --git a/content/en-us/tutorials/curriculums/core/building/customize-global-lighting.md b/content/en-us/tutorials/curriculums/core/building/customize-global-lighting.md
index dc4595bb7..6007b5355 100644
--- a/content/en-us/tutorials/curriculums/core/building/customize-global-lighting.md
+++ b/content/en-us/tutorials/curriculums/core/building/customize-global-lighting.md
@@ -1,5 +1,5 @@
---
-title: Customize global lighting
+title: Customize Global Lighting
description: Explains how to use global lighting settings to refine the look and feel of your experience.
prev: /tutorials/curriculums/core/building/create-basic-visual-effects
next: /tutorials/curriculums/core/building/apply-polished-assets
@@ -13,10 +13,10 @@ next: /tutorials/curriculums/core/building/apply-polished-assets
Using only a few modifications to Studio's default lighting settings, this section of the tutorial teaches you how to customize your global lighting in order to change the sun's position and light color, make dramatic shadows, and thicken the atmosphere.
- There are many additional lighting objects you can customize to impact global lighting in your experience. For an overview on all lighting objects available in Studio, see [Lighting and effects](../../../../environment/index.md).
+ There are many additional lighting objects you can customize to impact global lighting in your experience. For an overview on all lighting objects available in Studio, see [Lighting and Effects](../../../../environment/index.md).
-## Set lighting properties
+## Set Lighting Properties
The `Class.Lighting` service contains five high-level categories of properties that you can adjust to customize the global lighting in your experience:
@@ -29,10 +29,10 @@ The `Class.Lighting` service contains five high-level categories of properties t
The following instructions show you how to adjust properties within almost all of these categories to alter the colors of ambient and reflective lighting, make the edges of shadows sharper, utilize the most advanced lighting technology, and modify the position of the sun and your world to match the sample [Island Jump - Final](https://www.roblox.com/games/14238807008/Island-Jump-Completed-Sample) settings.
- For an overview on the additional properties within the `Class.Lighting` service, see [Global lighting](../../../../environment/lighting.md).
+ For an overview on the additional properties within the `Class.Lighting` service, see [Global Lighting](../../../../environment/lighting.md).
-### Adjust the color of light
+### Adjust the Color of Light
The first step in matching the sample **Island Jump - Final** experience's `Class.Lighting` service properties is to adjust the color of both ambient and reflective lighting in your environment. There are two Lighting service properties that control the color of ambient lighting:
@@ -57,11 +57,11 @@ To adjust the color of ambient lighting in your environment:
1. In the **Explorer** window, select **Lighting**.
2. In the **Properties** window,
- 1. Set **Ambient** to `16, 16, 16`. The entire environment becomes subtly darker.
- 1. Set **ColorShift_Top** to `196, 222, 255`. The hue that reflects from surfaces facing the sun lightens.
- 1. Set **OutdoorAmbient** to `134, 158, 190`. All areas except for the tunnel display with a blue-grey hue.
+ 1. Set **Ambient** to **16, 16, 16**. The entire environment becomes subtly darker.
+ 1. Set **ColorShift_Top** to **196, 222, 255**. The hue that reflects from surfaces facing the sun lightens.
+ 1. Set **OutdoorAmbient** to **134, 158, 190**. All areas except for the tunnel display with a blue-grey hue.
-### Harden shadows
+### Harden Shadows
The second step in matching the sample **Island Jump - Final** experience's `Class.Lighting` service properties is to harden the shadows in your environment. This creates a more dramatic effect when players navigate between the outdoor and covered areas of your experience.
@@ -80,9 +80,9 @@ The second step in matching the sample **Island Jump - Final** experience's `Cla
To harden the shadows in your environment:
1. In the **Explorer** window, select **Lighting**.
-2. In the **Properties** window, set **ShadowSoftness** to `0`. Shadows produce hard edges.
+2. In the **Properties** window, set **ShadowSoftness** to **0**. Shadows produce hard edges.
-### Enable the future lighting system
+### Enable the Future Lighting System
The third step in matching the sample **Island Jump - Final** experience's `Class.Lighting` service properties is to enable the most advanced lighting system in Studio. Studio begins every experience with the `Enum.Technology.ShadowMap` lighting system that renders crisp shadows and illumination from global lighting. However, to enhance the environment and equip your local light sources to produce precise shadows and illumination, you must enable the `Enum.Technology.Future` lighting system technology instead.
@@ -105,7 +105,7 @@ To enable the Future lighting system:
1. In the **Explorer** window, select **Lighting**.
2. In the **Properties** window, click the **Technology** dropdown, then select **Future**. The lighting system updates.
-### Change sun position
+### Change Sun Position
The final step in matching the sample **Island Jump - Final** experience's `Class.Lighting` service properties is to change the position of the sun in the sky. There are three properties that control the sun's position:
@@ -135,10 +135,10 @@ To change the sun position:
1. In the **Explorer** window, select **Lighting**.
2. In the **Properties** window,
- 1. Set **ClockTime** to `9`. The sun moves to the position it would be in the real world at 9:00 in the morning.
- 1. Set **GeographicLatitude** to `78`. The world moves by 78 degrees, which also moves the sun to the right of your sea stack platforms.
+ 1. Set **ClockTime** to **9**. The sun moves to the position it would be in the real world at 9:00 in the morning.
+ 1. Set **GeographicLatitude** to **78**. The world moves by 78 degrees, which also moves the sun to the right of your sea stack platforms.
-## Atmosphere properties
+## Atmosphere Properties
The `Class.Lighting` service's child `Class.Atmosphere` object allows you to create realistic environmental lighting effects by scattering sunlight in unique ways based on properties that simulate air particles. These properties can be very useful in creating a thickness in the environment's air, giving the atmosphere a tangible sense of depth.
@@ -148,7 +148,7 @@ The following instructions show you how to adjust `Class.Atmosphere` properties
For an overview on the additional properties within the `Class.Atmosphere`, see [Atmospheric Effects](../../../../environment/atmosphere.md).
-### Increase air particle density
+### Increase Air Particle Density
The first step in matching the sample **Island Jump - Final** experience's `Class.Atmosphere` properties is to increase air particle density. The `Class.Atmosphere.Density` property controls how many particles exist in the air of your environment. When you increase this property, the additional amount of particles obstruct the players' view of objects in the background. This is particularly useful for hiding the boundaries of your water terrain.
@@ -167,9 +167,9 @@ The first step in matching the sample **Island Jump - Final** experience's `Clas
To increase air particle density in your environment:
1. In the **Explorer** window, navigate to the **Lighting** service, then select its child **Atmosphere** object.
-2. In the **Properties** window, set **Density** to `0.375`. The air becomes thicker.
+2. In the **Properties** window, set **Density** to **0.375**. The air becomes thicker.
-### Blend distant objects
+### Blend Distant Objects
The second step in matching the sample **Island Jump - Final** experience's `Class.Atmosphere` properties, as well as the final step in this section of the tutorial, is to blend distant objects on the horizon. The `Class.Atmosphere.Offset` property controls how light transmits between the camera and the sky background. When you increase this value, it creates a horizon silhouette; when you decrease this value, it blends distant objects into the sky for a seemingly endless and seamless open world.
@@ -190,7 +190,7 @@ While the sample experience could have set this property to zero to completely h
To blend distant objects in your environment:
1. In the **Explorer** window, navigate to the **Lighting** service, then select its child **Atmosphere** object.
-2. In the **Properties** window, set **Offset** to `0.17`. The air becomes thicker.
+2. In the **Properties** window, set **Offset** to **0.17**. The air becomes thicker.
Now that your experience's global lighting is set to custom properties, in the next section of the tutorial, you will learn how to replace your greybox layout with high-quality polished assets.
diff --git a/content/en-us/tutorials/curriculums/core/building/greybox-a-playable-area.md b/content/en-us/tutorials/curriculums/core/building/greybox-a-playable-area.md
index 53cce0ee0..9b4b1ee80 100644
--- a/content/en-us/tutorials/curriculums/core/building/greybox-a-playable-area.md
+++ b/content/en-us/tutorials/curriculums/core/building/greybox-a-playable-area.md
@@ -1,5 +1,5 @@
---
-title: Greybox a playable area
+title: Greybox a Playable Area
description: Explains how to use Studio's solid modeling tools to plan out the basic structure of your platforms.
next: /tutorials/curriculums/core/scripting/script-game-behavior
prev: /tutorials/curriculums/core/building/create-an-environment-with-terrain
@@ -19,7 +19,7 @@ Using basic parts and solid modeling operations, this section of the tutorial te
the sea stack platforms that make up the playable area of the experience. Once you complete the environment,
you will learn how to create the gameplay for the experience using Luau scripts.
-## Plan the playable area
+## Plan the Playable Area
In the final version of the experience, players need to collect coins on the island
and sea stack platforms in order to upgrade their jumping power and reach higher platforms. You will configure
@@ -50,13 +50,15 @@ at least 30 studs higher from the previous level.
-## Add the platforms
+## Add the Platforms
Now that you have a plan for the difference in height between platforms, it's time to add in placeholder `Class.Part`
objects to represent the sea stack platforms. **Parts** are Roblox's basic building blocks with properties you can modify
to customize their physical appearance, such as their shape, size, and color.
-While you can use almost any part shape to represent your sea stack platforms, it's recommended to greybox your environment with **cylinder** parts because they offer a flat surface for you to land on when you playtest jumping from platform to platform, and because they are similar in shape to the sea stack meshes you will use in the final section of the tutorial.
+While you can use almost any part shape to represent your sea stack platforms, it's recommended to greybox your environment
+with **cylinder** parts because they offer a flat surface for you to land on when you playtest jumping from platform to platform,
+and because they are similar in shape to the sea stack meshes you will use in the final section of the tutorial.
A comparison between the sample Island Jump experience's greybox and final geometry
@@ -68,7 +70,7 @@ While you can use almost any part shape to represent your sea stack platforms, i
-### Create an organization structure
+### Create an Organization Structure
Before you insert placeholder parts into the 3D space, it's important to create an organization structure for your assets in the Workspace. This process ensures that your Workspace remains organized and easy to scan, especially as you venture into creating experiences with a significant amount of assets that you need to manage.
@@ -100,7 +102,7 @@ To create an organization structure:
-### Insert parts
+### Insert Parts
The following instructions provide two different instructional paths: you can either insert parts into your own unique environment, or you can insert parts in a way that exactly recreates the greybox environment within the sample [Island Jump - Building](https://www.roblox.com/games/14239096301/Island-Jump-Building).
@@ -109,7 +111,7 @@ To create an organization structure:
Now that you have an organizational structure to contain your assets, you can now begin inserting parts into the 3D space to represent your sea stack platforms.
-
+
To insert a cylinder part for your first platform:
@@ -122,7 +124,7 @@ To insert a cylinder part for your first platform:
-1. Navigate back to the **Home** tab, then use the **Move**, **Scale**, and **Rotate** tools to position, scale, and rotate your cylinder until it's a large, flat surface in the middle of your island. For more information on these tools, see [Manipulating parts](../../../../parts/index.md#manipulate-parts).
+1. Navigate back to the **Home** tab, then use the **Move**, **Scale**, and **Rotate** tools to position, scale, and rotate your cylinder until it's a large, flat surface in the middle of your island. For more information on these tools, see [Manipulating Parts](../../../../parts/index.md#manipulating-parts).
@@ -142,7 +144,7 @@ To insert a cylinder part for your first platform:
-
+
To exactly recreate the sea stack platforms within the sample [Island Jump - Building](https://www.roblox.com/games/14239096301/Island-Jump-Building) experience:
@@ -158,9 +160,9 @@ To exactly recreate the sea stack platforms within the sample [Island Jump - Bui
1. In the **Properties** window,
1. Set **Name** to **Level_1** for organization purposes.
- 1. Set **Size** to `12, 131, 131` to create a large platform.
- 1. Set **CFrame.Position** to `-23, -4, 9` so the top of the platform is only a short jump from the surface of the island.
- 1. Set **CFrame.Orientation** to `0, 0, 90` so the flat surface of the cylinder faces toward the sky.
+ 1. Set **Size** to **12, 131, 131** to create a large platform.
+ 1. Set **CFrame.Position** to **-23, -4, 9** so the top of the platform is only a short jump from the surface of the island.
+ 1. Set **CFrame.Orientation** to **0, 0, 90** so the flat surface of the cylinder faces toward the sky.
@@ -291,7 +293,7 @@ To exactly recreate the sea stack platforms within the sample [Island Jump - Bui
-### Align parts
+### Align Parts
If you used the sample **Island Jump - Building** experience values when inserting your sea stack platforms, you can skip this step.
@@ -304,9 +306,9 @@ The [Align Tool](../../../../studio/align-tool.md) aligns parts on either the mi
To align parts:
1. In the **Explorer** window, select all of your platforms.
-1. In the menu bar, navigate to the **Model** tab, then click the **Align Tool**. The **Align Tool** window displays.
+1. In the menu bar, navigate to the **Model** tab, then click the [Align Tool](../../../../studio/align-tool.md). The **Align Tool** window displays.
-
+
1. In the **Align Tool** window,
@@ -320,7 +322,7 @@ To align parts:
All platforms align their bottom edge
-### Create a hollow tunnel
+### Create a Hollow Tunnel
Aside from using parts as-is to block out your playable areas, you can also apply solid modeling operations to join parts in unique ways to form more complex shapes, such as a hollow tunnel within one of the sea stacks. This technique provides more visual interest and variation in how players interact with your environments.
@@ -331,7 +333,7 @@ There are four solid modeling tools:
- **Negate** – Negates parts, which is useful for making holes and indentations.
- **Separate** – Separates the union or intersection back into its individual parts.
-For the purposes of creating a hollow tunnel, you only need to use the **Union** and **Negate** tools. For a full breakdown of all of the tools, see [Solid modeling](../../../../parts/solid-modeling.md).
+For the purposes of creating a hollow tunnel, you only need to use the **Union** and **Negate** tools. For a full breakdown of all of the tools, see [Solid Modeling](../../../../parts/solid-modeling.md).
@@ -415,7 +417,7 @@ To create a hollow tunnel:
-## Playtest the layout
+## Playtest
After you finish greyboxing your playable areas, you must playtest the layout of your environment to ensure the experience is both fun and functional, and so that you can catch small issues before they turn into much larger projects the further you are in the development process. For example, your experience's gameplay needs players to steadily upgrade their jumping power according to the amount of coins they collect, so it's important to verify that players are able to jump between platforms in relation to the `Class.Humanoid.JumpPower` you expect players to have at varying platform height levels.
@@ -436,8 +438,8 @@ To playtest your experience:
-1. In the **Properties** window, navigate to the **Jump Settings** section, then enable **UseJumpPower**. The **JumpPower** property displays with a default value of `50`.
-1. Set **JumpPower** to `0`. This ensures your character is unable to jump, emulating the same starting state for players after you script the gameplay.
+1. In the **Properties** window, navigate to the **Jump Settings** section, then enable **UseJumpPower**. The **JumpPower** property displays with a default value of **50**.
+1. Set **JumpPower** to **0**. This ensures your character is unable to jump, emulating the same starting state for players after you script the gameplay.
@@ -445,7 +447,7 @@ To playtest your experience:
If you can't see the **Properties** window, open the **View** tab and ensure **Properties** is selected in the **Show** section.
-1. As you reach new levels, set **JumpPower** to multiples of `30` to simulate jumping upgrades.
+1. As you reach new levels, set **JumpPower** to multiples of **30** to simulate jumping upgrades.
diff --git a/content/en-us/tutorials/curriculums/core/index.md b/content/en-us/tutorials/curriculums/core/index.md
index b3d8f2f7b..0387fdb38 100644
--- a/content/en-us/tutorials/curriculums/core/index.md
+++ b/content/en-us/tutorials/curriculums/core/index.md
@@ -1,5 +1,5 @@
---
-title: Core curriculum
+title: Core Curriculum
description: //
next: /tutorials/curriculums/core/building/create-a-project
hideInPageNavigation: true
@@ -48,20 +48,20 @@ inspect the place files if you want to see the end result of each chapter.
- Chapter 1 - Build a greybox
+ Chapter 1 - Build a Greybox
- - [Create a project](./building/create-a-project.md) - Learn how to create a `.rbxl` file that represents your experience on the Roblox platform.
- - [Create an environment with terrain](./building/create-an-environment-with-terrain.md) - Learn how to create the island where players spawn using Studio's terrain tools.
- - [Greybox a playable area](./building/greybox-a-playable-area.md) - Learn how to use solid modeling tools to plan out the basic shape of your platforms.
+ - [Create a Project](./building/create-a-project.md) - Learn how to create a `.rbxl` file that represents your experience on the Roblox platform.
+ - [Create an Environment with Terrain](./building/create-an-environment-with-terrain.md) - Learn how to create the island where players spawn using Studio's terrain tools.
+ - [Greybox a Playable Area](./building/greybox-a-playable-area.md) - Learn how to use solid modeling tools to plan out the basic shape of your platforms.
@@ -72,21 +72,21 @@ inspect the place files if you want to see the end result of each chapter.
- Chapter 2 - Script the gameplay
+ Chapter 2 - Script the Gameplay
- - [Create a coin collection mechanic](./scripting/script-game-behavior.md) - Learn how to track and store players' coin collecting.
- - [Record and display player data](./scripting/record-and-display-player-data.md) - Learn how to store, retrieve, and display individual player data visually through a leaderboard.
- - [Create player hazards](./scripting/create-player-hazards.md) - Learn how to create a hazard in the water by modifying player behavior and creating a player life cycle.
- - [Script an upgrade button](./scripting/script-an-upgrade-button.md) - Learn how to upgrade player jump power by communicating with the Roblox server and handling GUI interactions.
+ - [Create a Coin Collection Mechanic](./scripting/script-game-behavior.md) - Learn how to track and store players' coin collecting.
+ - [Record and Display Player Data](./scripting/record-and-display-player-data.md) - Learn how to store, retrieve, and display individual player data visually through a leaderboard.
+ - [Create Player Hazards](./scripting/create-player-hazards.md) - Learn how to create a hazard in the water by modifying player behavior and creating a player life cycle.
+ - [Script an Upgrade Button](./scripting/script-an-upgrade-button.md) - Learn how to upgrade player jump power by communicating with the Roblox server and handling GUI interactions.
@@ -97,20 +97,20 @@ inspect the place files if you want to see the end result of each chapter.
- Chapter 3 - Polish the experience
+ Chapter 3 - Polish the Experience
- - [Create basic visual effects](./building/create-basic-visual-effects.md) - Learn how to create two different kinds of visual effect using particle emitters.
- - [Customize global lighting](./building/customize-global-lighting.md) - Learn how to use global lighting settings to refine the look and feel of your experience.
- - [Apply polished assets](./building/apply-polished-assets.md) - Learn how to finish your scene by replacing simple parts with complex, imported models.
+ - [Create Basic Visual Effects](./building/create-basic-visual-effects.md) - Learn how to create two different kinds of visual effect using particle emitters.
+ - [Customize Global Lighting](./building/customize-global-lighting.md) - Learn how to use global lighting settings to refine the look and feel of your experience.
+ - [Apply Polished Assets](./building/apply-polished-assets.md) - Learn how to finish your scene by replacing simple parts with complex, imported models.
diff --git a/content/en-us/tutorials/curriculums/core/scripting/create-player-hazards.md b/content/en-us/tutorials/curriculums/core/scripting/create-player-hazards.md
index 7e7ca735f..4ca0113aa 100644
--- a/content/en-us/tutorials/curriculums/core/scripting/create-player-hazards.md
+++ b/content/en-us/tutorials/curriculums/core/scripting/create-player-hazards.md
@@ -1,5 +1,5 @@
---
-title: Create player hazards
+title: Create Player Hazards
description: Explains how to create player hazards by modifying player behavior and creating a player life cycle.
next: /tutorials/curriculums/core/scripting/script-an-upgrade-button
prev: /tutorials/curriculums/core/scripting/record-and-display-player-data
@@ -19,7 +19,7 @@ invisible part at the same level as the water in your experience, so that fallin
into the hazard changes the player's health to zero and respawns them back to the
start of the experience.
-## Create a basic water hazard
+## Create a Basic Water Hazard
To create the basic water hazard:
@@ -32,14 +32,14 @@ To create the basic water hazard:
1. Move and scale the part to cover the water line around the island and platforms. For example, the
sample [Island Jump - Scripting](https://www.roblox.com/games/14239042199/Island-Jump-Scripting) experience
- sets **Size** to `825, 1, 576` and **CFrame.Position** to `174, -6.5, 38`.
+ sets **Size** to **825, 1, 576** and **CFrame.Position** to **174, -6.5, 38**.
1. Select the part, then in the **Properties** window, configure the following properties so
the hazard is invisible, and players can pass right through it:
- - Set **Transparency** to `1`. This makes the hazard invisible, so that the
+ - Set **Transparency** to **1**. This makes the hazard invisible, so that the
actual water appears to be the hazard.
- Disable **CanCollide**. This tells the engine that other parts can pass
through the hazard uninterrupted, meaning players can fall through the hazard.
@@ -75,7 +75,7 @@ To create the basic water hazard:
- Code explanation
+ Code Explanation
The **HazardService** has many similarities to **CoinService**. However,
@@ -88,7 +88,7 @@ To create the basic water hazard:
-## Connect to the player lifecycle
+## Connect to the Player Lifecycle
The player lifecycle represents events that occur when players interact in your
experience, such as joining, leaving, or respawning. You need to connect
@@ -134,7 +134,7 @@ Players.PlayerRemoving:Connect(onPlayerRemoved)
- Code explanation
+ Code Explanation
@@ -142,12 +142,12 @@ The code defines functions to reset coin counts during the appropriate
lifecycle events:
- `Class.Player.PlayerAdded` fires when a player joins the experience, and sets
- the coin count to `0`.
+ the coin count to **0**.
- `Class.Player.CharacterAdded` fires when a player's character model is added
to the world. It occurs after `Class.Player.PlayerAdded|PlayerAdded` and
whenever the player respawns.
- `Class.Humanoid.Died` fires when a player dies, and sets
- the coin count to `0`. `Library.task.spawn()` creates
+ the coin count to **0**. `Library.task.spawn()` creates
a separate thread for handling this, so other aspects of the player life cycle
can execute.
- `Class.Player.PlayerRemoved` fires when a player leaves the experience to
@@ -168,7 +168,7 @@ water, your character should die and lose their coins. To test your game:
1. Move your character to collect some coins, then jump in the water. If your
scripts are working correctly, your character dies, and the coin count on
- the leaderboard resets to `0`.
+ the leaderboard resets to **0**.
-## Create custom materials
+## Create Custom Materials
Studio represents custom materials as `Class.MaterialVariant` objects within the `Class.MaterialService`. These `Class.MaterialVariant` objects have four properties that combine the four tileable [texture maps](../../../art/modeling/surface-appearance.md#texture-maps) to create a high-quality custom material with physical characteristics:
@@ -78,7 +78,7 @@ To create `Class.MaterialVariant` objects for your tileable textures:
10. Repeat this process for each tileable texture you want to include in your experience.
-## Create SurfaceAppearance packages
+## Create SurfaceAppearance Packages
Studio utilizes trim sheets within `Class.SurfaceAppearance` objects that you can parent to `Class.MeshPart|MeshParts` that contain UV data. Similar to custom materials, `Class.SurfaceAppearance` objects have four properties that combine the four trim sheet texture maps to create a high-quality 3D visual surface treatment:
@@ -110,7 +110,7 @@ To create `Class.SurfaceAppearance` packages that you can child to your modular
8. **(Optional)** Select the **SurfaceAppearance** object's child **PackageLink** object, then in the **Properties** window, enable **AutoUpdate** to automatically update the package if you make any modifications to the **SurfaceAppearance** object.
-## Import modular assets and props
+## Import Modular Assets and Props
Studio represents the modular assets and props that you import as `Class.Model` objects with child `Class.MeshPart|MeshParts` for each component of the asset. For example, if you import a wall section with a top trim, bottom trim, and wall component, Studio represents the `.fbx` or `.obj` file as a **Wall_Section** `Class.Model` with separate child **Top_Trim**, **Bottom_Trim**, and **Wall** `Class.MeshPart|MeshParts`.
@@ -134,7 +134,7 @@ To import your modular assets and props into the experience:
6. Repeat this process for each modular asset and prop.
7. Move all of your assets into one area of your experience near your greybox geometry. This zone is your asset library.
-## Apply SurfaceAppearance data
+## Apply SurfaceAppearance Data
When you go through the process of unwrapping the UVs of a mesh in third-party modeling software, the software stores the UV data within the mesh's `.fbx` or `.obj` file. When you import that mesh into Studio, the resulting `Class.MeshPart` object retains that data, but you still need to apply a `Class.SurfaceAppearance` object with texture map properties from your trim sheet in order to display your trim textures on the asset.
@@ -144,19 +144,19 @@ To apply `Class.SurfaceAppearance` texture map data to unwrapped meshes in your
2. Child the duplicate **SurfaceAppearance** package to either a modular asset or a prop. The asset applies its UV data to the texture maps and displays its visual treatment.
3. Repeat this process for each modular asset and prop.
-## Set physics and rendering parameters
+## Set Physics and Rendering Parameters
Now that you have your assets within Studio, it's important to set physics and rendering parameters that allow the assets to retain the highest possible visual quality across devices with memory and GPU limitations. In general, the more closely you adhere to the guidance in this section, the more performant you make your experience. However, it's important to carefully consider the context of where you plan to place each asset within the overall environment to ensure you maintain your aesthetic goals and gameplay requirements.
### Anchored
-The `Class.BasePart.Anchored` property determines whether the Roblox Engine's physics system affects the position of the object. When you enable this property for a `Class.Part` or `Class.MeshPart`, it removes the object from the physical calculations of the dynamic simulation that's always running in experience, meaning the object will never change position due to gravity or collision from other objects.
+The `Class.BasePart.Anchored` property determines whether the Roblox engine's physics system affects the position of the object. When you enable this property for a `Class.Part` or `Class.MeshPart`, it removes the object from the physical calculations of the dynamic simulation that's always running in experience, meaning the object will never change position due to gravity or collision from other objects.
Objects that don't simulate a physics response are cheaper to render because they don't take up the GPU that's necessary for those physics calculations. When you free up GPU, you improve performance for your experience, especially on low-end devices that need to save GPU for fast-paced gameplay. It's for this reason that **every** asset aside from doors in the final sample laser tag environment are anchored.
### CanCollide
-The `Class.BasePart.CanCollide` property determines whether the object can physically interact with other objects. When you enable this property for a `Class.Part` or `Class.MeshPart`, the object is impenetrable, and the Roblox Engine accounts for it in physics calculations. These calculations can impact your experience's performance when there are many objects the engine must consider in its physics calculations.
+The `Class.BasePart.CanCollide` property determines whether the object can physically interact with other objects. When you enable this property for a `Class.Part` or `Class.MeshPart`, the object is impenetrable, and the Roblox engine accounts for it in physics calculations. These calculations can impact your experience's performance when there are many objects the engine must consider in its physics calculations.
To alleviate some of this impact on performance, disable this property for objects that the user will never interact with. For example, the final sample laser tag environment disables this property for all foliage.
@@ -164,19 +164,19 @@ To alleviate some of this impact on performance, disable this property for objec
### CanTouch
-The `Class.BasePart.CanTouch` property determines if `Class.BasePart.Touched|Touched` and `Class.BasePart.TouchEnded|TouchEnded` events fire on the object. When you enable this property for a `Class.Part` or `Class.MeshPart`, the Roblox Engine checks the object's touch event state to see if it needs to trigger or stop an event.
+The `Class.BasePart.CanTouch` property determines if `Class.BasePart.Touched|Touched` and `Class.BasePart.TouchEnded|TouchEnded` events fire on the object. When you enable this property for a `Class.Part` or `Class.MeshPart`, the Roblox engine checks the object's touch event state to see if it needs to trigger or stop an event.
This process happens for every single frame, which can take up a significant amount of memory if the engine needs to check the touch event state for many objects at once. To alleviate some of this impact on memory, only enable this property for objects that must trigger an event.
### CanQuery
-The `Class.BasePart.CanQuery` property determines whether the Roblox Engine considers the object during spatial query operations, such as raycasting. Studio enables this property for every `Class.Part` or `Class.MeshPart` by default, meaning that the engine checks to see if each object needs to call a spatial query operation. This process occurs for every single frame, which can take up a significant amount of memory when the engine needs to make these checks for many objects at once.
+The `Class.BasePart.CanQuery` property determines whether the Roblox engine considers the object during spatial query operations, such as raycasting. Studio enables this property for every `Class.Part` or `Class.MeshPart` by default, meaning that the Roblox engine checks to see if each object needs to call a spatial query operation. This process occurs for every single frame, which can take up a significant amount of memory when the engine needs to make these checks for many objects at once.
-For this reason, it's recommended to disable this property for objects that the Roblox Engine doesn't need to consider for spatial query operations. When making decisions about where to disable this property, consider how each asset impacts gameplay. For example, the final sample laser tag environment keeps this property enabled for every wall in the building because the engine needs to account for these surfaces as users fire lasers from their laser tag gun. If the engine doesn't account for these assets, then the laser would shoot straight through the building as though it wasn't there at all.
+For this reason, it's recommended to disable this property for objects that the Roblox engine doesn't need to consider for spatial query operations. When making decisions about where to disable this property, consider how each asset impacts gameplay. For example, the final sample laser tag environment keeps this property enabled for every wall in the building because the engine needs to account for these surfaces as users fire lasers from their laser tag gun. If the engine doesn't account for these assets, then the laser would shoot straight through the building as though it wasn't there at all.
### CastShadow
-The `Class.BasePart.CastShadow` property determines whether the object casts a shadow. When you enable this property for a `Class.Part` or `Class.MeshPart`, the Roblox Engine calculates every vertex location of the object at runtime, then draws a raycast from the sun to any of its neighboring objects until it collides with another object to create the shadow.
+The `Class.BasePart.CastShadow` property determines whether the object casts a shadow. When you enable this property for a `Class.Part` or `Class.MeshPart`, the Roblox engine calculates every vertex location of the object at runtime, then draws a raycast from the sun to any of its neighboring objects until it collides with another object to create the shadow.
These calculations can come at a performance cost, especially when you have many objects of geometric complexity. This is because objects with geometric complexity have more polygons than objects that are geometrically simple, meaning they have more vertices that the engine needs to calculate for the object's shadow. The fewer polygons in an object, the faster the operation and cheaper its shadow.
@@ -197,7 +197,7 @@ Shadows can provide a great sense of realism to objects with 3D geometrical dept
### DoubleSided
-The `Class.MeshPart.DoubleSided` property determines whether to render both faces or polygons in the mesh. When you enable this property for a planar `Class.MeshPart`, such as leaves, hair, or cloth cards, the Roblox Engine renders both faces or polygons in the mesh to allow users to see the fullness of the object no matter what angle they are looking at the object. For example, the following tree leaves are single-sided planar meshes, and when you enable this property, any of the leaves that face away from the camera become visible to the user.
+The `Class.MeshPart.DoubleSided` property determines whether to render both faces or polygons in the mesh. When you enable this property for a planar `Class.MeshPart`, such as leaves, hair, or cloth cards, the Roblox engine renders both faces or polygons in the mesh to allow users to see the fullness of the object no matter what angle they are looking at the object. For example, the following tree leaves are single-sided planar meshes, and when you enable this property, any of the leaves that face away from the camera become visible to the user.
@@ -227,7 +227,7 @@ The `Class.MeshPart.CollisionFidelity` property determines how closely the physi
-You can set this property to a different value to reduce the precision of a mesh's hitbox. For example, when you set this property to **Hull**, the Roblox Engine significantly reduces the vertices of the mesh's hitbox, and when you set this property to **Box**, the engine reduces the mesh's hitbox to a cube that surrounds the mesh. In addition, if you want to increase the precision of a mesh's hitbox, you can set this property to **PreviseConvexDecomposition** to increase the amount of vertices in the hitbox
+You can set this property to a different value to reduce the precision of a mesh's hitbox. For example, when you set this property to **Hull**, the Roblox engine significantly reduces the vertices of the mesh's hitbox, and when you set this property to **Box**, the engine reduces the mesh's hitbox to a cube that surrounds the mesh. In addition, if you want to increase the precision of a mesh's hitbox, you can set this property to **PreviseConvexDecomposition** to increase the amount of vertices in the hitbox
@@ -244,7 +244,7 @@ You can set this property to a different value to reduce the precision of a mesh
-Similar to `Class.BasePart.CastShadow`, the more vertices the Roblox Engine needs to render, the higher the performance cost. For this reason, it's important to consider how you want users to interact with each mesh to see if you can reduce the amount of vertices the engine needs to render for the mesh's hitbox. In cases where it isn't necessary for a hitbox to be precise, set this property to either **Box** or **Hull**.
+Similar to `Class.BasePart.CastShadow`, the more vertices the Roblox engine needs to render, the higher the performance cost. For this reason, it's important to consider how you want users to interact with each mesh to see if you can reduce the amount of vertices the engine needs to render for the mesh's hitbox. In cases where it isn't necessary for a hitbox to be precise, set this property to either **Box** or **Hull**.
To demonstrate this concept, reference the following images that display the hitbox of every mesh of the wall model that provides a rise in elevation between the first and second floor of the final sample laser tag environment. The default hitbox for the main wall has a lot of unnecessary geometry when it only needs to provide a surface to prevent the user from moving in that direction. If you set the property to **Box** for this mesh, you can remove this redundant geometry while keeping the purpose of the hitbox intact.
@@ -286,11 +286,11 @@ To view collision fidelity in Studio, toggle on **Collision fidelity** from
### RenderFidelity
-The `Class.MeshPart.RenderFidelity` property determines the mesh's level of detail that displays to the user. When you set this property to `Enum.RenderFidelity.Automatic`, the Roblox Engine reduces the mesh's fidelity the further the user is from the mesh, and when you set this property to `Enum.RenderFidelity.Precise`, every vertex of your mesh renders exactly as you intend no matter the distance between them.
+The `Class.MeshPart.RenderFidelity` property determines the mesh's level of detail that displays to the user. When you set this property to `Enum.RenderFidelity.Automatic`, the Roblox engine reduces the mesh's fidelity the further the user is from the mesh, and when you set this property to `Enum.RenderFidelity.Precise`, every vertex of your mesh renders exactly as you intend no matter the distance between them.
The more objects the engine must render precisely to the user from any distance, especially if they have a high vertex count, the higher the performance cost. To alleviate some of this impact on performance, set this property to `Enum.RenderFidelity.Performance` for objects with geometric complexity, such as foliage in the sample asset library, because they don't need to display in their entirety from a distance for any gameplay requirement. This reduces your experience's polygon count without yielding overall visual quality.
-## Convert assets into packages
+## Convert Assets into Packages
Now that all of your modular assets are in Studio with rendering parameters that are set up to retain their high visual quality for all users, it's time to convert them into packages. It's important to convert your assets into packages because it allows you to reuse them repeatedly throughout your current experience and other projects. In addition, you can easily make edits to a package that instantly populate to all of its instances, saving you a lot of time in the iteration process.
diff --git a/content/en-us/tutorials/curriculums/environmental-art/construct-your-world.md b/content/en-us/tutorials/curriculums/environmental-art/construct-your-world.md
index 9941ba33c..b89b0c7ea 100644
--- a/content/en-us/tutorials/curriculums/environmental-art/construct-your-world.md
+++ b/content/en-us/tutorials/curriculums/environmental-art/construct-your-world.md
@@ -1,5 +1,5 @@
---
-title: Construct your world
+title: Construct Your World
description: Explains how to utilize your asset library, configure additional elements of the 3D space to bring your world to life.
next: /tutorials/curriculums/environmental-art/optimize-your-experience
prev: /tutorials/curriculums/environmental-art/assemble-an-asset-library
@@ -26,7 +26,7 @@ After you complete this section, you will learn how to review and configure your
The instructions in this section of the tutorial show you how to **exactly** recreate the sample final environment using the [Environment Art Asset Library](https://www.roblox.com/library/14447738661/Environment-Art-Asset-Library), which takes about 90 minutes or less from start to finish. If you don't want to use the provided coordinates, you can adjust the geometry however you need to meet the specifications of your own experience, or use the sample itself for the rest of the tutorial.
-## Apply your asset library
+## Apply Your Asset Library
The first step in constructing your environment is to apply your asset library to the 3D space, and this process often falls into one of the following categories of work:
@@ -51,7 +51,7 @@ For example, the final sample laser tag environment uses new floor pieces with u
While this technique replaces and converts the original greybox geometry, it still respects the intention behind the original design to create peaks and valleys that control sight lines and engagement distances throughout the experience outside of horizontal movement. This means that users retain all physical and emotional senses of ascension and descension while also having the benefit of knowing where they are in the 3D space.
-
+
To apply your own asset library to the floors:
@@ -83,7 +83,7 @@ To apply your own asset library to the floors:
1. Anchor all of these floor parts.
-
+
To exactly recreate the floors within the sample [Environment Art - Constructing](https://www.roblox.com/games/14447826396/Environment-Art-Constructing) place file:
@@ -130,7 +130,7 @@ To exactly recreate the floors within the sample [Environment Art - Constructing
2. Select these parts, then in the **Properties** window,
- 1. Set **Color** to `248, 248, 248`.
+ 1. Set **Color** to **248, 248, 248**.
1. Set **Material** to **Concrete**.
1. Set **MaterialVariant** to **GlossyTiles**.
@@ -169,7 +169,7 @@ To exactly recreate the floors within the sample [Environment Art - Constructing
4. Select these parts, then in the **Properties** window,
- 1. Set **Color** to `233, 218, 218`.
+ 1. Set **Color** to **233, 218, 218**.
1. Set **Material** to **Concrete**.
1. Set **MaterialVariant** to **Concrete_Tiles_A**.
@@ -273,7 +273,7 @@ To exactly recreate the floors within the sample [Environment Art - Constructing
7. Select these parts, then in the **Properties** window,
- 1. Set **Color** to `233, 218, 218`.
+ 1. Set **Color** to **233, 218, 218**.
1. Set **Material** to **Concrete**.
1. Set **MaterialVariant** to **Concrete_Tiles_A**.
@@ -284,7 +284,7 @@ To exactly recreate the floors within the sample [Environment Art - Constructing
-### Spawn zones
+### Spawn Zones
The original greybox design for spawn zones was to create an area at opposite ends of their map for users to join their respective team when the match starts. The placement of these spawn zones allows users to have a safe location at the start of the match that's far away from enemy fire.
@@ -293,7 +293,7 @@ The original greybox design for spawn zones was to create an area at opposite en
The final sample laser tag environment keeps the intent of this design while also adding a color theme: **mint** for the team that assembles on the left side of the map, and **carnation pink** for the team that assembles on the right side of the map. You will continue to use this same color scheme throughout this section of the tutorial to differentiate areas of the map near each team's respective spawn zone.
-
+
To apply your own asset library to the spawn zones:
@@ -312,7 +312,7 @@ To apply your own asset library to the spawn zones:
1. Anchor all of these spawn zone assets.
-
+
To exactly recreate the spawn zones within the sample [Environment Art - Constructing](https://www.roblox.com/games/14447826396/Environment-Art-Constructing) place file:
@@ -407,7 +407,7 @@ To exactly recreate the spawn zones within the sample [Environment Art - Constru
-2. Select the wall component of these assets, then in the **Properties** window, set **Color** to `88, 218, 171`.
+2. Select the wall component of these assets, then in the **Properties** window, set **Color** to **88, 218, 171**.
@@ -502,7 +502,7 @@ To exactly recreate the spawn zones within the sample [Environment Art - Constru
-4. Select the wall component of these assets, then in the **Properties** window, set **Color** to `255, 170, 255`.
+4. Select the wall component of these assets, then in the **Properties** window, set **Color** to **255, 170, 255**.
@@ -511,7 +511,7 @@ To exactly recreate the spawn zones within the sample [Environment Art - Constru
-### Combat pockets
+### Combat Pockets
The original greybox design for the combat pockets was to create intentional spaces for combat where the map's primary lanes intersect with the cross lanes. In addition, the original greybox design required that each combat pocket needed to only include three entrance or exit points at most to refrain from giving users choice overload as they're navigating the space.
@@ -531,7 +531,7 @@ In addition, the technique in this section also applies props from the sample as
-
+
To apply your own asset library to the combat pockets:
@@ -554,7 +554,7 @@ To apply your own asset library to the combat pockets:
1. Anchor all of these combat pocket assets.
-
+
To exactly recreate the combat pockets within the sample [Environment Art - Constructing](https://www.roblox.com/games/14447826396/Environment-Art-Constructing) place file:
@@ -701,7 +701,7 @@ To apply your asset library to the combat pockets:
-2. Select the wall component of these assets, then in the **Properties** window, set **Color** to `88, 218, 171`.
+2. Select the wall component of these assets, then in the **Properties** window, set **Color** to **88, 218, 171**.
@@ -819,12 +819,12 @@ To apply your asset library to the combat pockets:
5. Select the wall component of these assets, then in the **Properties** window,
- 1. Set **Color** to `211, 190, 150`.
+ 1. Set **Color** to **211, 190, 150**.
1. Set **MaterialVariant** to **MetalPanels**.
-6. Add a **PlanterSmall** prop asset for a piece of cover at a **CFrame.Position** of `-67.5, 5, 252.5` and a **CFrame.Orientation** of `0, 90, 0`. You can add foliage assets from the asset library to the top of the planter to add more organic life to the building.
+6. Add a **PlanterSmall** prop asset for a piece of cover at a **CFrame.Position** of **-67.5, 5, 252.5** and a **CFrame.Orientation** of **0, 90, 0**. You can add foliage assets from the asset library to the top of the planter to add more organic life to the building.
@@ -1001,7 +1001,7 @@ To apply your asset library to the combat pockets:
8. Select the wall component of these assets, then in the **Properties** window,
- 1. Set **Color** to `181, 173, 156`.
+ 1. Set **Color** to **181, 173, 156**.
1. Set **MaterialVariant** to **Concrete_Ribbed_A**.
@@ -1149,7 +1149,7 @@ To apply your asset library to the combat pockets:
10. Select the wall component of these assets, then in the **Properties** window,
- 1. Set **Color** to `181, 173, 156`.
+ 1. Set **Color** to **181, 173, 156**.
1. Set **MaterialVariant** to **Concrete_Ribbed_A**.
@@ -1290,7 +1290,7 @@ To apply your asset library to the combat pockets:
-12. Select the wall component of these assets, then in the **Properties** window, set **Color** to `255, 170, 255`.
+12. Select the wall component of these assets, then in the **Properties** window, set **Color** to **255, 170, 255**.
@@ -1408,12 +1408,12 @@ To apply your asset library to the combat pockets:
15. Select the wall component of these assets, then in the **Properties** window,
- 1. Set **Color** to `255, 170, 255`.
+ 1. Set **Color** to **255, 170, 255**.
1. Set **MaterialVariant** to **MetalPanels**.
-16. Add a **PlanterSmall** prop asset for a piece of cover at a **CFrame.Position** of `-67.5, 5, 67.5` and a **CFrame.Orientation** of `0, 90, 0`. You can add foliage assets from the asset library to the top of the planter to add more organic life to the building.
+16. Add a **PlanterSmall** prop asset for a piece of cover at a **CFrame.Position** of **-67.5, 5, 67.5** and a **CFrame.Orientation** of **0, 90, 0**. You can add foliage assets from the asset library to the top of the planter to add more organic life to the building.
@@ -1422,7 +1422,7 @@ To apply your asset library to the combat pockets:
-### Perimeter hallways
+### Perimeter Hallways
By applying your asset library to the exterior of the combat pockets in the previous section, most cross lanes now include polished assets aside from the hallways that make up the perimeter of the building. In addition to using the same color scheme from previous sections, the final sample laser tag environment also uses wall assets with their default orange color to inform users where they are in relation to the back of the building.
@@ -1439,7 +1439,7 @@ Aside from this technique that applies the sample [Environment Art Asset Library
-
+
To apply your own asset library to the perimeter hallways:
@@ -1460,14 +1460,14 @@ To apply your own asset library to the perimeter hallways:
-1. Select your wall components, then in the **Properties** window, set **Color** to the same hue as the right spawn zone's color theme.
+1. Select your wall components, then in the Properties window, set Color to the same hue as the right spawn zone's color theme.
1. Anchor all of these perimeter hallway assets.
-
+
To exactly recreate the perimeter hallways within the sample [Environment Art - Constructing](https://www.roblox.com/games/14447826396/Environment-Art-Constructing) place file:
@@ -1512,7 +1512,7 @@ To exactly recreate the perimeter hallways within the sample [Environment Art -
-2. Select the wall component of these assets, then in the **Properties** window, set **Color** to `255, 170, 255`.
+2. Select the wall component of these assets, then in the **Properties** window, set **Color** to **255, 170, 255**.
@@ -1809,7 +1809,7 @@ To exactly recreate the perimeter hallways within the sample [Environment Art -
-6. Select the wall component of these assets, then in the **Properties** window, set **Color** to `255, 170, 255`.
+6. Select the wall component of these assets, then in the **Properties** window, set **Color** to **255, 170, 255**.
@@ -1825,7 +1825,7 @@ The final sample laser tag environment applies doors directly onto the greybox g
For this reason, it's recommended to playtest with multiple variations to experiment different play styles. In fact, you may experiment with placing door assets into your combat pockets that only open to users from one side of the door, or not at all.
-
+
To apply your own asset library to the doors:
@@ -1836,7 +1836,7 @@ To apply your own asset library to the doors:
1. **(Optional)** Anchor all of these door assets.
-
+
To exactly recreate the doors within the sample [Environment Art - Constructing](https://www.roblox.com/games/14447826396/Environment-Art-Constructing) place file:
@@ -1889,7 +1889,7 @@ To exactly recreate the doors within the sample [Environment Art - Constructing]
-### Exterior assets
+### Exterior Assets
The original greybox design for exterior assets was to set placeholder positions for objects that provide cover from enemy fire while users navigate the exterior primary lane. This was useful to help visualize what would help users as they ascend or descend stairs, cross the middle combat pocket, or otherwise exist in the outdoor space, but as you construct your environment, you can improve this design by providing different uses for these cover objects.
@@ -1900,7 +1900,7 @@ The following sections provide guidance on how to convert these initial placehol
The first exterior assets you can convert for the outdoor space are the two towers right outside of the middle combat pocket that intersect with the exterior primary lane. The technique in this section not only creates objects that are aesthetically pleasing to the eye, but it also creates objects that provide users a sense of scale in their environment. Every other object so far is about the size of the user's character **except** for these towers, which can lead to intrigue in the story behind the architecture or overall island that the building rests on.
-
+
To apply your own asset library to the towers:
@@ -1919,7 +1919,7 @@ To apply your own asset library to the towers:
1. Anchor all of these parts.
-
+
To exactly recreate the towers within the sample [Environment Art - Constructing](https://www.roblox.com/games/14447826396/Environment-Art-Constructing) place file:
@@ -1983,7 +1983,7 @@ To exactly recreate the towers within the sample [Environment Art - Constructing
2. Group everything into a model, then duplicate the model.
-3. Move the duplicate tower to a **CFrame.Position** of `-30.572, 57.93, 133.5`.
+3. Move the duplicate tower to a **CFrame.Position** of **-30.572, 57.93, 133.5**.
@@ -1997,7 +1997,7 @@ To exactly recreate the towers within the sample [Environment Art - Constructing
The second exterior assets you can convert for the outdoor space are the two columns that hold up the overhang pieces you will make later in this tutorial. Similar to the towers, the technique in this section not only creates objects that are aesthetically pleasing to the eye, but it also provides further visual cues to users about where they are in the overall environment. For example, each column has either mint or carnation pink detailing to inform users if they are closest to either their own or their enemy's spawn zone.
-
+
1. Using **block** and **wedge** parts, create a column that will hold the roof of your building.
@@ -2113,11 +2113,11 @@ To exactly recreate the columns within the sample [Environment Art - Constructin
3. Group everything into a model, then duplicate the model.
-4. Move the duplicate column to a **CFrame.Position** of `-18.169, 14.081, 81.5` and a **CFrame.Orientation** of `0, -90, 180`.
+4. Move the duplicate column to a **CFrame.Position** of **-18.169, 14.081, 81.5** and a **CFrame.Orientation** of **0, -90, 180**.
-5. Select the mint **block** part, then in the **Properties** window, set the **Color** property to `255, 170, 255` to match the color theme of the team on the right of the map.
+5. Select the mint **block** part, then in the **Properties** window, set the **Color** property to **255, 170, 255** to match the color theme of the team on the right of the map.
@@ -2172,7 +2172,7 @@ To apply your asset library to the left-most planter:
6. Select the union, then in the **Properties** window,
- 1. Set **Color** to `181, 173, 156`.
+ 1. Set **Color** to **181, 173, 156**.
1. Set **Material** to **Concrete**.
1. Set **MaterialVariant** to **Concrete_Board_Formed_A**.
1. Enable **UsePartColor**.
@@ -2258,7 +2258,7 @@ The roof of the building is one of the most complex assets in the final sample l
The first, top-most layer of the roof is the skylight geometry. The purpose of this layer is to provide outdoor light into interior combat areas.
-
+
To apply your own asset library to the skylights:
@@ -2274,16 +2274,16 @@ To apply your own asset library to the skylights:
1. Select the part, then in the **Properties** window,
- 1. Set **Color** to `105, 162, 172`.
+ 1. Set **Color** to **105, 162, 172.**
1. Set **Material** to **Neon**.
- 1. Set **Transparency** to `0.6`.
+ 1. Set **Transparency** to **0.6**.
1. Anchor all of these skylight assets.
-
+
To exactly recreate the skylights within the sample [Environment Art - Constructing](https://www.roblox.com/games/14447826396/Environment-Art-Constructing) place file:
@@ -2635,9 +2635,9 @@ To exactly recreate the skylights within the sample [Environment Art - Construct
7. Select these two parts, then in the **Properties** window:
- 1. Set **Color** to `105, 162, 172`.
+ 1. Set **Color** to **105, 162, 172**.
1. Set **Material** to **Neon**.
- 1. Set **Transparency** to `0.6`.
+ 1. Set **Transparency** to **0.6**.
@@ -2654,7 +2654,7 @@ To exactly recreate the skylights within the sample [Environment Art - Construct
The second layer of the roof is the ceiling geometry that users see at the top of their view as they navigate the interior of the building. The purpose of this layer is to fill the open areas between the top trim of each wall asset.
-
+
To apply your own asset library to the ceiling of the roof:
@@ -2666,7 +2666,7 @@ To apply your own asset library to the ceiling of the roof:
1. Anchor all of these ceiling assets.
-
+
To exactly recreate the ceiling within the sample [Environment Art - Constructing](https://www.roblox.com/games/14447826396/Environment-Art-Constructing) place file:
@@ -2807,7 +2807,7 @@ To exactly recreate the ceiling within the sample [Environment Art - Constructin
3. Select all of these ceiling parts, then in the **Properties** window:
- 1. Set **Color** to `248, 248, 248`.
+ 1. Set **Color** to **248, 248, 248**.
1. Set **MaterialVariant** to **MetalPanels**.
@@ -2817,12 +2817,12 @@ To exactly recreate the ceiling within the sample [Environment Art - Constructin
-#### Top roof
+#### Top Roof
The third layer of the roof is the top roof geometry. The purpose of this layer is to provide bulk to the outermost roof area that users see as they look at the building from the outdoor space. It also adds a sense of depth to the skylights, making the building look more complete from the inside and out.
-
+
To apply your own asset library to the top of the roof:
@@ -2837,7 +2837,7 @@ To apply your own asset library to the top of the roof:
1. Anchor all of these top roof assets.
-
+
To exactly recreate the top of the roof within the sample [Environment Art - Constructing](https://www.roblox.com/games/14447826396/Environment-Art-Constructing) place file:
@@ -2960,7 +2960,7 @@ To exactly recreate the top of the roof within the sample [Environment Art - Con
4. Select all of these top roof parts, then in the **Properties** window:
- 1. Set **Color** to `181, 173, 156`.
+ 1. Set **Color** to **181, 173, 156**.
1. Set **Material** to **Concrete**.
1. Set **MaterialVariant** to **Concrete_Tie_Holes_A**.
@@ -3048,7 +3048,7 @@ To exactly recreate the top of the roof within the sample [Environment Art - Con
9. Select all of these top roof parts, then in the **Properties** window:
- 1. Set **Color** to `248, 248, 248`.
+ 1. Set **Color** to **248, 248, 248**.
1. Set **MaterialVariant** to **MetalPanels**.
@@ -3063,7 +3063,7 @@ To exactly recreate the top of the roof within the sample [Environment Art - Con
The fourth layer of the roof is the overhang geometry that the column assets hold up in order for the building to be structurally sound. The purpose of this layer is to provide an aesthetically pleasing awning space for users navigating the exterior primary lane.
-
+
To apply your own asset library to the overhang of the roof:
@@ -3075,7 +3075,7 @@ To apply your own asset library to the overhang of the roof:
1. Anchor all of these overhang parts.
-
+
To exactly recreate the overhang within the sample [Environment Art - Constructing](https://www.roblox.com/games/14447826396/Environment-Art-Constructing) place file:
@@ -3267,7 +3267,7 @@ To exactly recreate the overhang within the sample [Environment Art - Constructi
The final layer of the roof is the trim geometry that surrounds the perimeter of the roof. The purpose of this layer is to provide visual cohesion between each previous layer from users looking at the room from the outdoor space.
-
+
To apply your own asset library to the trim of the roof:
@@ -3279,7 +3279,7 @@ To apply your own asset library to the trim of the roof:
1. Anchor all of these overhang parts.
-
+
To exactly recreate the trim of the roof within the sample [Environment Art - Constructing](https://www.roblox.com/games/14447826396/Environment-Art-Constructing) place file:
@@ -3379,7 +3379,7 @@ To exactly recreate the trim of the roof within the sample [Environment Art - Co
-2. Select these trim assets, then in the **Properties** window, set **Color** to `248, 248, 248`.
+2. Select these trim assets, then in the **Properties** window, set **Color** to **248, 248, 248**.
@@ -3575,7 +3575,7 @@ To exactly recreate the trim of the roof within the sample [Environment Art - Co
-5. Select these trim assets, then in the **Properties** window, set **Color** to `255, 170, 0`.
+5. Select these trim assets, then in the **Properties** window, set **Color** to **255, 170, 0**.
@@ -3584,7 +3584,7 @@ To exactly recreate the trim of the roof within the sample [Environment Art - Co
-## Delete excess geometry
+## Delete Excess Geometry
Now that your building is complete, it's time to delete the underlying greybox geometry and the baseplate. This process removes excess polygons that users will never see nor interact with, which quickly improves memory and performance for devices with memory and graphics processing unit (GPU) limitations. In addition, removing the baseplate also allows the building to float in the sky, which is good preparation for you to sculpt terrain for the outdoor space in the next section.
@@ -3598,7 +3598,7 @@ To delete excess geometry:
-## Sculpt terrain
+## Sculpt Terrain
Right now your environment is mostly architectural aside from foliage in your planters. However, following the sample art style from [Develop Polished Assets](./develop-polished-assets.md), the 3D space should contain a healthy mix of futuristic technology and lush greenery to inform users that the world values technological advances, but not at the expense of the earth.
@@ -3609,7 +3609,7 @@ Using the [Terrain Editor](../../../parts/terrain.md), you can quickly generate
-
+
To apply your own terrain to the outdoor area:
@@ -3644,7 +3644,7 @@ To apply your own terrain to the outdoor area:
-
+
To recreate the terrain within the sample [Environment Art - Constructing](https://www.roblox.com/games/14447826396/Environment-Art-Constructing) place file:
@@ -3660,13 +3660,13 @@ To recreate the terrain within the sample [Environment Art - Constructing](https
1. Set **Brush Mode** to **Add**.
1. Set the brush shape to the cylinder shape.
- 1. Set **Base Size** to `16`.
- 1. Set **Height** to `5`.
+ 1. Set **Base Size** to **16**.
+ 1. Set **Height** to **5**.
1. Set **Pivot Position** to **Top**.
1. Set **Plane Lock** to **Manual**.
1. In the **Edit Plane** setting,
1. Click the **Edit** button.
- 1. Set **Position** to `0, -1, 0`.
+ 1. Set **Position** to **0, -1, 0**.
1. Click the **Apply** button.
@@ -3677,12 +3677,12 @@ To recreate the terrain within the sample [Environment Art - Constructing](https
5. Navigate back to the Terrain Editor's **Brush Settings** section, then
- 1. Set **Base Size** to `10`.
- 1. Set **Height** to `10`.
+ 1. Set **Base Size** to **10**.
+ 1. Set **Height** to **10**.
1. Set **Ignore Parts** to **True/Enabled**.
1. In the **Edit Plane** setting,
1. Click the **Edit** button.
- 1. Set **Position** to `0, 0, 0`.
+ 1. Set **Position** to **0, 0, 0**.
1. Click the **Apply** button.
6. In the **Material Settings** section, select the **Slate** material, then in the viewport, draw another crescent shape that separates the pool from the architecture, and then a thin boundary around the outside of the pool.
@@ -3692,7 +3692,7 @@ To recreate the terrain within the sample [Environment Art - Constructing](https
7. Navigate back to the **Terrain Editor**, then select the **Paint** tool.
8. In the **Brush Settings** section,
1. Set the brush shape to the cylinder shape.
- 1. Set **Base Size** to `3`.
+ 1. Set **Base Size** to **3**.
1. Set **Pivot Position** to **Top**.
1. Set **Plane Lock** to **Off**.
9. In the **Material Settings** section, alternate between your **Mud**, **Leafy Grass**, **Ground**, **Sand**, **Salt**, **Slate**, and **Snow** custom materials, then in the viewport, draw on the remaining area.
@@ -3701,8 +3701,8 @@ To recreate the terrain within the sample [Environment Art - Constructing](https
10. Using your asset library,
- 1. Add a **FloatingIsland** asset with a `Datatype.CFrame.Position` of `201.726, -14.315, 183.5` for a spawn area users join before they separate into teams.
- 1. Intersperse rock assets with varying `Class.MeshPart.Size` and `Datatype.CFrame.Orientation` values along the border of the playable area.
+ 1. Add a **FloatingIsland** asset with a `Class.CFrame.Position` of **201.726, -14.315, 183.5** for a spawn area users join before they separate into teams.
+ 1. Intersperse rock assets with varying `Class.MeshPart.Size` and `Class.CFrame.Orientation` values along the border of the playable area.
1. Intersperse foliage assets around the outdoor space to add more organic life to the outdoor space.
@@ -3710,14 +3710,14 @@ To recreate the terrain within the sample [Environment Art - Constructing](https
-## Contain the playable area
+## Contain the Playable Area
If you playtest your experience and navigate off the island, your character will fall until they reach the project's `Class.Workspace.FallenPartsDestroyHeight` and respawn back in your team's spawn zone. To ensure that users cannot fall off the island, or join the match too early from the floating area spawn zone before they separate into teams, you must contain the playable area with an invisible barrier.
The values in this section are highly dependent on the terrain within the final sample laser tag environment. It's recommended to playtest and verify that there are no gaps in the barrier according to the custom terrain within your own experience.
-
+
To contain the playable area in your experience:
@@ -3726,12 +3726,12 @@ To contain the playable area in your experience:
1. Select these parts, then in the **Properties** window,
- 1. Set **Transparency** to `1`.
+ 1. Set **Transparency** to **1**.
1. Disable **CanCollide**.
1. Enable **Anchored**.
-
+
To exactly recreate the containment of the playable area within the sample [Environment Art - Constructing](https://www.roblox.com/games/14447826396/Environment-Art-Constructing) place file:
@@ -3827,14 +3827,14 @@ To exactly recreate the containment of the playable area within the sample [Envi
2. Select these parts, then in the **Properties** window,
- 1. Set **Transparency** to `1`.
+ 1. Set **Transparency** to **1**.
1. Disable **CanCollide**.
1. Enable **Anchored**.
-## Configure special effects
+## Configure Special Effects
Your building's architecture and outdoor space are nearly complete with assets from your asset library, but you may have noticed either consciously or unconsciously that the overall environment feels static. This is because realistic environments include movement from many different sources, whether that's from clouds crawling through the sky, wind brushing through greenery, or life forms navigating the space.
@@ -3858,7 +3858,7 @@ The first type of special effect the final sample laser tag environment uses to
-
+
To add and configure your own dynamic clouds in the background:
@@ -3871,14 +3871,14 @@ To add and configure your own dynamic clouds in the background:
2. Select the **Clouds** object, then in the **Properties** window,
- 1. Set **Cover** to a value between `0` (no clouds) and `1` (full cloud cover).
- 1. Set **Density** to a value between `0` (light, translucent clouds) and `1` (heavy, dark clouds).
+ 1. Set **Cover** to a value between **0** (no clouds) and **1** (full cloud cover).
+ 1. Set **Density** to a value between **0** (light, translucent clouds) and **1** (heavy, dark clouds).
1. Set **Color** to a material color of cloud particles according to the art style of your experience.
-
+
To add and configure dynamic clouds in the background:
@@ -3891,16 +3891,16 @@ To add and configure dynamic clouds in the background:
2. Select the **Clouds** object, then in the **Properties** window,
- 1. Set **Cover** to `0.625`.
- 1. Set **Density** to `0.5`.
- 1. Set **Color** to `143, 143, 143`.
+ 1. Set **Cover** to **0.625**.
+ 1. Set **Density** to **0.5**.
+ 1. Set **Color** to **143, 143, 143**.
-### Foreground clouds
+### Foreground Clouds
The second type of special effect the final sample laser tag environment uses to add movement to the 3D space is an effect called particle emitters. [Particle emitters](../../../effects/particle-emitters.md) emit 2D images, or particles, that look and behave for the duration of their lifetime according to the particle emitter's set properties, and they are useful for creating movement that feels and often is close to the user.
@@ -3910,7 +3910,7 @@ To add and configure foreground clouds:
1. Add a **block** part to a position where you want users to see a floating cloud.
2. Select this **block** part, then in the **Properties** window,
- 1. Set **Transparency** to `1`.
+ 1. Set **Transparency** to **1**.
1. Disable **CanCollide**.
1. Enable **Anchored**.
3. Create a particle emitter within this part.
@@ -3922,33 +3922,33 @@ To add and configure foreground clouds:
- 1. Set **LightEmission** to `0.3` to blend the colors of the texture and its environment.
- 1. Set **LightInfluence** to `0.2` to allow environment light to have a subtle effect on the color of particles.
+ 1. Set **LightEmission** to **0.3** to blend the colors of the texture and its environment.
+ 1. Set **LightInfluence** to **0.2** to allow environment light to have a subtle effect on the color of particles.
1. Set **Orientation** to **FacingCameraWorldUp** so particles always emit up toward the sky.
- 1. Set **Size** to `100` to create large clouds.
- 1. Set **Squash** to `-0.25` to shrink particles horizontally.
- 1. Set **Texture** to an image of a cloud. The sample uses `rbxassetid://10714362544`.
+ 1. Set **Size** to **100** to create large clouds.
+ 1. Set **Squash** to **-0.25** to shrink particles horizontally.
+ 1. Set **Texture** to an image of a cloud. The sample uses **rbxassetid://10714362544**.
1. Set **Transparency** to a number sequence that looks like the following image.
- 1. Set **Lifetime** to `30` to fade out particles at 30 seconds.
- 1. Set **Rate** to `0.25` to emit particles slowly.
- 1. Set **Acceleration** to `0, -0.8, 0` to impact particle speed over their lifetime.
- 1. Set **Drag** to `0.1` to make particles look their speed over time.
+ 1. Set **Lifetime** to **30** to fade out particles at 30 seconds.
+ 1. Set **Rate** to **0.25** to emit particles slowly.
+ 1. Set **Acceleration** to **0, -0.8, 0** to impact particle speed over their lifetime.
+ 1. Set **Drag** to **0.1** to make particles look their speed over time.
1. Enable **LockedToPart** to keep particles close to the particle emitter.
5. Repeat this process, moving cloud particle emitters throughout the environment.
-In addition, you can layer multiple particle emitters together to give clouds more depth. For example, in the final sample laser tag environment, foreground clouds layer an additional particle emitter with a **Color** property of `248, 248, 248`, **Texture** property of `rbxassetid://10714433747`, and a **Rate** property of `0.1`. You can find both of these particle emitters in the sample [Environment Art Asset Library](https://www.roblox.com/library/14447738661/Environment-Art-Asset-Library).
+In addition, you can layer multiple particle emitters together to give clouds more depth. For example, in the final sample laser tag environment, foreground clouds layer an additional particle emitter with a **Color** property of **248, 248, 248**, **Texture** property of **rbxassetid://10714433747**, and a **Rate** property of **0.1**. You can find both of these particle emitters in the sample [Environment Art Asset Library](https://www.roblox.com/library/14447738661/Environment-Art-Asset-Library).
-### Dust particles
+### Dust Particles
Particle emitters are such a versatile type of special effect because they offer so many properties you can customize to create interesting visual effects, such as glowing portals, green billowing smoke, or vibrant explosions. The final sample laser tag environment uses particle emitters again in this section to create floating dust particles that surround the user as they navigate the outdoor space.
@@ -3958,7 +3958,7 @@ To add and configure dust particles for the outdoor space:
1. Add a **block** part to the environment that covers the entire island.
2. Select this **block** part, then in the **Properties** window,
- 1. Set **Transparency** to `1`.
+ 1. Set **Transparency** to **1**.
1. Disable **CanCollide**.
1. Enable **Anchored**.
3. Create a particle emitter within this part.
@@ -3966,27 +3966,27 @@ To add and configure dust particles for the outdoor space:
1. From the contextual menu, insert a **ParticleEmitter**. The particle emitter immediately emits particles within the part's area.
4. Select this particle emitter, then in the **Properties** window,
- 1. Set **Color** to `192, 241, 255` to give the particles a light blue hue.
+ 1. Set **Color** to **192, 241, 255** to give the particles a light blue hue.
1. Set **Size** to a number sequence that looks like the following image.
- 1. Set **Texture** to a dust mote image. The sample uses `rbxassetid://14302399641`.
+ 1. Set **Texture** to a dust mote image. The sample uses **rbxassetid://14302399641**.
1. Set **Transparency** to a number sequence that looks like the following image.
- 1. Set **ZOffset** to `-5` to move particles away from the camera.
- 1. Set **Lifetime** to `1, 10` to set the minimum and maximum age of a particle to 1 and 10 seconds, respectively.
- 1. Set **Rate** to `50000` to create many particles for your environment.
- 1. Set **RotSpeed** to `-60` to create a range of speeds for newly emitted particles.
- 1. Set **Speed** to `1, 5` to set the minimum and maximum speed of a particle to 1 and 5 studs per second, respectively.
- 1. Set **Acceleration** to `1, -1, 1` to impact particle speed over its lifetime.
+ 1. Set **ZOffset** to **-5** to move particles away from the camera.
+ 1. Set **Lifetime** to **1, 10** to set the minimum and maximum age of a particle to 1 and 10 seconds, respectively.
+ 1. Set **Rate** to **50000** to create many particles for your environment.
+ 1. Set **RotSpeed** to **-60** to create a range of speeds for newly emitted particles.
+ 1. Set **Speed** to **1, 5** to set the minimum and maximum speed of a particle to 1 and 5 studs per second, respectively.
+ 1. Set **Acceleration** to **1, -1, 1** to impact particle speed over its lifetime.
1. Enable **LockedToPart** to keep particles close to the particle emitter.
-## Configure lighting sources
+## Configure Lighting Sources
Now that your environment has movement, the final step in constructing your environment is to configure lighting sources. Studio offers two high-level types of lighting sources:
@@ -3995,7 +3995,7 @@ Now that your environment has movement, the final step in constructing your envi
Both lighting sources are important to consider because your experience has both an indoor and outdoor environment that impact the user's ability to see what is happening around them while they're in combat.
-### Global lighting
+### Global Lighting
Global lighting is the luminescence from either the sun or moon in an experience. By adjusting a couple of key default properties in the `Class.Lighting` service, you can dramatically change how that light appears to users, as well as how it interacts with any other object you place in the experience.
@@ -4004,63 +4004,63 @@ Studio begins every experience with the `Enum.Technology.ShadowMap` lighting sys
For example, the `Enum.Technology.Future` lighting system automatically detects when a user is either in an interior or exterior space, then it responds by enabling the appropriate lighting model. This means that reflections are able to reflect off the floor and ceiling within the building, providing a richer visual experience as users navigate through combat pockets.
-
+
To configure your own global lighting:
-1. In the **Explorer** window, select the **Lighting** service, then in the **Properties** window, set its properties to values that reflect the art style of your experience. For more information on these properties, see [Global lighting](../../../environment/lighting.md).
+1. In the **Explorer** window, select the **Lighting** service, then in the **Properties** window, set its properties to values that reflect the art style of your experience. For more information on these properties, see [Global Lighting](../../../environment/lighting.md).
-1. In the **Explorer** window, select the **Lighting** service's child **Atmosphere** object, then in the **Properties** window, set its properties to values that reflect the art style of your experience. For more information on these properties, see [Atmospheric effects](../../../environment/atmosphere.md).
+1. In the **Explorer** window, select the **Lighting** service's child **Atmosphere** object, then in the **Properties** window, set its properties to values that reflect the art style of your experience. For more information on these properties, see [Atmospheric Effects](../../../environment/atmosphere.md).
-1. **(Optional)** Apply one or more customizable filters, such as bloom, depth‑of‑field, or sun rays. For more information on these properties, see [Post-processing effects](../../../environment/post-processing-effects.md).
+1. **(Optional)** Apply one or more customizable filters, such as bloom, depth‑of‑field, or sun rays. For more information on these properties, see [Post-Processing Effects](../../../environment/post-processing-effects.md).
-
+
To exactly recreate the global lighting configuration within the sample [Environment Art - Constructing](https://www.roblox.com/games/14447826396/Environment-Art-Constructing) place file:
1. In the **Explorer** window, select the **Lighting** service, then in the **Properties** window,
- 1. Set **Ambient** to `26, 34, 36`.
- 1. Set **OutdoorAmbient** to `26, 34, 36`.
- 1. Set **ShadowSoftness** to `0.15`.
+ 1. Set **Ambient** to **26, 34, 36**.
+ 1. Set **OutdoorAmbient** to **26, 34, 36**.
+ 1. Set **ShadowSoftness** to **0.15**.
1. Set **Technology** to **Future**.
- 1. Set **GeographicLatitude** to `-18`.
- 1. Set **TimeOfDay** to `-15:16:23`.
+ 1. Set **GeographicLatitude** to **-18**.
+ 1. Set **TimeOfDay** to **-15:16:23**.
2. In the **Explorer** window, select the **Lighting** service's child **Atmosphere** object, then in the **Properties** window,
- 1. Set **Density** to `0.285`.
- 1. Set **Offset** to `0.65`.
- 1. Set **Decay** to `254, 254, 254`
- 1. Set **Glare** to `0.3`.
- 1. Set **Haze** to `2`.
+ 1. Set **Density** to **0.285**.
+ 1. Set **Offset** to **0.65**.
+ 1. Set **Decay** to **254, 254, 254**.
+ 1. Set **Glare** to **0.3**.
+ 1. Set **Haze** to **2**.
3. In the **Explorer** window, select the **Lighting** service's child **Bloom** object, then in the **Properties** window,
- 1. Set **Intensity** to `1.5`.
- 1. Set **Size** to `56`.
+ 1. Set **Intensity** to **1.5**.
+ 1. Set **Size** to **56**.
-4. In the **Explorer** window, select the **Lighting** service's child **DepthOfField** object, then in the **Properties** window, set **FarIntensity** to `0.05`.
+4. In the **Explorer** window, select the **Lighting** service's child **DepthOfField** object, then in the **Properties** window, set **FarIntensity** to **0.05**.
-### Local lighting
+### Local Lighting
Local lighting is the luminescence from local [light sources](../../../effects/light-sources.md) in your experience, such as `Class.SpotLight`, `Class.SurfaceLight`, and `Class.PointLight` objects. It's important to analyze the needs of your experience to know which type of local light source to use. For example, the final sample laser tag environment needs lighting to help users see the different areas inside of the building while they're in combat, as well as lighting to differentiate the different spawn zone areas.
@@ -4073,7 +4073,7 @@ Local light sources create points of reference and directionality for users. For
-
+
To configure your own local lighting:
@@ -4128,25 +4128,25 @@ To configure your own local lighting:
1. **(Optional)** Add and anchor light fixtures around the interior and exterior of the building from your own asset library.
-
+
To exactly recreate the local lighting configuration within the sample [Environment Art - Constructing](https://www.roblox.com/games/14447826396/Environment-Art-Constructing) place file:
1. Add and configure the glowing perimeter lights.
1. Add a **block** part for one of the glowing perimeter lights, then in the **Properties** window,
- 1. Set **Color** to `199, 166, 147`.
+ 1. Set **Color** to **199, 166, 147**
1. Set **Material** to **Neon**.
- 1. Set **Size** to `89.254, 1, 1`.
- 1. Set **CFrame.Position** to `-78.297, 21, 293.439`.
+ 1. Set **Size** to **89.254, 1, 1**.
+ 1. Set **CFrame.Position** to **-78.297, 21, 293.439**.
1. Enable **Anchored**.
1. In the **Explorer** window, add a **SurfaceLight** object to the part.
1. Hover over the **block** part and click the **⊕** button. A contextual menu displays.
1. From the contextual menu, insert a **SurfaceLight** object.
1. Select the **SurfaceLight** object, then in the **Properties** window,
- 1. Set **Color** to `211, 190, 150`.
+ 1. Set **Color** to **211, 190, 150**.
1. Set **Face** to **Bottom**.
- 1. Set **Range** to `21`.
+ 1. Set **Range** to **21**.
1. Repeat this process, positioning and orienting parts to complete the glowing perimeter lights.
@@ -4154,18 +4154,18 @@ To exactly recreate the local lighting configuration within the sample [Environm
2. Add and configure the small hallway interior lights.
1. Add a **block** part for one of the small hallway interior lights, then in the **Properties** window,
- 1. Set **Color** to `163, 162, 165`.
+ 1. Set **Color** to **163, 162, 165**.
1. Set **Material** to **Neon**.
- 1. Set **Size** to `0.25, 0.25, 1`.
- 1. Set **CFrame.Position** to `-53.962, 19.936, 291.932`.
+ 1. Set **Size** to **0.25, 0.25, 1**.
+ 1. Set **CFrame.Position** to **-53.962, 19.936, 291.932**.
1. Enable **Anchored**.
1. In the **Explorer** window, add a **SpotLight** object to the part.
1. Hover over the **block** part and click the **⊕** button. A contextual menu displays.
1. From the contextual menu, insert a **SpotLight** object.
1. Select the **SpotLight** object, then in the **Properties** window,
- 1. Set **Angle** to `135`.
+ 1. Set **Angle** to **135**.
1. Set **Face** to **Bottom**.
- 1. Set **Range** to `20`.
+ 1. Set **Range** to **20**.
1. Repeat this process, positioning and orienting parts above doors and hallways until you are happy with the interior lighting.
@@ -4174,19 +4174,19 @@ To exactly recreate the local lighting configuration within the sample [Environm
1. Add a **block** part for the left spawn zone, then in the **Properties** window,
- 1. Set **Color** to `88, 218, 171`.
+ 1. Set **Color** to **88, 218, 171**.
1. Set **Material** to **Neon**.
- 1. Set **Size** to `62.5, 1, 37.5`.
- 1. Set **CFrame.Position** to `-77, 20.6, 321`.
+ 1. Set **Size** to **62.5, 1, 37.5**.
+ 1. Set **CFrame.Position** to **-77, 20.6, 321**.
1. Enable **Anchored**.
1. Add a **block** part for the right spawn zone, then in the **Properties** window,
- 1. Set **Color** to `255, 170, 255`.
+ 1. Set **Color** to **255, 170, 255**.
1. Set **Material** to **Neon**.
- 1. Set **Size** to `62.5, 1, 37.5`.
- 1. Set **CFrame.Position** to `-77, 20.6, 1`.
+ 1. Set **Size** to **62.5, 1, 37.5**.
+ 1. Set **CFrame.Position** to **-77, 20.6, 1**.
1. Enable **Anchored**.
diff --git a/content/en-us/tutorials/curriculums/environmental-art/develop-polished-assets.md b/content/en-us/tutorials/curriculums/environmental-art/develop-polished-assets.md
index a54362098..51e451768 100644
--- a/content/en-us/tutorials/curriculums/environmental-art/develop-polished-assets.md
+++ b/content/en-us/tutorials/curriculums/environmental-art/develop-polished-assets.md
@@ -1,5 +1,5 @@
---
-title: Develop polished assets
+title: Develop Polished Assets
description: Explains the high-level concepts regarding how to design and develop polished assets.
next: /tutorials/curriculums/environmental-art/assemble-an-asset-library
prev: /tutorials/curriculums/environmental-art/greybox-your-environment
@@ -24,7 +24,7 @@ After you complete this section, you will learn how to pull all of your polished
It's important to note the process between polishing assets and constructing your environment hardly ever looks like a straight line from your original idea to the final art. Iteration between each step and across steps is normal and almost always necessary in the development process.
-## Choose an art style
+## Choose an Art Style
Choosing an art style at the start of your design process allows you to have a main source of truth for the aesthetic treatment of your assets. You can treat it as your visual ground rules, constantly referencing it as you design your assets to ensure they always inform users of what you want your environment to communicate. An effective art style provides users information about the world they're playing in, such as its climate, rich history, or relationship to technology.
@@ -32,15 +32,15 @@ Many developers choose to create a mood or theme board, then add as many picture
-## Design textures
+## Design Textures
Now that you have an art style for your experience, it's time to review your layout and figure out what textures you need to create materials for the 3D space. Environments often require textures that can cover large surfaces, as well as textures that can provide a level of detail to your assets without adding additional geometry. For example, your greybox environment needs textures that can cover the outdoor space, such as moss, flowers and stones, as well as textures to provide details to the combat pockets, such as panels and bolts to frame doorways.
There are two high-level texturing methods that you can use to meet these requirements: tileable textures and trim sheets. The following sections provide information and guidance on both texture methods, including what to consider as you find textures on the [Creator Store](../../../production/creator-store.md), or design them in third-party tools.
-### Tileable textures
+### Tileable Textures
-**Tileable textures** are textures that tile both on the X **and** Y axis, and they allow you to cover large surfaces in your environment, such as floors, walls, and terrain. This type of texture requires minimal manual adjustments after you apply them to block `Class.Part|Parts` because blocks have flat surfaces, meaning you don't need to account for how the texture might deform on more complex geometry. In addition, you can import tileable textures `Class.MaterialVariant` objects within the `Class.MaterialService` to apply to your terrain, which is a process you will learn in [Create custom materials](./assemble-an-asset-library.md#create-custom-materials) in the next section of this tutorial.
+**Tileable textures** are textures that tile both on the X **and** Y axis, and they allow you to cover large surfaces in your environment, such as floors, walls, and terrain. This type of texture requires minimal manual adjustments after you apply them to block `Class.Part|Parts` because blocks have flat surfaces, meaning you don't need to account for how the texture might deform on more complex geometry. In addition, you can import tileable textures `Class.MaterialVariant` objects within the `Class.MaterialService` to apply to your terrain, which is a process you will learn in [Creating Custom Materials](./assemble-an-asset-library.md#creating-custom-materials) in the next section of this tutorial.
@@ -85,9 +85,9 @@ If you decide to design your own tileable textures in third-party modeling tools
- Create equal visible distribution so that no one element is more distinguishable than others.
- Even if a tileable texture is technically seamless, review the overall image to ensure it doesn't have an element that is so pronounced that the texture's repetition is noticeable.
-The previous point is near impossible to remove entirely, but you can set Studio material to tile organically, or add in additional decal overlays to hide the repetition effectively. For more information on these techniques, see [Assemble an asset library - Creating custom materials](assemble-an-asset-library.md#create-custom-materials) and [Assembling modular environments - Reducing visible repetition](assemble-modular-environments.md#reduce-visible-repetition), respectively.
+The previous point is near impossible to remove entirely, but you can set Studio material to tile organically, or add in additional decal overlays to hide the repetition effectively. For more information on these techniques, see [Assemble an Asset Library - Creating Custom Materials](assemble-an-asset-library.md#create-custom-materials) and [Assembling Modular Environments - Reducing Visible Repetition](assembling-modular-environments.md#reducing-visible-repetition), respectively.
-### Trim sheets
+### Trim Sheets
**Trim sheets** are textures that tile both on either the X **or** Y axis, and they allow you to add significantly more visual complexity to your experiences without having to import additional textures, saving you a negative impact on memory. Each row or column of a trim sheet has a unique visual appearance, giving you many different surface treatments to choose from when you're mapping UV data to a mesh. For example, the door frame and ceiling assets in the following two images use different layers of the same trim sheet to add detail work to the space.
@@ -100,11 +100,11 @@ The previous point is near impossible to remove entirely, but you can set Studio
-The most fundamental rule for trim sheets is to avoid contextual details that you can only apply to a single object. This is because trim sheets must have use for many types of objects in your world, and highly specific details are also distinguishable to users as they repeat in the 3D space. For example, in the following image from the [Mystery of Duvall showcase](../../../resources/the-mystery-of-duvall-drive/materialize-the-world.md#surface-appearance-and-trim-maps), the left-side furniture set's trim sheet includes more stain detail than the right-side furniture set's trim sheet. Notice how the extra stain detail makes its repetition prominent in comparison to the furniture set on the right.
+The most fundamental rule for trim sheets is to avoid contextual details that you can only apply to a single object. This is because trim sheets must have use for many types of objects in your world, and highly specific details are also distinguishable to users as they repeat in the 3D space. For example, in the following image from the [Mystery of Duvall showcase](../../../resources/the-mystery-of-duvall-drive/materializing-the-world.md#surface-appearance-and-trim-maps), the left-side furniture set's trim sheet includes more stain detail than the right-side furniture set's trim sheet. Notice how the extra stain detail makes its repetition prominent in comparison to the furniture set on the right.
-Following this fundamental rule, the final sample laser tag environment uses the following trim sheet texture maps with six rows of simple detail work to add visual interest and cohesion to its modular kit and props. You can use this trim sheet for UV unwrapping in third-party modeling tools, then utilize its texture maps in a `Class.SurfaceAppearance` object when you assemble your asset library. For more information on what each of these texture maps provide to meshes, see [PBR textures - Texture maps](../../../art/modeling/surface-appearance.md#texture-maps).
+Following this fundamental rule, the final sample laser tag environment uses the following trim sheet texture maps with six rows of simple detail work to add visual interest and cohesion to its modular kit and props. You can use this trim sheet for UV unwrapping in third-party modeling tools, then utilize its texture maps in a `Class.SurfaceAppearance` object when you assemble your asset library. For more information on what each of these texture maps provide to meshes, see [PBR Textures - Texture Maps](../../../art/modeling/surface-appearance.md#texture-maps).
This trim sheet file is only useful for UV unwrapping processes in third-party modeling tools. If you try to upload its texture maps to a `Class.SurfaceAppearance` object without completing a UV unwrapping process, there isn't any data for Studio to map to the texture itself.
@@ -141,9 +141,9 @@ If you decide to design your own trim sheets in third-party modeling tools like
- You can make different design choices to include more contextual details, but once the details are on the trim sheet, you cannot easily hide them.
- Export your trim sheet's texture maps in a location that is easy to reference when you're creating an asset library.
-For more information on this technique, see [Building architecture - Creating trim sheets](../../../resources/beyond-the-dark/building-architecture.md#creating-trim-sheets).
+For more information on this technique, see [Building Architecture - Creating Trim Sheets](../../../resources/beyond-the-dark/building-architecture.md#creating-trim-sheets).
-## Design modular kits
+## Design Modular Kits
Modular kits are sets of assets that seamlessly snap together to create variations of a larger complex object. Designing and using modular kits as a part of your development process is useful because it means you don't need to manually create each individual asset in your experience. Instead, you only need to create a few assets that you can reuse and customize to create variety throughout the scene.
@@ -151,7 +151,7 @@ Not only does this process significantly speed up how quickly you can replace or
-Each asset in this modular kit has a consistent pivot point location either at the forward-most, lower corner, or in a location that allows them to snap to a logical position on the building in 5 stud increments when you enable grid snapping, such as trim pieces onto walls, or doors into their doorway position. In addition, each asset is at least 5 studs tall and wide, so there is never any clashing geometry, even when you rotate and move the assets. For more information on this concept, see [Assembling modular environments - The importance of consistent pivot point locations](assemble-modular-environments.md#the-importance-of-consistent-pivot-point-locations).
+Each asset in this modular kit has a consistent pivot point location either at the forward-most, lower corner, or in a location that allows them to snap to a logical position on the building in 5 stud increments when you enable grid snapping, such as trim pieces onto walls, or doors into their doorway position. In addition, each asset is at least 5 studs tall and wide, so there is never any clashing geometry, even when you rotate and move the assets. For more information on this concept, see [Assembling Modular Environments - The Importance of Consistent Pivot Point Locations](assembling-modular-environments.md#the-importance-of-consistent-pivot-point-locations).
@@ -163,7 +163,7 @@ You can use or modify the [sample modular kit](https://www.roblox.com/library/14
No matter what modular kit you use, it's important to test often and look at your assets from multiple perspectives to see if there is any clashing geometry. If there is, it often means that one of the asset's pivot point locations isn't relatively consistent with the other.
-## Design props
+## Design Props
Props are non-modular assets that enhance an environment's level of visual storytelling while providing users important context about the world they're in. For example, if users are exploring a cave and see props like glowing orbs and skeletons, they can infer that their environment is both magical and dangerous, so it might be wise to proceed with caution.
@@ -177,7 +177,7 @@ Unlike modular assets, props don't need to have consistent pivot point locations
You can use or modify props from the [Environment Art Asset Library](https://www.roblox.com/library/14447738661/Environment-Art-Asset-Library) in the world building section of this tutorial. However, if you decide to design your own props in third-party modeling tools like [Blender](https://www.blender.org/) or [Maya](https://www.autodesk.com/products/maya/overview), keep the following in mind:
-- Users often see props from multiple angles, so it's important to include enough detail for users to understand what the prop is, but not too much detail so that it impacts performance. A good rule is to only include enough geometry that users can tell what a prop is from its silhouette. For more information on this concept, see [Developing a moving world - Setting up the eye of the storm](../../../resources/the-mystery-of-duvall-drive/develop-a-moving-world.md).
+- Users often see props from multiple angles, so it's important to include enough detail for users to understand what the prop is, but not too much detail so that it impacts performance. A good rule is to only include enough geometry that users can tell what a prop is from its silhouette. For more information on this concept, see [Developing a Moving World - Setting Up the Eye of the Storm](../../../resources/the-mystery-of-duvall-drive/developing-a-moving-world.md).
- You can use the same trim sheet you used for your modular assets so that you make efficient use of textures that are already within your environment, and so that every asset remains stylistically cohesive.
- Distinct visual markers in props are more noticeable the more you reuse them in your environment.
diff --git a/content/en-us/tutorials/curriculums/environmental-art/greybox-your-environment.md b/content/en-us/tutorials/curriculums/environmental-art/greybox-your-environment.md
index 7e46dfa30..f8a193ff5 100644
--- a/content/en-us/tutorials/curriculums/environmental-art/greybox-your-environment.md
+++ b/content/en-us/tutorials/curriculums/environmental-art/greybox-your-environment.md
@@ -1,5 +1,5 @@
---
-title: Greybox your environment
+title: Greybox Your Environment
description: Explains how to greybox the laser tag environment using basic parts.
next: /tutorials/curriculums/environmental-art/develop-polished-assets
prev: /tutorials/curriculums/environmental-art/
@@ -21,13 +21,13 @@ After you complete this section, you will learn how to develop high-quality asse
-## Three lane map layout
+## Three Lane Map Layout
The **three lane map layout** is a first-person shooter map layout that includes a spawn zone for each team on opposite sides of the map, three primary lanes that each team can use to travel to either spawn zone, and cross lanes that allow for users to travel from one primary lane to another. This type of map layout is a common layout for first-person shooter experiences because it quickly places users into combat zones as soon as they join a match, and it allows for a variety of playstyles depending on which primary lane users choose to follow.
The following sections explain each component of the three lane map layout, including considerations of how each component works together to create intentional gameplay interactions within first-person shooter experiences.
-### Spawn zones
+### Spawn Zones
**Spawn zones** are areas of the map where users either join their team at the start of a match, or rejoin the gameplay after their health reaches zero. At minimum, each team needs to have a central spawn zone when users first join the experience. Many developers place these central spawn zones at opposite ends of their maps to allow users time to navigate the experience at the start of the match before seeing the enemy team.
@@ -35,7 +35,7 @@ The following sections explain each component of the three lane map layout, incl
In addition, many team-based first-person shooter experiences also include spawn zones throughout the map that users can randomly respawn at once their health reaches zero. The placement of these decentralized spawn zones can significantly increase the experience's difficulty, especially when you place spawn zones near areas with heavy combat. To keep the gameplay simple, the sample laser tag greybox environment only includes one central spawn zone for each team.
-### Primary lanes
+### Primary Lanes
**Primary lanes** are paths that extend the length of the map from one spawn zone to another. The three lane map layout includes three primary lanes, and how developers conceptualize them is often dependent on the overall environmental context of the experience. For example, because the sample laser tag map has both an indoor and outdoor environment, the names of the primary lanes are as follows:
@@ -47,7 +47,7 @@ For most first-person shooter experiences using the three lane map layout, the m
-### Cross lanes
+### Cross Lanes
**Cross lanes** are paths that intersect all of the primary lanes, extending from the interior to the exterior primary lane. These are the paths that users can use to travel from one primary lane to another, and they often contain minimal obstructions to help users take cover from enemy fire. This is because coverless zones create transitory spaces that encourage users to not stay in one place for too long without it being dangerous.
@@ -59,7 +59,7 @@ Similar to the reason why the most combat occurs around the middle primary lane,
Building a three lane map layout with these combat pockets in mind allows you to segment the distance from spawn zones, and create intentional spaces where users have to interact with each other. This encourages users to engage in rapid gameplay and quickly become familiar with the map as they jump between primary lanes using cross lanes.
-## Create playable areas
+## Create Playable Areas
Now that you are familiar with three lane map layouts, it's time to learn how to create the playable areas for the sample laser tag greybox environment that follows a three lane map layout. As you follow these instructions that exactly recreate the geometry within the sample [Environment Art - Greyboxing](https://www.roblox.com/games/14447721254/Environment-Art-Greyboxing) `.rbxl` file, you will start to see how it all works together to make up two spawn zones, three primary lanes, and five cross lanes that mirror across the middle of the map when you look at it from a top-down view.
@@ -73,7 +73,7 @@ If you adjust the geometry to meet the specifications of your own experience, no
-### Floor geometry
+### Floor Geometry
The first step in creating the laser tag greybox environment is to create the geometry for each of the following floors:
@@ -90,15 +90,15 @@ It's important to have spaces in the experience with peaks and valleys because i
In addition, a rise in elevation creates both a physical and emotional sense of ascension, allowing users with a high ground to have a bird's eye view of the battlefield in order to get a better sense of where to travel next. When they're ready to move on, the drop in elevation creates both a physical and emotional sense of descension, pushing users to make quick decisions to maneuver around enemy lines of sight and achieve their goals.
-
+
To create your own floor geometry:
1. Open Roblox Studio with a **Baseplate** template.
1. In the menu bar, navigate to the **Model** tab, then in the **Snap to Grid** section,
- 1. Set **Rotate** to `90`.
- 1. Set **Move** to `5` studs. This allows you to equally position all greybox geometry on or away from each other in 5 stud increments.
+ 1. Set **Rotate** to **90**.
+ 1. Set **Move** to **5 studs**. This allows you to equally position all greybox geometry on or away from each other in 5 stud increments.
@@ -121,15 +121,15 @@ To create your own floor geometry:
1. Anchor all of your parts.
-
+
To exactly recreate the floor geometry within the sample [Environment Art - Greyboxing](https://www.roblox.com/games/14447721254/Environment-Art-Greyboxing) place file:
1. Open Roblox Studio with a **Baseplate** template.
1. In the menu bar, navigate to the **Model** tab, then in the **Snap to Grid** section,
- 1. Set **Rotate** to `90`.
- 1. Set **Move** to `5` studs. This allows you to equally position all greybox geometry on or away from each other in 5 stud increments.
+ 1. Set **Rotate** to **90**.
+ 1. Set **Move** to **5 studs**. This allows you to equally position all greybox geometry on or away from each other in 5 stud increments.
@@ -141,8 +141,8 @@ To exactly recreate the floor geometry within the sample [Environment Art - Grey
1. In the **Explorer** window, select the block, then in the **Properties** window,
- 1. Set **Size** to `105, 1, 185`.
- 1. Set **CFrame.Position** to `-77.5, 4.5, 252.5`.
+ 1. Set **Size** to **105, 1, 185**.
+ 1. Set **CFrame.Position** to **-77.5, 4.5, 252.5**.
@@ -268,7 +268,7 @@ To exactly recreate the floor geometry within the sample [Environment Art - Grey
-### Perimeter wall geometry
+### Perimeter Wall Geometry
The second step in creating the laser tag greybox environment is to create the geometry for perimeter walls of the building. This provides boundaries for the interior gameplay of the experience, as well as guidance to users on where they can go to engage with one another.
@@ -277,7 +277,7 @@ To help visualize the geometry of the perimeter walls of the building you are cr
-
+
To create your own perimeter wall geometry:
@@ -288,7 +288,7 @@ To create your own perimeter wall geometry:
1. Anchor these parts.
-
+
To exactly recreate the perimeter wall geometry within the sample [Environment Art - Greyboxing](https://www.roblox.com/games/14447721254/Environment-Art-Greyboxing) place file:
@@ -416,7 +416,7 @@ To exactly recreate the perimeter wall geometry within the sample [Environment A
-### Spawn zone geometry
+### Spawn Zone Geometry
The third step in creating the laser tag greybox environment is to create the geometry to contain each team's spawn zone. For experiences that only contain centralized spawn zones, sectioning them off into their own rooms lets users acclimate to the experience when they first join the match, and it provides them cover from enemy fire when they rejoin the match after their health reaches zero.
@@ -429,7 +429,7 @@ To help visualize the geometry of the spawn zone areas you are creating for the
-
+
To create your own spawn zone geometry:
@@ -557,7 +557,7 @@ To exactly recreate the spawn zone geometry within the sample [Environment Art -
-### Combat pockets geometry
+### Combat Pockets Geometry
The fourth step in creating the laser tag greybox environment is to create the geometry for combat pockets in the interior of the building. This geometry makes up the majority of the playable areas in the experience because combat pockets arise from the intersections of primary lane and cross lanes, which span the entirety of the building.
@@ -570,7 +570,7 @@ To help visualize geometry of the combat pockets you are creating for the experi
-
+
To create your own combat pockets geometry:
@@ -593,7 +593,7 @@ To create your own combat pockets geometry:
1. Anchor these parts.
-
+
To exactly recreate the combat pockets geometry within the sample [Environment Art - Greyboxing](https://www.roblox.com/games/14447721254/Environment-Art-Greyboxing) place file:
@@ -861,7 +861,7 @@ To exactly recreate the combat pockets geometry within the sample [Environment A
-### Exterior geometry
+### Exterior Geometry
The final step in creating the laser tag greybox environment is to create the placeholder exterior assets that create interesting composition for the outdoor space, as well as minimal cover for users traveling the exterior primary lane. This area of the experience is important because while it comes with risk due to the minimal cover from enemy fire, it also provides users a quick route to the enemy team's spawn zone.
@@ -870,7 +870,7 @@ To help visualize the geometry of the exterior assets you are creating for the e
-
+
To create your own exterior geometry:
@@ -881,7 +881,7 @@ To create your own exterior geometry:
1. Anchor these parts.
-
+
To exactly recreate the exterior geometry within the sample [Environment Art - Greyboxing](https://www.roblox.com/games/14447721254/Environment-Art-Greyboxing) place file:
@@ -1045,7 +1045,7 @@ To exactly recreate the exterior geometry within the sample [Environment Art - G
-## Apply placeholder materials
+## Apply Placeholder Materials
Now that you have your placeholder geometry in place, it's time to apply placeholder materials to the map in key areas to help orient users to where they are in the experience. The sample [Environment Art - Greyboxing](https://www.roblox.com/games/14447721254/Environment-Art-Greyboxing) `.rbxl` file uses the following color map, but you can use can use any color to achieve the same purpose:
@@ -1069,14 +1069,14 @@ For example, if the following user is on the "red" team, when they're walking on
To apply placeholder materials:
-1. Select the top perimeter walls and the top hallway editions, then set their `Class.Part.Color` to `255, 176, 0`.
-1. Select the left-side floor parts, then set their `Class.Part.Color` to `255, 89, 89`.
-1. Select the right-side floor parts, then set their `Class.Part.Color` to `16, 42, 220`.
-1. Select the part for the elevation between the ground and first floor, then set their `Class.Part.Color` to `75, 151, 75`.
+1. Select the top perimeter walls and the top hallway editions, then set their `Class.Part.Color` to **255, 176, 0**.
+1. Select the left-side floor parts, then set their `Class.Part.Color` to **255, 89, 89**.
+1. Select the right-side floor parts, then set their `Class.Part.Color` to **16, 42, 220**.
+1. Select the part for the elevation between the ground and first floor, then set their `Class.Part.Color` to **75, 151, 75**.
-## Playtest your layout
+## Playtest Your Layout
It's important to continuously playtest the layout of your environment **at nearly every step of the development process** so you can ensure the experience is both fun and functional, and you can catch small issues before they turn into much larger problems the further you are in the process. As you playtest, ask yourself the following questions:
@@ -1095,7 +1095,7 @@ To playtest your experience:
2. Select from one of the following playtest options:
- - **Play** – Starts simulating the experience, inserting your avatar at either a `Class.SpawnLocation` or coordinates of around `0, 100, 0`.
+ - **Play** – Starts simulating the experience, inserting your avatar at either a `Class.SpawnLocation` or coordinates of around **0, 100, 0**.
- **Play Here** – Starts simulating the experience, inserting your avatar in front of the camera's current position.
- **Run** – Starts simulating the experience without inserting your avatar. Instead, the simulation begins at the current camera position and you can navigate around using the Studio camera controls.
diff --git a/content/en-us/tutorials/curriculums/environmental-art/index.md b/content/en-us/tutorials/curriculums/environmental-art/index.md
index a34089470..fc55dfbac 100644
--- a/content/en-us/tutorials/curriculums/environmental-art/index.md
+++ b/content/en-us/tutorials/curriculums/environmental-art/index.md
@@ -1,5 +1,5 @@
---
-title: Environmental art curriculum
+title: Environmental Art Curriculum
description: //
next: /tutorials/curriculums/environmental-art/greybox-your-environment
hideInPageNavigation: true
@@ -44,7 +44,7 @@ learning how to build an environment, try the [core curriculum](../core/index.md
- Chapter 1 - Greybox your environment
+ Chapter 1 - Greybox Your Environment
@@ -67,7 +67,7 @@ experience gameplay before investing time into polishing assets.
- Chapter 2 - Develop polished assets
+ Chapter 2 - Develop Polished Assets
@@ -89,7 +89,7 @@ experience gameplay before investing time into polishing assets.
- Chapter 3 - Assemble an asset library
+ Chapter 3 - Assemble an Asset Library
@@ -111,7 +111,7 @@ experience gameplay before investing time into polishing assets.
- Chapter 4 - Construct your world
+ Chapter 4 - Construct Your World
@@ -133,7 +133,7 @@ experience gameplay before investing time into polishing assets.
- Chapter 5 - Optimize your experience
+ Chapter 5 - Optimize Your Experience
diff --git a/content/en-us/tutorials/curriculums/environmental-art/optimize-your-experience.md b/content/en-us/tutorials/curriculums/environmental-art/optimize-your-experience.md
index 3074f14aa..9d90c258c 100644
--- a/content/en-us/tutorials/curriculums/environmental-art/optimize-your-experience.md
+++ b/content/en-us/tutorials/curriculums/environmental-art/optimize-your-experience.md
@@ -1,5 +1,5 @@
---
-title: Optimize your experience
+title: Optimize Your Experience
description: Explains how to configure your assets and Studio settings to improve frame rate and performance levels.
prev: /tutorials/curriculums/environmental-art/construct-your-world
---
@@ -13,15 +13,15 @@ prev: /tutorials/curriculums/environmental-art/construct-your-world
Using the [Environment Art - Optimizing](https://www.roblox.com/games/14447845297/Environment-Art-Optimizing) `.rbxl` file as a reference, this section of the environmental art curriculum shows you how to review and configure your place file for optimal graphics, including guidance on:
- Reviewing the physics and rendering parameters of each asset to confirm they preserve memory and engine performance.
-- Culling excess texture, geometry, or transparencies that unnecessarily increase the amount of calculations the Roblox Engine must perform to render your assets.
+- Culling excess texture, geometry, or transparencies that unnecessarily increase the amount of calculations the Roblox engine must perform to render your assets.
-While the Roblox Engine handles most optimization work for you, you can assist in these optimization efforts by utilizing the [Microprofiler](../../../studio/microprofiler/index.md) to see where it takes more time to render specific frames. Using this information, you can make informed decisions about what assets need your attention in regards to their parameters or excess content.
+While the Roblox engine handles most optimization work for you, you can assist in these optimization efforts by utilizing the [Microprofiler](../../../studio/microprofiler/index.md) to see where it takes more time to render specific frames. Using this information, you can make informed decisions about what assets need your attention in regards to their parameters or excess content.
-## Review physics and render parameters
+## Review Physics and Rendering Parameters
-In [Assemble an asset library](./assemble-an-asset-library.md), you learned how important it is to set physics and rendering parameters that allow your assets to retain their high visual quality across devices with memory and GPU limitations. However, it's common as you construct your environment to adjust these parameters according to an asset's contextual position and purpose within your experience. For example, much of the foliage in the final sample laser tag environment casts shadows despite a performance cost because it adds to the realism of the environment.
+In [Assemble an Asset Library](./assemble-an-asset-library.md), you learned how important it is to set physics and rendering parameters that allow your assets to retain their high visual quality across devices with memory and GPU limitations. However, it's common as you construct your environment to adjust these parameters according to an asset's contextual position and purpose within your experience. For example, much of the foliage in the final sample laser tag environment casts shadows despite a performance cost because it adds to the realism of the environment.
When you modify physics and rendering parameters, it's useful near the end of the development process to review all parameters to see where you can optimize a parameter while maintaining aesthetic goals and gameplay requirements. To illustrate, you can disable `Class.BasePart.CastShadow` property for the foliage near the edges of the gameplay area to save on performance without interfering with a user's gameplay or visual experience.
@@ -36,26 +36,26 @@ When you modify physics and rendering parameters, it's useful near the end of th
-## Cull nonessential content
+## Cull Nonessential Content
After you review your physics and rendering parameters, you can review the assets themselves to see where you can cull any nonessential content from the experience that doesn't affect your gameplay, such as identical textures with different assetIDs, complex geometry with a high vertice count, or transparencies that layer on top of each other depending on the camera view. The following sections detail what you can do to review this content, and why it helps optimization efforts.
-### Remove duplicate textures
+### Remove Duplicate Textures
-As you transition between developing your assets and constructing your environment, it's common to iterate over meshes or textures as you find what's necessary for your aesthetic goals or gameplay requirements. If you don't convert your assets into [packages](../../../projects/assets/packages.md), when you import these iterations into Studio, you're making unique assetIDs that the Roblox Engine needs to reference as it renders your assets within the environment.
+As you transition between developing your assets and constructing your environment, it's common to iterate over meshes or textures as you find what's necessary for your aesthetic goals or gameplay requirements. If you don't convert your assets into [packages](../../../projects/assets/packages.md), when you import these iterations into Studio, you're making unique assetIDs that the Roblox engine needs to reference as it renders your assets within the environment.
-For example, if you were to import the following two fire hydrant meshes into Studio separately, even if they are exactly the same in appearance, the Roblox Engine treats them as two objects with unique assetIDs. The more unique calls the engine needs to make, the more of an impact on memory and performance. For this reason, it's important to confirm when you're reusing an asset multiple times, each instance of that asset uses the same assetID so that the engine only needs to make a single call to render it repeatedly.
+For example, if you were to import the following two fire hydrant meshes into Studio separately, even if they are exactly the same in appearance, the Roblox engine treats them as two objects with unique assetIDs. The more unique calls the engine needs to make, the more of an impact on memory and performance. For this reason, it's important to confirm when you're reusing an asset multiple times, each instance of that asset uses the same assetID so that the engine only needs to make a single call to render it repeatedly.
-### Optimize geometry
+### Optimize Geometry
If you find that you need to make more adjustments to increase frame rate across devices, it's useful to see where you can optimize your geometry by either:
- Combining groups of meshes into a single asset.
- Decreasing the polygon count of assets with geometric complexity.
-Expanding on this first technique, every unique asset in your experience represents a draw call on the GPU in which it sends a signal to the GPU to call information in order for the Roblox Engine to render the asset correctly. The more unique assets you have, the more draw calls the system needs to make. For this reason, if you have a group of meshes that make up a larger component in your experience, you can group them together in third-party modeling tools to reduce the need for multiple draw calls.
+Expanding on this first technique, every unique asset in your experience represents a draw call on the GPU in which it sends a signal to the GPU to call information in order for the Roblox engine to render the asset correctly. The more unique assets you have, the more draw calls the system needs to make. For this reason, if you have a group of meshes that make up a larger component in your experience, you can group them together in third-party modeling tools to reduce the need for multiple draw calls.
To illustrate this point, the final sample laser tag environment parents multiple parts and meshes together to create the large towers outside of the building. If you were to combine all of these individual components together, you could make it a single asset with only one assetID, and reduce the number of draw calls from 8 to 1. However, it's important to note that this technique removes your ability to freely change the visual and physical characteristics of each component, such as its position or material.
@@ -66,12 +66,12 @@ For example, in the following image, the left tower remains multiple assets unde
Expanding on the second technique, assets with geometric complexity have more polygons, meaning they have more vertices that the engine needs to calculate as it renders their visual appearance. This means that assets with less complexity and fidelity are less costly to render, leading to an improvement in both performance and memory.
-If you choose to utilize this second technique, after you simplify your geometry in third-party tooling, it's important to remember to update your packages with the new import instead of creating a new assetID, otherwise the Roblox Engine needs to make two separate calls for each assetID.
+If you choose to utilize this second technique, after you simplify your geometry in third-party tooling, it's important to remember to update your packages with the new import instead of creating a new assetID, otherwise the Roblox engine needs to make two separate calls for each assetID.
-### Delete layered transparencies
+### Delete Layered Transparencies
-To provide a sense of realism to the environment, the final sample laser tag environment includes many meshes with varying levels of transparency, such as the foliage in the outdoor space, glass on the futuristic signage or planter railing. When the camera views multiple semi-transparent objects that are in front or behind each other, the Roblox Engine must render the overlapping pixels multiple times to account for the
+To provide a sense of realism to the environment, the final sample laser tag environment includes many meshes with varying levels of transparency, such as the foliage in the outdoor space, glass on the futuristic signage or planter railing. When the camera views multiple semi-transparent objects that are in front or behind each other, the Roblox engine must render the overlapping pixels multiple times to account for the
transparent areas. This process is called high transparency overdraw, and it comes at a significant impact to performance.
For example, consider the following view of a planter in the sample environment. The engine must render the transparent areas of the leaves between the plant closest to the camera to the plant closest to the outdoor area in layers, equating to hundreds of thousands of overdrawn pixels. To alleviate some of this impact, it's important to review the layout of all semi-transparent objects in your environment, and ensure there aren't too many places where there are many layers of overlap, especially in large areas of the screen.
diff --git a/content/en-us/tutorials/curriculums/gameplay-scripting/add-rounds.md b/content/en-us/tutorials/curriculums/gameplay-scripting/adding-rounds.md
similarity index 98%
rename from content/en-us/tutorials/curriculums/gameplay-scripting/add-rounds.md
rename to content/en-us/tutorials/curriculums/gameplay-scripting/adding-rounds.md
index ee9b6c474..90d56dc84 100644
--- a/content/en-us/tutorials/curriculums/gameplay-scripting/add-rounds.md
+++ b/content/en-us/tutorials/curriculums/gameplay-scripting/adding-rounds.md
@@ -1,7 +1,7 @@
---
-title: Add rounds
+title: Adding Rounds
description: Explains how to implement round-based behavior.
-next: /tutorials/curriculums/gameplay-scripting/implement-blasters
+next: /tutorials/curriculums/gameplay-scripting/implementing-blasters
prev: /tutorials/curriculums/gameplay-scripting/spawn-respawn
---
@@ -19,7 +19,7 @@ After you complete this section, you will learn how to implement blaster behavio
-## Start loop
+## Start Loop
**ServerScriptService** > **Gameplay** > **Rounds** handles most of the logic for implementing rounds, and it starts by calling the `startRoundLoopAsync()` function to mark the beginning of a round loop. While players join the lobby and wait to sort into a team, `startRoundLoopAsync()` calls the `resetScores()` function in **ServerScriptService** > **Gameplay** > **Scoring** to reset both the leaderboard and team points.
@@ -52,7 +52,7 @@ For any new players that join the experience after the lobby group was sorts int
end)
```
-## Set objective
+## Set Objective
Now that each player is in the arena with their teammates, the experience needs to provide instructions for what to do to be successful within the round. The sample laser tag experience tackles this requirement by providing an objective prompt at the top of each player's screen with clear guidance on what the team needs to do to win.
@@ -85,7 +85,7 @@ local function setObjective(gui: ScreenGui)
end
```
-## Track points
+## Track Points
Now that players have a goal for the round, the experience needs to keep track of each team's points until they meet their objective. While the `Class.Teams` service's default behavior automatically groups each player underneath their team and adds up each player's contributions to their team score, it's important to store and monitor points in a separate location for round-based gameplay because if a player scores then leaves before the round is over, their contribution is deducted from the leaderboard as soon as they disconnect from the experience.
@@ -160,7 +160,7 @@ function Scoring.incrementScore(player: Player, amount: number)
end
```
-## Display results
+## Display Results
As players tag each other and score points for their team, **ServerScriptService** > **Gameplay** > **Rounds** checks to see if the team that scored met the round objective. If their team score is lower than the `TEAM_SCORE_LIMIT` variable in **ReplicatedStorage** > **TEAM_SCORE_LIMIT**, the server continues to wait until one of the teams scores again.
@@ -218,7 +218,7 @@ local function onRoundWinner(winner: Team, localTeam: Team?)
end
```
-## Reset teams
+## Reset Teams
At the same time that **ServerScriptService** > **Gameplay** > **Rounds** verifies that a team met the round objective and triggers the appropriate UI display for each player, it also transports all players from the arena to the lobby by disconnecting them from the round. This starts the process of formally ending the round and resetting both teams.
diff --git a/content/en-us/tutorials/curriculums/gameplay-scripting/create-teams.md b/content/en-us/tutorials/curriculums/gameplay-scripting/creating-teams.md
similarity index 99%
rename from content/en-us/tutorials/curriculums/gameplay-scripting/create-teams.md
rename to content/en-us/tutorials/curriculums/gameplay-scripting/creating-teams.md
index 3becc9a85..daa1a8abd 100644
--- a/content/en-us/tutorials/curriculums/gameplay-scripting/create-teams.md
+++ b/content/en-us/tutorials/curriculums/gameplay-scripting/creating-teams.md
@@ -1,5 +1,5 @@
---
-title: Create teams
+title: Creating Teams
description: Explains how separate players into teams as they join an experience.
prev: /tutorials/curriculums/gameplay-scripting/
next: /tutorials/curriculums/gameplay-scripting/spawn-respawn
@@ -17,7 +17,7 @@ After you complete this section, you will learn about the scripts that allow pla
-## Assign team colors
+## Assign Team Colors
The sample laser tag experience uses the `Class.Teams` service as a basis for creating two teams because the service offers built-in team sorting behavior that broadly works out-of-the-box. For example, without any additional scripting effort, the service handles actions like:
@@ -130,7 +130,7 @@ end
-## Display team indicators
+## Display Team Indicators
Once a player is sorted into a team, they need to be able to quickly decipher what team they belong to, and differentiate between their allies and enemy team members. This ability is important because the gameplay of a first-person shooter experience requires players to make quick strategic decisions while they're in combat zones so that they don't get tagged out and lose the round.
@@ -167,7 +167,7 @@ To set players up for success, the sample laser tag experience provides multiple
You don't need to do any additional work for the Leaderboard Indicator or Name Tint outside of assigning team colors from the previous section of the tutorial, but the custom UI team indicators require more programming effort to both display the indicators and occlude enemy indicators when they are behind walls. For a full explanation of the scripts that control the custom UI behavior, as well as how to implement each UI element itself, see [Player Indicator](../user-interface-design/implement-designs-in-studio.md#player-indicator) and [Team Indicator](../user-interface-design/implement-designs-in-studio.md#team-indicator) from the UI Curriculum.
-## Disable friendly fire
+## Disable Friendly Fire
While some first-person shooter experiences penalize players who blast their own teammates, the sample laser tag experience allows for more forgiving gameplay by disabling friendly fire. This design decision allows everyone to only increase their team score, not subtract from it due to gameplay accidents.
diff --git a/content/en-us/tutorials/curriculums/gameplay-scripting/detect-hits.md b/content/en-us/tutorials/curriculums/gameplay-scripting/detecting-hits.md
similarity index 96%
rename from content/en-us/tutorials/curriculums/gameplay-scripting/detect-hits.md
rename to content/en-us/tutorials/curriculums/gameplay-scripting/detecting-hits.md
index e63c17683..cf8b2812f 100644
--- a/content/en-us/tutorials/curriculums/gameplay-scripting/detect-hits.md
+++ b/content/en-us/tutorials/curriculums/gameplay-scripting/detecting-hits.md
@@ -1,7 +1,7 @@
---
-title: Detect hits
+title: Detecting Hits
description: Explains how hit detection works in a laser tag experience.
-prev: /tutorials/curriculums/gameplay-scripting/implement-blasters
+prev: /tutorials/curriculums/gameplay-scripting/implementing-blasters
---
**Detecting hits** is the process of identifying when blasts collide with players, then reducing their health accordingly. At a high-level, you can think of this work as either:
@@ -20,7 +20,7 @@ Using the [sample laser tag experience](https://www.roblox.com/games/14817965191
After you complete this section, you can explore additional development topics to enhance your gameplay, such as audio, lighting, and special effects.
-## Get blast direction
+## Get Blast Direction
After a player blasts their blaster, **ReplicatedStorage** > **Blaster** > **attemptBlastClient** > **blastClient** > **generateBlastData** calls two functions to start the hit detection process: `rayDirections()` and `rayResults()`.
@@ -83,7 +83,7 @@ end -- new line
local rayResults = castLaserRay(localPlayer, currentCamera.CFrame.Position, rayDirections)
```
-## Cast rays
+## Cast Rays
`castLaserRay()`, the second function in **ReplicatedStorage** > **Blaster** > **attemptBlastClient** > **blastClient** > **generateBlastData**, performs the more complex operations within the script. It begins by specifying parameters so that it can make `Class.Workspace:Raycast()` calls for raycasting purposes. Raycasting is the process of sending out an invisible ray from a `Datatype.Vector3` point in a specific direction with a defined length, then checking its path to see where it intersects with other objects.
@@ -127,9 +127,9 @@ end
`Datatype.RaycastResult.Distance|Distance` isn't particularly interesting in this section's scripts, but you could utilize it in unique ways if you want blasters to inflict more damage at a close range. Similarly, this section's scripts don't consider `Datatype.RaycastResult.Material|Material`, but you could use material types to distinguish between an armored body and a set of weak points during damage calculations.
-## Validate the blast
+## Validate the Blast
-To prevent cheating, the previous chapter [Implementing Blasters](implement-blasters.md) explains how `blastClient` notifies the server of the blast using a `Class.RemoteEvent` so that it can verify all data that each client sends, such as whether or not they truly tagged another player with their blaster. This ray validation process occurs in **ServerScriptService** > **LaserBlastHandler** > **getValidatedBlastData** > **getValidatedRayResults**, and each check correlates to a nested module script:
+To prevent cheating, the previous chapter [Implementing Blasters](implementing-blasters.md) explains how `blastClient` notifies the server of the blast using a `Class.RemoteEvent` so that it can verify all data that each client sends, such as whether or not they truly tagged another player with their blaster. This ray validation process occurs in **ServerScriptService** > **LaserBlastHandler** > **getValidatedBlastData** > **getValidatedRayResults**, and each check correlates to a nested module script:
1. First, `getValidatedRayResults` calls `validateRayResult` to check that each entry in the `rayResults` table from the client is a `Datatype.CFrame` and a `Player` (or nil).
@@ -173,11 +173,11 @@ To prevent cheating, the previous chapter [Implementing Blasters](implement-blas
No anti-exploit strategy is comprehensive, but it's important to consider how malicious players may approach your experience so that you can put checks in place that the server can run to flag suspicious behavior.
-## Reduce player health
+## Reduce Player Health
After verifying that a player tagged another player, the final steps in completing the main gameplay loop in the sample laser tag experience are to reduce the tagged player's health, increment the leaderboard, and respawn the player back into the round.
-Starting with reducing the tagged player's health, [Spawning and respawning](spawn-respawn.md) covers the distinction between `Class.Player` and `Class.Player.Character`, specifically that a character is a `Class.Humanoid` model. `Class.Humanoid` models have a `Class.Humanoid.Health|Health` property with a default value of 100. Rather than implementing its own system, the sample laser tag experience uses this built-in property to keep track of how much damage a player needs before they are tagged out of the round.
+Starting with reducing the tagged player's health, [Spawning and Respawning](spawn-respawn.md) covers the distinction between `Class.Player` and `Class.Player.Character`, specifically that a character is a `Class.Humanoid` model. `Class.Humanoid` models have a `Class.Humanoid.Health|Health` property with a default value of 100. Rather than implementing its own system, the sample laser tag experience uses this built-in property to keep track of how much damage a player needs before they are tagged out of the round.
The experience stores damage values in the `damagePerHit` attribute of each blaster. For example, the blaster that blasts a single laser beam inflicts 10 points of damage, so it takes ten blasts with this blaster to tag out another player. To start the process of tagging a player out, `LaserBlastHandler` calls **ServerScriptService** > **LaserBlastHandler** > **processTaggedPlayers**, which checks the now-validated `rayResults` table for players and passes `damagePerHit` to `onPlayerTagged`.
diff --git a/content/en-us/tutorials/curriculums/gameplay-scripting/implement-blasters.md b/content/en-us/tutorials/curriculums/gameplay-scripting/implementing-blasters.md
similarity index 97%
rename from content/en-us/tutorials/curriculums/gameplay-scripting/implement-blasters.md
rename to content/en-us/tutorials/curriculums/gameplay-scripting/implementing-blasters.md
index e6e2a9a5a..6f268c33a 100644
--- a/content/en-us/tutorials/curriculums/gameplay-scripting/implement-blasters.md
+++ b/content/en-us/tutorials/curriculums/gameplay-scripting/implementing-blasters.md
@@ -1,8 +1,8 @@
---
-title: Implement blaster behavior
+title: Implementing Blaster Behavior
description: Explains end-to-end how a blast mechanic works in a laser tag experience.
-next: /tutorials/curriculums/gameplay-scripting/detect-hits
-prev: /tutorials/curriculums/gameplay-scripting/add-rounds
+next: /tutorials/curriculums/gameplay-scripting/detecting-hits
+prev: /tutorials/curriculums/gameplay-scripting/adding-rounds
---
**Implementing blaster behavior** is the process of programming a blast mechanic in first-person shooter experiences. While players can blast with a single click or press of a button, creating a satisfying and accurate blast behavior is important because it enhances players' enjoyment of the overall gameplay.
@@ -17,7 +17,7 @@ Using the [sample laser tag experience](https://www.roblox.com/games/14817965191
After you complete this section, you will learn about the scripts that allow the blaster to detect when its blasts collide with other players, then deduct the corresponding amount of health according to each blaster type.
-## Detect player input
+## Detect Player Input
The first step to implementing blaster behavior is to listen for when a player presses the blast button. The input type that players use to press the blast button depends on which device they're using to access the experience. For example, the sample laser tag experience supports mouse and keyboard controls, gamepads, and touch controls. You can see each of these input types in **ReplicatedStorage** > **UserInputHandler**.
@@ -43,7 +43,7 @@ local function onBlasterActivated(_actionName: string,
end
```
-## Check whether the player can blast
+## Check Whether the Player Can Blast
After `UserInputHandler` detects a button press or screen tap, it calls **ReplicatedStorage** > **Blaster** > **attemptBlastClient** to check whether the player can blast or not. Like most checks in the sample laser tag experience, it occurs twice: first on the client, then later on the server. `attemptBlastClient` then calls **ReplicatedStorage** > **Blaster** > **canLocalPlayerBlast** to perform a simple check of the `blasterStateClient` player attribute:
@@ -67,7 +67,7 @@ end
-## Generate blast data
+## Generate Blast Data
After verifying that the player's blaster is in the `Ready` state, `attemptBlastClient` calls **ReplicatedStorage** > **attemptBlastClient** > **blastClient**. The first step that `blastClient` takes is to set the `blasterStateClient` player attribute to `Blasting`, which avoids the same rapid fire case from earlier.
@@ -105,7 +105,7 @@ This function starts by using `getBlasterConfig` to retrieve the player's blaste
The function then uses `currentCamera.CFrame` as the point of origin for the blast, passing it to `getDirectionsForBlast`. At this point, the code is no longer about the blaster, it's about the laser beam, which you will learn more about in the [Detecting Hits](detecting-hits.md) section of the tutorial. Finally, after creating the `rayResults` table, `generateBlastData` has all the information it needs to return the blast data to `blastClient`.
-## Notify the server
+## Notify the Server
Once `blastClient` has complete data for the blast, it fires two events:
@@ -191,7 +191,7 @@ The server then does the following:
For more information on these server operations, see the [Detecting Hits](detecting-hits.md) section of the tutorial.
-## Reset the blaster
+## Reset the Blaster
In the sample laser tag experience, blasters use a heat mechanic. Rather than reloading after a set number of blasts, they need time to "cool down" between each blast. This same cooldown delay occurs on both the client (`blastClient`) and the server (`blastServer`), with the server acting as the source of truth.
diff --git a/content/en-us/tutorials/curriculums/gameplay-scripting/index.md b/content/en-us/tutorials/curriculums/gameplay-scripting/index.md
index e3dc770b6..69787ed91 100644
--- a/content/en-us/tutorials/curriculums/gameplay-scripting/index.md
+++ b/content/en-us/tutorials/curriculums/gameplay-scripting/index.md
@@ -1,7 +1,7 @@
---
-title: Gameplay scripting curriculum
+title: Gameplay Scripting Curriculum
description: //
-next: /tutorials/curriculums/gameplay-scripting/create-teams
+next: /tutorials/curriculums/gameplay-scripting/creating-teams
hideInPageNavigation: true
hideBreadcrumbs: true
---
@@ -39,10 +39,10 @@ data model, and the client-server relationship. If you need help learning how to
-Chapter 1 - Create teams
+Chapter 1 - Creating Teams
-Learn how to [sort players into teams](create-teams.md) when a round is active.
+Learn how to [sort players into teams](creating-teams.md) when a round is active.
@@ -50,7 +50,7 @@ Learn how to [sort players into teams](create-teams.md) when a round is active.
-Chapter 2 - Spawn and respawn
+Chapter 2 - Spawning and Respawning
Learn how to [trigger unique actions](spawn-respawn.md) when players spawn and respawn back into a round.
@@ -61,10 +61,10 @@ Learn how to [trigger unique actions](spawn-respawn.md) when players spawn and r
-Chapter 3 - Add rounds
+Chapter 3 - Adding Rounds
-Learn how to [implement rounds](add-rounds.md) that track points, display final results, and reset teams.
+Learn how to [implement rounds](adding-rounds.md) that track points, display final results, and reset teams.
@@ -72,10 +72,10 @@ Learn how to [implement rounds](add-rounds.md) that track points, display final
-Chapter 4 - Implement blasters
+Chapter 4 - Implementing Blasters
-Learn how to [script blast behavior](implement-blasters.md) for two different blaster types.
+Learn how to [script blast behavior](implementing-blasters.md) for two different blaster types.
@@ -83,10 +83,10 @@ Learn how to [script blast behavior](implement-blasters.md) for two different bl
-Chapter 5 - Detect hits
+Chapter 5 - Detecting Hits
-Learn how to [perform hit detection](detect-hits.md) from blast data, and allocate damage to reduce player health.
+Learn how to [perform hit detection](detecting-hits.md) from blast data, and allocate damage to reduce player health.
diff --git a/content/en-us/tutorials/curriculums/gameplay-scripting/spawn-respawn.md b/content/en-us/tutorials/curriculums/gameplay-scripting/spawn-respawn.md
index 28d1c8d58..d6594b70e 100644
--- a/content/en-us/tutorials/curriculums/gameplay-scripting/spawn-respawn.md
+++ b/content/en-us/tutorials/curriculums/gameplay-scripting/spawn-respawn.md
@@ -1,8 +1,8 @@
---
-title: Spawn and respawn
+title: Spawning and Respawning
description: Explains how spawning and respawning works in a laser tag experience.
-next: /tutorials/curriculums/gameplay-scripting/add-rounds
-prev: /tutorials/curriculums/gameplay-scripting/create-teams
+next: /tutorials/curriculums/gameplay-scripting/adding-rounds
+prev: /tutorials/curriculums/gameplay-scripting/creating-teams
---
**Spawning** is the process of creating an object or character in an experience, and **respawning** is the process of adding an object or character back into an experience after they meet a removal condition, such as a character's health reaching zero or falling off the map. Both processes are important because they ensure players are able to join your experience, and can continue playing to improve their skills.
@@ -18,11 +18,11 @@ Using the [sample laser tag experience](https://www.roblox.com/games/14817965191
This section includes plenty of scripting content, but instead of writing everything from scratch when creating an experience, it encourages you to leverage existing components, rapidly iterate, and figure out which systems need a custom implementation to match your vision. After you complete this section, you will learn how to implement round-based gameplay that tracks points, monitors player state, and displays round results.
-## Configure spawn locations
+## Configure Spawn Locations
If you were to playtest the experience right now, all players would randomly spawn at either the `Class.SpawnLocation` object in the green team's spawn zone, or the `Class.SpawnLocation` object in the pink team's spawn zone. This presents a gameplay issue where players could tag each other within each spawn zone as soon as their opponent's force field disappears.
-To combat this problem, the sample laser tag experience configures both spawn locations with a `Class.SpawnLocation.Neutral|Neutral` property set to **false** to restrict the opposing team's players from spawning in the wrong spawn zone, and a `Class.SpawnLocation.TeamColor|TeamColor` property set to the corresponding `Class.Team.Color` value from [Assign Team Colors](create-teams.md#assign-team-colors) in the previous section of the tutorial:
+To combat this problem, the sample laser tag experience configures both spawn locations with a `Class.SpawnLocation.Neutral|Neutral` property set to **false** to restrict the opposing team's players from spawning in the wrong spawn zone, and a `Class.SpawnLocation.TeamColor|TeamColor` property set to the corresponding `Class.Team.Color` value from [Assign Team Colors](creating-teams.md#assign-team-colors) in the previous section of the tutorial:
- **TeamASpawn** – The spawn location in the green team's spawn zone with a `Class.SpawnLocation.TeamColor|TeamColor` property set to **Mint**.
- **TeamBSpawn** – The spawn location in the pink team's spawn zone with a `Class.SpawnLocation.TeamColor|TeamColor` property set to **Carnation Pink**.
@@ -101,7 +101,7 @@ local function spawnPlayersInLobby(players: { Player })
end
```
-## Connect new players
+## Connect New Players
Luau code in Studio is often event-driven, meaning that scripts listen for events from a Roblox service, then call a function in response. For example, when adding new players to a multiplayer experience, there must be an event that handles everything necessary for players to connect successfully. In the sample laser tag experience, this corresponding event is `Players.PlayerAdded:Connect`.
@@ -199,7 +199,7 @@ end
If you add breakpoints or even just a `print()` statement, you can see that `onPlayerStateChanged()` gets called frequently throughout the experience: such as during initial setup of a round, to set itself on the main code path, after the player chooses a blaster, and when the player returns to the lobby, or the **Neutral** spawn location. Furthermore, after the player chooses a blaster, **ServerScriptService** > **BlasterSelectedHandler** sets the `PlayerState` to `Playing`, and `PlayerStateHandler` can finally remove the force field by calling `scheduleDestroyForceField()`.
-## Customize force fields
+## Customize Force Fields
Instead of using a custom implementation, the sample laser tag experience uses Studio's built-in `Class.ForceField` class to prevent players from taking damage while they're selecting their blaster. This ensures that the only requirement for players to spawn with a force field is to include spawn locations with a `Class.SpawnLocation.Duration` property that is greater than 0. The sample uses an arbitrary value of 9,999 to enable force fields, then handles the actual duration programmatically in **ReplicatedStorage** > **ForceFieldClientVisuals**.
@@ -275,7 +275,7 @@ end
To learn more about dealing with this type of situation, see [Debounce Patterns](../../../scripting/debounce.md).
-## Handle client state
+## Handle Client State
While most of this section focuses on **ServerScriptService** > **PlayerStateHandler**, there's another script of the same name in **ReplicatedStorage**. The reason for the split is the client-server architecture:
@@ -326,7 +326,7 @@ local function onPlaying()
end
```
-## Respawn characters
+## Respawn Characters
The sample laser tag experience handles respawning character back into a round through the `onTaggedOut()` state in **ReplicatedStorage** > **PlayerStateHandler**. Like the `onSelectingBlaster()` and `onPlaying()` state, `onTaggedOut()` triggers unique behavior according to the changes to the `playerState` attribute. Specifically, it disables player movement, presents the respawn UI, and disables the blaster.
@@ -368,7 +368,7 @@ Players.RespawnTime = 10 -- new line, in seconds
In an experience with a progression system, such as checkpoints, you can use `Class.Player.RespawnLocation` to specify an exact location for players to respawn to after their health reaches zero.
-## Miscellaneous setup
+## Miscellaneous Setup
As part of initial setup, the sample laser tag experience also performs some small, but critical steps:
@@ -376,6 +376,6 @@ As part of initial setup, the sample laser tag experience also performs some sma
- The experience uses a first-person camera by setting the `StarterPlayer.CameraMode.LockFirstPerson` property. Note that if you want to let users change between first- and third-person cameras, you must change the property programmatically rather than just setting it once in Studio, and modify the controls and UI to compensate for the change in perspective.
-- The experience uses the built-in Roblox leaderboard with the unit of "points", which players earn each time they tag another player out. You can see the configuration in **ServerScriptService** > **SetupLeaderboard**, but [In-Experience Leaderboards](../../../players/leaderboards.md) offers a full overview. Note that `onPlayerTagged` adds points to the leaderboard, which you'll learn about in [Add rounds](add-rounds.md) and [Detect hits](detect-hits.md).
+- The experience uses the built-in Roblox leaderboard with the unit of "points", which players earn each time they tag another player out. You can see the configuration in **ServerScriptService** > **SetupLeaderboard**, but [In-Experience Leaderboards](../../../players/leaderboards.md) offers a full overview. Note that `onPlayerTagged` adds points to the leaderboard, which you'll learn about in [Adding Rounds](adding-rounds.md) and [Detecting Hits](detecting-hits.md).
Now that players can spawn, choose a blaster, and aim it from a first-person point of view, the next section teaches you about the scripts behind creating round-based gameplay.
diff --git a/content/en-us/tutorials/curriculums/user-interface-design/choose-an-art-style.md b/content/en-us/tutorials/curriculums/user-interface-design/choose-an-art-style.md
index 1ca298b4d..9bc7fbb83 100644
--- a/content/en-us/tutorials/curriculums/user-interface-design/choose-an-art-style.md
+++ b/content/en-us/tutorials/curriculums/user-interface-design/choose-an-art-style.md
@@ -1,5 +1,5 @@
---
-title: Choose an art style
+title: Choose an Art Style
description: Explains how to greybox the laser tag environment using basic parts.
next: /tutorials/curriculums/user-interface-design/wireframe-your-layouts
prev: /tutorials/curriculums/user-interface-design/
@@ -19,7 +19,7 @@ After you complete this section, you will learn how to design the structure and
-## Identify your UI elements
+## Identify Your UI Elements
The first step in choosing an art style for your UI is to identify what UI elements you need for the varying types of information you want to communicate to your audience. Doing this work at the start of your design process is crucial because it allows you to categorize UI elements by their functional purpose, make semantic decisions according to where and when players are going to interact with each UI element, and plan where you can reuse UI elements across your experience.
@@ -71,7 +71,7 @@ After you sort your experience's UI needs into categories, you can create a list
Now that you have a list of UI elements for your experience, it's time to begin making stylistic and semantic choices for each grouping of UI elements, starting with a color theme.
-## Select a color theme
+## Select a Color Theme
A **color theme**, or color palette, is a selection of colors that each communicate a message through consistent application within your experience, such as using a bright color to indicate when something is selectable. Applying a color theme to your UI elements is important, especially when you rely on color conventions within the genre of your experience, because it allows players to quickly understand your UI with minimal effort.
@@ -107,7 +107,7 @@ To highlight the guidance in the last point, the sample laser tag experience uti
-## Outline simple icons
+## Outline Simple Icons
An **icon** is a symbol that represents an action, object, or concept in an experience. Outlining icons that are simple and intuitive is important because the end result enables players to easily recognize what they are able to do and what you want to tell them through your UI without using text, which can clutter the screen and pull attention away from content that matters. This process is even more crucial if your audience accesses your experience using a small screen on mobile devices.
@@ -143,7 +143,7 @@ When outlining simple icons for your own experience, consider the following:
If you don't know what types of icons are common within your experience's genre, check out the [Game UI Database](https://gameuidatabase.com/). This free resource tool for UI designers includes screenshots from hundreds of games of different genres that you can reference during your design process.
-## Establish an interaction order
+## Establish an Interaction Order
An **interaction order** is the sequence of interactions players can have with your UI. As there are often multiple interactable UI elements on the screen, it's important to establish an intuitive interaction order to assist players in making decisions as they navigate various workflows.
@@ -178,7 +178,7 @@ When establishing an interaction order for the workflows in your own experience,
In [Implement in Studio](implement-designs-in-Studio.md), you will learn how to use `Class.UIAspectRatioConstraint` objects to ensure UI elements maintain a specific aspect ratio no matter what device players use to access your experience. In addition to making your design process easier, this technique can also help you meet the Web Content Accessibility Guidelines' [Touch Target Size and Spacing](https://w3c.github.io/Mobile-A11y-TF-Note/#targetSize) recommendation to create a touch zone for interactive UI elements that's at least 9x9 mm on mobile devices.
-## Determine a text system
+## Determine a Text System
A **text system** is a set of rules about fonts and style for all of the words in your UI, such as "always bold headers" or "use green font when referencing a health stat." Determining a text system early into your design process allows you to have a structure that you can consistently apply throughout your experience so players know what to expect as they search for the information they need.
diff --git a/content/en-us/tutorials/curriculums/user-interface-design/implement-designs-in-studio.md b/content/en-us/tutorials/curriculums/user-interface-design/implement-designs-in-studio.md
index 710e1eea4..ccb295020 100644
--- a/content/en-us/tutorials/curriculums/user-interface-design/implement-designs-in-studio.md
+++ b/content/en-us/tutorials/curriculums/user-interface-design/implement-designs-in-studio.md
@@ -1,5 +1,5 @@
---
-title: Implement designs in Studio
+title: Implement Designs in Studio
description: Explains how to greybox the laser tag environment using basic parts.
prev: /tutorials/curriculums/user-interface-design/wireframe-your-layouts
---
@@ -18,7 +18,7 @@ After you review the techniques in this section, you can apply them to your own
The instructions in this section of the tutorial show you how to exactly recreate the UI components using the UI Design Asset Library. This process takes about 90 minutes or less from start to finish. If you don't want to use the provided values, you can adjust each UI element to meet the specifications of your own experience, or use the sample itself for the rest of the tutorial.
-## Get asset library
+## Get Asset Library
Asset libraries are collections of assets you can add into your inventory for easy access and reuse. The asset library you will use for your project from the [Creator Store](../../../production/creator-store.md) includes nine 2D individual UI element assets, and the final versions of the objective, blaster selector, and player info components you are creating in this section of the tutorial.
@@ -115,7 +115,7 @@ To get the asset library from your inventory into your experience:
1. Click the dropdown menu, then select the **My Packages** sort.
1. Click the **Final Screen UI Components** tile, then in the **Explorer** window, select **Completed Components**, then drag them into the **StarterGui** service. You can now enable any of the final components to reference their design.
-## Emulate devices
+## Emulate Devices
Studio's **Device Emulator** allows you to test how players will see and interact with your UI on various devices. This tool is a vital part of the implementation process because the aspect ratio of your viewport in Studio doesn't necessarily reflect the aspect ratio of the screens players use to access your experience, and it's important that your UI is both legible and accessible on every device.
@@ -136,7 +136,7 @@ To emulate your screen to the smallest screen size:
-## Create ScreenGui objects
+## Create ScreenGui Objects
To display UI elements on every player's screen, you can create a `Class.ScreenGui` object in the `Class.StarterGui` service. `Class.ScreenGui` objects are the primary containers for on-screen UI, and the `Class.StarterGui` service copies its contents to each player's `Class.PlayerGui` container as they enter an experience.
@@ -485,7 +485,7 @@ To exactly recreate the crosshair within the sample [Laser Tag](https://www.robl
1. **(Optional)** Insert a **UIAspectRatioConstraint** into **Crosshair** to ensure the label's aspect ratio remains the same no matter the player's screen size. The sample sets its `Class.UIAspectRatioConstraint.AspectRatio` property to **0.895**.
-#### Hit marker
+#### Hit Marker
A hit marker is a UI element that only displays when a blast makes impact with another player on the enemy team. Like the crosshair, this UI element is a vital gameplay requirement for first-person shooter experiences because it provides visual feedback of when players are successful in tagging out their opponents.
@@ -584,7 +584,7 @@ return setupHitmarker
Now, whenever a player blasts their blaster and the blast makes impact with another player, the hit marker momentarilly displays.
-#### Blaster selector
+#### Blaster Selector
A blaster selector is a UI component that players use to select their blaster type before joining or rejoining a round. The sample laser tag experience provides two types of blasters: one that produces several beams with a wide, horizontal spread, and another that produces a single beam. The type of blaster that players select influences their strategy during the round, making this UI component an essential workflow for the overall experience.
@@ -1001,7 +1001,7 @@ return setupNavButtons
Now, whenever a player joins the experience or respawns back into a round after their health reaches zero, the blaster selector UI displays, they can make a selection, and each button functions as expected.
-#### Blast button
+#### Blast Button
A blast button is a UI component that players use to blast their blaster if they are accessing the experience through a mobile or tablet device. The sample laser tag experience uses a blaster button with an icon that depicts both a crosshair and a blast to communicate the button's function without text.
@@ -1162,7 +1162,7 @@ Following the visual hierarchy best practices from [Wireframe Your Layouts](wire
-#### Player indicator
+#### Player Indicator
A player indicator is a UI component that players reference to quickly decipher what team they belong to as soon as they spawn into their team's spawn zone. The sample laser tag experience provides two versions of the player indicator depending on if the player is on the **green** or **pink** team.
@@ -1406,7 +1406,7 @@ return setPlayerName
Now, whenever a player joins or rejoins the round after respawning, the player indicator displays on the bottom-left of their screen.
-#### Force field screen
+#### Force Field Screen
A force field screen is a UI element that overlays the viewport to inform players they're safe from enemy team fire while joining or rejoining a round. Following the aesthetic guidelines for icons from [Choose an Art Style](./choose-an-art-style.md), the sample laser tag experience utilizes a semi-transparent hexagonal pattern to symbolize a force field. This design decision not only reinforces the overall futuristic art style for all UI in the experience, but it also communicates the player's state without any text or additional guidance.
@@ -1603,7 +1603,7 @@ return scheduleDestroyForceField
Now, whenever a player joins or rejoins the round after respawning, the new force field screen UI displays instead of the default first-person `Class.ForceField` visuals.
-#### Respawn screen
+#### Respawn Screen
A respawn screen is a UI element that dims the viewport to inform players that they have been tagged out, and that the server is in the process of respawning them back to their spawn zone. This UI element is important because it gives players time to process that they've been tagged out, and strategize their next move before they rejoin the active round.
@@ -1828,7 +1828,7 @@ Now, whenever a player's health reaches zero, the respawn screen displays until
Now that you are familiar with common `Class.GuiObject|GuiObjects` for on-screen UI, try to recreate the **RoundResultsGui** `Class.ScreenGui` object and all of its children for the on-screen display when players win or lose a match. You can use the [sample laser tag experience](https://www.roblox.com/games/14817965191/Laser-Tag-1A) `.rbxl` file as a reference, or adjust the values to meet the gameplay requirements of your own experience.
-## Create SurfaceGui objects
+## Create SurfaceGui Objects
To display UI on a part's surface in the 3D space that responds to scripting logic for **each individual player**, you can parent a `Class.SurfaceGui` object to the part that you want to display your UI within the `Class.ReplicatedStorage` service. This technique ensures your UI and its scripting logic are available to both the server and each player's client.
@@ -1844,7 +1844,7 @@ To create a `Class.SurfaceGui` object:
-### Cooldown meter
+### Cooldown Meter
A cooldown meter is a UI component that informs players how long they have to wait before they're able to blast their blaster again. This slight pause prevents players from being able to blast as quickly as they can click or press a button, which is unrealistic for laser tag gameplay.
@@ -2079,7 +2079,7 @@ return runCooldownBarEffect
Now, whenever a player blasts their blaster, the cooldown bar animates to communicate when the player can blast again.
-## Create BillboardGui objects
+## Create BillboardGui Objects
In order to display UI elements within the 3D space that respond to scripting logic and always face each player's camera regardless of their viewing angle, such as player names or map markers, you can create a `Class.BillboardGui` object as a child of a `Class.BasePart` or `Class.Attachment` that exists in the 3D space.
@@ -2097,7 +2097,7 @@ To create a `Class.BillboardGui` object:
1. Rename the **BillboardGui** according to the context of its child UI elements.
1. Repeat this process for every UI element you need to contextually display above players' heads.
-### Team indicator
+### Team Indicator
A team indicator is a UI element that informs players which team other players in the round belong to so that they can easily differentiate between their allies and enemy team members. This information is important because the gameplay of a first-person shooter experience requires players to make quick strategic decisions while they're in combat zones so that they don't get tagged out and lose the match.
@@ -2277,7 +2277,7 @@ onLocalTeamChanged()
Now, whenever a player's is in an active round, team indicators display over other players' heads unless they are on the enemy team and behind an object.
-### Tagged out indicator
+### Tagged Out Indicator
A tagged out indicator is a UI element that informs players when other players are no longer active in the round and are in the process of respawning back to their spawn zone. This information is important because the gameplay of a first-person shooter experience requires players to move onto their next target as soon as they tag out a player so that they don't become vulnerable in the arena by playing in the same location for too long.
diff --git a/content/en-us/tutorials/curriculums/user-interface-design/index.md b/content/en-us/tutorials/curriculums/user-interface-design/index.md
index 272b11c2c..eacd70b4d 100644
--- a/content/en-us/tutorials/curriculums/user-interface-design/index.md
+++ b/content/en-us/tutorials/curriculums/user-interface-design/index.md
@@ -1,5 +1,5 @@
---
-title: User inferface design curriculum
+title: User Inferface Design Curriculum
description: //
next: /tutorials/curriculums/user-interface-design/choose-an-art-style
hideInPageNavigation: true
@@ -39,7 +39,7 @@ learning how to build an environment and navigating Studio's UI, try the [core c
- Chapter 1 - Choose an art style
+ Chapter 1 - Choose an Art Style
@@ -52,7 +52,7 @@ learning how to build an environment and navigating Studio's UI, try the [core c
- Chapter 2 - Wireframe your layouts
+ Chapter 2 - Wireframe Your Layouts
@@ -65,7 +65,7 @@ learning how to build an environment and navigating Studio's UI, try the [core c
- Chapter 3 - Implement designs in Studio
+ Chapter 3 - Implement Designs in Studio
diff --git a/content/en-us/tutorials/curriculums/user-interface-design/wireframe-your-layouts.md b/content/en-us/tutorials/curriculums/user-interface-design/wireframe-your-layouts.md
index 3aee0154f..8a42273a5 100644
--- a/content/en-us/tutorials/curriculums/user-interface-design/wireframe-your-layouts.md
+++ b/content/en-us/tutorials/curriculums/user-interface-design/wireframe-your-layouts.md
@@ -1,5 +1,5 @@
---
-title: Wireframe your layouts
+title: Wireframe Your Layouts
description: Explains how to greybox the laser tag environment using basic parts.
next: /tutorials/curriculums/user-interface-design/implement-designs-in-studio
prev: /tutorials/curriculums/user-interface-design/choose-an-art-style
@@ -15,7 +15,7 @@ Using the [sample laser tag experience](https://www.roblox.com/games/14817965191
After you complete this section, you will learn how to construct and configure your UI in Studio that respects your art style and wireframes.
-## Plan a visual hierarchy
+## Plan a Visual Hierarchy
A visual hierarchy is an organization structure that highlights UI elements by their order of importance. Planning a visual hierarchy for the different workflows in your experience is important because it sets players up for success in accomplishing their goals, which is especially necessary for the rapid gameplay of first-person shooter experiences in which goals change from moment to moment.
@@ -76,7 +76,7 @@ For a full review of the visual hierarchy for the sample laser tag experience, s
For more information on prioritizing UI elements on the screen, see [UI & UX Design](../../../production/game-design/ui-ux-design.md#prioritization).
-## Block in UI elements
+## Block in UI Elements
Now that you have a visual hierarchy in mind, you can block in individual UI elements using basic shapes to review the composition of your custom UI layout alongside Roblox's core UI on multiple devices. This process allows you to see where you need to modify your design so that it's effective on all screen sizes that players can use to access your experience, such as on mobile, tablet, laptop, and TV screens.
@@ -134,7 +134,7 @@ When blocking in UI elements for your layouts, consider the following:
For more information on what to consider as you design and block in your UI elements for multiple devices, see [Positioning and Sizing - Cross-Platform Factors](../../../ui/positioning-and-sizing.md#cross-platform-factors).
-## Develop user flows
+## Develop User Flows
A user flow is a collection of paths that players can take in an experience to complete a task, such as to choose a weapon, purchase an item, or heal a character. User flows typically start where you expect players to begin the task, and finish with the final action or achievement players reach at the end of the task. In addition, effective user flows also account for unusual paths players may want to take on their own to achieve the same goal.
diff --git a/content/en-us/tutorials/first-experience/index.md b/content/en-us/tutorials/first-experience/index.md
index 3a4080b96..74f3fec30 100644
--- a/content/en-us/tutorials/first-experience/index.md
+++ b/content/en-us/tutorials/first-experience/index.md
@@ -1,5 +1,5 @@
---
-title: Create your first experience
+title: Creating Your First Experience
description: Explains the process of creating your first experience in Roblox Studio.
---
@@ -9,14 +9,14 @@ Using a sample [high-quality catapult](https://create.roblox.com/store/asset/172
- Building and organizing a data model for a single place using one of Studio's project templates.
- Customizing both primitive and complex 3D objects from the Creator Store with unique properties for your own gameplay requirements.
-- Organizing and placing scripts in their proper locations so the Roblox Engine can properly simulate and render gameplay.
+- Organizing and placing scripts in their proper locations so the Roblox engine can properly simulate and render gameplay.
- Playtesting and publishing your creation to a global audience that accesses the platform using a variety of devices.
-After you complete this process, you can learn how to recreate a simple 3D platformer experience with the [Core curriculum](../curriculums/core/index.md), experiment with different use case tutorials, or start making your own projects.
+After you complete this process, you can learn how to recreate a simple 3D platformer experience with the [core curriculum](../curriculums/core/index.md), experiment with different use case tutorials, or start making your own projects.
-## Create a project
+## Create a Project
A **project** is a collection of assets, settings, and other resources that together represent an experience. All projects start with a single **place** that players load into when they join an experience, but you can create additional places within that same experience to organize assets for different gameplay areas. For example, if you want players to join a dungeon before teleporting to either a vast desert or spooky island, you can organize the assets for each area into their own place.
@@ -75,7 +75,7 @@ To open a project with the Baseplate template:
-## Get asset pack
+## Get Asset Pack
Now that you have a project open, you can add additional 3D objects to the data model aside from the spawn location and baseplate. Studio represents 3D objects as `Class.BasePart` objects that render with physical simulation in the 3D space, and emulate real-world physical behavior like gravity, friction, and force.
@@ -109,8 +109,6 @@ To insert this tutorial's asset pack from the Creator Store to your Studio inven
-
-
To get this asset pack from your inventory into your experience:
1. In the menu bar, select the **View** tab.
@@ -126,9 +124,9 @@ To get this asset pack from your inventory into your experience:
-## Customize targets
+## Customize Targets
-When you add a 3D object into your experience, Studio updates the **Explorer** window to display the name of the object and a nest of its children within the `Class.Workspace` service. For example, after you add the catapult model into your viewport, the Explorer window displays the **IntrotoStudioCatapult** folder and its child assets alongside the spawn location and baseplate.
+When you add a 3D object into your experience, Studio updates the **Explorer window** to display the name of the object and a nest of its children within the `Class.Workspace` service. For example, after you add the catapult model into your viewport, the Explorer window displays the **IntrotoStudioCatapult** folder and its child assets alongside the spawn location and baseplate.
@@ -140,7 +138,7 @@ When you add a 3D object into your experience, Studio updates the **Explorer** w
The Explorer window is a fundamental Studio window that represents the data model for the place in your experience that you have open. This means that if you have an experience with multiple places, this window displays different objects depending on the place you're currently working on.
-When you select an object in the Explorer window, Studio updates the **Properties** window to display a selection of properties you can customize for that object without using a script, such as the object's size, color, position, or orientation. To demonstrate this process, this section of the tutorial provides guidance on customizing the visual and behavioral characteristics of the gray targets on the floating platforms.
+When you select an object in the Explorer window, Studio updates the **Properties window** to display a selection of properties you can customize for that object without using a script, such as the object's size, color, position, or orientation. To demonstrate this process, this section of the tutorial provides guidance on customizing the visual and behavioral characteristics of the gray targets on the floating platforms.
To customize your targets:
@@ -166,9 +164,9 @@ To customize your targets:
-## Organize scripts
+## Organize Scripts
-While you have a lot of flexibility in how you organize data models within your projects, the Roblox Engine expects certain objects to be in specific **container services** for simulation and rendering functionality to work properly between the server and the client. The **server** refers to a Roblox computer that acts as the ultimate authority for maintaining the experience's state, and it keeps all connected **clients**, or player devices like mobile phones and laptops, in sync with its source of truth.
+While you have a lot of flexibility in how you organize data models within your projects, the Roblox engine expects certain objects to be in specific **container services** for simulation and rendering functionality to work properly between the server and the client. The **server** refers to a Roblox computer that acts as the ultimate authority for maintaining the experience's state, and it keeps all connected **clients**, or player devices like mobile phones and laptops, in sync with its source of truth.
@@ -242,7 +240,7 @@ To organize folders into their correct container services for the catapult to wo
-## Customize projectiles
+## Customize Projectiles
While your projectiles are exactly the same size as each other, they travel different distances when you launch them from the catapult. This is because each projectile has a unique **material** that emulates the physical characteristics of its real-world counterpart, including its density, elasticity, and friction.
@@ -280,7 +278,7 @@ To customize the third projectile:
-## Publish experience
+## Publish Experience
Roblox not only provides the tooling and engine for you to create and run experiences, it also gives you access to a large social network of players that access the platform on a wide array of devices, including phones, computers, tablets, consoles, and VR hardware. When you're ready to release your experience to this global audience, you must publish and configure the experience's settings so that it's available to all players on any device you want to support.
diff --git a/content/en-us/tutorials/fundamentals/coding-1/coding-fundamentals.md b/content/en-us/tutorials/fundamentals/coding-1/coding-fundamentals.md
index 35643c74f..9eea1206d 100644
--- a/content/en-us/tutorials/fundamentals/coding-1/coding-fundamentals.md
+++ b/content/en-us/tutorials/fundamentals/coding-1/coding-fundamentals.md
@@ -1,16 +1,16 @@
---
-title: Coding fundamentals
+title: Coding Fundamentals
description: Teaches the basics of coding with Lua.
next: /tutorials/fundamentals/coding-1/landing
---
-### Series description
+### Series Description
Start coding on Roblox with this easy-to-follow series covering the fundamentals of how to use the programming language Lua. These courses are perfect for those new to coding or just starting with Lua. Each course centers around a foundational computer science principle, and features individual lessons with step-by-step tutorials you can use to create your own experiences on Roblox.
Before beginning this course, the reader should have basic knowledge of Roblox Studio, as demonstrated in [Introduction to Studio](../../first-experience/index.md).
-### Series contents
+### Series Contents
@@ -21,11 +21,11 @@ Before beginning this course, the reader should have basic knowledge of Roblox S
-
[Variables and objects](../coding-1/landing.md)
+
[Variables and Objects](../coding-1/landing.md)
Create your first script and start making things happen with code. These tutorials cover variables, data types, and properties.
-
[Functions and events](../coding-2/functions-and-events.md)
+
[Functions and Events](../coding-2/functions-and-events.md)
Use functions to create chunks of code that run only when you tell it. Connect your code to in-world events to create interactive objects like traps or bridges.
@@ -37,11 +37,11 @@ Before beginning this course, the reader should have basic knowledge of Roblox S
Learn how to repeat code a certain amount of time or make it run forever using for and while loops. Practice using these loop types to code timed bridges and flashing lights.
-
[Dictionaries and arrays](../coding-5/landing.md)
+
[Dictionaries and Arrays](../coding-5/landing.md)
Learn how to store a lot of data in a single variable using tables and arrays. Data structures such as these can store large data sets like a player's inventory.
-
[Organize code](../coding-6/landing.md)
+
[Organizing Code](../coding-6/landing.md)
Take your code organization a step further and learn about module scripts, a unique type of script that can interact with other scripts in Roblox Lua.
diff --git a/content/en-us/tutorials/fundamentals/coding-1/create-a-script.md b/content/en-us/tutorials/fundamentals/coding-1/creating-a-script.md
similarity index 94%
rename from content/en-us/tutorials/fundamentals/coding-1/create-a-script.md
rename to content/en-us/tutorials/fundamentals/coding-1/creating-a-script.md
index 5b0ca5ccb..2bf2c2f20 100644
--- a/content/en-us/tutorials/fundamentals/coding-1/create-a-script.md
+++ b/content/en-us/tutorials/fundamentals/coding-1/creating-a-script.md
@@ -1,5 +1,5 @@
---
-title: Create a script
+title: Creating a Script
description: Learn how to create a script in Roblox Studio using Lua. Great for beginners interested in coding or computer science on Roblox.
next: /tutorials/fundamentals/coding-1/object-properties
prev: /tutorials/fundamentals/coding-1/landing
@@ -9,11 +9,11 @@ prev: /tutorials/fundamentals/coding-1/landing
This article will cover how to start coding in Roblox, introducing common concepts like scripts, data types, and variables. By the end, you'll be able to type out code that displays messages in Roblox Studio.
-## Code with scripts
+## Coding with Scripts
In Roblox Studio, lines of Lua code are held in **scripts**. These scripts give the game sets of instructions on how to give players health points, create a rain of fireballs, or anything else imaginable.
-### Create a script
+### Creating a Script
Scripts are commonly created in **ServerScriptService**, a special folder made just for holding scripts.
@@ -24,7 +24,7 @@ Scripts are commonly created in **ServerScriptService**, a special folder made j
3. Right-click Script and select **Rename**. Name the script _PracticeScript_. Naming scripts helps you and any teammates remember what each script does.
-### Hello world
+### Hello World
New scripts include a print function at the top of the script editor. **Print functions** display text on the screen. It's one of the first functions many people learn, and you'll use it often. This code will make "Hello world!" appear on the screen.
@@ -34,11 +34,11 @@ print("Hello world!")
To find the script next time you open up Roblox Studio, click on the name of the script above the game editor, or double-click the script's name in Explorer.
-### Test output
+### Testing Output
You can see the result of running the default code with the **Output** window. The Output window is typically at the bottom of Roblox Studio, but if you've never used it before, you may need to enable it.
-You'll need the Output Window throughout this course, so now is a good time to enable it if you haven't already.
+You'll need the Output window throughout this course, so now is a good time to enable it if you haven't already.
1. Select the **View** menu tab.
@@ -47,13 +47,13 @@ You'll need the Output Window throughout this course, so now is a good time to e
The window will appear at the bottom of Roblox Studio.
-3. To test the script, click **Play**. `Hello world!` will show up in the Output Window.
+3. To test the script, click **Play**. `Hello world!` will show up in the Output window.
4. Click **Stop** to end the playtest. You can now return to the Script tab.
-## Identify data types
+## Identifying Data Types
Coding languages classify different kinds of values into **data types**. For example, one data type is a **number**. Number data types are self-explanatory as they are made up of only numbers.
@@ -69,7 +69,7 @@ Strings like `"Hello World"` always sit inside quotation marks, `"like this"`. M
- `"There are 50 players left"`
- `"10"`
-## Create variables
+## Creating Variables
**Variables** are containers for information the program can use and change, like player names or points.
@@ -81,7 +81,7 @@ When declaring new variables, some coding languages require that you also state
In Lua, variables can be global or local. You'll usually use **local** variables. Local variables can only be used within the script or chunk of code where they were created. Global variables can potentially be used by other scripts, but too many global variables can make your experience slow and unresponsive. It's better to stay in the habit of making variables local unless necessary.
-### Use variables and strings together
+### Using Variables and Strings Together
Time to declare your own variables. These steps will use a string to store the name of your favorite animal.
@@ -97,7 +97,7 @@ Time to declare your own variables. These steps will use a string to store the n
Variable names can't include spaces. Be careful not to include spaces or the code won't work as intended.
-### Name variables
+### Naming Variables
Variables can be named anything, but good names will always describe their purpose. Generic names make your code difficult to read and update later. Coders will also use different capitalization styles to remind themselves how the variable is used within the script. A good default style is **camelCase**.
@@ -117,7 +117,7 @@ Bad Variable Names
- `myVariable` - Doesn't describe the purpose of the variable
- `player name` - The included space will cause issues
-### Assign values to variables
+### Assigning Values to Variables
New variables are empty. To **assign** it a value, or put something inside its container, use the `=` symbol. In this case, assign the variable the name of your favorite animal.
@@ -133,7 +133,7 @@ New variables are empty. To **assign** it a value, or put something inside its c
local myAnimal = "Porcupines"
```
-### Use print() for your own messages
+### Using Print() For Your Own Messages
Print functions display text on the screen, as you saw earlier. It's one of the first functions many people learn since it's a simple way of giving the script a command. To see your variable, use the `Global.LuaGlobals.print()` function.
@@ -155,9 +155,9 @@ Print functions display text on the screen, as you saw earlier. It's one of the
If you see a red error in the output editor, it's like there's an error in the code. Each error has a unique way of describing itself. Try and use the information from the error to fix your code.
-3. Test your code with the play button. You should see the name of your animal in the Output Window.
+3. Test your code with the play button. You should see the name of your animal in the Output window.
-### Combine strings
+### Combining Strings
You can display any string in the Output using `print()`; you can even print multiple strings stored within variables or typed directly within the function. **Concatenation** is combining strings. To concatenate the string assigned to your variable and a second string, use two dots `..` The following example concatenates two variables and two typed strings.
@@ -173,7 +173,7 @@ Play around with printing different combinations of strings.
## Summary
-New scripts can be created by clicking the + button next to the name of an object. ServerScriptService is a common place to create new scripts. New scripts include the default code `print("Hello world!")`. This code will display `Hello world!` in the Output Window, where you can see the results of your code and if any errors have occurred.
+New scripts can be created by clicking the + button next to the name of an object. ServerScriptService is a common place to create new scripts. New scripts include the default code `print("Hello world!")`. This code will display `Hello world!` in the Output window, where you can see the results of your code and if any errors have occurred.
"Hello world!" is an example of a string data type. Strings can include any combination of characters that you might type on your keyboard. Concatenation is when multiple strings are combined.
diff --git a/content/en-us/tutorials/fundamentals/coding-1/landing.md b/content/en-us/tutorials/fundamentals/coding-1/landing.md
index 48c3edb79..6f98d9bac 100644
--- a/content/en-us/tutorials/fundamentals/coding-1/landing.md
+++ b/content/en-us/tutorials/fundamentals/coding-1/landing.md
@@ -1,24 +1,24 @@
---
-title: Variables and objects
+title: Variables and Objects
description: Learn how to start coding in Roblox Studio in this tutorial series.
-next: /tutorials/fundamentals/coding-1/create-a-script
+next: /tutorials/fundamentals/coding-1/creating-a-script
prev: /tutorials/fundamentals/coding-1/coding-fundamentals
---
-### Series description
+### Series Description
For anyone interested in learning computer science or coding, this serves as a foundational series. This series is recommended for anyone interested in taking other coding lessons in Roblox Studio.
-### Objectives and prerequisites
+### Objectives and Prerequisites
-
Learning objectives
+
Learning Objectives
Understand the process of scripting, such as creating scripts and being able to identify interface elements like the Output Window.
- Utilize data types, and variables use strings to print messages to the Output Window and change object properties.
+ Utilize data types, and variables use strings to print messages to the Output window and change object properties.
@@ -32,7 +32,7 @@ For anyone interested in learning computer science or coding, this serves as a f
-### Series contents
+### Series Contents
@@ -43,15 +43,15 @@ For anyone interested in learning computer science or coding, this serves as a f
Instead of calling out a specific part name, learn how to navigate the hierarchy to make code that will work for any part
diff --git a/content/en-us/tutorials/fundamentals/coding-1/object-properties.md b/content/en-us/tutorials/fundamentals/coding-1/object-properties.md
index de6d5ecef..95addf804 100644
--- a/content/en-us/tutorials/fundamentals/coding-1/object-properties.md
+++ b/content/en-us/tutorials/fundamentals/coding-1/object-properties.md
@@ -1,5 +1,5 @@
---
-title: Object properties
+title: Object Properties
description: Learn how to use Lua to change the appearance properties of different objects, such as color and shape.
next: /tutorials/fundamentals/coding-1/parents-and-children
prev: /tutorials/fundamentals/coding-1/creating-a-script
@@ -9,7 +9,7 @@ prev: /tutorials/fundamentals/coding-1/creating-a-script
To learn about properties, you'll explore common properties found in parts and then write a script to change part colors.
-## The properties window
+## The Properties Window
The **Properties** window can be used to learn about an object's properties. Use it to take a look at a part's properties.
@@ -20,7 +20,7 @@ The **Properties** window can be used to learn about an object's properties. Use
If you don't see the Properties window, go to the **View** tab and click the Properties button.
-## Add comments to scripts
+## Adding Comments to Scripts
Comments are special lines starting with `--` that help coders remember what parts of scripts do. Unlike other code, comments don't run; they're just there so you can leave notes to yourself and other programmers. This script will change a part's `Class.BasePart.Color|Color` property at the start of the game.
@@ -34,7 +34,7 @@ Comments are special lines starting with `--` that help coders remember what par
-- Changes the color of a part
```
-### Locate the part
+### Locating the Part
To make changes to a part, you must be able to describe the part's location. The Explorer is an excellent tool for **referencing** locations. In this case, PracticePart is under Workspace.
@@ -53,7 +53,7 @@ Now that you know where the part is, the part's location needs to be translated
A long way to get to Workspace would be `game.Workspace`. However, needing to access Workspace is so common that Roblox made the keyword `workspace` as a shortcut.
-### Change a property with code
+### Changing a Property with Code
You'll use an RGB value to change the part's color. Computers use **RGB values**, the combination of red, green, and blue, to create all the colors on your screen.
diff --git a/content/en-us/tutorials/fundamentals/coding-1/parents-and-children.md b/content/en-us/tutorials/fundamentals/coding-1/parents-and-children.md
index e2c0f5067..3d504b3db 100644
--- a/content/en-us/tutorials/fundamentals/coding-1/parents-and-children.md
+++ b/content/en-us/tutorials/fundamentals/coding-1/parents-and-children.md
@@ -1,5 +1,5 @@
---
-title: Parents and children
+title: Parents and Children
description: Practice navigating object hierarchies instead of using specific names in your code.
next: /tutorials/fundamentals/coding-2/functions-and-events
prev: /tutorials/fundamentals/coding-1/object-properties
@@ -11,7 +11,7 @@ To do this, you must understand **parent and child relationships**.
Parents and children are ways to describe the hierarchy between different objects. Anytime you've added a new part to Workspace, Workspace has been the parent object, and the part became a child object. When you added a script to ServerScriptService, ServerScriptService was the parent, and the script was a new child.
-## Set up the project and script
+## Setting Up the Project and Script
To demonstrate parent and child relationships, you'll start with a single part that changes colors and then duplicate the script across multiple parts.
@@ -29,7 +29,7 @@ To demonstrate parent and child relationships, you'll start with a single part t
4.Test and check that the part changes color as desired.
-## Parent and child relationships
+## Parent and Child Relationships
A **parent** is anything with objects, like scripts or parts, attached below it. Anything under the parent is its **children**. In the example below, ColorPart is the parent, and ColorChanger is the child.
@@ -37,7 +37,7 @@ A **parent** is anything with objects, like scripts or parts, attached below it.
With the current script, you can only change the color of a **single part** named ColorPart. To change any part's color, you can design the code to work on the script's parent object, whatever it happens to be named. The code `script.Parent`, will go up the hierarchy and find the object the script is attached to.
-### Use script.Parent
+### Using script.Parent
`script.Parent` can be assigned to a variable like any other value with the `=` symbol.
@@ -48,7 +48,7 @@ With the current script, you can only change the color of a **single part** name
colorPart.Color = Color3.fromRGB(50, 240, 255)
```
-### Test reusable parts
+### Testing Reusable Parts
Now that the variable will refer to whatever part the script is attached to, you can make as many copies as you want.
diff --git a/content/en-us/tutorials/fundamentals/coding-2/code-a-function.md b/content/en-us/tutorials/fundamentals/coding-2/coding-a-function.md
similarity index 96%
rename from content/en-us/tutorials/fundamentals/coding-2/code-a-function.md
rename to content/en-us/tutorials/fundamentals/coding-2/coding-a-function.md
index 7b0f5aa32..358f02a07 100644
--- a/content/en-us/tutorials/fundamentals/coding-2/code-a-function.md
+++ b/content/en-us/tutorials/fundamentals/coding-2/coding-a-function.md
@@ -1,5 +1,5 @@
---
-title: Code a function
+title: Coding a Function
description: What a function is, and how to code a function in Roblox Lua
next: /tutorials/fundamentals/coding-2/using-parameters-and-events
prev: /tutorials/fundamentals/coding-1/parents-and-children
@@ -29,7 +29,7 @@ end
makeDinner()
```
-## Create a function
+## Creating a Function
To practice, your first function will print your favorite food in the Output Window. First set up the script you're going to use, if you don't remember how, here's a reminder:
@@ -54,7 +54,7 @@ end
Type end yourself if the code doesn't autocomplete for some reason. If the function doesn't have an end, your code won't run.
-### Add code to functions
+### Adding Code to Functions
All of the code for your function has to be typed between the lines `local function printFood()` and `end`. Any code not between those two points won't run when the function does.
@@ -80,7 +80,7 @@ end
As you typed, your code should have indented automatically. This makes it easier for you and others to see the start and end of a function. If it didn't auto indent, you can press Tab at the beginning of the line to quickly indent it.
-### Tell the function to run
+### Telling the Function to Run
There's one more thing we need to do before the function will work, and that's to tell it to run, also known as **calling** a function. Functions won't run until they are called. To call a function, type the function's name including the `()` at the end.
@@ -94,11 +94,11 @@ There's one more thing we need to do before the function will work, and that's t
printFood()
```
-2. Test the code. Your favorite food should appear in the Output Window.
+2. Test the code. Your favorite food should appear in the Output window.
-### Troubleshooting tips
+### Troubleshooting Tips
If your code doesn't run, check for errors such as the following:
diff --git a/content/en-us/tutorials/fundamentals/coding-2/functions-and-events.md b/content/en-us/tutorials/fundamentals/coding-2/functions-and-events.md
index f09d87d99..5b7c44628 100644
--- a/content/en-us/tutorials/fundamentals/coding-2/functions-and-events.md
+++ b/content/en-us/tutorials/fundamentals/coding-2/functions-and-events.md
@@ -1,17 +1,17 @@
---
-title: Functions and events
+title: Functions and Events
description: Landing page for chapter on coding functions in Lua and using events on Roblox.
next: /tutorials/fundamentals/coding-2/coding-a-function
prev: /tutorials/fundamentals/coding-1/parents-and-children
---
-### Series description
+### Series Description
Use functions and events to make code run when you want, as often as you want. With functions and events you can set up traps, buttons, health pickups, and more.
Covered in this course are functions, parameters, arguments, and returning values.
-### Objectives and prerequisites
+### Objectives and Prerequisites
@@ -50,19 +50,19 @@ Covered in this course are functions, parameters, arguments, and returning value
-
[Code a function](../coding-2/code-a-function.md)
+
[Coding a Function](../coding-2/coding-a-function.md)
Set up chunks of code in a way that only runs when you tell it to run.
-
[Use parameters and events](../coding-2/use-parameters-and-events.md)
+
[Using Parameters and Events](../coding-2/using-parameters-and-events.md)
How to code a function when you don't have all of the information yet.
-
[Parameters practice - buttons](../coding-2/parameters-practice-buttons.md)
+
[Parameters Practice - Buttons](../coding-2/parameters-practice-buttons.md)
Practice using events and parameters by making a bridge appear in-world with the push of a button.
-
[Multiple parameters and arguments](../coding-2/multiple-parameters-and-arguments.md)
+
[Multiple Parameters and Arguments](../coding-2/multiple-parameters-and-arguments.md)
Pass multiple pieces of information into a function at once.
diff --git a/content/en-us/tutorials/fundamentals/coding-2/multiple-parameters-and-arguments.md b/content/en-us/tutorials/fundamentals/coding-2/multiple-parameters-and-arguments.md
index 2d6a84ac6..efb74b409 100644
--- a/content/en-us/tutorials/fundamentals/coding-2/multiple-parameters-and-arguments.md
+++ b/content/en-us/tutorials/fundamentals/coding-2/multiple-parameters-and-arguments.md
@@ -1,5 +1,5 @@
---
-title: Multiple parameters and arguments
+title: Multiple Parameters and Arguments
description: Pass multiple pieces of information into a function in Roblox Lua using arguments and parameters.
next: /tutorials/fundamentals/coding-3/landing
prev: /tutorials/fundamentals/coding-2/parameters-practice-buttons
@@ -15,14 +15,14 @@ local function assignTeam(playerName, whichTeam)
end
```
-## Practice with multiple parameters
+## Practice with Multiple Parameters
To practice working with multiple parameters, create a function that sorts objects in your game into trash or recycling.
- The **first** parameter will be trash, which will be destroyed.
- The **second** parameter will be for recycling, which will be made shiny and new again.
-### Set up the function
+### Set Up the Function
First set up the function with multiple parameters and then test your work.
@@ -39,7 +39,7 @@ end
sortGarbage()
```
-### Use multiple parameters
+### Using Multiple Parameters
Inside the function, parameters can be used similar to variables. In this example, `trash` is destroyed and then `recyclable` is given sparkles using a Particle Emitter.
@@ -88,7 +88,7 @@ Inside the function, parameters can be used similar to variables. In this exampl
sortGarbage()
```
-## Pass values through parameters
+## Passing Values Through Parameters
Time to take out the trash! With the parameters set up, the functions are ready to take in information.
@@ -123,7 +123,7 @@ Time to take out the trash! With the parameters set up, the functions are ready
4. Test your code. The object passed in first will be destroyed. The second object will sparkle.
-## Order of parameters
+## Order of Parameters
Typically, arguments are matched to parameters based on the order they're passed in. For instance, the first argument is used for the first parameter. The second argument is used for the second.
diff --git a/content/en-us/tutorials/fundamentals/coding-2/parameters-practice-buttons.md b/content/en-us/tutorials/fundamentals/coding-2/parameters-practice-buttons.md
index 725c52c5e..cdc52f170 100644
--- a/content/en-us/tutorials/fundamentals/coding-2/parameters-practice-buttons.md
+++ b/content/en-us/tutorials/fundamentals/coding-2/parameters-practice-buttons.md
@@ -1,15 +1,15 @@
---
-title: Parameters practice - buttons
+title: Parameters Practice - Buttons
description: Practice connecting functions to events by creating a button that activates a bridge.
next: /tutorials/fundamentals/coding-2/multiple-parameters-and-arguments
-prev: /tutorials/fundamentals/coding-2/use-parameters-and-events
+prev: /tutorials/fundamentals/coding-2/using-parameters-and-events
---
Buttons can be used by players to unlock new areas, give points, and reveal treasure. Whenever a player touches a button, it should give some feedback to let players know it's being interacted with, like change colors or make sounds.
In this example, the button will be used to activate a bridge. When the button has been pressed, it'll turn green and players will be able to use the bridge. If the player hasn't pressed the button, they'll fall through the bridge when they try to walk on it.
-## Make a bridge
+## Make a Bridge
Start off by setting up the bridge.
@@ -24,7 +24,7 @@ Start off by setting up the bridge.
4. Test the game, the bridge should be misty looking and people shouldn't be able to walk on it yet.
-## Create the button
+## Create the Button
Now that the bridge is set up, create the button.
@@ -34,7 +34,7 @@ Now that the bridge is set up, create the button.
4. Move the button so it's slightly floating and not touching anything. This is so to make sure the `Touched` event doesn't accidentally fire.
-## Make the button interactive
+## Making the Button Interactive
This time, instead of using the `Class.BasePart.Touched|Touched` event to create a trap, you'll use it to create a button that makes the bridge usable. To make the bridge collidable, use the code `bridge.CanCollide = true` within a custom function that runs when a player touches the button. You know everything else you need to complete the following steps.
@@ -71,7 +71,7 @@ end
button.Touched:Connect(buttonPressed)
```
-### Troubleshoot your code
+### Troubleshooting Your Code
**Issue: The bridge is already solid when the game starts.**
Make sure that the parts are Anchored and not touching anything. The parts might touch something, like terrain or another part, and cause the buttonPressed() function to fire accidentally.
@@ -82,7 +82,7 @@ Check the following:
- The naming of your bridge. The bridge in your script must be named exactly like in the Explorer.
- That `part.Touched:Connect(buttonPressed)` is outside the `buttonPressed()` function.
-### Optional code challenge
+### Optional Code Challenge
The script in this lesson can also be used to keep doors that keep players out of specific areas. Practice your coding skills and do the following:
diff --git a/content/en-us/tutorials/fundamentals/coding-2/use-parameters-and-events.md b/content/en-us/tutorials/fundamentals/coding-2/using-parameters-and-events.md
similarity index 95%
rename from content/en-us/tutorials/fundamentals/coding-2/use-parameters-and-events.md
rename to content/en-us/tutorials/fundamentals/coding-2/using-parameters-and-events.md
index 59e61fc8f..f42148d25 100644
--- a/content/en-us/tutorials/fundamentals/coding-2/use-parameters-and-events.md
+++ b/content/en-us/tutorials/fundamentals/coding-2/using-parameters-and-events.md
@@ -1,19 +1,19 @@
---
-title: Use parameters and events
+title: Using Parameters and Events
description: How to pass information into functions using parameters and arguments. Also covers connecting functions to events.
next: /tutorials/fundamentals/coding-2/parameters-practice-buttons
-prev: /tutorials/fundamentals/coding-2/code-a-function
+prev: /tutorials/fundamentals/coding-2/coding-a-function
---
Normally, functions can only use the information they have coded within them. Sometimes however, you might not know in advance what that information will be, or you want to be able to reuse the same function with multiple pieces of similar information. For example, if you wanted to use a function to display the name of the person who finished an obby course the fastest in giant letters to everyone. You won't know the name of the future winner until the race is finished.
**Parameters** are placeholders for information you want to give to the function at a later time. They're like windows that allow you to **pass** information to the function.
-## Use parameters and events to set up a trap
+## Use Parameters and Events to Set Up a Trap
This script will create a trap part that destroys whatever touches the part, including other parts. You'll have to use a parameter to set it up. Be careful to anchor the trap where it doesn't fall and destroy things unintentionally.
-### Create a new part
+### Create a New Part
A part needs to be set up that will destroy anything that touches it.
@@ -21,7 +21,7 @@ A part needs to be set up that will destroy anything that touches it.
2. In the Explorer, rename the part:TrapPart.
3. **Anchor** the part.
-### Set up the script
+### Set Up the Script
Use what you know about variables and the experience hierarchy to reference the trap part.
@@ -35,7 +35,7 @@ Use what you know about variables and the experience hierarchy to reference the
```
-### Create a function with a parameter
+### Create a Function with a Parameter
The trap will use a function to destroy whatever touched the part. To work, the function needs to know what touched the part. And that means using parameters. Parameters are typed inside the `()` that comes after a function's name. They look like this:
@@ -77,7 +77,7 @@ The actual information that gets passed through the parameter is called an **arg
end
```
-### Use an event to call the function
+### Use an Event to Call the Function
We want the function to run whenever something touches the part. To make that happen, connect the function to the `Touched` event. **Events** are things that happen in the experience. Like a player touching a part or losing health. When a function is connected to an event, the function runs whenever the event happens.
diff --git a/content/en-us/tutorials/fundamentals/coding-3/give-points.md b/content/en-us/tutorials/fundamentals/coding-3/giving-points.md
similarity index 97%
rename from content/en-us/tutorials/fundamentals/coding-3/give-points.md
rename to content/en-us/tutorials/fundamentals/coding-3/giving-points.md
index f460c5acc..f6a727d1c 100644
--- a/content/en-us/tutorials/fundamentals/coding-3/give-points.md
+++ b/content/en-us/tutorials/fundamentals/coding-3/giving-points.md
@@ -1,5 +1,5 @@
---
-title: Else/if practice with giving points
+title: Else/If Practice with Giving Points
description: Create a part that gives players points using if and else statements in Roblox Lua.
next: /tutorials/fundamentals/coding-4/landing
prev: /tutorials/fundamentals/coding-3/multiple-conditions
@@ -9,11 +9,11 @@ This project will use conditional statements to create a part that will give or
-## Set up the project
+## Setting up the Project
The point giving part can be added into any project where points are relevant. For instance, an adventure game where players collect points.
-### Point tracking
+### Point Tracking
To setup this project, you'll need a leaderboard to track the points and a part that changes colors. Code for the leaderboard will be provided.
@@ -40,7 +40,7 @@ To setup this project, you'll need a leaderboard to track the points and a part
Players.PlayerAdded:Connect(onPlayerJoin)
```
-### Color changing part
+### Color Changing Part
The script will cycle through three different colors for the part. Each color will have a variable to store it's RGB value, a data type that includes a set of three numbers (red, green, blue) that create colors.
@@ -80,7 +80,7 @@ The script will cycle through three different colors for the part. Each color wi
local losePoints = 100
```
-### Add the players service
+### Adding the Players Service
To award points, you'll need to get access to the player's information which is stored in the Explorer under Players, and is separate from the character object. This is where information like leaderboard stats can be found.
@@ -100,7 +100,7 @@ You can do so by adding the **Players** service to your script. **Services** are
local Players = game:GetService("Players")
```
-### Functions and events
+### Functions and Events
PointsScript will need two functions. The first function will give and subtract parts. The second function will check if a player has touched the part. These functions will then be connected with a touch event, which runs whenever that part is touched.
@@ -209,18 +209,18 @@ To loop through colors, the script will use a while =loop that changes the part'
-### Troubleshooting tips
+### Troubleshooting Tips
At this point, if the color looping doesn't work as intended, try one of the following below.
- Check that the while loop is at the **bottom** of the script, below the Touched event. If the loop is not at the bottom, it'll keep other parts of the script from running correctly.
- Check that each color inside `Datatype.Color3.fromRGB()` is correctly written. There must be three numbers between 0 and 255 separated by commas, like `(255, 50, 0)`.
-## Give players points
+## Giving Players Points
Players will be given points based on the current color of the part when they touch it.
-### Find the current color
+### Finding the Current Color
Whenever a player touches the part, the script will need to know the current color of the part to award points later.
@@ -253,7 +253,7 @@ Whenever a player touches the part, the script will need to know the current col
end
```
-### Give or subtract points
+### Giving or Subtracting Points
Next, you'll use if and elseif to give or subtract points depending on the color of the part when touched. Remember that blue provides a small amount, green provides many, and red subtracts points.
@@ -312,7 +312,7 @@ Next, you'll use if and elseif to give or subtract points depending on the color
-## Give players feedback
+## Giving Players Feedback
The PointPart works, but players might not notice something happened unless they happen to be looking at their leaderboard. Fix that by creating particles when the PointPart is destroyed.
@@ -320,7 +320,7 @@ Adding feedback when players use a part, like sounds, shakes, or particles, make
-### Create a particle effect
+### Creating a Particle Effect
The particle effect will be the same color as the part when touched. Since the colors were stored in variables, it's easy to reuse them.
@@ -369,7 +369,7 @@ The particle effect will be the same color as the part when touched. Since the c
-### Troubleshooting tips
+### Troubleshooting Tips
At this point, if particles doesn't work as intended, try one of the following below.
diff --git a/content/en-us/tutorials/fundamentals/coding-3/intro-to-if-statements.md b/content/en-us/tutorials/fundamentals/coding-3/intro-to-if-statements.md
index 1470b2899..e48612457 100644
--- a/content/en-us/tutorials/fundamentals/coding-3/intro-to-if-statements.md
+++ b/content/en-us/tutorials/fundamentals/coding-3/intro-to-if-statements.md
@@ -1,5 +1,5 @@
---
-title: Intro to if statements
+title: Intro to If Statements
description: Learn how to code if statements in Roblox Lua.
next: /tutorials/fundamentals/coding-3/traps-with-if-statements
prev: /tutorials/fundamentals/coding-3/landing
@@ -21,7 +21,7 @@ end
Code chunks using conditionals are **control structures.** Control structures are like flow diagrams in code form and can have several conditional statements.
-## If statement practice
+## If Statement practice
These steps show how to create a script that changes a part's color if a statement is true.
@@ -34,7 +34,7 @@ These steps show how to create a script that changes a part's color if a stateme
2. Create a new part named LieDetector.
-### Format if statements
+### Formatting If Statements
**Conditions** can come in various forms but are often simple statements like math equations. For example, if 1+1 equals 2, then run some code. Like ordinary math equations, conditional can use **operators** such as plus (`+`) or less than (`<`) to evaluate statements.
@@ -71,7 +71,7 @@ One particular operator to be aware of is `==`; it stands for "is equal to." So
4. **Test** your code. If three plus three is equal to six, the part will turn green.
-## Check a false condition
+## Checking a False Condition
Now, purposely change the statement to see what happens when the math equation is false.
@@ -85,7 +85,7 @@ Now, purposely change the statement to see what happens when the math equation i
2. Test your code now. The part shouldn't turn green for a false statement.
-### Math operators
+### Math Operators
The table below lists some common Lua operators. More information about operators can be found on [Luau Operators](../../../luau/operators.md).
@@ -116,14 +116,14 @@ The table below lists some common Lua operators. More information about operator
-### Comparison operators
+### Comparison Operators
- `==` : Is equal to.
- `~=` : Is not equal to.
- `<` or `>` are used for less or greater than, respectively.
- `<=` or `>=` are used for less/greater than or equal to, respectively.
-## Variables and properties
+## Variables and Properties
Conditional statements are also used to evaluate the status of properties and variables. The following steps check whether a variable was successfully assigned a value.
diff --git a/content/en-us/tutorials/fundamentals/coding-3/landing.md b/content/en-us/tutorials/fundamentals/coding-3/landing.md
index 9f1eb3259..d793addeb 100644
--- a/content/en-us/tutorials/fundamentals/coding-3/landing.md
+++ b/content/en-us/tutorials/fundamentals/coding-3/landing.md
@@ -5,11 +5,11 @@ next: /tutorials/fundamentals/coding-3/intro-to-if-statements
prev: /tutorials/fundamentals/coding-2/multiple-parameters-and-arguments
---
-### Series description
+### Series Description
Many experiences have actions that only take place if a list of requirements are met. You may have seen rooms only specific teams could enter or inventory items only some players could purchase. This series will cover how to set up code that says, "If this happens, then do that."
-### Objectives and prerequisites
+### Objectives and Prerequisites
@@ -30,7 +30,7 @@ Many experiences have actions that only take place if a list of requirements are
-### Series contents
+### Series Contents
@@ -57,7 +57,7 @@ Many experiences have actions that only take place if a list of requirements are
Design code that accounts for multiple scenarios with `else` and `elseif`.
Use everything learned about conditionals to create a part that can award points to players.
diff --git a/content/en-us/tutorials/fundamentals/coding-3/multiple-conditions.md b/content/en-us/tutorials/fundamentals/coding-3/multiple-conditions.md
index fbaa00b1d..7be73ff17 100644
--- a/content/en-us/tutorials/fundamentals/coding-3/multiple-conditions.md
+++ b/content/en-us/tutorials/fundamentals/coding-3/multiple-conditions.md
@@ -1,7 +1,7 @@
---
-title: Multiple conditions
+title: Multiple Conditions
description: Learn how to use elseif and else to create more complex control structures in Roblox Lua.
-next: /tutorials/fundamentals/coding-3/give-points
+next: /tutorials/fundamentals/coding-3/giving-points
prev: /tutorials/fundamentals/coding-3/powerups-with-if-statements
---
@@ -22,7 +22,7 @@ end
In this project, `else` and `elseif` are used to code a parkour course where runners receive awards depending on their finishing time.
-## Code multiple conditions
+## Coding Multiple Conditions
For this project, you could write a unique if statement for each medal to award players, but that takes a lot of time. Take, for instance, the imaginary code below.
@@ -54,7 +54,7 @@ end
When the if/then statement runs, it'll start at the top and only run the code for the **first** true condition it finds.
-## Set up the race course
+## Setting Up the Race Course
Start by placing the course's starting point and finish line, and then create a script to time the player and award different medals.
@@ -114,7 +114,7 @@ Start by placing the course's starting point and finish line, and then create a
5. Playtest and check that `finish()` is called when you touch the finish line.
-### Keep finish() from repeating
+### Keep finish() From Repeating
Right now, whenever a player touches the finish line, `finish()` gets continuously called as long as the player touches the part.
@@ -156,7 +156,7 @@ Use a **boolean**, a variable that stores true or false, to ensure that finish()
4. Playtest your game to check that you only see your test print statement once.
-### Keep track of time
+### Keeping Track of Time
Like an if statement, a while loop can also use a condition to see if it should run. To time the player, create a timer using a while true do loop that only runs when the `raceActive` boolean is true.
@@ -188,7 +188,7 @@ Like an if statement, a while loop can also use a condition to see if it should
3. Play the game and check that you see each second displayed in the Output Window.
-## Award player medals
+## Awarding Player Medals
To finish, use an if statement with multiple conditions to award players a different prize medal based on their performance. Use an if statement and two elseif statements to check the player's finish time and award them the correct medal.
@@ -216,7 +216,7 @@ To finish, use an if statement with multiple conditions to award players a diffe
3. Playtest and confirm the gold medal can be awarded.
-### Add additional conditions
+### Adding Additional Conditions
Now that you've tested for the gold medal, code conditions for the other medals using the `elseif` keyword.
@@ -254,7 +254,7 @@ Now that you've tested for the gold medal, code conditions for the other medals
3. Playtest for the silver and bronze medals.
-### Troubleshooting tips
+### Troubleshooting Tips
If you don't see the silver and bronze metals appear, try one of the below.
@@ -262,7 +262,7 @@ If you don't see the silver and bronze metals appear, try one of the below.
- In `partTouched()`, make sure the second condition of the if statement uses `==`, like in `raceActive == true`.
- Check that each `elseif` is in scope. Each `elseif` condition must be between the first line of the if/then statement and it's last `end`.
-### Add the else condition
+### Adding the Else Condition
If the player didn't earn any of the medals, you should encourage them to try again. In this case, you can use an `else` statement, which runs if **no other** conditions are true, to show them a message.
@@ -306,7 +306,7 @@ After finishing the project, you can expand upon the script to add new elements
- Add code so players can repeat the race by touching the start line when they finish.
- Design a way to display time during a race. You can either display the time on a part using a Surface GUI, like in the
- [Create a Timed Bridge tutorial](../coding-4/create-a-timed-bridge.md).
+ [Creating a Timed Bridge tutorial](../coding-4/creating-a-timed-bridge.md).
```lua title ="Completed script"
local timePassed = 0
diff --git a/content/en-us/tutorials/fundamentals/coding-3/powerups-with-if-statements.md b/content/en-us/tutorials/fundamentals/coding-3/powerups-with-if-statements.md
index 72ed0acda..d800487da 100644
--- a/content/en-us/tutorials/fundamentals/coding-3/powerups-with-if-statements.md
+++ b/content/en-us/tutorials/fundamentals/coding-3/powerups-with-if-statements.md
@@ -1,5 +1,5 @@
---
-title: Evaluate multiple statements
+title: Evaluating Multiple Statements
description: How to use the and keyword to evaluate more than one statement at a time in Roblox Luau.
next: /tutorials/fundamentals/coding-3/multiple-conditions
prev: /tutorials/fundamentals/coding-3/traps-with-if-statements
@@ -19,11 +19,11 @@ if 4 + 2 == 6 and 4 ~= 6 then
end
```
-## Create a powerup
+## Creating a Powerup
Powerups are in-experience items that give players special abilities like flying, invisibility, or speed. This powerup will boost the player's walking speed every time the powerup is touched. Continuously applying boosts can make the player go way too fast, so `and` will be used to control the upper walking speed limit.
-### Set up the powerup
+### Setting Up the Powerup
Use this code with a simple part or a model, such as a crystal, coin, or glowing neon orb.
@@ -62,7 +62,7 @@ Use this code with a simple part or a model, such as a crystal, coin, or glowing
```
-## Speed players up
+## Speeding Players Up
The speed boost will make avatars walk faster every time the speed boost is touched. That will quickly become very, very fast. The keyword `and` will ensure players can't go too fast by only enabling the speed boost if the player is under a certain speed.
@@ -90,7 +90,7 @@ The speed boost will make avatars walk faster every time the speed boost is touc
```
-### Fine tune the speed boost
+### Fine Tuning the Speed Boost
OnTouch is called every time the speed boost is touched. Every step or slightest bounce triggers the Touched event and calls the connected function. The part's property, `CanTouch` can keep the Touched event from firing. Take advantage of CanTouch and turn off the speed boost for one second every time it's been activated.
diff --git a/content/en-us/tutorials/fundamentals/coding-3/traps-with-if-statements.md b/content/en-us/tutorials/fundamentals/coding-3/traps-with-if-statements.md
index 42b97c239..351fc42d4 100644
--- a/content/en-us/tutorials/fundamentals/coding-3/traps-with-if-statements.md
+++ b/content/en-us/tutorials/fundamentals/coding-3/traps-with-if-statements.md
@@ -1,5 +1,5 @@
---
-title: If/then practice with traps
+title: If/then Practice with Traps
description: Create a trap that sets the player's health to zero with Roblox Lua.
next: /tutorials/fundamentals/coding-3/powerups-with-if-statements
prev: /tutorials/fundamentals/coding-3/intro-to-if-statements
@@ -9,7 +9,7 @@ Traps that decrease players' health are a fun game-play element that can be code
-## Set up the trap
+## Setting up the Trap
Traps work exceptionally well in experiences with movement-based challenges, like obbies. These steps will start by setting up the necessary variables and functions. Do as much as you can without looking at the code boxes first.
@@ -46,7 +46,7 @@ Traps work exceptionally well in experiences with movement-based challenges, lik
trapPart.Touched:Connect(onTouch)
```
-## Check for player touch
+## Checking for Player Touch
Remember, the parameter `otherPart` records whatever touches the trap part, which might be a part of a player or just the baseplate.
@@ -56,7 +56,7 @@ To ensure the trap will only destroy players and won't destroy random decor item
Humanoids are present in player avatars and many NPCs. Humanoids have several unique properties. One such property is Health.
-### Find a specific object
+### Finding a Specific Object
The function `FindFirstChildWhichIsA()` can be used to look for specific object types, which is handy because we're looking for a Humanoid-type object. Players will likely touch the trap with only a part of their avatar, so a variable must be set up to find the parent of the touching part and search it for a Humanoid.
@@ -89,7 +89,7 @@ The function `FindFirstChildWhichIsA()` can be used to look for specific object
trapPart.Touched:Connect(onTouch)
```
-### Check with an if statement
+### Checking with an if Statement
If a Humanoid is found, then set the Humanoid's Health to zero.
@@ -131,7 +131,7 @@ If a Humanoid is found, then set the Humanoid's Health to zero.
3. **Run** the code and check that you can see the output whenever a player touches the part.
-## Change the player's health
+## Changing the Player's Health
If the statement is true, you can use the same humanoid variable to set the player's health to 0.
diff --git a/content/en-us/tutorials/fundamentals/coding-4/create-a-timed-bridge.md b/content/en-us/tutorials/fundamentals/coding-4/creating-a-timed-bridge.md
similarity index 96%
rename from content/en-us/tutorials/fundamentals/coding-4/create-a-timed-bridge.md
rename to content/en-us/tutorials/fundamentals/coding-4/creating-a-timed-bridge.md
index 447171f8a..bf32f0aa5 100644
--- a/content/en-us/tutorials/fundamentals/coding-4/create-a-timed-bridge.md
+++ b/content/en-us/tutorials/fundamentals/coding-4/creating-a-timed-bridge.md
@@ -1,5 +1,5 @@
---
-title: Loops practice - create a timed bridge
+title: Loops Practice - Creating a Timed Bridge
description: Make a bridge that disappears to add challenge to a Roblox game. Combine for loops and while loops in this computer science practice.
next: /tutorials/fundamentals/coding-4/nested-loops
prev: /tutorials/fundamentals/coding-4/glow-lights-with-for-loops
@@ -9,11 +9,11 @@ This project is another example of using for loops in a practical way. For this
-## Set up the project
+## Setting up the Project
This bridge can be included in any game project with movement-based challenges, like an obby.
-### Create parts
+### Creating Parts
1. Find a place to build a bridge, like a river or a large gap in an obby. Create three **anchored** parts like below.
@@ -28,7 +28,7 @@ This bridge can be included in any game project with movement-based challenges,
- **Transparency** = 0.8
- **CanCollide** = False
-### Create the timer display
+### Creating the Timer Display
When crossing the bridge, players will need to see how many seconds are left before the bridge disappears. One way to display images or text is by adding an object called a Surface GUI to a part. **Surface GUIs** can also be used to create in-game signs, custom health bars, and inventory systems. This tutorial will go through this quickly, but more information can be found in the [Tutorials](../../../tutorials/index.md) section.
@@ -45,7 +45,7 @@ When crossing the bridge, players will need to see how many seconds are left bef
- Set **TextScaled** to true.
- Set **Text** to be blank. Text will be updated using the script.
-### Set up the script
+### Setting up the Script
Now that the timer is in place, create a script to control the bridge and display the countdown number to players.
@@ -60,7 +60,7 @@ Now that the timer is in place, create a script to control the bridge and displa
local timerDuration = 5
```
-## Code the touch interaction
+## Coding the Touch Interaction
To use the bridge, you'll need to create two functions. One function will make the bridge walkable and display the timer. The other function will listen for if a player touches the button that activates the bridge.
@@ -118,9 +118,9 @@ To use the bridge, you'll need to create two functions. One function will make t
button.Touched:Connect(buttonPressed)
```
-5. Run the project. Touch the part and check in the Output Window to see the print statement.
+5. Run the project. Touch the part and check in the Output window to see the print statement.
-### Troubleshooting tips
+### Troubleshooting Tips
At this point, if the bridge doesn't work as intended, try one of the following below.
@@ -133,11 +133,11 @@ At this point, if the bridge doesn't work as intended, try one of the following
- Make sure all three parts are Anchored.
- Check the Transparency property for the bridge.
-## Create the timer
+## Creating the Timer
Whenever players step on the bridge, `startTimer()` will make the bridge walkable and start the timer. Once the timer reaches 0, the bridge will become unwalkable, causing anyone who's not fast enough to fall.
-### Make the bridge walkable
+### Making the Bridge Walkable
To start, the script will need to make the bridge solid, or collidable and then start a timer until it becomes unwalkable.
@@ -191,7 +191,7 @@ To start, the script will need to make the bridge solid, or collidable and then
-## Keep the bridge from restarting
+## Keeping the Bridge from Restarting
Notice though, if you move around on the button, the timer will keep restarting.
@@ -265,7 +265,7 @@ This is because the for loop is being called each time you touch the button and
-## Complete timed bridge script
+## Complete Timed Bridge Script
```lua
local bridge = script.Parent
diff --git a/content/en-us/tutorials/fundamentals/coding-4/glow-lights-with-for-loops.md b/content/en-us/tutorials/fundamentals/coding-4/glow-lights-with-for-loops.md
index 5f94ffb9a..a00e183bb 100644
--- a/content/en-us/tutorials/fundamentals/coding-4/glow-lights-with-for-loops.md
+++ b/content/en-us/tutorials/fundamentals/coding-4/glow-lights-with-for-loops.md
@@ -1,5 +1,5 @@
---
-title: Glow lights with for loops
+title: Glowing Lights with For Loops
description: Create glowing lights in Roblox Studio using a for loop. This practical example teaches computer science with Roblox.
next: /tutorials/fundamentals/coding-4/creating-a-timed-bridge
prev: /tutorials/fundamentals/coding-4/intro-to-for-loops
@@ -9,7 +9,7 @@ To practice for loops, you'll create a lamp that gradually glows brighter and th
-## Set up the part and script
+## Setting up the Part and Script
The lamp will be a part with an attached light and script.
@@ -45,11 +45,11 @@ The lamp will be a part with an attached light and script.
local timeChange = 1
```
-## Make the lamp glow
+## Making the Lamp Glow
The lamp will use two **for loops**, one that counts up to make the lamp brighter, and one that counts down to dim it. Each for loop will have a control variable called currentBrightness. That way, as the for loop's control variable goes up and down, so will the brightness of the light.
-### First loop (light increase)
+### First Loop (Light Increase)
Remember, a for loop starts with keyword `for` followed by a control variable. This script will set the brightness value of the light to value in the control variable.
@@ -99,7 +99,7 @@ If you can't see the brightness change over time in the first loop:
- Check that `timeChange` is at least 1 or higher. Smaller numbers will make the brightness change faster, but be harder to see over time.
- Make sure that the first line of your for loop has two total commas separating the control variable, end value, and increment value.
-### Second loop (light decrease)
+### Second Loop (Light Decrease)
To dim the light, use a second for loop. The values of this loop will be reversed so the light starts bright and each second, gets dimmer.
@@ -121,7 +121,7 @@ To dim the light, use a second for loop. The values of this loop will be reverse
-### Make the light repeat
+### Making the Light Repeat
Right now, the light only turns on and off once. To make the lamp continuously glow on and off, the for loops will be placed inside a repeating while loop.
@@ -153,7 +153,7 @@ Right now, the light only turns on and off once. To make the lamp continuously g
-## Finished light script
+## Finished Light Script
A finished version of the script can be referenced below.
diff --git a/content/en-us/tutorials/fundamentals/coding-4/intro-to-for-loops.md b/content/en-us/tutorials/fundamentals/coding-4/intro-to-for-loops.md
index b5506fe54..c1a1d6d9f 100644
--- a/content/en-us/tutorials/fundamentals/coding-4/intro-to-for-loops.md
+++ b/content/en-us/tutorials/fundamentals/coding-4/intro-to-for-loops.md
@@ -1,13 +1,13 @@
---
-title: Intro to for loops
+title: Intro to For Loops
description: Use for loops to repeat code in this lesson for Roblox Lua. This lesson explains how for loops work and includes practice scripts.
next: /tutorials/fundamentals/coding-4/glow-lights-with-for-loops
-prev: /tutorials/fundamentals/coding-4/repeat-code-with-while-loops
+prev: /tutorials/fundamentals/coding-4/repeating-code-with-while-loops
---
There are different ways to make code run over and over. If you want the code to only run a certain amount of times, use a **for loop**. This article will cover the logic behind for loops and demonstrate some practical examples, such as coding a countdown.
-## How for loops work
+## How For Loops Work
For loops use three values to control how many times they run: a **control** variable, an **end** value, and an **increment** value. Starting from the value of the control variable, the for loops will either count up or down each time it runs code inside the loop until it passes the end value. Positive increment values count up, and negative increment values count down.
@@ -17,7 +17,7 @@ For loops use three values to control how many times they run: a **control** var
Different computer languages might use other terminology with for loops. For instance, in C# or JavaScript, the end value might be called the condition.
-## Steps in a for loop
+## Steps in a For Loop
To understand for loops, it helps to see a flow chart diagram showing the logic of how they progress.
@@ -33,7 +33,7 @@ Once the control variable passes the end value, the loop will stop. For example,
-## Code a countdown
+## Code a Countdown
To see how a for loop works, use these steps to code a for loop that starts at 10 and counts down to 0, one number at a time. Every time the loop runs, it'll print the current value inside the control variable.
@@ -90,18 +90,18 @@ To see how a for loop works, use these steps to code a for loop that starts at 1
Notice that the loop will print out the current value of count each time it goes through an **iteration**. An iteration is the complete process of checking the control value, running code, and updating the increment value. Because the control variable starts at 0 and has to go pass 10, the loop will go through 11 iterations before stopping.
-### Troubleshooting tips
+### Troubleshooting Tips
At this point, if the loop doesn't work as intended, try one of the following below.
- Check that you have **two commas** separating the numbers in your for loop. Having extra or missing commas will make the loop not start.
- If the for loop prints all at once, make sure that there is a wait function that uses at least 1 second.
-## Different for loop examples
+## Different For Loop Examples
Changing the three values of a for loop will change how the loop functions. Below are different examples of for loops with different start, end, and increment values. Try putting them into scripts and see what happens.
-### Count up by one
+### Counting Up By One
```lua
for count = 0, 5, 1 do
@@ -110,7 +110,7 @@ for count = 0, 5, 1 do
end
```
-### Count up in even numbers
+### Counting Up in Even Numbers
```lua
for count = 0, 10, 2 do
@@ -119,7 +119,7 @@ for count = 0, 10, 2 do
end
```
-### If for loops don't run at all
+### If For Loops Don't Run At All
If the control variable starts out **beyond** the end value, like in the example below, the for loop won't run at all.
diff --git a/content/en-us/tutorials/fundamentals/coding-4/landing.md b/content/en-us/tutorials/fundamentals/coding-4/landing.md
index b45aa120d..e3d3fba84 100644
--- a/content/en-us/tutorials/fundamentals/coding-4/landing.md
+++ b/content/en-us/tutorials/fundamentals/coding-4/landing.md
@@ -5,16 +5,16 @@ next: /tutorials/fundamentals/coding-4/repeating-code-with-while-loops
prev: /tutorials/fundamentals/coding-3/giving-points
---
-### Series description
+### Series Description
In computer science, loops are a common feature in many scripts, often used to repeat sets of code. This series will cover two of the most common loops: for and while loops.
-### Objectives and prerequisites
+### Objectives and Prerequisites
-
Learning objectives
+
Learning Objectives
Understand situations where loops are useful as opposed to alternative forms of writing a script.
diff --git a/content/en-us/tutorials/fundamentals/coding-4/nested-loops.md b/content/en-us/tutorials/fundamentals/coding-4/nested-loops.md
index 9387f40b8..7ef719f97 100644
--- a/content/en-us/tutorials/fundamentals/coding-4/nested-loops.md
+++ b/content/en-us/tutorials/fundamentals/coding-4/nested-loops.md
@@ -1,17 +1,17 @@
---
-title: Nested loops
+title: Nested Loops
description: Learn how to use nested loops. This computer science lesson uses Roblox Lua to combine multiple nested for loops.
next: /tutorials/fundamentals/coding-5/landing
-prev: /tutorials/fundamentals/coding-4/create-a-timed-bridge
+prev: /tutorials/fundamentals/coding-4/creating-a-timed-bridge
---
Nesting loops allows you to repeat tasks in batches. For example, baking three batches of six cupcakes, or assigning weapons to players on two teams.
-## How nested loops run
+## How Nested Loops Run
When loops are nested, scripts go line by line until it reaches the next loop. The inner loop will run until it's condition is met before returning to the outer loop.
-### Nested loop logic
+### Nested Loop Logic
The following diagram shows the steps a loop takes.
@@ -33,7 +33,7 @@ The following diagram shows the steps a loop takes.
-### Nested loop example
+### Nested Loop Example
Nested loops can seem somewhat abstract, so a visual example can help. For this exercise, copy and paste a sample script and run it in Studio. This script will create towers of parts. The outer loop will control how many parts to make, while the inner loop will create the actual batch.
@@ -74,17 +74,17 @@ Nested loops can seem somewhat abstract, so a visual example can help. For this
2. Watch as the script spawns a different batch of colored parts. After going through one batch, it'll pause for 2 seconds. The print statement in the outer loop will run only one time per completed inner loop.
-## Nested for loop tower
+## Nested For Loop Tower
Each loop has its own set of code, so can be responsible for different tasks. One thing nested loops can do is change the placement of where an object spawns to create a tower like the one in this video. There's three different loops, one each for controlling where along the width, length, and height of the tower the cube spawns.
-## Code a cube maker script
+## Coding a Cube Maker Script
To practice nested loops, you'll make a script that creates a tower of cubes. For the cube tower script, first code a function that spawns a single cube. The tower will be built by repeatedly calling this function.
-### Set up the script
+### Setting up the Script
For the cube tower script, first code a function that spawns a single cube. The tower will be built by repeatedly calling this function.
@@ -139,7 +139,7 @@ For the cube tower script, first code a function that spawns a single cube. The
In Roblox code, once an object is created by script, it's recommended to parent it at the end. It's faster to make changes to an instance before there is a physical object in the game world.
-### Spawn in different directions
+### Spawning in Different Directions
To create a tower, spawn cubes at specific points by setting the X, Y, Z properties of each new cube. X and Z are side to side. Y is up and down.
@@ -171,7 +171,7 @@ To create a tower, spawn cubes at specific points by setting the X, Y, Z propert
In Roblox, CFrame is a data type used to store 3D position and orientation. It's used to place objects in a world.
-### Spawn with nested loops
+### Spawning with Nested Loops
The script will have three loops total, one each for the length, width, and height of the tower. To complete an entire floor before moving upwards, start with setting the Y coordinate in the first, outermost loop.
@@ -259,11 +259,11 @@ The script will have three loops total, one each for the length, width, and heig
-## Optional challenges
+## Optional Challenges
Below are different self-directed challenges that use nested loops in different ways. Try and code on your own before looking at the solution.
-### Fade away parts
+### Fade Away Parts
As the tower is built, have the parts fade in transparency from left to right.
@@ -303,7 +303,7 @@ for heightIndex = 1, TOWER_SIZE do
end
```
-### Rain down objects
+### Rain Down Objects
Instead of parts, try spawning an actual object. The example here used cupcakes.
diff --git a/content/en-us/tutorials/fundamentals/coding-4/repeat-code-with-while-loops.md b/content/en-us/tutorials/fundamentals/coding-4/repeating-code-with-while-loops.md
similarity index 96%
rename from content/en-us/tutorials/fundamentals/coding-4/repeat-code-with-while-loops.md
rename to content/en-us/tutorials/fundamentals/coding-4/repeating-code-with-while-loops.md
index 1196fd9dd..c841c1302 100644
--- a/content/en-us/tutorials/fundamentals/coding-4/repeat-code-with-while-loops.md
+++ b/content/en-us/tutorials/fundamentals/coding-4/repeating-code-with-while-loops.md
@@ -1,5 +1,5 @@
---
-title: Repeat code with while loops
+title: Repeating Code with While Loops
description: Learn how to use while loops with Roblox's Luau language in this computer science lesson.
next: /tutorials/fundamentals/coding-4/intro-to-for-loops
prev: /tutorials/fundamentals/coding-4/landing
@@ -11,7 +11,7 @@ In computer science, a **loop** is a coding pattern that repeats a set of instru
-## Set up the part and script
+## Setting Up the Part and Script
Use any Roblox project for this exercise. When finished, this part can be used as a way of decorating an environment.
@@ -23,7 +23,7 @@ Use any Roblox project for this exercise. When finished, this part can be used a
-- Changes the color of LoopingPart every few seconds
```
-## Use variables to store a part
+## Using Variables to Store a Part
Variables can also hold references to objects besides strings. For example, when a script knows the reference to a part, the script can change it.
@@ -53,7 +53,7 @@ A local variable only works in the script where it was created. If a local varia
Remember that the `=` operator sets the value of a variable to whatever is on the right of it.
-## While loops
+## While Loops
Before creating the while loop for the color changing part, it's worthwhile to explain its syntax. A while loop has three components:
@@ -71,7 +71,7 @@ while true do
end
```
-## Code a while loop
+## Coding a While Loop
Next, you'll set up the while loop for the color changing part.
@@ -91,7 +91,7 @@ Next, you'll set up the while loop for the color changing part.
You might have noticed the editor automatically added `end` to the script and indented the next line of code. Indenting makes code easier to read. Instructions in a loop should **always** be indented.
-### Add code in the loop
+### Adding Code in the Loop
With the while loop created, instructions can be added to change the part's color over time. Inside the loop, add a line of code for each color. Each color will use RGB values, a way of storing colors as numbers in computer science.
@@ -119,7 +119,7 @@ With the while loop created, instructions can be added to change the part's colo
If desired, a color can be created manually by assigning a value in each number from 0 to 255.
-### Make the script wait
+### Making the Script Wait
If you add a second line of color changing code right now, it would change the brick's color so fast you might not even see the first color go by. To make the script wait before running the next line of code, use a `Library.task.wait()` function.
@@ -166,7 +166,7 @@ At this point, if the color changing part doesn't work as intended, try one of t
- Make sure all RGB values have numbers from 0 to 255, are whole or decimals, and are separated by commas.
- The numbers inside the `()` of a wait function should be greater than 1. It's possible that if a wait is too short, you may not see that color.
-## Complete color looping part script
+## Complete Color Looping Part Script
```lua
-- Create a variable to store the part
diff --git a/content/en-us/tutorials/fundamentals/coding-5/intro-to-arrays.md b/content/en-us/tutorials/fundamentals/coding-5/intro-to-arrays.md
index 03a9ec32d..b2e60cf8c 100644
--- a/content/en-us/tutorials/fundamentals/coding-5/intro-to-arrays.md
+++ b/content/en-us/tutorials/fundamentals/coding-5/intro-to-arrays.md
@@ -1,5 +1,5 @@
---
-title: Intro to arrays
+title: Intro to Arrays
description: Learn how to use arrays in Roblox Lua to store multiple values at a time. This tutorial shows how to create and change arrays while making an interactive NPC in Roblox.
next: /tutorials/fundamentals/coding-5/loops-and-arrays
prev: /tutorials/fundamentals/coding-5/landing
@@ -21,7 +21,7 @@ There are different types of tables. One type is an **array**, which stores list
`local myArray = {"item1", "item2", 10, workspace.Part, myVariable}`
-### Create a talking character
+### Creating a Talking Character
To explore arrays, you'll work with a non-playable character (NPC) that, when clicked, shows a different line of dialogue.
@@ -37,7 +37,7 @@ This project will use a pre-made NPC model, which includes a partial script and
2. In Explorer, import the NPC by right-clicking on **Workspace** > **Insert From File** and select the downloaded file.
-## Code a dialogue array
+## Coding a Dialogue Array
These steps use an array to store different phrases for the NPC to say when players interact with it.
@@ -73,7 +73,7 @@ These steps use an array to store different phrases for the NPC to say when play
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}
```
-## Use array indexes
+## Using Array Indexes
Each value in the array is assigned an `index` number. Indexes are assigned to values in the order in which the values are stored. The first value is at index 1, the second at index 2, and so forth.
@@ -104,7 +104,7 @@ In the array just created, `"Hi"` is at index 1, and `"Goodbye!"` is at index 3.
-## Use specific index values
+## Using Specific Index Values
Use index values to assign specific pieces of dialogue to the NPC. To use a value at a specific index, add the index in brackets directly after the array's name, like `dialogueArray[1]`.
@@ -127,7 +127,7 @@ Use index values to assign specific pieces of dialogue to the NPC. To use a valu
-## Change dialogue lines
+## Changing Dialogue Lines
When the player interacts with the NPC, the NPC will always say the same line. That's boring. Instead, use a variable to update which index value to use.
@@ -168,7 +168,7 @@ Notice there's an **error** in the Output Window once the script reaches the end
You'll fix this in the next section so the dialogue restarts from the beginning after it shows the last string.
-## Array sizes
+## Array Sizes
You can use the size of the array to know when to reset the desired index to 1. Find the **size** of an array by typing `#`, without spaces, before an array's name.
@@ -176,7 +176,7 @@ For example: `#dialogueArray`
Check the array's size against the variable's current value to know when it's time to start back at the beginning.
-### Restart the dialogue
+### Restarting the Dialogue
Use the array size to check when it's time to cycle back to the first piece of dialogue.
@@ -241,14 +241,14 @@ This script used an array to create a list of possible dialogue lines for a Non-
prompt.Triggered:Connect(speak)
```
-### Troubleshooting tips
+### Troubleshooting Tips
If the character doesn't go through the array of dialogue, try the following troubleshooting tips.
- Check the if statement that `dialogueIndex` is set back to 1. In the else statement, check that `dialogueIndex` has 1 added to itself.
- When getting the array's size, ensure there are no spaces after the # in `#dialogueArray`.
-## Optional challenges
+## Optional Challenges
Try one of the optional challenges below.
diff --git a/content/en-us/tutorials/fundamentals/coding-5/intro-to-dictionaries.md b/content/en-us/tutorials/fundamentals/coding-5/intro-to-dictionaries.md
index ca38071e3..d6ed1453a 100644
--- a/content/en-us/tutorials/fundamentals/coding-5/intro-to-dictionaries.md
+++ b/content/en-us/tutorials/fundamentals/coding-5/intro-to-dictionaries.md
@@ -1,5 +1,5 @@
---
-title: Intro to dictionaries
+title: Intro to Dictionaries
description: Learn how to use a dictionary table to tag values within data sets.
next: /tutorials/fundamentals/coding-5/pairs-and-ipairs
prev: /tutorials/fundamentals/coding-5/making-changes-to-arrays
@@ -18,7 +18,7 @@ local pet = {
Use dictionaries when you need to label values, not just list them in order as an array does. Practice using dictionaries in this tutorial by manipulating values associated with a player.
-## Dictionary syntax
+## Dictionary Syntax
Like arrays, dictionaries are assigned to a variable with curly brackets `{}`. **Key-value pairs** are stored on separate lines followed by a comma. Keys and values can be any data type, including strings, numbers, and variable names.
@@ -47,7 +47,7 @@ print(partList[redPart])
Use consistent data types for dictionary keys. Mixing data types, such as using both strings and variables for keys, can lead to inconsistent results when manipulating the array and confuse other coders.
-## Create a dictionary
+## Creating a Dictionary
One everyday use of dictionaries is organizing player or character information. These steps explore how a theoretical enemy character's information can be stored and accessed.
@@ -84,7 +84,7 @@ One everyday use of dictionaries is organizing player or character information.
}
```
-### Use dictionary values
+### Using Dictionary Values
There are two ways to access dictionary values:
@@ -103,7 +103,7 @@ print("The villain " .. enemy.Name .. " approaches!")
Which style to use usually depends on the purpose of the table. For tables holding a collection of values like a list of players in a server, coders will usually use `tableName["keyName"]`. For a dictionary used to describe an object, coders are more likely to use `tableName.keyName`.
-## Change a dictionary value
+## Changing a Dictionary Value
Changing a key's value is the same as any other variable; use the equal `=` operator.
@@ -120,9 +120,9 @@ Changing a key's value is the same as any other variable; use the equal `=` oper
print("The enemy's name is " .. enemy.Name)
```
-2. Playtest and check the Output Window.
+2. Playtest and check the Output window.
-## Pre-existing variables as keys
+## Pre-existing Variables as Keys
Dictionaries can interact with pre-existing variables declared in other parts of a script. The following coding example uses a variable to add a player's name as a key when they join the experience and then sets their points value to 0.
@@ -203,7 +203,7 @@ end
Players.PlayerAdded:Connect(setPoints)
```
-### Optional challenges
+### Optional Challenges
Below are some challenges that apply to using dictionaries in different ways. See if you can build out the code for these.
diff --git a/content/en-us/tutorials/fundamentals/coding-5/landing.md b/content/en-us/tutorials/fundamentals/coding-5/landing.md
index d3ba42d9d..8d22a2b49 100644
--- a/content/en-us/tutorials/fundamentals/coding-5/landing.md
+++ b/content/en-us/tutorials/fundamentals/coding-5/landing.md
@@ -1,15 +1,15 @@
---
-title: Arrays and dictionaries
+title: Arrays and Dictionaries
description: Learn how to store data in tables with arrays and dictionaries in Roblox Lua.
next: /tutorials/fundamentals/coding-5/intro-to-arrays
prev: /tutorials/fundamentals/coding-4/nested-loops
---
-### Series description
+### Series Description
Data structures are how coders store and organize entire sets of data. In Lua, data structures are tables. Unlike variables, tables can hold any number of values. Tables can store a list of high scores, a player's inventory, or all of an object's properties. Two types of tables covered in this series are **dictionaries** and **arrays**.
-### Objectives and prerequisites
+### Objectives and Prerequisites
@@ -34,7 +34,7 @@ Data structures are how coders store and organize entire sets of data. In Lua, d
-### Series contents
+### Series Contents
@@ -45,19 +45,19 @@ Data structures are how coders store and organize entire sets of data. In Lua, d
-
[Intro to arrays](../coding-5/intro-to-arrays.md)
+
[Intro to Arrays](../coding-5/intro-to-arrays.md)
Learn how to store like groupings of data together with arrays.
-
[Loops and arrays](../coding-5/loops-and-arrays.md)
+
[Loops and Arrays](../coding-5/loops-and-arrays.md)
Combine arrays with loops to repeat code with a disappearing path trap.
-
[Make changes to arrays](../coding-5/make-changes-to-arrays.md)
+
[Making Changes to Arrays](../coding-5/making-changes-to-arrays.md)
Add and remove values in arrays by coding a script to manage a player's inventory
-
[Intro to dictionaries](../coding-5/intro-to-dictionaries.md)
+
[Intro to Dictionaries](../coding-5/intro-to-dictionaries.md)
Organize complex sets of data with pairs using dictionaries.
diff --git a/content/en-us/tutorials/fundamentals/coding-5/loops-and-arrays.md b/content/en-us/tutorials/fundamentals/coding-5/loops-and-arrays.md
index 30428e781..ef50275ca 100644
--- a/content/en-us/tutorials/fundamentals/coding-5/loops-and-arrays.md
+++ b/content/en-us/tutorials/fundamentals/coding-5/loops-and-arrays.md
@@ -1,7 +1,7 @@
---
-title: Loops and arrays
+title: Loops and Arrays
description: Learn how to iterate, or go through, arrays in Roblox Lua using loops.
-next: /tutorials/fundamentals/coding-5/make-changes-to-arrays
+next: /tutorials/fundamentals/coding-5/making-changes-to-arrays
prev: /tutorials/fundamentals/coding-5/intro-to-arrays
---
@@ -11,7 +11,7 @@ To explore looping through arrays, create a disappearing bridge path where parts
-## Loop through an array
+## Looping through an Array
For the project, find or create a set of three parts to make disappear. The parts must all be anchored.
@@ -34,7 +34,7 @@ For the project, find or create a set of three parts to make disappear. The part
}
```
-### Use a for loop with an array
+### Using a for Loop With an Array
Use a for loop to go through the array and control how fast the parts should disappear in the order the parts are indexed within the array.
@@ -85,7 +85,7 @@ Use a for loop to go through the array and control how fast the parts should dis
-### Troubleshooting tips
+### Troubleshooting Tips
If the bridge doesn't disappear, check the possible issues below:
@@ -93,7 +93,7 @@ If the bridge doesn't disappear, check the possible issues below:
- Depending on how fast your character loads into the experience, the first parts may already be invisible. To address this, add a small wait, such as `task.wait(2)`, at the start of the script.
-### Code the second loop
+### Coding the Second Loop
Right now, the parts disappear forever. To make them reappear, create a second for loop that will go through each part and instantly make each piece walkable.
@@ -129,7 +129,7 @@ Right now, the parts disappear forever. To make them reappear, create a second f
-## Repeat with a while loop
+## Repeating with a While Loop
The parts disappear and reappear, but only once. To make the code keep repeating, nest all of the code within a while loop.
diff --git a/content/en-us/tutorials/fundamentals/coding-5/make-changes-to-arrays.md b/content/en-us/tutorials/fundamentals/coding-5/making-changes-to-arrays.md
similarity index 96%
rename from content/en-us/tutorials/fundamentals/coding-5/make-changes-to-arrays.md
rename to content/en-us/tutorials/fundamentals/coding-5/making-changes-to-arrays.md
index e0b5146cf..0979717b9 100644
--- a/content/en-us/tutorials/fundamentals/coding-5/make-changes-to-arrays.md
+++ b/content/en-us/tutorials/fundamentals/coding-5/making-changes-to-arrays.md
@@ -1,5 +1,5 @@
---
-title: Make changes to arrays
+title: Making Changes to Arrays
description: Learn how to add, remove, and find values in an array in Roblox Lua using tables.
next: /tutorials/fundamentals/coding-5/intro-to-dictionaries
prev: /tutorials/fundamentals/coding-5/loops-and-arrays
@@ -13,7 +13,7 @@ To apply these skills, you'll create a script that helps to manage a player's in
-## Add values to arrays
+## Adding Values to Arrays
To add a new value to an array, use `table.insert(array, valueToInsert)`. The second parameter can be any value such as a string, number, or entire object, like `Class.Player` or `Class.IntValue`.
@@ -39,11 +39,11 @@ To practice, you'll create a script that stores player items in a table, then ad
3. Run the project. In Output, expand the three dots `...` to see the printed table.
-## Remove values from arrays
+## Removing Values from Arrays
To remove a value, like if a player used an item or someone in a list of active players leaves an experience, use `Library.table.remove()`. Depending on the parameters provided, the function can either remove the last value of a table, or at a specific index.
-### Remove the last value
+### Removing the Last Value
Sometimes a script needs to remove a specific item. For instance, removing the first item in a player's inventory, or picking the first player in a list. To remove the last value in an array, use `Library.table.remove(arrayName)`. In this use case, the only parameter needed is the table itself.
@@ -61,9 +61,9 @@ Sometimes a script needs to remove a specific item. For instance, removing the f
print(playerItems)
```
-2. Run the project. In the Output Window, the last value, `"Sleeping Bag"`, shouldn't print.
+2. Run the project. In the Output window, the last value, `"Sleeping Bag"`, shouldn't print.
-### Remove by index
+### Removing by Index
To remove a value at a specific point in the array, input in the second parameter the index to remove, such as `table.remove(arrayName, 1)`.
@@ -89,11 +89,11 @@ To remove a value at a specific point in the array, input in the second paramete
Notice also that all the index values changed or have been pushed. Removing a value from an array will change the array size and shift index values **down** after the one removed. `"Bread"` is now index 1, and `"Sleeping Bag"` is now index 2.
-## Search for values in an array
+## Searching for Values in an Array
To find specific values in arrays, like the name of a winning player, use the `Library.table.find()` function. Alternatively, you can code your own search function using `for` loops and `if` statements.
-### Find and return a single value
+### Finding and Returning a Single Value
To find a value in an array, create a function named `findValue()` that goes through an array and stops the first time it finds a matching value.
@@ -150,7 +150,7 @@ Once it finds the value, the function will use the `return` keyword to return th
print("The value is at index " .. valueFound)
```
-### Remove a value
+### Removing a Value
If a value was found using the find function, it can be removed. Check if a value was found with an if statement.
@@ -175,7 +175,7 @@ If a value was found using the find function, it can be removed. Check if a valu
Notice that because this function was called once, only the first instance of `"Bread"` was removed. The following section will cover how to find and remove all instances.
-## Find and remove all of a specific value
+## Finding and Removing All of a Specific Value
While the previous code could only remove the first instance of a value found, this code snippet will find and remove all occurrences from an array. For example, if, say, a player wanted to sell all their bread at an in-game store.
diff --git a/content/en-us/tutorials/fundamentals/coding-5/pairs-and-ipairs.md b/content/en-us/tutorials/fundamentals/coding-5/pairs-and-ipairs.md
index 06b318c29..def66e044 100644
--- a/content/en-us/tutorials/fundamentals/coding-5/pairs-and-ipairs.md
+++ b/content/en-us/tutorials/fundamentals/coding-5/pairs-and-ipairs.md
@@ -1,7 +1,7 @@
---
title: pairs and ipairs
description: pairs() and ipairs() are used to go through Roblox Lua tables. This lesson covers how to code them for a script and when to use them.
-next: /tutorials/fundamentals/coding-5/return-values-from-tables
+next: /tutorials/fundamentals/coding-5/returning-values-from-tables
prev: /tutorials/fundamentals/coding-5/intro-to-dictionaries
---
@@ -143,12 +143,12 @@ Use `pairs()` to see what was picked, and then `ipairs()` to print the list of i
The above step is an example of error checking in computer science. It's always a good practice to code what happens if there's a missing value possible in your code. If not, it's possible there might be an error during run time.
-## Optional challenges
+## Optional Challenges
Below are some challenges that apply using pairs and ipairs in different ways. Try seeing if you can build out the code for these.
**Challenge**: Create a Waiter NPC
-Instead of using the Output Window, use the NPC from [Intro To Arrays](../coding-5/intro-to-arrays.md) to create a waiter to take customer orders.
+Instead of using the output window, use the NPC from [Intro To Arrays](../coding-5/intro-to-arrays.md) to create a waiter to take customer orders.
**Challenge**: Allow Players to Place Orders
Allow players to select an ingredient by touching a physical part such as a proximity prompt. For more information, see [Proximity Prompts](../../../ui/proximity-prompts.md).
diff --git a/content/en-us/tutorials/fundamentals/coding-5/return-values-from-tables.md b/content/en-us/tutorials/fundamentals/coding-5/returning-values-from-tables.md
similarity index 96%
rename from content/en-us/tutorials/fundamentals/coding-5/return-values-from-tables.md
rename to content/en-us/tutorials/fundamentals/coding-5/returning-values-from-tables.md
index 573d98fad..bc37377ee 100644
--- a/content/en-us/tutorials/fundamentals/coding-5/return-values-from-tables.md
+++ b/content/en-us/tutorials/fundamentals/coding-5/returning-values-from-tables.md
@@ -1,5 +1,5 @@
---
-title: Return values from tables
+title: Returning Values from Tables
description: Learn how to write a search function using pairs and ipairs to return values from tables in Roblox Lua.
next: /tutorials/fundamentals/coding-6/landing
prev: /tutorials/fundamentals/coding-5/pairs-and-ipairs
@@ -29,7 +29,7 @@ local placeInLine = getPlaceInLine(shipToFind)
print("Your place in line is " .. placeInLine)
```
-## Dictionary search example
+## Dictionary Search Example
Have you ever searched for a lost pet in house going room by room? On your own code a function to search through a dictionary named house to see which room holds a lost puppy.
diff --git a/content/en-us/tutorials/fundamentals/coding-6/coding-concept-abstraction.md b/content/en-us/tutorials/fundamentals/coding-6/coding-concept-abstraction.md
index 4af1be5aa..2745fac4a 100644
--- a/content/en-us/tutorials/fundamentals/coding-6/coding-concept-abstraction.md
+++ b/content/en-us/tutorials/fundamentals/coding-6/coding-concept-abstraction.md
@@ -1,5 +1,5 @@
---
-title: Coding concept - abstraction
+title: Coding Concept - Abstraction
description: Abstractions in computer science are simplified representations of a larger idea or concept. This is used for computer science AP CSP lessons.
next: /tutorials/fundamentals/coding-6/coding-concept-algorithms
prev: /tutorials/fundamentals/coding-6/creating-with-module-scripts
@@ -11,11 +11,11 @@ prev: /tutorials/fundamentals/coding-6/creating-with-module-scripts
A common example in coding languages is `print()`. Most of its code is hidden, so the coder can focus on what needs to be printed and not the rest of the code.
-## Why create abstractions
+## Why Create Abstractions
Abstractions keeps programs organized, reduces complexity, and makes code easier to update.
-### Shop example
+### Shop Example
Say that you have an in-game shop that sells just two different backpacks. The code for the second backpack was copied with slight changes, such as a different name and selling price.
@@ -38,7 +38,7 @@ Here, the code is **not** abstracted. Each backpack has a script of its own. Wha
- A holiday sale, 25% off all backpacks.
-## Design abstractions
+## Designing Abstractions
Having separate backpack scripts makes adding and updating backpacks time consuming. Instead, create an abstraction so you don't have to make updates in so many different places.
diff --git a/content/en-us/tutorials/fundamentals/coding-6/coding-concept-algorithms.md b/content/en-us/tutorials/fundamentals/coding-6/coding-concept-algorithms.md
index 384984d41..07d314036 100644
--- a/content/en-us/tutorials/fundamentals/coding-6/coding-concept-algorithms.md
+++ b/content/en-us/tutorials/fundamentals/coding-6/coding-concept-algorithms.md
@@ -1,5 +1,5 @@
---
-title: Coding concept - algorithms
+title: Coding Concept - Algorithms
description: Algorithms in computer science are a series of steps used to determine an outcome. This is used for computer science AP CSP lessons.
prev: /tutorials/fundamentals/coding-6/coding-concept-abstraction
---
@@ -29,7 +29,7 @@ For an offline activity, try using this combination of art and computer science
-## Create algorithms in code
+## Creating Algorithms in Code
In real life, we don't usually think about the algorithms we use everyday. Computers however, need algorithms to be coded step-by-step and use at least one of three methods to solve a problem or produce an outcome.
@@ -84,7 +84,7 @@ In real life, we don't usually think about the algorithms we use everyday. Compu
-## Combine algorithms
+## Combining Algorithms
Much like larger problems can be broken into smaller problems, some algorithms can be broken down into a series of smaller algorithms.
diff --git a/content/en-us/tutorials/fundamentals/coding-6/create-with-module-scripts.md b/content/en-us/tutorials/fundamentals/coding-6/creating-with-module-scripts.md
similarity index 97%
rename from content/en-us/tutorials/fundamentals/coding-6/create-with-module-scripts.md
rename to content/en-us/tutorials/fundamentals/coding-6/creating-with-module-scripts.md
index 2061592bf..e7551ac01 100644
--- a/content/en-us/tutorials/fundamentals/coding-6/create-with-module-scripts.md
+++ b/content/en-us/tutorials/fundamentals/coding-6/creating-with-module-scripts.md
@@ -1,5 +1,5 @@
---
-title: Create with module scripts
+title: Creating with Module Scripts
description: Apply your knowledge of modular scripts in Roblox with this practical example.
next: /tutorials/fundamentals/coding-6/coding-concept-abstraction
prev: /tutorials/fundamentals/coding-6/intro-to-module-scripts
@@ -11,11 +11,11 @@ To apply your knowledge of module scripts, create a module script that allows pl
-## Project setup
+## Project Setup
This project includes a starter map with leaderboard and scripted pickup objects for the keys and treasure chests.
-### Load the starter project
+### Load the Starter Project
1. Download the starter project.
@@ -26,7 +26,7 @@ This project includes a starter map with leaderboard and scripted pickup objects
2. In Roblox Studio, open the downloaded file: _Intro to Module Scripts - Starter Project.rbxl_.
-### Create a module script
+### Create a Module Script
So players can get treasure from chests, create a module script named _TreasureManager_. Using a module script will connect the pickups and leaderboards together.
@@ -41,11 +41,11 @@ So players can get treasure from chests, create a module script named _TreasureM
return TreasureManager
```
-## Use functions in module scripts
+## Using Functions in Module Scripts
To test how functions work in module scripts, create a new function named `getKey()`. When the `getKey()` function is called from another script, it'll receive a key part to destroy and add 1 to the number of keys in the player's inventory.
-### Create a module function for keys
+### Create a Module Function for keys
1. This module script will use a combination of module and local functions, type **two** comments to help you keep them separated.
@@ -87,7 +87,7 @@ To test how functions work in module scripts, create a new function named `getKe
end
```
-### Use the module function
+### Use the Module Function
Now, the module function `getKey()` can be used in other scripts. To test that function, you'll open a premade script and call it.
@@ -141,7 +141,7 @@ Now, the module function `getKey()` can be used in other scripts. To test that f
-### Troubleshooting tips
+### Troubleshooting Tips
**Issue:** Get an error message including: `"Infinite yield possible"`.
@@ -254,11 +254,11 @@ end
return TreasureManager
```
-## Get information from module scripts
+## Getting Information From Module Scripts
The _TreasureManager_ module script will be used when players touch a treasure chest to check if they have at least one key before opening it and giving them gold.
-### Check if chests can be opened
+### Check If Chests Can Be Opened
1. First in **ServerStorage** > _TreasureManager_ script, set up variables for how many keys it costs to open a chest, and how much gold each chest contains.
@@ -306,7 +306,7 @@ The _TreasureManager_ module script will be used when players touch a treasure c
end
```
-### Give players treasure
+### Give Players Treasure
So the player can open a chest, create a function in _TreasureManager_ that awards them treasure.
@@ -335,7 +335,7 @@ So the player can open a chest, create a function in _TreasureManager_ that awar
end
```
-### Call the chest functions
+### Call the Chest Functions
Now that the two module functions, `canOpenChest()` and `openChest()`, have been created, they can be called by the Chest parts whenever a player touches them using the premade `partTouched()` function.
@@ -397,13 +397,13 @@ Now that the two module functions, `canOpenChest()` and `openChest()`, have been
- If you have at least 1 key, touching a chest will destroys it and awards treasure.
- If you have 0 keys, you can't open a treasure chest.
-### Troubleshooting tips
+### Troubleshooting Tips
- In _ChestScript_, make sure that functions called from the module script like `canOpenChest()` are spelled exactly how they're found in the _TreasureManager_ script. Any difference will cause an error.
- Check that copy and pasted functions, like `treasureManager.openChest()`, are exactly as shown in the lesson. Any differences can cause subtle errors in the script.
-## Finished scripts
+## Finished Scripts
```lua title='Finished TreasureManager Script'
diff --git a/content/en-us/tutorials/fundamentals/coding-6/intro-to-module-scripts.md b/content/en-us/tutorials/fundamentals/coding-6/intro-to-module-scripts.md
index d15dbf2f6..58ef47e60 100644
--- a/content/en-us/tutorials/fundamentals/coding-6/intro-to-module-scripts.md
+++ b/content/en-us/tutorials/fundamentals/coding-6/intro-to-module-scripts.md
@@ -1,7 +1,7 @@
---
-title: Intro to module scripts
+title: Intro to Module Scripts
description: Learn key concepts around organizing and reusing code in Roblox with modular scripts.
-next: /tutorials/fundamentals/coding-6/create-with-module-scripts
+next: /tutorials/fundamentals/coding-6/creating-with-module-scripts
prev: /tutorials/fundamentals/coding-6/landing
---
@@ -15,11 +15,11 @@ By storing commonly used code in module scripts, it makes maintaining and organi
Normal scripts should be used for standalone elements of a game, such as touching a pickup, while module scripts are useful for storing code that can be reused by multiple independent scripts, like rewarding points.
-## Module script basics
+## Module Script Basics
Module scripts are actually their own separate object compared to script objects. In Roblox, module scripts can be denoted with a **purple** icon.
-### Create a module script
+### Creating a Module Script
ModuleScripts are commonly placed in **ServerScriptService** when used by server-side scripts and **ReplicatedStorage** when used by client-side local scripts (such as GUI interactions).
@@ -27,7 +27,7 @@ ModuleScripts are commonly placed in **ServerScriptService** when used by server
-### Structure of module scripts
+### Structure of Module Scripts
When created, every module script starts out with the code below:
@@ -47,7 +47,7 @@ return RewardManager
So other scripts can use a module's non-local functions or variables, every module ends with return `MyModule`. Whenever another script tries to get code from the module, return lets that script access code stored inside the module table.
-### Add to module scripts
+### Adding to Module Scripts
To add a function or variable to the module which can be used in another script, type the module table's name, followed by a dot, and the name of the function or variable, like in `TestModule.myVariable`. Using the dot operator is another way of adding code into a table, allowing other scripts to access that code whenever the module table is returned.
@@ -69,7 +69,7 @@ return TestModule
Anything added to the module table should be typed between `local MyModule = {}` and `return MyModule`, or else the code may create an error.
-### Scope in module scripts
+### Scope in Module Scripts
For a module function or variable to be used in an outside script, **don't** type `local`.
@@ -99,7 +99,7 @@ end
return RewardManager
```
-## Use modules in other scripts
+## Using Modules In Others Scripts
By itself, a module script can't run code — it needs to be loaded in another script using the keyword `Global.LuaGlobals.require()`. The function `Global.LuaGlobals.require()` accepts one argument, the location of the module script in the Explorer.
@@ -117,7 +117,7 @@ local MyModule = require(ServerStorage.ModuleScript)
MyModule.myFunction()
```
-## RewardManager example
+## RewardManager Example
```lua title="ModuleScript - RewardManager"
local RewardManager = {}
@@ -156,7 +156,7 @@ print("Should award " .. coins .. " coins")
If you're in another script, make sure that the module script function or variable is spelled **exactly** the same as found in that module. To help, you can copy the exact function or variable name from the module and then just paste it in the normal script where it'll be used.
-## General troubleshooting
+## General Troubleshooting
Some of the tips here address common issues when working with module scripts. Keep in mind that module scripts can be a complicated topic with more nuance. For more details, see this more technical guide on [Module Scripts](../../../scripting/module.md).
diff --git a/content/en-us/tutorials/fundamentals/coding-6/landing.md b/content/en-us/tutorials/fundamentals/coding-6/landing.md
index 9cb01fcc4..d8cef35fd 100644
--- a/content/en-us/tutorials/fundamentals/coding-6/landing.md
+++ b/content/en-us/tutorials/fundamentals/coding-6/landing.md
@@ -1,20 +1,20 @@
---
-title: Organizing code
+title: Organizing Code
description: Roblox module scripts are one way of organizing code. This series covers how they work and how to implement them in a game experience.
next: /tutorials/fundamentals/coding-6/intro-to-module-scripts
prev: /tutorials/fundamentals/coding-5/returning-values-from-tables
---
-### Series description
+### Series Description
As you continue to work with code, scripts will become more complex. To address this, coders have a variety of techniques to make coding efficient, easy to understand, and reduce the chance of error. This series covers methods of organizing scripts, such as module scripts, a special type in script that can store functions and variables used by other scripts.
-### Objectives and prerequisites
+### Objectives and Prerequisites
-
Learning objectives
+
Learning Objectives
Understand the logic behind module scripts, as well as how to code a module script and access it in other scripts.
@@ -32,7 +32,7 @@ As you continue to work with code, scripts will become more complex. To address
-### Series contents
+### Series Contents
@@ -43,19 +43,19 @@ As you continue to work with code, scripts will become more complex. To address
-
[Intro to module scripts](../coding-6/intro-to-module-scripts.md)
+
[Intro to Module Scripts](../coding-6/intro-to-module-scripts.md)
Learn how to use module scripts, a type of script that stores functions and variables that can be called or accessed from other scripts.
-
[Create with module scripts](../coding-6/create-with-module-scripts.md)
+
[Creating with Module Scripts](../coding-6/creating-with-module-scripts.md)
Apply using module scripts to create a mini-game where players gather keys to open chests.
Abstractions in computer science provide a simplified representation of something larger. They pull out only the most necessary information and hide everything else.
An **algorithm** uses a series of steps to determine an outcome. Steps can be a set of directions, comparisons, or even a mathematical formula.
diff --git a/content/en-us/tutorials/index.md b/content/en-us/tutorials/index.md
index 6b73ed639..5601369c5 100644
--- a/content/en-us/tutorials/index.md
+++ b/content/en-us/tutorials/index.md
@@ -1,5 +1,5 @@
---
-title: Start learning with tutorials
+title: Start Learning with Tutorials
description: Learn how to create Roblox experiences, avatars, and avatar items with use case tutorials, curriculum paths, and videos.
hideInPageNavigation: true
---
@@ -8,7 +8,7 @@ Roblox offers both short and long-form tutorials to help you learn various creat
- **Experiences** - 3D worlds that you can create and publish using Roblox Studio.
- **Avatars** - Character models with many specialized features that allow players to interact with experiences and express themselves.
-- **Avatar items** - Clothing and accessories that players can use to customize their avatars.
+- **Avatar Items** - Clothing and accessories that players can use to customize their avatars.
While many creators focus on a single area, the following tutorials walk you through the fundamentals of each process.
@@ -21,12 +21,12 @@ While many creators focus on a single area, the following tutorials walk you thr
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Create your first experience
+ Create Your First ExperienceLearn about important concepts for developing on Roblox by recreating an experience that launches projectiles at floating platforms.
@@ -38,12 +38,12 @@ While many creators focus on a single area, the following tutorials walk you thr
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Create your first avatar character
+ Create Your First Avatar CharacterLearn how to create your own custom avatar character using Blender and one of Roblox's downloadable template models.
@@ -53,16 +53,16 @@ While many creators focus on a single area, the following tutorials walk you thr
-
+
- Create your first avatar item
+ Create Your First Avatar ItemLearn how to convert a mesh object in Blender to either a publishable accessory item or an equipable and layable clothing item for avatars.
-
+
-
+
@@ -71,7 +71,7 @@ While many creators focus on a single area, the following tutorials walk you thr
-
Curriculum paths
+
Curriculum Paths
**Curriculum paths** provide a comprehensive overview of the various skills you need for different development areas after you familiarize yourself with Studio's core functionality. In addition to demonstrating how to use Studio features for each creative discipline, this long-form type of structured learning shows you how to examine and solve common design problems within your own experiences.
@@ -87,7 +87,7 @@ While many creators focus on a single area, the following tutorials walk you thr
@@ -99,12 +99,12 @@ While many creators focus on a single area, the following tutorials walk you thr
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Environmental art
+ Environmental ArtLearn how to recreate a high-quality environment for a first-person laser tag experience.
@@ -116,19 +116,19 @@ While many creators focus on a single area, the following tutorials walk you thr
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Gameplay scripting
+ Gameplay ScriptingLearn how to organize and implement the gameplay logic for a large, complex project.
**Use case tutorials** focus on a specific task that you can complete in order to learn about various aspects of developing in Studio. In addition to teaching you how to use collections of related features to recreate common components for experiences, this short-form type of structured learning highlights techniques you can use to achieve effects for a variety of design requirements.
@@ -142,9 +142,9 @@ While many creators focus on a single area, the following tutorials walk you thr
Modeling
@@ -250,8 +250,8 @@ While many creators focus on a single area, the following tutorials walk you thr
Scripting
-
Learn how to script the gameplay logic for player hazards, such as deadly lava and fading traps
-
Learn how to script the gameplay logic for player information, such as their score, health, and data that needs to persist between sessions
+
Learn how to script the gameplay logic for player hazards, such as deadly lava and fading traps
+
Learn how to script the gameplay logic for player information, such as their score, health, and data that needs to persist between sessions
@@ -264,11 +264,11 @@ While many creators focus on a single area, the following tutorials walk you thr
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Input and camera
+ Input and Camera
Learn how to detect user input to trigger unique actions in your experiences
diff --git a/content/en-us/tutorials/use-case-tutorials/animation/create-an-animation.md b/content/en-us/tutorials/use-case-tutorials/animation/creating-an-animation.md
similarity index 99%
rename from content/en-us/tutorials/use-case-tutorials/animation/create-an-animation.md
rename to content/en-us/tutorials/use-case-tutorials/animation/creating-an-animation.md
index bcdcdf9bb..99cf9b2e1 100644
--- a/content/en-us/tutorials/use-case-tutorials/animation/create-an-animation.md
+++ b/content/en-us/tutorials/use-case-tutorials/animation/creating-an-animation.md
@@ -1,5 +1,5 @@
---
-title: Create character animations
+title: Creating Character Animations
description: The process for using the Animation Editor to create custom character animations.
---
@@ -18,9 +18,9 @@ After you complete this tutorial, you will have an assetID for your animation, a
-## Add rig
+## Add Rig
-**Rigs**, or collections of parts connected by joints like `Class.Bone` or `Class.Motor6D` objects, are necessary to create character animations because they include the internal structure you need to move and rotate body parts into different poses. While you can [create your own rigs](../../../art/modeling/rig-a-humanoid-model.md) using external 3D modeling tools, Studio provides several pre-built rigs that you can access through the [Rig Builder](../../../studio/rig-builder.md) plugin.
+**Rigs**, or collections of parts connected by joints like `Class.Bone` or `Class.Motor6D` objects, are necessary to create character animations because they include the internal structure you need to move and rotate body parts into different poses. While you can [create your own rigs](../../../art/modeling/rigging-a-humanoid-model.md) using external 3D modeling tools, Studio provides several pre-built rigs that you can access through the [Rig Builder](../../../studio/rig-builder.md) plugin.
@@ -53,7 +53,7 @@ To add a pre-built rig to the 3D space:
-## Pose rig
+## Pose Rig
Every animation is made up of a sequence of key poses at different frames, then Studio programmatically **interpolates**, or "fills in", the in-between frames to create smooth movement. For example, if you were to create a key pose of an arm reaching toward the sky at the 0:00 frame, then another key pose of the same arm reaching toward the ground at the 0:09 frame, Studio fills in the 0:01-0:08 frames between the poses.
@@ -86,7 +86,7 @@ Animation is an art form, and the design decisions you make for your character m
-### Left step
+### Left Step
The first course of action for a walk cycle is to create the four key poses that make up the character's left step, or the step they take to move forward with their left foot. As you complete each pose, consider how the character's weight shifts from an even distribution between both feet to balancing on a single foot, and how that affects movement throughout the rest of their body.
@@ -301,7 +301,7 @@ To create a first pass High pose for the left foot cycle:
1. Save the animation.
-### Right step
+### Right Step
The second course of action for a walk cycle is to create the four key poses that make up the character's right step, or the step they take to move forward with their right foot. While this tutorial focuses on recreating the same process as the character's left foot sequence, you can make subtle adjustments that add personality to your walk cycle, such as a lean to the right or extra pep in their right step.
@@ -483,7 +483,7 @@ To create a first pass High pose for the right foot cycle:
1. Save the animation.
-## Test animation
+## Test Animation
After you complete your first pass of your key poses, it's important to test your animation to see how it flows together. If there are any inconsistencies or choppy transitions, you can make subtle adjustments to ensure the animation is as smooth as it should be for your character's body and personality.
@@ -516,7 +516,7 @@ To test your poses:
-## Publish animation
+## Publish Animation
In order to play your animation in your open experience, as well as store it for reuse in other projects, you must publish the animation to the cloud. This process creates a unique assetID for your animation that you can reference in scripts, which is especially important if you want to replace any of Roblox's default character animations.
diff --git a/content/en-us/tutorials/use-case-tutorials/animation/play-character-animations.md b/content/en-us/tutorials/use-case-tutorials/animation/playing-character-animations.md
similarity index 97%
rename from content/en-us/tutorials/use-case-tutorials/animation/play-character-animations.md
rename to content/en-us/tutorials/use-case-tutorials/animation/playing-character-animations.md
index 87c3c206e..a66ba43e0 100644
--- a/content/en-us/tutorials/use-case-tutorials/animation/play-character-animations.md
+++ b/content/en-us/tutorials/use-case-tutorials/animation/playing-character-animations.md
@@ -1,5 +1,5 @@
---
-title: Play character animations
+title: Playing Character Animations
description: The process for changing default character animations and triggering custom animations.
---
@@ -12,7 +12,7 @@ Using the [Hazardous Space Station](https://www.roblox.com/games/134383324873456
After you complete this tutorial, you will have the skills to customize animations for a wide variety of gameplay situations.
-## Change default animations
+## Changing Default Animations
Every character with a default `Class.Humanoid` object, whether it's a player-controlled avatar or a non-player character (NPC), includes a set of **default animations** that play whenever the character performs specific in-experience actions, such as running, climbing, and jumping. Roblox provides these animations out-of-the-box for every experience without any additional scripting effort.
@@ -33,7 +33,7 @@ Every character with a default `Class.Humanoid` object, whether it's a player-co
However, if these default animations don't meet the design requirements for your world's environment, aesthetic, or overall narrative, you can swap them out with custom animations that apply to every player that joins your experience. This game design technique can help your characters and experiences feel more personal, engaging, and immersive.
-To demonstrate, the following section teaches you how to swap out the default walk animation with a custom walk cycle animation from [Create Character Animations](create-an-animation.md). Using this same process, you can swap out any of the default animations with your own animation assetIDs.
+To demonstrate, the following section teaches you how to swap out the default walk animation with a custom walk cycle animation from [Creating Character Animations](creating-an-animation.md). Using this same process, you can swap out any of the default animations with your own animation assetIDs.
@@ -46,7 +46,7 @@ To demonstrate, the following section teaches you how to swap out the default wa
-### Create script
+### Create Script
Every character's `Class.Humanoid` object includes a child `Class.Animator` object that stores all of the character's default animations. In order to set any of these default animations to new assetIDs, you must create a script in the `Class.ServiceScriptService` so that it can reference and override the `Class.Animator` object's default values as soon as players load into the experience.
@@ -85,7 +85,7 @@ When it detects an `Class.Animator` object for the first time, the script then p
-### Replace assetID
+### Replace AssetID
Now that you know your script is able to detect when players load and connect to the server, you can modify your script to specifically reference the animation id(s) you want to swap with your own custom animations.
@@ -141,7 +141,7 @@ The following table contains all of the default character animations that you ca
To replace the default walk animation assetID:
-1. Call the default walk animate script reference, then replace the assetID with your own custom animation assetID. For example, the following code sample references the walk cycle animation from [Create Character Animations](create-an-animation.md).
+1. Call the default walk animate script reference, then replace the assetID with your own custom animation assetID. For example, the following code sample references the walk cycle animation from [Creating Character Animations](creating-an-animation.md).
```lua
local Players = game:GetService("Players")
@@ -170,7 +170,7 @@ To replace the default walk animation assetID:
-## Trigger animations
+## Triggering Animations
While the previous technique focuses on swapping out default animations that automatically play whenever a character performs specific in-experience actions, you can programmatically trigger animations to play in response to **any** character action within the 3D space, such as picking up an item or taking damage from a hazard.
@@ -181,7 +181,7 @@ While the previous technique focuses on swapping out default animations that aut
This method of playing animations is useful because it provides players instantaneous feedback on how they should interact with objects in their environment. To demonstrate, the following section shows you how to trigger an animation whenever characters are too close to hazardous steam leaks as a way of subtly teaching players to avoid walking too close to the walls.
-### Insert volume
+### Insert Volume
One of the most common ways to trigger unique gameplay behavior is to use **volumes**, or invisible regions within the 3D space, to detect when characters or objects interact with specific areas of the environment. When you pair volumes with scripts, you can use their collision feedback to programmatically trigger actions, such as reducing the player's health or playing an animation.
@@ -202,7 +202,7 @@ To insert a volume around a steam leak that will trigger an animation:
-### Create script
+### Create Script
Now that you have a defined region for triggering your animation, it's time to create a script that programmatically detects whenever players collide with the volume. You can then listen for collision events to trigger any animation that makes sense for your gameplay requirements.
@@ -268,7 +268,7 @@ Setting debounce from `false` to `true` to `false` again after the animation fin
-### Add animation
+### Add Animation
If you were to playtest your experience right now, your `TriggerAnimation` script still wouldn't be able to play an animation in response to the local player-volume collision. This is because it's waiting for a child `Class.Animation` object with an animation assetID it can reference, and that `Class.Animation` object doesn't currently exist.
diff --git a/content/en-us/tutorials/use-case-tutorials/audio/in-game-sounds.md b/content/en-us/tutorials/use-case-tutorials/audio/in-game-sounds.md
index a7fe97c5d..1382c6285 100644
--- a/content/en-us/tutorials/use-case-tutorials/audio/in-game-sounds.md
+++ b/content/en-us/tutorials/use-case-tutorials/audio/in-game-sounds.md
@@ -1,5 +1,5 @@
---
-title: In-game sounds
+title: In-Game Sounds
description: The process for creating positional and feedback sounds to enhance an experience.
---
@@ -7,7 +7,7 @@ In addition to background music, in-game audio can enhance a player's experience
For the first example, you'll create a positional sound for a waterfall. In the second example, a script will be used to play a jingle when players touch a collectable.
-## Positional sounds
+## Positional Sounds
When a **Sound** object is parented to a part or attachment, it becomes positional. Audio will emit from its location and grow louder as players get closer, as in the case of this waterfall.
@@ -15,7 +15,7 @@ When a **Sound** object is parented to a part or attachment, it becomes position
-### Create a sound
+### Create a Sound
1. In any desired part, create a new **Sound** object named **WaterfallSound**.
@@ -38,7 +38,7 @@ When a **Sound** object is parented to a part or attachment, it becomes position
4. Test the game to confirm you hear the waterfall ambience.
-### Adjust sound distance
+### Adjust Sound Distance
Notice when testing, the audio plays immediately, even if the player is far away from the object. Using the roll-off properties, you can modify the distance at which a player hears a sound to create fading effects.
@@ -56,14 +56,14 @@ Notice when testing, the audio plays immediately, even if the player is far away
-### Fine tune the roll off
+### Fine Tuning the Roll Off
Depending on your needs, you may want to adjust different properties for special effects or increased realism. See the following properties:
- `Class.Sound.RollOffMaxDistance|RollOffMinDistance` - Minimum distance (in studs) a sound decreases in volume.
- `Class.SoundGroup` - Used to adjust and balance volume between groups of sounds, like background music and in-game effects.
-## Feedback sounds
+## Feedback Sounds
Sounds can be played on command using scripts. You can link sounds to events, such as players touching a part or interacting with a menu. Here, you'll create a script that plays a chime whenever players touch collectable objects.
@@ -71,7 +71,7 @@ Sounds can be played on command using scripts. You can link sounds to events, su
-### Set up collectables
+### Set Up Collectables
The remainder of this tutorial uses a pre-made model. This model includes parts and scripts so players can collect gemstones.
@@ -91,7 +91,7 @@ The remainder of this tutorial uses a pre-made model. This model includes parts

-### Set up the script
+### Setup the Script
1. In **StarterPlayer** > **StarterPlayerScripts**, create a new local script named **CollectableSounds**.
@@ -119,7 +119,7 @@ The remainder of this tutorial uses a pre-made model. This model includes parts
end
```
-### Play a sound
+### Play a Sound
1. Create a variable for **SoundService**, then another variable to store the **feedback sound**.
diff --git a/content/en-us/tutorials/use-case-tutorials/audio/play-background-music.md b/content/en-us/tutorials/use-case-tutorials/audio/playing-background-music.md
similarity index 89%
rename from content/en-us/tutorials/use-case-tutorials/audio/play-background-music.md
rename to content/en-us/tutorials/use-case-tutorials/audio/playing-background-music.md
index 9ed33693c..f5a01d0af 100644
--- a/content/en-us/tutorials/use-case-tutorials/audio/play-background-music.md
+++ b/content/en-us/tutorials/use-case-tutorials/audio/playing-background-music.md
@@ -1,5 +1,5 @@
---
-title: Play background music
+title: Playing Background Music
description: The process for creating background music in your experience.
---
@@ -9,13 +9,13 @@ Audio in Roblox is created with a `Class.Sound` object. Sounds can be positional
-## Play music
+## Playing Music
-You can [upload](../../../sound/assets.md#import-custom-audio) music or [obtain it from the marketplace](../../../sound/assets.md#find-audio-assets), which contains thousands of free-to-use tracks. For this tutorial, you need the **asset ID** of a track.
+You can [upload](../../../sound/assets.md#importing-custom-audio) music or [obtain it from the marketplace](../../../sound/assets.md#finding-audio-assets), which contains thousands of free-to-use tracks. For this tutorial, you need the **asset ID** of a track.
The basic steps are to copy an asset ID, create a `Class.Sound` object, and use a script to play the music.
-### Sound setup
+### Sound Setup
If a sound object is parented to a part, sound will emit from its position. If a sound object is parented to **SoundService**, it will play at the same volume at every point in the game world. This makes SoundService ideal for storing background music.
@@ -37,7 +37,7 @@ Here are some sample music IDs you can use:
- **Upbeat Electronica** - `rbxassetid://1837849285`
- **Grandiose Fantasy** - `rbxassetid://1848183670`
-### Play the song
+### Playing the Song
Background music can be played in a game through a script.
@@ -63,7 +63,7 @@ Background music can be played in a game through a script.
4. Test the game and confirm that the music is audible.
-### Audio properties
+### Audio Properties
Currently, the music doesn't loop. Additionally, the original sound file may be too loud for background music. These settings can be changed through two properties.
diff --git a/content/en-us/tutorials/use-case-tutorials/input-and-camera/control-the-users-camera.md b/content/en-us/tutorials/use-case-tutorials/input-and-camera/controlling-the-users-camera.md
similarity index 97%
rename from content/en-us/tutorials/use-case-tutorials/input-and-camera/control-the-users-camera.md
rename to content/en-us/tutorials/use-case-tutorials/input-and-camera/controlling-the-users-camera.md
index d64429515..497d09c92 100644
--- a/content/en-us/tutorials/use-case-tutorials/input-and-camera/control-the-users-camera.md
+++ b/content/en-us/tutorials/use-case-tutorials/input-and-camera/controlling-the-users-camera.md
@@ -1,11 +1,11 @@
---
-title: Control the user's camera
+title: Controlling the User's Camera
description: Explains how to customize the default camera view for a user.
---
The user's view of the world is represented by a `Class.Camera` object. You can change the camera behavior to suit your experience in a variety of ways. For example, the camera can react to events in the world, such as shaking when a monster walks by, or locked to the side of the user character, as in a side-scroller.
-## Create a first-person camera
+## Creating a First-Person Camera
A first-person camera is a view where the camera stays locked with the character's head, which is more accurate to real life. It's common in shooter and story experiences where the goal is to make the user feel immersed in the world.
@@ -37,13 +37,13 @@ In Studio, the `Class.StarterPlayer` object contains a number of properties that
If your cursor is stuck in the middle of the screen while testing, you can free up your mouse by pressing the Escape key or press ShiftF5 to end the test.
-## Create a side-scrolling camera
+## Creating a Side-Scrolling Camera
A side-scrolling view keeps the camera at a fixed position relative to the side of the character, giving the world a two-dimensional feel.

-### Script the camera
+### Scripting the Camera
1. Expand StarterPlayer, and in StarterPlayerScripts add a **LocalScript** named `CameraManager`.
@@ -88,7 +88,7 @@ A side-scrolling view keeps the camera at a fixed position relative to the side
Only a user can see their own camera configuration, so it is always controlled using `Class.LocalScript`.
-### Point the camera
+### Pointing the Camera
All character models contain a part named **HumanoidRootPart**, which can be used to get the character's position in the world. This sets position the camera points at.
@@ -135,7 +135,7 @@ All character models contain a part named **HumanoidRootPart**, which can be use
Separate individual numbers into variables to make them easier to tweak later.
-### Set the camera position
+### Setting the Camera Position
The camera also needs a position. To give the user's view a 2D side-scrolling look, the camera needs to look directly at the side of the character. Place the camera to the side of the user by adding depth to just the **Z axis** of the camera's position using a `Datatype.Vector3`.
@@ -184,7 +184,7 @@ local function updateCamera()
end
```
-### Sync the camera
+### Sync the Camera
The last step is to run this function repeatedly to keep the camera in sync with the user. The image the user sees is constantly refreshing. The split second it takes to do all of the calculations necessary is called the **render step**.
@@ -223,13 +223,13 @@ The last step is to run this function repeatedly to keep the camera in sync with
2. Playtest your code. Use the A and D keys to move your character from side to side.
-## Create an isometric camera
+## Creating an Isometric Camera
The basic structure of getting the user's position and updating the camera's position every frame can be adapted to many other camera styles, such as an **isometric camera**. An isometric camera is a 3D view pointing slightly down at a fixed angle towards the user character.

-### Modify position and view
+### Modifying Position and View
1. Using the code from the previous example, modify `cameraPosition` to add the same amount to all 3 dimensions.
diff --git a/content/en-us/tutorials/use-case-tutorials/input-and-camera/detect-user-input.md b/content/en-us/tutorials/use-case-tutorials/input-and-camera/detecting-user-input.md
similarity index 93%
rename from content/en-us/tutorials/use-case-tutorials/input-and-camera/detect-user-input.md
rename to content/en-us/tutorials/use-case-tutorials/input-and-camera/detecting-user-input.md
index b2cb5193e..02a5e9a11 100644
--- a/content/en-us/tutorials/use-case-tutorials/input-and-camera/detect-user-input.md
+++ b/content/en-us/tutorials/use-case-tutorials/input-and-camera/detecting-user-input.md
@@ -1,5 +1,5 @@
---
-title: Detect user input
+title: Detecting User Input
description: Explains how to customize and connect user input to actions.
---
@@ -9,9 +9,9 @@ Connecting user input to actions gives users much better and more intuitive cont
-## Get started
+## Getting Started
-This tutorial uses the **Blaster** tool created in [Create Player Tools](../../../tutorials/use-case-tutorials/scripting/intermediate-scripting/create-player-tools.md). You can follow those instructions to create the tool or you can download the [Blaster](https://www.roblox.com/library/6571559694/Blaster) model and insert it into **StarterPack**.
+This tutorial uses the **Blaster** tool created in [Creating Player Tools](../../../tutorials/use-case-tutorials/scripting/intermediate-scripting/creating-player-tools.md). You can follow those instructions to create the tool or you can download the [Blaster](https://www.roblox.com/library/6571559694/Blaster) model and insert it into **StarterPack**.
Models can be added into your Inventory to be used between any experience. To add a model to your experience:
@@ -20,7 +20,7 @@ Models can be added into your Inventory to be used between any experience. To ad
3. In the Toolbox window, click on the **Inventory** button. Then, make sure the dropdown is on **My Models**.
4. Select the **Blaster** model to add it into the experience.
-## Create an action handler
+## Creating an Action Handler
First, you'll need a function to handle when user input is detected.
@@ -85,7 +85,7 @@ First, you'll need a function to handle when user input is detected.
end
```
-## Bind the action
+## Binding the Action
`Class.ContextActionService` can be used to **bind** a function to a specific input by using the `Class.ContextActionService:BindAction()|BindAction` function, which accepts several arguments:
@@ -136,7 +136,7 @@ KeyCodes are values that represent different input buttons, such as keyboard key
-## Unbind the action
+## Unbinding the Action
When the user unequips the tool, the action needs to be **unbound** so they can't reload without the tool being equipped.
diff --git a/content/en-us/tutorials/use-case-tutorials/lighting/create-flickering-lights.md b/content/en-us/tutorials/use-case-tutorials/lighting/creating-flickering-lights.md
similarity index 98%
rename from content/en-us/tutorials/use-case-tutorials/lighting/create-flickering-lights.md
rename to content/en-us/tutorials/use-case-tutorials/lighting/creating-flickering-lights.md
index 7e8672c0a..55bf06fbd 100644
--- a/content/en-us/tutorials/use-case-tutorials/lighting/create-flickering-lights.md
+++ b/content/en-us/tutorials/use-case-tutorials/lighting/creating-flickering-lights.md
@@ -1,5 +1,5 @@
---
-title: Create flickering lights
+title: Creating Flickering Lights
description: Explains the process of creating flickering local light sources in your experience.
---
@@ -19,7 +19,7 @@ In the following method to create flickering lights, follow each section to lear
You can create your own assets in third-party modeling tools and follow along with your own design. For information on exporting models for use in Studio, see [Exporting Requirements](../../../art/modeling/export-requirements.md).
-## Import the sample lamp
+## Importing the Sample Lamp
This guide uses a downloadable `.rbxm` file of a high-quality, customizable banker's lamp model to demonstrate a flickering light technique. You can use this model to understand the basic principles, then apply them to your own models you create within Studio or other third-party modeling software.
@@ -31,7 +31,7 @@ To import the [BankersLamp](../../../assets/tutorials/creating-flickering-lights
-## Create a brightness NumberSequence
+## Creating a Brightness NumberSequence
A `Datatype.NumberSequence` is a data type that represents a series of number values from 0 to 1 over an instance's lifetime. This type of data type is useful for creating flickering lights because you can specify how you want the lamp light's brightness to change over its lifetime, and when you change brightness from full intensity to no light at all in short succession, you can achieve a flickering effect.
@@ -71,7 +71,7 @@ For example, the following graph makes the light flicker to full brightness for
-## Create a loop duration
+## Creating a Loop Duration
Now that you have a `Datatype.NumberSequence` to determine how the lamp light's brightness changes over its lifetime, you must determine how long you want the flickering loop to take. In other words, this loop duration essentially controls how often the `Datatype.NumberSequence` repeats, in seconds.
@@ -91,7 +91,7 @@ To create a loop duration:
1. Set the new **LoopDuration** attribute to **1**. This tells the `Datatype.NumberSequence` to repeat after one second.
-## Script the light flicker
+## Scripting the Light Flicker
Now that you have all of the elements to control the brightness of your lamp over its lifetime, it's time to create a `Class.Script` that will get everything to work together and flicker the light.
diff --git a/content/en-us/tutorials/use-case-tutorials/lighting/enhance-indoor-environments.md b/content/en-us/tutorials/use-case-tutorials/lighting/enhancing-indoor-environments.md
similarity index 98%
rename from content/en-us/tutorials/use-case-tutorials/lighting/enhance-indoor-environments.md
rename to content/en-us/tutorials/use-case-tutorials/lighting/enhancing-indoor-environments.md
index ae7aaceea..bd1f5a983 100644
--- a/content/en-us/tutorials/use-case-tutorials/lighting/enhance-indoor-environments.md
+++ b/content/en-us/tutorials/use-case-tutorials/lighting/enhancing-indoor-environments.md
@@ -1,5 +1,5 @@
---
-title: Enhance indoor environments with Future lighting
+title: Enhancing Indoor Environments with Future Lighting
description: Explains how to leverage Future Lighting to enhance indoor environments.
---
@@ -26,13 +26,13 @@ If at any point you become stuck in the process, you can use **Lighting Indoors
-## Configure global lighting
+## Configure Global Lighting
Global lighting is the luminescence from either the sun or moon in an experience. While this tutorial focuses on enhancing the lighting inside of the cabin that's covered from the sun, it's important to configure global lighting because it impacts the air particles within the general atmosphere of the experience, regardless of whether they are indoors or outdoors.
By adjusting a couple of key default properties in the `Class.Lighting` service and its child `Class.Atmosphere` object, you can dramatically change how both the atmosphere and sunlight coming through the window appears to players, as well as how this lighting interacts with any other object you place in the experience.
-### Enable the Future lighting system
+### Enable the Future Lighting System
The `Class.Lighting.Technology` property determines the behavior of both global and local lighting in your experience. Studio begins every experience with the `Enum.Technology.ShadowMap` lighting system, ensuring that the global lighting has precise shadows and illumination. However, to enhance the environment and enable your local light sources to also produce precise shadows, illumination, and specular highlights, you must enable the `Enum.Technology.Future` lighting system technology.
@@ -71,11 +71,11 @@ To enable **Future** lighting technology:
-### Elevate metal reflections
+### Elevate Metal Reflections
A core advantage of using the Future lighting system is its ability to produce specular highlights on shiny, metallic surfaces. This increases the realism of indoor environments because it emulates real-world lighting behavior, and it provides a sense of depth to objects in the 3D space.
-By default, all materials use [physically-based rendering](../../../art/modeling/surface-appearance.md) (PBR) textures that allow you to display realistic surfaces in various lighting scenarios by using multiple texture maps on a single object. This means that when you use Studio's built-in materials:
+By default, all materials use [Physically-Based Rendering](../../../art/modeling/surface-appearance.md) (PBR) textures that allow you to display realistic surfaces in various lighting scenarios by using multiple texture maps on a single object. This means that when you use Studio's built-in materials:
- The metalness and roughness of a particular surface is already defined for you without any additional steps.
- Objects with Studio's built-in materials naturally react more accurately to the lighting in your environment with realistic reflections.
@@ -100,7 +100,7 @@ To recreate the metal reflections in the sample [Lighting Indoors - Complete](ht
1. In the **Explorer** window, select **Lighting**.
1. In the **Properties** window, ensure that **EnvironmentalDiffuseScale** and **EnvironmentSpecularScale** are set to `1`. If so, the metal in the experience is accurately reflective.
-### Change the time of day
+### Change the Time of Day
In addition to customizing the general atmosphere of the 3D space, global lighting is a powerful tool in creating points of interest within the environment that you want players to explore. When you pair this technique with local light sources, you can indirectly guide players to each section of the gameplay area and prevent them from missing anything important.
@@ -117,7 +117,7 @@ To recreate the time of day in the sample [Lighting Indoors - Complete](https://
-### Amplify the sun rays
+### Amplify the Sun Rays
Now that the sun is at an ideal position in the sky to shine its light in through the window and create a point of interest, you can use the `Class.Lighting` service's child `Class.SunRaysEffect|SunRays` object to exaggerate the sun's illumination by amplifying its individual sun rays. Unlike other static atmospheric effects, sun rays dynamically change shape as objects come between the player's camera and the sun, creating realistic light and shadow visuals.
@@ -141,7 +141,7 @@ To recreate the sun rays in the atmosphere in the sample [Lighting Indoors - Com
1. Set **Intensity** to `0.023` to increase the opacity of the sun's halo.
1. Set **Spread** to `0.266` to widen the sun rays spread across the sky.
-### Adjust the color of ambient light
+### Adjust the Color of Ambient Light
Customizing the color of ambient light, or the general, indirect light in the 3D space, is a common method for both setting the mood of an environment and determining whether its lighting is warm or cool. There are two `Class.Lighting` properties that control the color of ambient lighting:
@@ -168,7 +168,7 @@ To recreate the color of ambient lighting in the sample [Lighting Indoors - Comp
-### Choose a complementary skybox
+### Choose a Complementary Skybox
The `Class.Lighting` service has a child `Class.Sky` object with six individual properties that together create the skybox that makes up an experience's sky. Skyboxes can have a major impact on the look and feel of what's in your environment, so it's important to carefully consider how you can choose a skybox that enhances your experience's visual quality, especially as it influences the overall atmosphere that seeps into indoor spaces.
@@ -217,7 +217,7 @@ To recreate the skybox in the sample [Lighting Indoors - Complete](https://www.r
-### Increase air particle density
+### Increase Air Particle Density
The `Class.Lighting` service has a child `Class.Atmosphere` object with properties that allow you to simulate realistic environments by scattering sunlight in unique ways. While some of these properties are more evident in outdoor environments, such as those that impact the silhouette and blending of distant objects near the skyline, others influence the density and color of the air particles present throughout the 3D space, regardless of whether they are indoors or outdoors.
@@ -243,13 +243,13 @@ To recreate the density of the atmosphere's air particles in the sample [Lightin
-## Configure local lighting
+## Configure Local Lighting
Local lighting is the luminescence from local [light sources](../../../effects/light-sources.md) in your experience, such as `Class.PointLight`, `Class.SpotLight`, and `Class.SurfaceLight` objects. After you configure your global lighting to meet the general lighting and atmosphere requirements of the experience, it's important to utilize these local light sources to meet the specific lighting needs of anything in the scene that you want to illuminate within the 3D space.
The following sections demonstrate how to create each type of local light source and adjust a couple of its default properties to significantly alter how the local lighting compliments your global lighting and interacts with the overall environment.
-### Light the candles
+### Light the Candles
The first objects in the scene that need to illuminate the space are the groupings of candles on the dresser near the window. Their default configuration in the **Lighting Indoors - Start** sample includes the following `Class.ParticleEmitter` objects to add gentle movement to their flames:
@@ -298,7 +298,7 @@ To recreate candle local lighting in the sample [Lighting Indoors - Complete](ht
-### Turn on the desk lamp
+### Turn on the Desk Lamp
The second object in the scene that needs to illuminate the space is the desk lamp near the back corner of the cabin. When you're deciding which local light object you want to use, it's important to review how the type and shape of the light source affects how it shines light in the real world. For example, because the **Lighting Indoors - Start** sample's desk lamp includes a white light bulb under a curved, dark green hood, the lamp must produce two different types of light:
@@ -351,7 +351,7 @@ To recreate the lamp local lighting in the sample [Lighting Indoors - Complete](
-### Illuminate the radio screen
+### Illuminate the Radio Screen
The final object in the scene that needs to illuminate the space is the classic radio in the middle of the statues on the dresser. Similar to the previous section, when deciding which local light object you want to use, it's important to review how the type and shape of the light source **doesn't** emit light in the real world. For example, neither of the previous local light objects work for this radio because its screen wouldn't emit light in every direction like a `Class.PointLight` object, nor from a single point in one direction like a `Class.SpotLight`.
@@ -398,13 +398,13 @@ To recreate the radio surface light in the sample [Lighting Indoors - Complete](
-## Balance light sources
+## Balance Light Sources
Lighting an environment is a balance between your light sources and the camera's perception of their lighting. Even if your light sources have appropriate settings for how they'd illuminate the space in the real world, you may have to adjust and rebalance how the camera perceives that lighting in order to achieve your ideal lighting behavior.
For example, the scene in its current state has an intentionally warm glow throughout the cabin, but its colors and shadows appear both dull and desaturated. To solve this problem, the **Lighting Indoors - Complete** sample adjusts its global lighting to increase its richness in the player's camera without losing details or contrast between light and dark hues throughout the 3D space.
-### Adjust light exposure
+### Adjust Light Exposure
Similar to customizing how long a real-life camera's lens stays open for a picture, the `Class.Lighting` service's `Class.Lighting.ExposureCompensation|ExposureCompensation` property allows you to adjust how much light reaches the camera. Using this property is unique from adjusting the `Class.Lighting.Brightness|Brightness` property because `Class.Lighting.ExposureCompensation|ExposureCompensation` applies a bias toward increasing the effect of brighter parts of the environment.
@@ -432,7 +432,7 @@ To recreate the exposure levels in the sample [Lighting Indoors - Complete](http
-### Adjust color contrast
+### Adjust Color Contrast
Similar to applying a filter over a camera, you can add a `Class.ColorCorrectionEffect` post-processing object to the `Class.Lighting` service to adjust how the camera perceives color. This is useful when you want to make color adjustments that impact the entire environment instead of just a single object or gameplay area.
diff --git a/content/en-us/tutorials/use-case-tutorials/lighting/enhance-outdoor-environments-with-future-lighting.md b/content/en-us/tutorials/use-case-tutorials/lighting/enhancing-outdoor-environments-with-future-lighting.md
similarity index 93%
rename from content/en-us/tutorials/use-case-tutorials/lighting/enhance-outdoor-environments-with-future-lighting.md
rename to content/en-us/tutorials/use-case-tutorials/lighting/enhancing-outdoor-environments-with-future-lighting.md
index d46568401..e63d4e80c 100644
--- a/content/en-us/tutorials/use-case-tutorials/lighting/enhance-outdoor-environments-with-future-lighting.md
+++ b/content/en-us/tutorials/use-case-tutorials/lighting/enhancing-outdoor-environments-with-future-lighting.md
@@ -1,5 +1,5 @@
---
-title: Enhance outdoor environments with Future lighting
+title: Enhancing Outdoor Environments with Future Lighting
description: Explains how to leverage Future Lighting to enhance outdoor environments.
---
@@ -25,11 +25,11 @@ If at any point you become stuck in the process, you can use **Lighting Outdoors
-## Configure global lighting
+## Configure Global Lighting
Global lighting is the luminescence from either the sun or moon in an experience. By adjusting a couple of key default properties in the `Class.Lighting` service, you can dramatically change how that light appears to players, as well as how it interacts with any other object you place in the experience.
-### Enable the Future lighting system
+### Enable the Future Lighting System
The `Class.Lighting.Technology` property determines the behavior of both global and local lighting in your experience. Studio begins every experience with the `Enum.Technology.ShadowMap` lighting system, ensuring that the global lighting has precise shadows and illumination. However, to enhance the environment and equip your local light sources to also produce precise shadows and illumination, such as the light from the campfire, you must enable the `Enum.Technology.Future` lighting system technology directly in Studio. This allows both your global and local lighting to work together and provide more realistic and immersive visuals.
@@ -53,9 +53,9 @@ To enable the `Enum.Technology.Future` lighting system:
-### Elevate metal reflections
+### Elevate Metal Reflections
-By default, all materials use physically-based rendering (PBR) textures that allow you to display realistic surfaces in various lighting scenarios by using multiple image files on a single object. This means that when you use Studio's built-in materials, the metalness and roughness of a particular surface is already defined for you, and the objects with those materials naturally react more accurately to the lighting in your environment with realistic reflections. You can enhance this effect by setting the `Class.Lighting.EnvironmentDiffuseScale` and `Class.Lighting.EnvironmentSpecularScale` properties to `1` to truly take advantage of metal reflections from the `Enum.Technology.Future` lighting system.
+By default, all materials use Physically-Based Rendering (PBR) textures that allow you to display realistic surfaces in various lighting scenarios by using multiple image files on a single object. This means that when you use Studio's built-in materials, the metalness and roughness of a particular surface is already defined for you, and the objects with those materials naturally react more accurately to the lighting in your environment with realistic reflections. You can enhance this effect by setting the `Class.Lighting.EnvironmentDiffuseScale` and `Class.Lighting.EnvironmentSpecularScale` properties to `1` to truly take advantage of metal reflections from the `Enum.Technology.Future` lighting system.
This step is important because it ensures that any PBR textures in your experience, including those from `Class.MaterialVariant|MaterialVariants` or `Class.SurfaceAppearance` objects, look their best and reflect their surroundings better. For example, examine the following two images of the same pan and utensils near the campfire with different `Class.Lighting.EnvironmentDiffuseScale` and `Class.Lighting.EnvironmentSpecularScale` property values. When you adjust these values, the metal becomes more apparent and reflects the lighting from both the global and local light sources significantly more than before.
@@ -73,9 +73,9 @@ This step is important because it ensures that any PBR textures in your experien
To elevate metal reflections:
1. In the **Explorer** window, select **Lighting**.
-1. In the **Properties** window, set **EnvironmentalDiffuseScale** and **EnvironmentSpecularScale** to `1`. The metal in the experience becomes more reflective.
+1. In the **Properties** window, set **EnvironmentalDiffuseScale** and **EnvironmentSpecularScale** to **1**. The metal in the experience becomes more reflective.
-### Change the time of day
+### Change the Time of Day
Now that your experience is using the `Enum.Technology.Future` lighting system and materials are reacting realistically to the light sources in your experience, it's time to move the sun to a different position according to where it would be in the real world for the time of day. The sun's default position is high in the sky, emulating around midday in the real world, so it's best to move it nearer to the skyline, right above the mountains. This step also allows the light to move down the path onto the campfire and achieve a nice golden sun.
@@ -93,9 +93,9 @@ Now that your experience is using the `Enum.Technology.Future` lighting system a
To change the time of day:
1. In the **Explorer** window, select **Lighting**.
-1. In the **Properties** window, set **ClockTime** to `17`. The sun moves to the approximate position it would be in at 5pm.
+1. In the **Properties** window, set **ClockTime** to **17**. The sun moves to the approximate position it would be in at 5pm.
-### Adjust the color of ambient light
+### Adjust the Color of Ambient Light
There are two `Class.Lighting` properties that control the color of ambient lighting:
@@ -118,9 +118,9 @@ By default, these properties are set to produce gray ambient lighting, but to co
To adjust the color of ambient lighting:
1. In the **Explorer** window, select **Lighting**.
-1. In the **Properties** window, set **Outdoor Ambient** and **Ambient** to `156, 136, 176`. The ambient lighting changes to a light purple hue.
+1. In the **Properties** window, set **Outdoor Ambient** and **Ambient** to **156, 136, 176**. The ambient lighting changes to a light purple hue.
-### Choose a skybox
+### Choose a Skybox
A skybox is a cube made up of six individual images that create an experience's sky, including what's above and below the horizon. Skyboxes can have a major impact on the look and feel of what's in your environment, so it's important to carefully consider how you can choose a skybox that enhances your experience's visual quality. For example:
@@ -139,11 +139,11 @@ To illustrate these concepts, examine the following two images to see how the sa
-### Atmospheric effects
+### Atmospheric Effects
The `Class.Lighting` service has a child `Class.Atmosphere` object with properties that allow you to simulate realistic environments by scattering sunlight in unique ways. These properties can be very useful in creating a thickness in the experience's air, giving the environment a tangible sense of depth. The `Class.Atmosphere` object pulls most of its colors from the skybox directly, which is why the previous decisions about your skybox were so important.
-#### Increase air particle density
+#### Increase Air Particle Density
The `Class.Atmosphere.Density` property controls how many particles exist in the air of your experience. When you increase this property, the additional amount of particles obstruct the player's view of objects in the background. For example, when `Class.Atmosphere.Density` is `0`, the background trees, sun, and skybox are clearly visible, but when you increase this property to `0.391`, the particles start to scatter the light and conceal the trees.
@@ -161,33 +161,33 @@ The `Class.Atmosphere.Density` property controls how many particles exist in the
To increase density of the air particles in the atmosphere:
1. In the **Explorer** window, select **Atmosphere**.
-1. In the **Properties** window, set **Density** to `0.272`.
+1. In the **Properties** window, set **Density** to **0.272**.
-#### Add a haze
+#### Add a Haze
The `Class.Atmosphere.Haze` property controls the overall haziness of the atmosphere to create a visible effect both above the horizon and far into the distance from the camera. When you increase this property, it not only affects the overall environment, but it also affects objects that have a particularly powerful fresnel effect, such as metal objects that reflect the environment around them.
To add haze to the atmosphere:
1. In the **Explorer** window, select **Atmosphere**.
-1. In the **Properties** window, set **Haze** to `1`.
+1. In the **Properties** window, set **Haze** to **1**.
-#### Adjust the color of the atmosphere
+#### Adjust the Color of the Atmosphere
The `Class.Atmosphere.Color` property sets the hue of the atmosphere for subtle environmental moods and themes, and it can really enhance the haze within your experience. You can set this to any color you want to suit your experience, but it's recommended to set it to a color value that is close to the average of the objects in the environment.
To adjust the color of the atmosphere:
1. In the **Explorer** window, select **Atmosphere**.
-1. In the **Properties** window, set **Color** to `85, 78, 54`.
+1. In the **Properties** window, set **Color** to **85, 78, 54**.
-## Configure local lighting
+## Configure Local Lighting
Local lighting is the luminescence from local [light sources](../../../effects/light-sources.md) in your experience, such as `Class.SpotLight`, `Class.SurfaceLight`, and `Class.PointLight` objects. The key local light source you can create for this experience is the campfire's glow, and by adjusting a couple of its default properties, you can significantly alter how this local lighting interacts with the overall environment and compliment your global lighting configuration.
@@ -213,18 +213,18 @@ To add a `Class.PointLight` to the campfire:
-### Increase the range of the PointLight
+### Increase the Range of the PointLight
The default properties of the `Class.PointLight` aren't enough to fully brighten the objects surrounding the campfire, so you need to increase the range that the light can reach. Because the fire is large and bright, the light needs to cast far enough to illuminate the nearby trees, rocks, and brush. This also helps to make the space feel warm and cozy, as though the heat of the fire is naturally expanding outward.
To increase the range of the `Class.PointLight`:
1. In the **Explorer** window, select the campfire's **PointLight**.
-1. In the **Properties** window, set **Range** to `48`. The light's maximum lighting range expands.
+1. In the **Properties** window, set **Range** to **48**. The light's maximum lighting range expands.
-### Enable shadows
+### Enable Shadows
While the lighting's range is realistic to its size, it's unrealistic that the surrounding trees and rocks don't cast shadows from the campfire's light. Sometimes this is useful if you need to add in a couple of point lights to brighten dark spaces within your experience, but when you're aiming to emulate the real world, you can enable local lighting's ability to cast shadows. It's important to note that additional shadows can impact your experience's performance on low-end devices, so only enable shadows when they significantly add to the scene.
@@ -235,7 +235,7 @@ To enable shadows from the campfire's local lighting:
-### Adjust the lighting's brightness and color
+### Adjust the Lighting's Brightness and Color
While the local lighting is already looking and feeling closer to realistic behavior, it's still weak in strength and too white for a warm glow. When you increase the campfire's brightness and add a warmer hue, it really brings life to the fire and adds to the coziness of the scene.
@@ -243,8 +243,8 @@ To enable shadows from the campfire's local lighting:
1. In the **Explorer** window, select the campfire's **PointLight**.
1. In the **Properties** window,
- 1. Set **Brightness** to `2`.
- 1. Set **Color** to `255, 179, 73`.
+ 1. Set **Brightness** to **2**.
+ 1. Set **Color** to **255, 179, 73**.
diff --git a/content/en-us/tutorials/use-case-tutorials/lighting/light-with-props.md b/content/en-us/tutorials/use-case-tutorials/lighting/lighting-with-props.md
similarity index 98%
rename from content/en-us/tutorials/use-case-tutorials/lighting/light-with-props.md
rename to content/en-us/tutorials/use-case-tutorials/lighting/lighting-with-props.md
index f08432a43..21ba468ce 100644
--- a/content/en-us/tutorials/use-case-tutorials/lighting/light-with-props.md
+++ b/content/en-us/tutorials/use-case-tutorials/lighting/lighting-with-props.md
@@ -1,5 +1,5 @@
---
-title: Light with props
+title: Lighting with Props
description: The process for creating light sources out of props.
---
@@ -7,13 +7,13 @@ While overall world lighting is globally controlled through the `Class.Lighting`

-## Starter project
+## Starter Project
The remainder of this tutorial uses the [Misty Harbor](https://www.roblox.com/games/6445909934/Misty-Harbor) project as a showcase. To follow along, open it in Studio before proceeding.
-## Point lights
+## Point Lights
A `Class.PointLight` emits light **spherically** from a single point. This object is ideal for non-directional light sources like bulbs, torches, and fireballs.
@@ -67,7 +67,7 @@ Light sources like point lights need to be inserted directly into parts, meshes,
-## Spot lights
+## Spot Lights
A `Class.SpotLight` emits light in the shape of a **cone**. This object is ideal for light sources like street lamps, flashlights, and headlights.
@@ -107,7 +107,7 @@ A `Class.SpotLight` emits light in the shape of a **cone**. This object is ideal
5. Experiment with different **Brightness** and **Color** values, as with the point light.
-## Surface lights
+## Surface Lights
A `Class.SurfaceLight` emits light from the entire surface/face of a part, rather than just from a single point. This object is useful for light sources like TV or computer screens, lighted billboards, and fluorescent panels.
diff --git a/content/en-us/tutorials/use-case-tutorials/modeling/assemble-modular-environments.md b/content/en-us/tutorials/use-case-tutorials/modeling/assembling-modular-environments.md
similarity index 97%
rename from content/en-us/tutorials/use-case-tutorials/modeling/assemble-modular-environments.md
rename to content/en-us/tutorials/use-case-tutorials/modeling/assembling-modular-environments.md
index 21b7df529..6acc1bfef 100644
--- a/content/en-us/tutorials/use-case-tutorials/modeling/assemble-modular-environments.md
+++ b/content/en-us/tutorials/use-case-tutorials/modeling/assembling-modular-environments.md
@@ -1,5 +1,5 @@
---
-title: Assemble modular environments
+title: Assembling Modular Environments
description: Explains how to configure and assemble reusable assets that seamlessly snap together.
---
@@ -20,7 +20,7 @@ Assembling modular environments is useful because it means you don't need to man
Using the same modular building kit pieces that built Studio's Modern City template, this guide walks you through the importance of consistent pivot point locations in order for modular assets to align and snap together, shows you how to combine modular assets to create a realistic building, and demonstrates how to customize modular assets to create variety within your environment.
-## The importance of consistent pivot point locations
+## The Importance of Consistent Pivot Point Locations
Every object in Studio moves and rotates according to the location of its pivot point. By default, parts and meshes start with a pivot point location in the center of the object, so when you move them, they move from the center of the object outwards. The default pivot point location is useful for having symmetrical scaling and rotation, but it becomes problematic when you want to snap together objects of varying shapes in a predictable and uniform way.
@@ -65,7 +65,7 @@ Modular assets can consist of a nearly infinite variety of different shapes, siz
For information on how to configure pivot locations for parts and models you create within Studio, see [Pivot Tools](../../../studio/pivot-tools.md#edit-pivot). For information on how to configure pivot locations for meshes you create in third-party modeling tools, see the pivot point documentation for [Blender](https://docs.blender.org/manual/en/2.80/scene_layout/object/editing/transform/control/pivot_point.html) or [Maya](https://knowledge.autodesk.com/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2022/ENU/Maya-Basics/files/GUID-150B390E-840B-4FE3-B8E9-8DEBCE7CEC97-htm.html).
-## Configure snapping behavior
+## Configuring Snapping Behavior
Studio's default settings allow you to freely move and rotate objects to any fraction of a stud or degree, respectively. However, because modular building kits rely on assets snapping together at exact increments, you must change these default settings **according to the requirements of each modular building kit**. For example, the Modern City sample [modular building kit](https://create.roblox.com/store/asset/13168370735/Modular-Building-Kit-Modern-City) requires each mesh to rotate in 7.5 stud and 45 degree increments with collisions off. This ensures that as you move and rotate meshes around the 3D environment, they can connect and maintain clear alignment to one another as the building grows.
@@ -75,12 +75,12 @@ To configure Studio settings for ideal snapping behavior for the sample modular
1. In the **Tools** section, disable **Collisions**.
1. In the **Snap to Grid** section,
- 1. Enable **Rotate** and set it to `45`.
- 1. Enable **Move** and set it to `7.5`.
+ 1. Enable **Rotate** and set it to 45.
+ 1. Enable **Move** and set it to 7.5.
-## Combine modular assets
+## Combining Modular Assets
When you start to assemble modular assets into a larger complex object, it's helpful to choose one core object whose position coordinates you can reference throughout the entire process. This ensures that each additional object quickly aligns to the right pivot location before moving them to a different position.
@@ -109,11 +109,11 @@ To snap modular assets together to create a building using the sample modular bu
-## Customize modular assets
+## Customizing Modular Assets
To ensure every object looks and feels unique from one another, it's important to customize your modular assets to create visual variety. While the following sections explore customization strategies for the sample modular building kit, such as using alternate materials for the walls and trims, experimenting with different hues for these adornments, removing repetition for materials that tile on large surfaces, and dressing objects with decorative props, you can utilize similar methods for any modular building kit you use to create modular environments.
-### Use custom materials
+### Using Alternative Custom Materials
Every mesh within the sample modular building kit uses a [custom material](../../../parts/materials.md#custom-materials) from the sample [materials pack](https://create.roblox.com/store/asset/13168345645/Modern-City-Materials-Pack) that you can use to alter the appearance and physical qualities of your buildings' walls. For example, by default, all walls start with a **PaintedBrick** custom material, but you can change it to various forms of alternative brick, concrete, and plaster, then set a distinct tint color to the material in order to give each building a unique appearance.
@@ -138,7 +138,7 @@ To use alternative custom materials for wall meshes:
-### Use SurfaceAppearance objects
+### Using Alternative SurfaceAppearance Objects
Every mesh with a trim in the sample modular building kit includes a `Class.SurfaceAppearance` object that utilizes custom textures to make each building's adornments feel more realistic. To make each building in your experience feel unique, you can swap any `Class.SurfaceAppearance` object for another in the **SurfaceAppearance** folder in the workspace, including materials like concrete, plaster, and wood, then set a distinct tint color to the trim for additional variety.
@@ -183,9 +183,9 @@ To swap `Class.SurfaceAppearance` objects for trim meshes:
-### Reduce visible repetition
+### Reducing Visible Repetition
-When you're building large objects that utilize tiling materials like bricks and concrete, the tiling pattern can rapidly reveal visible repetition. To help reduce the visible tiling of these materials, you can create a grunge decal or texture, then add it as a child of your wall meshes to overlay on top of the wall's active materials. This customization strategy has the benefit of adding additional realism to your building, quickly improving the quality of your 3D environment. For information on how to apply and customize textures, see [Textures and decals](../../../parts/textures-decals.md).
+When you're building large objects that utilize tiling materials like bricks and concrete, the tiling pattern can rapidly reveal visible repetition. To help reduce the visible tiling of these materials, you can create a grunge decal or texture, then add it as a child of your wall meshes to overlay on top of the wall's active materials. This customization strategy has the benefit of adding additional realism to your building, quickly improving the quality of your 3D environment. For information on how to apply and customize textures, see [Textures and Decals](../../../parts/textures-decals.md).
@@ -200,7 +200,7 @@ When you're building large objects that utilize tiling materials like bricks and
-### Add decorative props
+### Adding Decorative Props
As a final step in making objects feel distinct in their larger modular environment, you can add a significant amount of character to each object by dressing them with decorative props. For example, the sample modular building kit includes assets like fire escapes, window balconies, air conditioner units, and foliage that you can experiment with to flourish each building and make it feel lived in. Even just including a few decorative props can add a vast amount of storytelling to your scene.
diff --git a/content/en-us/tutorials/use-case-tutorials/modeling/create-neon-signs.md b/content/en-us/tutorials/use-case-tutorials/modeling/creating-neon-signs.md
similarity index 98%
rename from content/en-us/tutorials/use-case-tutorials/modeling/create-neon-signs.md
rename to content/en-us/tutorials/use-case-tutorials/modeling/creating-neon-signs.md
index 953590169..f6e391e9c 100644
--- a/content/en-us/tutorials/use-case-tutorials/modeling/create-neon-signs.md
+++ b/content/en-us/tutorials/use-case-tutorials/modeling/creating-neon-signs.md
@@ -1,5 +1,5 @@
---
-title: Create neon signs
+title: Creating Neon Signs
description: Explains how to create neon signage to draw attention to something in an experience.
---
@@ -19,7 +19,7 @@ In the following method to create a neon sign, follow each section to learn how
You can create your own assets in third-party modeling tools and follow along with your own design. For information on exporting models for use in Studio, see [Exporting Requirements](../../../art/modeling/export-requirements.md).
-## Create the backboard and border
+## Create the Backboard and Border
A `Class.Part` is Roblox's primary building block that you can move, resize, rotate, and customize to change their appearance, such as their color and material. Using [basic parts](../../../parts/index.md) to create the foundation of neon signs is useful because the signage's backboard and border only require basic shapes.
@@ -56,7 +56,7 @@ To create the backboard and border:
Now that you have three parts that make up the basic shapes of your neon sign, you can sculpt the border's shape.
-## Shape the neon border
+## Shape the Neon Border
Using [solid modeling](../../../parts/solid-modeling.md), you can join and separate parts in unique ways to form more complex shapes known as **unions**. This process enables you to resize and modify the duplicate border part to become the neon border.
@@ -90,7 +90,7 @@ To create the neon border shape:
Now that you have a complete backboard and a glowing neon border, you can create extruding neon 3D text for the words of the sign.
-## Incorporate neon 3D text
+## Incorporate Neon 3D Text
Since Studio doesn't natively support 3D text, this guide provides an open-text.obj file for you to import into your scene that contains a 3D model of text that spells the word "OPEN". You can also use other methods to create 3D texts or custom designs for this process, such as using your own models from third-part modeling software, working with community plugins, or creating your own text manually in Studio through solid modeling.
diff --git a/content/en-us/tutorials/use-case-tutorials/physics/build-a-ferris-wheel.md b/content/en-us/tutorials/use-case-tutorials/physics/building-a-ferris-wheel.md
similarity index 96%
rename from content/en-us/tutorials/use-case-tutorials/physics/build-a-ferris-wheel.md
rename to content/en-us/tutorials/use-case-tutorials/physics/building-a-ferris-wheel.md
index 4e61d13a7..63e70e35b 100644
--- a/content/en-us/tutorials/use-case-tutorials/physics/build-a-ferris-wheel.md
+++ b/content/en-us/tutorials/use-case-tutorials/physics/building-a-ferris-wheel.md
@@ -1,6 +1,6 @@
---
-title: Build a ferris wheel
-description: The process for creating a ferris wheel using a motor.
+title: Building a Ferris Wheel
+description: The process for creating a Ferris Wheel using a motor.
---
Many contraptions in Roblox will use multiple constraints to build more complicated mechanisms. In particular, you can configure several constraints to be **actuated**, meaning they will move under their own power. This tutorial will show you how to actuate a `Class.HingeConstraint` to be a **motor** in order to make a ferris wheel.
@@ -9,7 +9,7 @@ Many contraptions in Roblox will use multiple constraints to build more complica
-## Ferris wheel setup
+## Ferris Wheel Setup
1. Add a ferris wheel into a place using either [this model](https://www.roblox.com/library/6448931648/FerrisWheel) or this [pre-built place](https://www.roblox.com/games/6448937909/Ferris-Wheel).
@@ -19,7 +19,7 @@ Many contraptions in Roblox will use multiple constraints to build more complica
-## Add attachments
+## Add Attachments
You will need to add attachments to the ferris wheel to determine where it will rotate. When working with attachments, it helps to move the pieces you are working with apart so you can clearly see the position and orientation of the attachments.
@@ -47,7 +47,7 @@ You will need to add attachments to the ferris wheel to determine where it will

-## Create a HingeConstraint
+## Creating a HingeConstraint
Now that both attachments are in place, it's time to add a `Class.HingeConstraint` to act as the motor for the wheel.
@@ -63,7 +63,7 @@ Now that both attachments are in place, it's time to add a `Class.HingeConstrain

-## Change to motor
+## Changing to Motor
By default, `Class.HingeConstraint|HingeConstraints` will only turn if an outside force acts on them, such as a user character pushing in the connected parts. To make a `Class.HingeConstraint` turn on its own, we have to configure it to be a **Motor**, set our desired turn rate, and make sure the hinge has enough torque.
diff --git a/content/en-us/tutorials/use-case-tutorials/physics/build-a-hinged-door.md b/content/en-us/tutorials/use-case-tutorials/physics/building-a-hinged-door.md
similarity index 98%
rename from content/en-us/tutorials/use-case-tutorials/physics/build-a-hinged-door.md
rename to content/en-us/tutorials/use-case-tutorials/physics/building-a-hinged-door.md
index 19173d95d..1448f97cc 100644
--- a/content/en-us/tutorials/use-case-tutorials/physics/build-a-hinged-door.md
+++ b/content/en-us/tutorials/use-case-tutorials/physics/building-a-hinged-door.md
@@ -1,5 +1,5 @@
---
-title: Build a hinged door
+title: Building a Hinged Door
description: The process for creating a door using a HingeConstraint.
---
@@ -9,7 +9,7 @@ Roblox's physics system allows you to construct moving mechanisms like doors, ro
-## Door setup
+## Door Setup
Start by creating parts for the door and its attachments. **Attachments** are where one object can connect to another. These attachments will later be used to connect the door to its frame with a hinge.
@@ -29,7 +29,7 @@ Start by creating parts for the door and its attachments. **Attachments** are wh

-## Move the attachments
+## Move the Attachments
New attachments are created in the center of a part. So they can work with the door, the two attachments need to be moved to face each other.
@@ -62,7 +62,7 @@ New attachments are created in the center of a part. So they can work with the d
Left: FrameAttachment / Right: DoorAttachment
-## Rotate the attachments
+## Rotate the Attachments
The orientation of an attachment affects how a constraint can move. For the door, both attachments must be rotated so the hinge swings left and right, like those on a standard door.
@@ -86,7 +86,7 @@ The orientation of an attachment affects how a constraint can move. For the door

-## Add the constraint
+## Adding the Constraint
Remember, constraints are a way of connecting two attachments to move in a specific way. This door will use a `Class.HingeConstraint`, a common constraint that rotates objects along the axes of two attachments.
@@ -125,7 +125,7 @@ Remember, constraints are a way of connecting two attachments to move in a speci
-## Adjust the door
+## Adjust the Door
The door is currently able to swing past the door frame. This can be fixed by adjusting the hinge **limits**.
diff --git a/content/en-us/tutorials/use-case-tutorials/physics/create-elevators.md b/content/en-us/tutorials/use-case-tutorials/physics/creating-elevators.md
similarity index 97%
rename from content/en-us/tutorials/use-case-tutorials/physics/create-elevators.md
rename to content/en-us/tutorials/use-case-tutorials/physics/creating-elevators.md
index 03c145bf1..810e6190d 100644
--- a/content/en-us/tutorials/use-case-tutorials/physics/create-elevators.md
+++ b/content/en-us/tutorials/use-case-tutorials/physics/creating-elevators.md
@@ -1,5 +1,5 @@
---
-title: Create elevators
+title: Creating Elevators
description: The process for creating moving platforms to move users from one area to another.
---
@@ -14,7 +14,7 @@ In the following method to create an elevator, follow each section to learn how
- Create a `Class.ProximityPrompt` for users to interact with to start the platform's motion.
- Create a `Class.Script` to connect all of the elevator's components and enable the platform to move along the track.
-## Create the platform and track
+## Creating the Platform and Track
A `Class.Part` is Roblox's primary building block that you can move, resize, rotate, and customize to change their appearance, such as their color and material. Using basic parts to create the foundation of the elevator is useful because the elevator's platform and track only require basic shapes.
@@ -51,11 +51,11 @@ To create the platform and track of your elevator:
In the viewport, the model appears as two separate objects. In the Explorer window, the model contains the separate Platform and Track objects.
-## Configure the PrismaticConstraint
+## Configuring the PrismaticConstraint
Now that you have two parts that make up the foundation of your elevator, you can create a `Class.PrismaticConstraint`, align the associated attachments so the platform moves along an ideal path, and set the constraint's values to enable the platform to move up and down the track.
-### Create the PrismaticConstraint and attachments
+### Creating the PrismaticConstraint and Attachments
A `Class.PrismaticConstraint` creates a rigid joint between two `Class.Attachment|Attachments`, allowing the attachments to slide along one axis without rotating. This type of [constraint](../../../physics/mechanical-constraints.md) is ideal for elevators because it keeps the platform at a single orientation while still being able to move upwards and downwards.
@@ -85,7 +85,7 @@ To create a PrismaticConstraint and its attachments:
-### Align the attachments
+### Aligning the Attachments
If you keep both attachments at their default positions within the center of their parent parts, the attachments will try to pull each part inside of the other, causing the physics of both parts to collide and render the elevator non-functional. To ensure this doesn't happen, you must move the attachments outside of their parent parts so the platform can freely travel through an unobstructed space along the outside of the track, then align them along their X and Z axes so that the platform only moves up and down the Y axis.
@@ -112,7 +112,7 @@ To align the constraint's attachments:
-### Set PrismaticConstraint values
+### Setting PrismaticConstraint Values
Now that you have a `Class.PrismaticConstraint` and have aligned its associated `Class.Attachment|Attachments`, it's time to set the constraint's values that a `Class.Script` can use to enable the platform to move up and down the track to a set lower and upper range of motion that correlates to the bottom and top of the track. Because the bottom and top of the track are each 10 studs away from the **TrackAttachment** that's in the middle of the track that's 20 studs in length, the constraint's lower and upper limits must be `-10` and `10`, respectively.
@@ -147,7 +147,7 @@ To set values for your constraint to enable elevator movement within a set range
1. Set **Speed** to **10**.
1. Set **TargetPosition** to **-10**.
-## Create the proximity prompt
+## Creating the Proximity Prompt
A `Class.ProximityPrompt` is an object that encourages user interaction to trigger an action when they approach in-experience objects such as doors, light switches, and buttons. This process uses a [proximity prompt](../../../ui/proximity-prompts.md) to allow users to press a key when they are near the platform in order to activate the elevator's movement.
@@ -158,7 +158,7 @@ To create a proximity prompt:
-## Script elevator movement
+## Scripting Elevator Movement
Now that you have all of the elements of your elevator ready to go, it's time to create a `Class.Script` that gets everything to work together and move the platform up and down the track.
diff --git a/content/en-us/tutorials/use-case-tutorials/physics/create-moving-objects.md b/content/en-us/tutorials/use-case-tutorials/physics/creating-moving-objects.md
similarity index 98%
rename from content/en-us/tutorials/use-case-tutorials/physics/create-moving-objects.md
rename to content/en-us/tutorials/use-case-tutorials/physics/creating-moving-objects.md
index 72163155a..2f49a8cd2 100644
--- a/content/en-us/tutorials/use-case-tutorials/physics/create-moving-objects.md
+++ b/content/en-us/tutorials/use-case-tutorials/physics/creating-moving-objects.md
@@ -1,5 +1,5 @@
---
-title: Create moving objects
+title: Creating Moving Objects
description: Explains the process of creating dynamic motion by moving objects.
---
@@ -17,7 +17,7 @@ Using the [Moving Objects](https://www.roblox.com/games/17560154079/UCT-Linear-M
-## Linear motion and physical forces
+## Linear Motion and Physical Forces
Roblox Studio is a real-world simulation engine that emulates physical behavior in real time, so in order to predict how objects moving linearly can behave in experiences, it's important to have a high-level understanding of how objects move in real life with linear motion.
@@ -69,7 +69,7 @@ Understanding linear velocity is important for designing gameplay in your experi
The following sections dive deeper into these concepts as you learn how to move objects at either a constant or initial linear velocity with the necessary force to overcome any oppositional physical forces within the environment. As you review these physics concepts with the upcoming techniques, you can more accurately predict how to adjust property values to achieve any ideal linear movement behavior in Studio.
-## Maintain a constant linear velocity
+## Maintaining a Constant Linear Velocity
For an object to reach and maintain a constant linear velocity, it needs a force to overcome any oppositional physical forces that either decelerate the object's linear velocity, or cause the object to remain stationary. For example, if you want an object to have a linear velocity of `[0, 12, 0]` in Studio, you need enough force for the object to reach and maintain 12 studs per second along the Y axis in its environment.
@@ -88,7 +88,7 @@ The amount of force necessary not only depends on oppositional physical forces w
The following subsections use assemblies of different shapes and sizes to teach you how to move either an entire object or only a portion of the object at a constant linear velocity. As you experiment with different property values, you will learn how to estimate the maximum amount of force you need for assemblies in your own experiences.
-### Use LinearVelocity constraints
+### Using LinearVelocity Constraints
`Class.LinearVelocity` objects are a type of [mover constraint](../../../physics/mechanical-constraints.md) that apply force on an entire assembly to maintain a constant linear velocity. By not locking the assembly's position to an axis during its motion, the assembly is free to rotate as it collides with other objects in the 3D space. This type of movement leads to surprising gameplay scenarios that are more difficult for players to predict.
@@ -107,7 +107,7 @@ To demonstrate this process, you will configure a lily pad with an attachment th
-#### Add attachment
+#### Add Attachment
You can specify the point to apply force by adding an `Class.Attachment` object to the assembly, then configuring the attachment's position in the 3D space. The sample [Moving Objects](https://www.roblox.com/games/17560154079/UCT-Linear-Movement) experience places an attachment in the center of the lily pad so that the constraint can move the mesh from the attachment along a particular axis.
@@ -125,7 +125,7 @@ To add an attachment:
-#### Configure constraint
+#### Configure Constraint
Now that your mesh has a fixed point to move the lily pad, you can configure the properties of a `Class.LinearVelocity` constraint to specify the direction and magnitude for the constant linear velocity, the amount of studs you want the mesh to move per second, and the maximum amount of force the engine can apply for the mesh to reach a constant linear velocity.
@@ -169,7 +169,7 @@ To configure a `Class.LinearVelocity` constraint:
-### Use PrismaticConstraint constraints
+### Using PrismaticConstraint Constraints
`Class.PrismaticConstraint` objects are a type of [mechanical constraint](../../../physics/mechanical-constraints.md) that create a rigid joint between two attachments, allowing their parent assemblies to move along one axis **relative to each other**. By locking both assemblies' position to a single axis, each assembly is only able to rotate if they rotate together in the same direction.
@@ -191,7 +191,7 @@ To demonstrate this process, you will configure a log assembly with two objects
-#### Configure attachments
+#### Configure Attachments
You can specify the direction to move a particular object within an assembly by adding two `Class.Attachment` objects to the assembly, then configuring their alignment and orientation in the 3D space. The sample [Moving Objects](https://www.roblox.com/games/17560154079/UCT-Linear-Movement) experience aligns two attachments along the world's X axis near the position of where the unanchored log overlaps with the anchored part, and orients each attachment's primary axis to face the world's negative X axis.
@@ -219,7 +219,7 @@ To configure attachments for the prismatic constraint:
-#### Configure constraint
+#### Configure Constraint
Now that your attachments are aligned on the same axis and face the same direction you want the log to move, you can configure the properties of a `Class.PrismaticConstraint` constraint to specify whether to apply the target constant linear velocity in the positive or negative direction of each attachment's' primary axis, the amount of studs you want the attachments to move per second, and the maximum amount of force the engine can apply for the log to reach a constant linear velocity.
@@ -256,13 +256,13 @@ To configure a prismatic constraint:
-## Apply an initial linear force
+## Applying an Initial Linear Force
Another way of changing an object's linear velocity is by applying an impulse of force. After the impulse of force, the object either decelerates until it becomes stationary if there is an oppositional force such as friction, or remains in motion with constant linear velocity if there aren't any oppositional forces.
This technique is useful to move objects after a significant gameplay event, such as an explosion or impactful collision, because it provides players instantaneous feedback. To demonstrate, the following subsection teaches you how to launch a player's character upward toward the sky when they collide with a jump pad with an initial impulse that you can adapt with new values to meet your own gameplay requirements.
-### Use ApplyImpulse
+### Using ApplyImpulse
The `Class.BasePart.ApplyImpulse|ApplyImpulse` method applies force on an entire assembly to obtain an initial linear velocity before slowing to a stop when there are oppositional forces. To begin moving the assembly, the method needs to know:
diff --git a/content/en-us/tutorials/use-case-tutorials/physics/create-spinning-objects.md b/content/en-us/tutorials/use-case-tutorials/physics/creating-spinning-objects.md
similarity index 98%
rename from content/en-us/tutorials/use-case-tutorials/physics/create-spinning-objects.md
rename to content/en-us/tutorials/use-case-tutorials/physics/creating-spinning-objects.md
index e2bc89dbe..7a3c04e2f 100644
--- a/content/en-us/tutorials/use-case-tutorials/physics/create-spinning-objects.md
+++ b/content/en-us/tutorials/use-case-tutorials/physics/creating-spinning-objects.md
@@ -1,5 +1,5 @@
---
-title: Create spinning objects
+title: Creating Spinning Objects
description: Explains the process of creating dynamic motion by spinning objects.
---
@@ -17,7 +17,7 @@ Using the [Spinning Objects](https://www.roblox.com/games/16550477904/Spinning-O
You can create your own assemblies using basic parts or meshes from third-party modeling tools, then follow along with your own assets. For information on exporting meshes for use in Studio, see [Exporting Requirements](../../../art/modeling/export-requirements.md).
-## Angular motion and physical forces
+## Angular Motion and Physical Forces
Roblox Studio is a real-world simulation engine that emulates physical behavior in real time, so in order to predict the behavior of spinning objects in experiences, it's important to have a high-level understanding of how objects spin in real life with angular motion.
@@ -59,7 +59,7 @@ This is because torque needs to be _greater_ than any directional physical force
The following sections dive deeper into these concepts as you learn how to spin objects at either a constant or initial angular velocity with the necessary torque to overcome any oppositional physical forces within the environment. As you review these physics concepts with the upcoming techniques, you can more accurately predict how to adjust property values to achieve any ideal spinning behavior in Studio.
-## Maintain a constant angular force
+## Maintaining a Constant Angular Force
For an object to reach and maintain a constant angular velocity, it needs an angular force to overcome any oppositional physical forces that either decelerate the object's angular velocity, or cause the object to remain stationary. For example, if you want an object to have an angular velocity of `[0, 12, 0]` in Studio, you need enough torque for the object to reach and maintain `12` radians per second along the Y axis in its environment, or about two full rotations per second.
@@ -78,7 +78,7 @@ The amount of torque you apply to your objects not only depends on oppositional
The following subsections use assemblies of different shapes and sizes to teach you how to spin either an entire object or only a portion of the object. As you experiment with different property values, you will learn how to estimate the maximum amount of torque you need for assemblies in your own experiences.
-### Use AngularVelocity constraints
+### Using AngularVelocity Constraints
`Class.AngularVelocity` objects are a type of [mover constraint](../../../physics/mover-constraints.md) that apply torque on an entire assembly to maintain a constant angular velocity. To begin spinning the assembly, the `Class.AngularVelocity` constraint needs to know:
@@ -90,7 +90,7 @@ To demonstrate this process, you will add a block to your workspace with an atta
-#### Add attachment
+#### Add Attachment
You can specify the fixed point to spin an assembly by adding an `Class.Attachment` object to the assembly, then configuring the attachment's position in the 3D space. The sample [Spinning Objects](https://www.roblox.com/games/16550477904/Spinning-Objects) experience places an attachment in the center of a block part so that the constraint can spin the part counterclockwise around the center of itself.
@@ -111,7 +111,7 @@ To add an attachment:
-#### Configure constraint
+#### Configure Constraint
Now that your block has a fixed point to spin the block, you can configure the properties of an `Class.AngularVelocity` constraint to specify the rotational direction, axis or axes to apply a target constant angular velocity, the amount of radians you want the block to spin per second, and the maximum amount of torque the engine can apply for the block to reach a constant angular velocity.
@@ -154,7 +154,7 @@ However, if your block is a larger size and on grass terrain, you need to increa
-### Use HingeConstraint constraints
+### Using HingeConstraint Constraints
`Class.HingeConstraint` objects are a type of [mechanical constraint](../../../physics/mechanical-constraints.md) that allows two attachments to rotate around one axis, constraining the attachments to the same position and their primary axes in the same direction. When you set `Class.HingeConstraint.ActuatorType` to **Motor**, this constraint applies torque on the two attachments with the goal of the attachments reaching and maintaining a constant angular velocity.
@@ -173,7 +173,7 @@ To demonstrate this process, you will add a propeller assembly with two objects
-#### Get propeller asset
+#### Get Propeller Asset
The **Creator Store** is a tab of the Toolbox that you can use to find all assets that are made by Roblox and the Roblox community for use within your projects, including model, image, mesh, audio, plugin, video, and font assets. You can use the Creator Store to add an individual asset or asset library directly into an open experience.
@@ -198,7 +198,7 @@ To get this propeller asset from your inventory into your experience:
-#### Configure attachments
+#### Configure Attachments
You can specify both the position of where you want the attachments to overlap and the direction of rotational movement to spin a particular object within an assembly by adding two `Class.Attachment` objects to the assembly, then configuring their alignment and orientation in the 3D space.
@@ -222,7 +222,7 @@ To configure attachments for the hinge constraint:
-#### Configure constraint
+#### Configure Constraint
Now that your attachments have position to overlap and a direction of rotational movement, you can configure the properties of a `Class.HingeConstraint` constraint to specify the amount of radians you want the attachment to spin per second, and the maximum amount of torque the engine can apply for the attachment to reach a constant angular velocity.
@@ -258,13 +258,13 @@ To configure a hinge constraint:
-## Apply an initial angular force
+## Applying an Initial Angular Force
Another way of changing an object's angular velocity is by applying an impulse of angular force. After the impulse of angular force, the object either decelerates until it becomes stationary if there is an oppositional force such as friction, or remains in motion with constant velocity if there aren't any oppositional forces.
This technique is useful to spin objects after a significant gameplay or weather event, such as a strong gust of wind, because it provides players instantaneous feedback. To demonstrate, the following subsection teaches you how to spin an assembly with an initial random angular force that you can adapt with new values to meet your own gameplay requirements.
-### Use ApplyAngularImpulse
+### Using ApplyAngularImpulse
The `Class.BasePart.ApplyAngularImpulse|ApplyAngularImpulse` method applies torque on an entire assembly to obtain an initial angular velocity before slowing to a stop. To begin spinning the assembly, the method needs to know:
diff --git a/content/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/deadly-lava.md b/content/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/deadly-lava.md
index c94d81371..9f489ed95 100644
--- a/content/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/deadly-lava.md
+++ b/content/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/deadly-lava.md
@@ -1,17 +1,17 @@
---
-title: Deadly lava
+title: Deadly Lava
description: The process for creating a lava floor that kills players on contact.
next: /tutorials/scripting/basic-scripting/fading-trap
prev: /tutorials/scripting/basic-scripting/intro-to-scripting
---
-In [Introduction to scripting](./intro-to-scripting.md), you learned how to make changes in an experience in a loop over time. What if you want to make changes based on user behavior? In this tutorial, you'll learn how to make a deadly lava floor which kills users when they step on it.
+In [Introduction to Scripting](./intro-to-scripting.md), you learned how to make changes in an experience in a loop over time. What if you want to make changes based on user behavior? In this tutorial, you'll learn how to make a deadly lava floor which kills users when they step on it.
-## Set up
+## Setting Up
You need a place in your world to put the deadly lava. If you followed the [Introduction to Scripting](./intro-to-scripting.md) course, the lava floor would fit nicely in the gap covered by the disappearing platforms.
@@ -37,7 +37,7 @@ You need a place in your world to put the deadly lava. If you followed the [Intr
local lava = script.Parent
```
-## Connect to an event
+## Connecting to an Event
Use an **event** to detect when a user touches the lava. Every part has a `Touched` event that fires when something touches it. You can **connect** to this event to run a function when it fires.
@@ -57,7 +57,7 @@ Use an **event** to detect when a user touches the lava. Every part has a `Touch
Any code you write in the `kill` function will now run whenever something touches the lava. Note that a **colon** is used for the `Connect` function, **not** a dot - don't worry about why at this point, just remember the difference.
-## Get the touching part
+## Getting the Touching Part
To kill the user, the function will need an object associated with that user. A part's `Touched` event can provide the "other part" that touched it — but only if you request it by making it a **parameter** of the function.
@@ -75,7 +75,7 @@ lava.Touched:Connect(kill)
When the `kill` function is called, the `otherPart` parameter will represent the part that touched the lava floor, and the code you'll write in the function will be able to use it.
-## Character and humanoid
+## Character and Humanoid
When a user touches the lava, Roblox can detect the specific body part of the user that touched it, such as the left leg or right foot. This part is in the user's **Character** model, which contains all of the objects that make up the user's avatar in the experience, including:
@@ -109,7 +109,7 @@ end
lava.Touched:Connect(kill)
```
-## Check the humanoid
+## Checking the Humanoid
You can easily check if the Humanoid was found using an **if** statement. The code in an if statement will only run if the condition defined in the first line is true.
@@ -133,7 +133,7 @@ lava.Touched:Connect(kill)
In Lua, any value other than false or nil (an empty value) is evaluated as true in a conditional statement, so in this case you can use `humanoid` directly as the condition.
-## Set character health
+## Setting Character Health
Now that the `Class.Humanoid` has been checked, its properties can be changed. If you set its `Health` property to **0**, the associated Character dies. In the body of the if statement, set the `Health` property of humanoid to 0.
@@ -151,7 +151,7 @@ lava.Touched:Connect(kill)
With that, your lava floor is complete! Test your experience and you should find that your deadly lava successfully kills users on contact. Try using your lava as an extra challenge in an obby, or as a boundary for a world.
-## Final code
+## Final Code
```lua
local lava = script.Parent
diff --git a/content/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/fading-trap.md b/content/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/fading-trap.md
index 1b3bcabb9..df0ebece4 100644
--- a/content/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/fading-trap.md
+++ b/content/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/fading-trap.md
@@ -1,7 +1,7 @@
---
-title: Fading trap
+title: Fading Trap
description: The process for creating a platform that fades away when a player steps on it.
-next: /tutorials/scripting/basic-scripting/score-points
+next: /tutorials/scripting/basic-scripting/scoring-points
prev: /tutorials/scripting/basic-scripting/deadly-lava
---
@@ -11,7 +11,7 @@ In [Deadly Lava](./deadly-lava.md), you learned how to trigger code based on use
-## Set up
+## Setting Up
If you followed [Deadly Lava](./deadly-lava.md), you can place your fading platform above the lava floor that users can't jump across.
@@ -37,7 +37,7 @@ If you followed [Deadly Lava](./deadly-lava.md), you can place your fading platf
platform.Touched:Connect(fade)
```
-## Fade the platform
+## Fading the Platform
Having the platform vanish in an instant would be no fun at all as users would find it impossible to get across the gap. Instead, the platform should **fade away** before users fall through it to give them a chance to jump off.
@@ -72,7 +72,7 @@ In **FadeOnTouch**:
When the loop runs, count increases by 1 with each iteration. This means that the platform's `Transparency` will increase by 0.1 every 0.1 seconds, reaching full transparency after 1 second.
-## Reappear
+## Reappearing
After the platform has vanished, users should fall through it. The platform should also come back a few seconds after it fades - otherwise, users would never get to try the jump again if they failed. The CanCollide property controls whether users can fall through a part.
@@ -98,7 +98,7 @@ After the platform has vanished, users should fall through it. The platform shou
platform.Touched:Connect(fade)
```
-## Debounce variable
+## Debounce Variable
In [Deadly Lava](./deadly-lava.md), you learned that the `Touched` event runs each time a user's body part comes into contact with the part. This behavior causes issues when a user runs across the fading platform: the function will run multiple times, resetting the loop each time.
@@ -125,7 +125,7 @@ end
platform.Touched:Connect(fade)
```
-## Check the variable
+## Checking the Variable
An if statement can be used to only run the code in the fade function if the `isTouched` debouncing variable is false. Wrap the body of the fade function in an `if` statement with the condition `not isTouched`.
@@ -165,7 +165,7 @@ if isTouched == nil then
end
```
-## Toggle the debounce
+## Toggling the Debounce
Currently, the code in the `fade` function will always run because `isTouched` is false and `not isTouched` evaluates to true. To complete the debounce routine, you'll need to toggle the variable's value in two places.
@@ -199,7 +199,7 @@ You can duplicate this platform across a wider gap to create a challenging obsta
-## Final code
+## Final Code
```lua
local platform = script.Parent
diff --git a/content/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/intro-to-scripting.md b/content/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/intro-to-scripting.md
index 681d535fb..1c944de3c 100644
--- a/content/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/intro-to-scripting.md
+++ b/content/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/intro-to-scripting.md
@@ -1,5 +1,5 @@
---
-title: Introduction to scripting
+title: Introduction to Scripting
description: The process for creating a basic script that makes a platform disappear.
next: /tutorials/scripting/basic-scripting/deadly-lava
---
@@ -10,7 +10,7 @@ In [Introduction to Roblox Studio](../../../first-experience/index.md), you lear
-## Set the scene
+## Setting the Scene
First off, you need a **Part** to act as the platform. Making and moving parts should be familiar to you from [Introduction to Roblox Studio](../../../first-experience/index.md). You don't need a complicated world aside from the platform — you just need a gap that your users can't easily jump across.
@@ -28,7 +28,7 @@ First off, you need a **Part** to act as the platform. Making and moving parts s
Remember that setting a part's Anchored property to **true** makes it stay in place no matter what. Your platform falls down if it's not anchored.
-## Insert a script
+## Inserting a Script
Code in Roblox is written in a language called [Luau](../../../../luau/index.md) which you can put in scripts within various containers in the **Explorer**. If you put a script under a **Part**, Roblox will run the script's code when the part is loaded into the game.
@@ -44,7 +44,7 @@ Remember to **rename** parts and scripts as soon as you create them so you don't
-## First variable
+## First Variable
It's a good idea to start off your script by making a **variable** for the platform. A variable is a **name** associated with a **value**. Once a variable is created, it can be used again and again. You can change the value as needed.
@@ -62,7 +62,7 @@ local platform = script.Parent
`script.Parent` is used to find the object the script is located in. As you might have guessed, `script` refers to the script you're writing in and the `Parent` of the script is where it's located.
-## Disappear function
+## Disappear Function
Time to make the platform disappear. It's always best to group code for achieving a specific action into a **function**. A function is a named block of code that helps you organize your code and use it in multiple places without writing it again. Create a **function** in the script and call it `disappear`.
@@ -78,7 +78,7 @@ The first new line **declares** the function — it indicates the start of the f
The parentheses are for including additional information as needed. You'll learn more about passing information to functions in a later course.
-## Part properties
+## Part Properties
When the platform disappears, it needs to be invisible and users need to fall through it — but you can't just destroy the platform since it needs to reappear later.
@@ -122,7 +122,7 @@ Just like `script.Parent`, properties are accessed using a **dot**. Values are a
You might notice that Studio automatically **indents** your code inside a function. Always make sure to indent your code like this — it helps indicate where the function begins and ends, which makes your code more readable.
-## Call the function
+## Calling the Function
Once you've declared a function, you can run it by writing its name with parentheses next to it. For example, `disappear()` will run the `disappear` function. This is known as **calling** a function.
@@ -141,7 +141,7 @@ Once you've declared a function, you can run it by writing its name with parenth
2. Test the code by pressing the **Play** button. If your code works, the platform should have disappeared by the time the user spawns into the game.
-## Appear function
+## Appear Function
You can easily make the platform reappear by writing a function that does the exact opposite of the `disappear` function.
@@ -163,7 +163,7 @@ You can easily make the platform reappear by writing a function that does the ex
end
```
-## Loop code
+## Looping Code
The platform should be constantly disappearing and reappearing, with a few seconds between each change. It's impossible to write an infinite number of function calls — fortunately, with a **while loop**, you don't have to.
@@ -187,7 +187,7 @@ while true do
end
```
-## Toggle the platform
+## Toggling the Platform
In the while loop, you need to write code to wait a few seconds between the platform disappearing and reappearing.
@@ -223,7 +223,7 @@ You could duplicate this platform to cover a wider gap, but you need to change t
-## Final code
+## Final Code
```lua
local platform = script.Parent
diff --git a/content/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/score-points.md b/content/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/scoring-points.md
similarity index 98%
rename from content/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/score-points.md
rename to content/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/scoring-points.md
index 7493b29ca..bf7fd8f45 100644
--- a/content/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/score-points.md
+++ b/content/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/scoring-points.md
@@ -1,5 +1,5 @@
---
-title: Score points
+title: Scoring Points
description: The process for creating a scoring system to award and track points for players.
prev: /tutorials/scripting/basic-scripting/fading-trap
---
@@ -10,7 +10,7 @@ In previous tutorials, you made a variety of experience features including [fadi
-## Set up
+## Setting Up
First up, you'll need to set the scene for your experience. Duplicate the [fading platforms](./fading-trap.md) you made in the previous tutorial and let users compete to stay on the board of platforms for as long as possible.
@@ -18,7 +18,7 @@ You can also use [deadly lava](./deadly-lava.md) to kill users when they fall of

-## Player points
+## Player Points
Roblox has a built-in **Leaderboard** for showing user stats. When you set player points through the leaderboard, they show up on the right side of the screen in the experience.
@@ -30,7 +30,7 @@ It's best to put scripts which set up experience state into **ServerScriptServic
-## Listen for players
+## Listening for Players
In Roblox, a **service** is an object which performs a range of useful functions. The `Class.Players` service has an event called `Class.Players.PlayerAdded|PlayerAdded` that you can use to set up points for each user who joins the experience.
@@ -56,7 +56,7 @@ When declaring a variable to contain a service, it's best to name it with the ex
-## Create a stats folder
+## Create a Stats Folder
To make a user's points display in the leaderboard, all you need to do is create a new `Class.Folder` in their `Class.Player` object called `"leaderstats"` and put their points in there. New objects can be created from within a script via the `Datatype.Instance.new()` function.
@@ -89,7 +89,7 @@ Make sure you name the folder **exactly** as it is shown here (`"leaderstats"`)
-## Create the points
+## Creating the Points
The leaderboard system reads any values in the `leaderstats` folder and displays whatever it finds.
@@ -119,7 +119,7 @@ Players.PlayerAdded:Connect(onPlayerAdded)
Test your experience and you should see the leaderboard appear in the top right with the names of your users and a points score next to them.
-## Count time
+## Counting Time
Each user should earn a point for each second they are alive. A `while` loop and the `Library.task.wait()` function can be used to update the value of points every second.
@@ -134,7 +134,7 @@ while true do
end
```
-## Player list
+## Player List
To run code for every user in the experience, you need to iterate through the **array** of users returned by the `Class.Players:GetPlayers()|GetPlayers` function.
@@ -153,7 +153,7 @@ while true do
end
```
-## Award points
+## Awarding Points
To award a point to each user in the for loop, you'll need to get the user out of the array and add 1 to the **Points** object stored in their `leaderstats` folder.
@@ -181,7 +181,7 @@ Test your experience and you should find that the leaderboard shows your player'
-## Listen for characters
+## Listening for Characters
The goal of the experience is to see who can stay alive the longest, so users who die will need to have their points reset to 0.
@@ -217,7 +217,7 @@ local function onPlayerAdded(player)
end
```
-## Reset points
+## Resetting Points
When a user dies, their `Class.Humanoid` automatically fires a `Class.Humanoid.Died|Died` event. You can use this event to find out when to reset their points.
@@ -252,7 +252,7 @@ end
Test this out and you'll see the user's score resets when they die.
-## Check the player
+## Checking the Player
If users keep earning points even when dead, it's hardly in the spirit of the experience, so the code needs to check if users are alive before awarding a point.
@@ -326,7 +326,7 @@ This is just the start: you can continue improving your experience for your user
- Create a lobby area where users wait to be teleported to the experience area, allowing users to start simultaneously.
- Announce the winners of each round.
-## Final code
+## Final Code
```lua
local Players = game:GetService("Players")
diff --git a/content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/create-a-health-pickup.md b/content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/creating-a-health-pickup.md
similarity index 96%
rename from content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/create-a-health-pickup.md
rename to content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/creating-a-health-pickup.md
index 60a92ed8b..0aa2d9b15 100644
--- a/content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/create-a-health-pickup.md
+++ b/content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/creating-a-health-pickup.md
@@ -1,7 +1,7 @@
---
-title: Create a health pickup
+title: Creating a Health Pickup
description: The process for creating a pickup that restores health.
-next: /tutorials/scripting/intermediate-scripting/save-data
+next: /tutorials/scripting/intermediate-scripting/saving-data
---
Throughout the Basic Scripting tutorials, you have scripted individual parts to create playable scenes. With the previous method, if you were to duplicate the parts you would then also have duplicate scripts. This would make updating the scripts tedious as changes would have to be done script by script.
@@ -12,7 +12,7 @@ In this tutorial, a different pattern will be used to create a number of health
-## Set up
+## Setting Up
First up, you'll need a part or a model to use as a pickup. The [Showdown Town example world](https://www.roblox.com/games/6407123421/Showdown-Town-Health-Pickups) includes plenty of health pickups spread all over the map.
@@ -25,7 +25,7 @@ Each health pickup is a Union of two rectangular parts with a green PointLight i
-## Restore health
+## Restoring Health
To begin with, the script needs to restore a player's health. This pattern should be familiar to you from the [Deadly Lava](../basic-scripting/deadly-lava.md) tutorial.
@@ -62,7 +62,7 @@ The code here calls `Class.Instance:FindFirstChildWhichIsA()|FindFirstChildWhich
-## Get the pickups folder
+## Getting the Pickups Folder
The folder holding the health pickups may not have loaded into the game by the time the script runs. `WaitForChild` can be used to pause the script and get the HealthPickups folder when it loads.
@@ -86,7 +86,7 @@ When called on a folder, the `GetChildren` function will return an array of the
end
```
-## Loop with ipairs
+## Looping with ipairs
`onTouchHealthPickup` needs to be called for each health pickup in the array. To do this efficiently, a new kind of loop syntax will be used.
@@ -137,11 +137,11 @@ A health bar should appear in the top right which will disappear when the player
-## Pickup cooldown
+## Pickup Cooldown
Currently, the pickup will indefinitely heal any player who touches it. It would be more effective in a game if it could only be picked up once, with a short cooldown before it can be used again.
-First, you need to record whether or not the pickup is in the cooldown period. The pattern below should be familiar from [Fade Trap](../basic-scripting/fading-trap.md) - this time, the debounce will be achieved by setting an attribute on the health pickup.
+First, you need to record whether or not the pickup is in the cooldown period. The pattern below should be familiar from [Fading Trap](../basic-scripting/fading-trap.md) - this time, the debounce will be achieved by setting an attribute on the health pickup.
1. In the for loop, set a new **attribute** called `"Enabled"` to `true`.
2. Wrap the code inside `onTouchHealthPickup` in an if statement with the condition `healthPickup:GetAttribute("Enabled")`.
@@ -165,7 +165,7 @@ First, you need to record whether or not the pickup is in the cooldown period. T
end
```
-## Disable the pickup
+## Disabling the Pickup
The pickup should provide visual feedback that it is disabled - a common way to indicate this is to make it slightly transparent.
@@ -230,7 +230,7 @@ If you want to make the feedback more impactful for the player when the pickup i
Try using these health pickups in your own projects, or change the appearance and effect to give a different kind of power-up to your players.
-## Final code
+## Final Code
```lua
local MAX_HEALTH = 100
diff --git a/content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/create-player-tools.md b/content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/creating-player-tools.md
similarity index 95%
rename from content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/create-player-tools.md
rename to content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/creating-player-tools.md
index cf2813570..f03caf6a3 100644
--- a/content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/create-player-tools.md
+++ b/content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/creating-player-tools.md
@@ -1,8 +1,8 @@
---
-title: Create player tools
+title: Creating Player Tools
description: The process for creating and customizing Tools that players can equip and use.
next: /tutorials/scripting/intermediate-scripting/hit-detection-with-lasers
-prev: /tutorials/scripting/intermediate-scripting/create-a-health-pickup
+prev: /tutorials/scripting/intermediate-scripting/creating-a-health-pickup
---
Tools are a simple way to manage items that the player can hold in their hand and use in-game. They can range from weapons such as swords to food items.
@@ -11,7 +11,7 @@ In this tutorial, you'll learn how to create a tool in the shape of a laser blas

-## Create the tool
+## Creating the Tool
The `Class.Tool` object is the basis of any tool in Roblox, so you'll need to create one. It's easier to change how tools look by adding objects such as Parts and MeshParts to the tool in the workspace where they are visible.
@@ -39,11 +39,11 @@ The `Class.Tool` object is the basis of any tool in Roblox, so you'll need to cr
If you don't include a part named Handle in the tool, it will drop to the ground when a player tries to equip it.
-## Store the tool
+## Storing the Tool
Tools can be kept in the game world as **collectable tools** or given to all players as **starter tools**.
-### Collectable tool
+### Collectable Tool
The blaster is currently a child of **Workspace** so it will be collectable. A player can pick up the tool by touching it, causing it to become a child of the character model; the tool will then be equipped and placed in their hotbar.
@@ -64,7 +64,7 @@ During gameplay, unequipped tools are stored within the player's hierarchy in th
-### Starter tool
+### Starter Tool
Storing a tool in `Class.StarterPack` will place it in a player's `Class.Backpack` when they join the game or respawn.
@@ -74,9 +74,9 @@ Storing a tool in `Class.StarterPack` will place it in a player's `Class.Backpac
2. Play the game to test the tool. Click on the hotbar at the bottom of the screen or press **1** on the keyboard to equip the tool.
-## Tool properties
+## Tool Properties
-### Position / orientation
+### Position / Orientation
A tool's position and orientation can be changed using the **grip** properties. **GripPos** changes the position of the grip, whereas **GripForward**, **GripRight** and **GripUp** affect the rotation.
@@ -99,7 +99,7 @@ Currently the player is holding the center of the blaster instead of the grip.
-### Hotbar icon
+### Hotbar Icon
By default, the tool **name** will be displayed on the hotbar icon. It's good practice to change the icon to be an image of the tool. Set the **TextureId** property of the tool to `rbxassetid://92628145`.
@@ -120,7 +120,7 @@ A **tooltip** is a small text description that appears when the mouse hovers ove

-## Use scripts with tools
+## Using Scripts with Tools
A tool has three key events you can connect to: `Class.Tool.Equipped|Equipped`, `Class.Tool.Unequipped|Unequipped` and `Class.Tool.Activated|Activated`.
@@ -149,7 +149,7 @@ A tool has three key events you can connect to: `Class.Tool.Equipped|Equipped`,
These methods only work in `Class.LocalScript|LocalScripts` because only the player's device knows when input happens, such as a mouse button being clicked or a screen being touched.
-## Add the sounds
+## Adding the Sounds
To see these events in action, you can play a sound when they fire. First, you'll need to create Sound objects to use for this.
@@ -161,7 +161,7 @@ To see these events in action, you can play a sound when they fire. First, you'l

-## Add the code
+## Adding the Code
The example code below plays the **Equip** sound when the tool is equipped and the **Fire** sound when activated.
diff --git a/content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/hit-detection-with-lasers.md b/content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/hit-detection-with-lasers.md
index fe199ac8f..8a12bcbe8 100644
--- a/content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/hit-detection-with-lasers.md
+++ b/content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/hit-detection-with-lasers.md
@@ -1,7 +1,7 @@
---
-title: Hit detection with lasers
+title: Hit Detection with Lasers
description: The process for casting a laser from a blaster and detecting collision.
-prev: /tutorials/scripting/intermediate-scripting/create-player-tools
+prev: /tutorials/scripting/intermediate-scripting/creating-player-tools
---
In this tutorial, you'll learn how to cast a laser from the blaster in [Creating Player Tools](./creating-player-tools.md) and detect whether or not it hits a player.
@@ -10,7 +10,7 @@ In this tutorial, you'll learn how to cast a laser from the blaster in [Creating
-## Raycasting to find collisions
+## Raycasting to Find Collisions
**Raycasting** creates an invisible ray from a start position towards a given direction with a defined length. If the ray collides with objects or terrain in its path, it will return information on the collision such as the position and the object it collided with.
@@ -19,11 +19,11 @@ In this tutorial, you'll learn how to cast a laser from the blaster in [Creating
Raycast from A towards B colliding with a wall
-## Find the mouse location
+## Finding the Mouse Location
Before a laser can be shot, you must first know where the player is aiming. This can be found by raycasting from the player's 2D mouse location on the screen directly forwards from the camera into the game world. The ray will collide with whatever the player is aiming at with the mouse.
-1. Open the **ToolController** script inside the Blaster tool from [Create Player Tools](./create-player-tools.md). If you haven't completed that tutorial yet you can download the [Blaster](https://www.roblox.com/library/6571559694/Blaster) model and insert it into StarterPack.
+1. Open the **ToolController** script inside the Blaster tool from [Creating Player Tools](./creating-player-tools.md). If you haven't completed that tutorial yet you can download the [Blaster](https://www.roblox.com/library/6571559694/Blaster) model and insert it into StarterPack.

@@ -124,7 +124,7 @@ The length of the direction vector determines how far the ray will travel. The r
local raycastResult = workspace:Raycast(screenToWorldRay.Origin, directionVector)
```
-## Collision information
+## Collision Information
If the raycast operation finds an object hit by the ray, it will return a `Datatype.RaycastResult`, which contains information about the collision between the ray and object.
@@ -186,7 +186,7 @@ local function getWorldMousePosition()
end
```
-## Fire towards the target
+## Firing Towards the Target
Now that the 3D mouse position is known, it can be used as a **target position** to fire a laser towards. A second ray can be cast between the player's weapon and the target position using the **Raycast** function.
@@ -323,7 +323,7 @@ Finally, you'll need to check that the raycast operation returned a value. If a
end
```
-## Check the object hit
+## Checking the Object Hit
To find if the object hit by the laser is part of a player's character or just a piece of scenery, you'll need to look for a `Class.Humanoid`, as every character has one.
@@ -360,9 +360,9 @@ If you have other models in the game that contain humanoids, further checks will
end
```
-Now the laser blaster should print `Player hit` to the Output Window every time the raycast operation hits another player.
+Now the laser blaster should print `Player hit` to the output window every time the raycast operation hits another player.
-## Test with multiple players
+## Testing with Multiple Players
Two players are needed to test if the weapon raycast is finding other players, so you need to start a local server.
@@ -382,7 +382,7 @@ Two players are needed to test if the weapon raycast is finding other players, s
You can find out more about the Test tab [here](../../../../studio/test-tab.md).
-## Find the laser position
+## Finding the Laser Position
The blaster should fire a red beam of light at its target. The function for this will be inside a `Class.ModuleScript` so it can be reused in other scripts later on. First, the script will need to find the position where the laser beam should be rendered.
@@ -434,7 +434,7 @@ The blaster should fire a red beam of light at its target. The function for this
end
```
-## Create the laser part
+## Creating the Laser Part
Now that you know where to create a laser beam, you need to add the beam itself. This can be done easily with a Neon part.
@@ -504,7 +504,7 @@ Now the function to render the laser beam is complete, it can be called by the *
-## Control weapon fire rate
+## Controlling Weapon Fire Rate
Weapons need a delay between each shot to stop players from dealing too much damage in a short amount of time. This can be controlled by checking if enough time has passed since a player last fired.
@@ -573,7 +573,7 @@ Weapons need a delay between each shot to stop players from dealing too much dam
When you test the blaster you should find that no matter how fast you click, there will always be a short 0.3 seconds delay between each shot.
-## Damage the player
+## Damaging the Player
Clients cannot damage other clients directly; the server needs to be responsible for issuing damage when a player is hit.
@@ -652,7 +652,7 @@ The server needs to deal damage to the player who has been hit when the event is
6. Test the blaster with 2 players by starting a local server. When you shoot the other player, their health will decrease by the number assigned to `LASER_DAMAGE`.
-## Render other player's laser beams
+## Rendering Other Player's Laser Beams
Currently, the laser beam is created by the client firing the weapon, so only they will be able to see the laser beam.
@@ -660,7 +660,7 @@ If the laser beam was created on the server then everyone would be able to see i
To solve this issue, every client will create their own laser beams. This means the client shooting the weapon will see the laser beam instantly. Other clients will experience a small delay between when another player shoots and a beam appears. This is the best case scenario: there is no way to communicate one client's laser to other clients any faster.
-### Shooter's client
+### Shooter's Client
First, the client needs to tell the server it has fired a laser and provide the end position.
@@ -681,7 +681,7 @@ First, the client needs to tell the server it has fired a laser and provide the
end
```
-### The server
+### The Server
The server now must receive the event that the client has fired and tell all clients the start and end position of the laser beam so they can also render it.
@@ -739,7 +739,7 @@ The server can now call **FireAllClients** on the **LaserFired** remote event to
end
```
-### Render on the clients
+### Rendering on the Clients
Now **FireAllClients** has been called, each client will receive an event from the server to render a laser beam. Each client can reuse the **LaserRenderer** module from earlier to render the laser beam using the tool's handle position and end position value sent by the server. The player that fired the laser beam in the first place should ignore this event otherwise they'll see 2 lasers.
@@ -781,7 +781,7 @@ Now **FireAllClients** has been called, each client will receive an event from t
-## Sound effects
+## Sound Effects
The shooting sound effect currently only plays on the client that's shooting the projectile. You'll need to move the code to play the sound so that other players will hear it too.
@@ -813,7 +813,7 @@ The shooting sound effect currently only plays on the client that's shooting the
end
```
-## Secure remotes using validation
+## Securing Remotes using Validation
If the server isn't checking data from incoming requests, a hacker can abuse remote functions and events and use them to send fake values to the server. It's important to use **server-side validation** to prevent this.
@@ -944,7 +944,7 @@ Your laser blaster is now complete, with a basic hit detection system using rayc
-## Final code
+## Final Code
### ToolController
diff --git a/content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/save-data.md b/content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/saving-data.md
similarity index 96%
rename from content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/save-data.md
rename to content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/saving-data.md
index 77a41b63c..b4c8cdaac 100644
--- a/content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/save-data.md
+++ b/content/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/saving-data.md
@@ -1,5 +1,5 @@
---
-title: Save data
+title: Saving Data
description: The process for creating a basic data store to save, store, and read data back.
---
@@ -7,11 +7,11 @@ Games often need to store some amount of **persistent data** between sessions li
This tutorial will show you how to create a basic **data store**, save sample data, and read the data back into a game session.
-## Enable Studio access
+## Enabling Studio Access
By default, games tested in Studio cannot access data stores, so you must first enable them.
-1. Make sure your game is [published](../../../../production/publishing/publish-experiences-and-places.md) to enable Studio access.
+1. Make sure your game is [published](../../../../production/publishing/publishing-experiences-and-places.md) to enable Studio access.
2. From the **Home** tab, open the **Game Settings** window.
@@ -19,7 +19,7 @@ By default, games tested in Studio cannot access data stores, so you must first
4. Click **Save** to register your changes.
-## Create a data store
+## Creating a Data Store
Data stores are identified by a unique **name**. In this example, a data store named **PlayerGold** will save each player's gold to persistent storage.
@@ -41,7 +41,7 @@ Data stores are identified by a unique **name**. In this example, a data store n
local goldStore = DataStoreService:GetDataStore("PlayerGold")
```
-## Save data
+## Saving Data
A data store is essentially a dictionary, like a Lua table. Each value in the data store is indexed by a unique **key**, for instance the player's unique `Class.Player.UserId|UserId` or simply a named string for a game promo.
@@ -147,7 +147,7 @@ Be careful to not send requests to data stores too often. Requests on a data sto
A common mistake may be updating a player's gold data every time they collect a gold piece. Instead, store the player's gold in a variable and only update the data store occasionally, such as with a periodic auto-save and/or when the player leaves the game.
-## Read data
+## Reading Data
To read data from a data store, call `Class.GlobalDataStore:GetAsync()|GetAsync()` with the desired key name.
@@ -179,7 +179,7 @@ end
To test the script, click **Run** and notice the `currentGold` value printed to the **Output** window. Note that it may take a couple seconds, as the functions must connect to data store servers.
-## Sample project
+## Sample Project
Now that you understand basic data store usage, test it out in the [Gold Rush](https://www.roblox.com/games/5268331031/Gold-Rush) sample game. You can also edit the game in Studio and explore the enhanced **GoldManager** script which includes data auto‑saving and more.
diff --git a/content/en-us/tutorials/use-case-tutorials/ui/create-a-score-bar.md b/content/en-us/tutorials/use-case-tutorials/ui/creating-a-score-bar.md
similarity index 99%
rename from content/en-us/tutorials/use-case-tutorials/ui/create-a-score-bar.md
rename to content/en-us/tutorials/use-case-tutorials/ui/creating-a-score-bar.md
index daf09a3cd..376aa4112 100644
--- a/content/en-us/tutorials/use-case-tutorials/ui/create-a-score-bar.md
+++ b/content/en-us/tutorials/use-case-tutorials/ui/creating-a-score-bar.md
@@ -1,5 +1,5 @@
---
-title: Create score bars
+title: Creating Score Bars
description: The process for creating a score bar UI that displays current player information.
---
@@ -18,7 +18,7 @@ As with all 2D creation, there are many ways to achieve any particular goal. You
-## Create the frame
+## Create the Frame
To display UI elements on every player's screen, you can create a `Class.ScreenGui` object in the `Class.StarterGui` service. `Class.ScreenGui` objects are the primary containers for on-screen UI, and the `Class.StarterGui` service copies its contents to each player's `Class.PlayerGui` container as they enter an experience.
@@ -66,7 +66,7 @@ To recreate the frame container within the sample [Gold Rush](https://www.roblox
1. Set **FillDirection** to **Horizontal**.
1. Set **VerticalAlignment** to **Center**.
-## Add an icon
+## Add an Icon
An icon is a symbol that represents an action, object, or concept in an experience. Using icons that are simple and intuitive allows players to easily recognize what you're communicating with your UI without using text, which can clutter the screen and pull attention away from content that matters.
@@ -89,7 +89,7 @@ To recreate the gold crown icon within the sample [Gold Rush](https://www.roblox
-## Insert score text
+## Insert Score Text
Score text records the player's score within an experience, such as how many points they earn within a match. It's important that all UI text is both clear and easy to read so players can quickly understand the information they need to be successful within your experience.
@@ -115,7 +115,7 @@ To recreate the score text within the sample [Gold Rush](https://www.roblox.com/
-## Test the design
+## Test the Design
Studio's **Device Emulator** allows you to test how players will see and interact with your UI on various devices. This tool is a vital part of designing UI because the aspect ratio of your viewport in Studio doesn't necessarily reflect the aspect ratio of the screens players use to access your experience, and it's important that your UI is both legible and accessible on every device.
diff --git a/content/en-us/tutorials/use-case-tutorials/ui/create-hud-meters.md b/content/en-us/tutorials/use-case-tutorials/ui/creating-hud-meters.md
similarity index 97%
rename from content/en-us/tutorials/use-case-tutorials/ui/create-hud-meters.md
rename to content/en-us/tutorials/use-case-tutorials/ui/creating-hud-meters.md
index d2a6b3415..57f04c0f5 100644
--- a/content/en-us/tutorials/use-case-tutorials/ui/create-hud-meters.md
+++ b/content/en-us/tutorials/use-case-tutorials/ui/creating-hud-meters.md
@@ -1,5 +1,5 @@
---
-title: Create HUD meters
+title: Creating HUD Meters
description: Learn how to build a custom HUD meter to replace the default character health meter.
---
@@ -17,17 +17,17 @@ Using [Hazardous Space Station](https://www.roblox.com/games/99416825187098/Haza
- How to replace the default Roblox health meter with your own meter and hook it up to the character's health level.
- How to animate the center portion of the health meter and set its color between five color gradient keypoints (red, orange, yellow, lime, green).
-## Use the Device Emulator
+## Using the Device Emulator
Roblox is inherently cross-platform, as players can discover and join experiences on a PC or console, then later pick up their phone and continue where they left off. Mobile devices (phones and tablets) have the least amount of screen space, so it's important that your UI elements fit on smaller screens and that they're clearly visible to players.
-The best way to test UI designs across platforms is Studio's [Device Emulator](../../../studio/test-modes.md#device-emulation). This tool provides a preset selection of devices and allows you to add your own custom presets.
+The best way to test UI designs across platforms is Studio's [Device Emulator](../../../studio/testing-modes.md#device-emulation). This tool provides a preset selection of devices and allows you to add your own custom presets.
1. Open the [Hazardous Space Station](https://www.roblox.com/games/99416825187098/Hazardous-Space-Station) template in Studio.
-2. From the **Test** tab, toggle on the **Device** tool.
+2. From the [Test](../../../studio/test-tab.md) tab, toggle on the **Device** tool.
@@ -35,7 +35,7 @@ The best way to test UI designs across platforms is Studio's [Device Emulator](.
-## Create a screen container
+## Create a Screen Container
A `Class.ScreenGui` container holds UI objects (`Class.GuiObject|GuiObjects`) to display on a player's screen (in this tutorial, the entirety of the health meter). To display a `Class.ScreenGui` and its child objects to every player who joins the experience, place it inside the `Class.StarterGui` container. When a player joins and their character first spawns, the `Class.ScreenGui` and its contents clone into the `Class.PlayerGui` container for that player, located within the `Class.Players` container.
@@ -43,7 +43,7 @@ A `Class.ScreenGui` container holds UI objects (`Class.GuiObject|GuiObjects`) to
To insert an empty `Class.ScreenGui`:
-1. In the **Explorer** window, locate the `Class.StarterGui` container.
+1. In the [Explorer](../../../studio/explorer.md) window, locate the `Class.StarterGui` container.
@@ -55,7 +55,7 @@ To insert an empty `Class.ScreenGui`:
-### Utilize safe areas
+### Utilize Safe Areas
Modern phones take advantage of the entire screen but typically include notches, cutouts, and other elements that occupy screen space. Every Roblox experience also includes the **top bar controls** for quick access to the main menu, [chat](../../../chat/in-experience-text-chat.md), [leaderboard](../../../players/leaderboards.md), and more.
@@ -90,7 +90,7 @@ While the default of `Enum.ScreenInsets|CoreUISafeInsets` ensures all UI objects
-### Set edge padding
+### Set Edge Padding
With `Class.ScreenGui.ScreenInsets|ScreenInsets` set to `Enum.ScreenInsets|DeviceSafeInsets`, content can now extend directly up to the physical top edge of the screen. However, a small amount of **padding** can help push the health meter (and other objects inside the container) slightly away from the screen edges for a cleaner appearance and to prevent them from being clipped.
@@ -106,13 +106,13 @@ One way to apply padding to a UI container is through the insertion of a `Class.
-## Construct the health meter
+## Construct the Health Meter
With the [screen container configured](#create-a-screen-container), you can begin constructing the health meter using Roblox UI objects such as [frames](../../../ui/frames.md) and an [image label](../../../ui/labels.md).
-### Create the parent frame
+### Create the Parent Frame
Similar to design applications like Figma and Photoshop, a `Class.Frame` in Roblox serves as a container for other UI objects. For this tutorial, the entire health meter will be contained in a single parent frame, making it simple to reposition across various HUD layouts.
@@ -128,7 +128,7 @@ Similar to design applications like Figma and Photoshop, a `Class.Frame` in Robl
-### Position the frame
+### Position the Frame
In Roblox, the position of a UI object is represented by a `Datatype.UDim2` coordinate set containing `Datatype.UDim.Scale|Scale` and `Datatype.UDim.Offset|Offset` values for both the **X** and **Y** axes:
@@ -145,7 +145,7 @@ To position a UI object in the upper-right corner of the screen container, `Data
-Additionally, you'll need to set an upper-right [anchor point](../../../ui/position-and-size.md#anchorpoint) for the parent frame to define its origin point. Acceptable values are between `0` and `1`, relative to the size of the object, so an anchor value of `1, 0` puts the frame's anchor point in its upper‑right corner.
+Additionally, you'll need to set an upper-right [anchor point](../../../ui/positioning-and-sizing.md#anchorpoint) for the parent frame to define its origin point. Acceptable values are between `0` and `1`, relative to the size of the object, so an anchor value of `1, 0` puts the frame's anchor point in its upper‑right corner.
@@ -159,7 +159,7 @@ Additionally, you'll need to set an upper-right [anchor point](../../../ui/posit
-### Resize the frame
+### Resize the Frame
Like position, the `Class.Frame.Size|Size` of a UI object is represented by a `Datatype.UDim2` coordinate set containing `Datatype.UDim.Scale|Scale` and `Datatype.UDim.Offset|Offset` values for both the **X** and **Y** axes.
@@ -171,7 +171,7 @@ By default, the new frame's size is `{0, 100},{0, 100}`
-### Style the frame
+### Style the Frame
By default, `Class.Frame|Frames` are filled in solid white. The final health meter should have a darker and slightly opaque fill, as well as a dark outline, so that it stands out better on both light and dark backgrounds.
@@ -204,7 +204,7 @@ To finalize the meter frame's styling, you can round the corners to form a "pill
-### Create the inner fill
+### Create the Inner Fill
Now that the health meter's containing frame is complete, you can add an **inner fill** portion to represent the character's variable health. Since it only needs to be a solid‑filled region, a sub‑child `Class.Frame` inside the parent frame is suitable.
@@ -238,7 +238,7 @@ Now that the health meter's containing frame is complete, you can add an **inner
-### Add the icon
+### Add the Icon
To more clearly indicate the purpose of the meter, you can add an [image label](../../../ui/labels.md) to the left side, in this case a red heart which commonly symbolizes health or life.
@@ -254,7 +254,7 @@ To more clearly indicate the purpose of the meter, you can add an [image label](
-4. Locate the icon's `Class.ImageLabel.Image|Image` property and enter `rbxassetid://91715286435585`, the reference to a pre‑uploaded heart image (if desired, you can [import](../../../projects/assets/manager.md#import-assets) your own image and use its asset ID).
+4. Locate the icon's `Class.ImageLabel.Image|Image` property and enter `rbxassetid://91715286435585`, the reference to a pre‑uploaded heart image (if desired, you can [import](../../../projects/assets/manager.md#importing-assets) your own image and use its asset ID).
@@ -271,7 +271,7 @@ To more clearly indicate the purpose of the meter, you can add an [image label](
-### Constrain the size
+### Constrain the Size
While a [scale height](#resize-the-frame) of `0.05` (5%) looks good on modern phone screens and gaming monitors which are 16:9 aspect ratio or wider, the meter may look slightly too tall on tablet screens and older phones. You can check this by emulating a tablet like **iPad 7th Generation** from the **Device Emulator**.
@@ -300,13 +300,13 @@ Now, the meter bar maintains a more consistent height between wider and taller s
-## Replace the default health meter
+## Replace the Default Health Meter
Roblox experiences include a default health meter which becomes visible when characters take damage. If you keep the default meter visible, it will duplicate and potentially overlap the custom meter.
-### Disable the default meter
+### Disable the Default Meter
To disable the default health meter, you'll use a **client script** (`Class.LocalScript`) within `Class.StarterPlayerScripts` that calls `Class.StarterGui:SetCoreGuiEnabled()`.
@@ -357,7 +357,7 @@ If you playtest the experience now and take damage, you'll notice that the defau
-### Listen for health changes
+### Listen for Health Changes
All default Roblox character models contain a `Class.Humanoid` class which provides special behaviors and functionality to the character, such as setting its walk/run speed and managing its health. `Class.Humanoid.Health|Health` changes on the server [replicate](../../../projects/client-server.md#replication) to each player's client and you can detect these changes to update both the size and color of the custom health meter.
@@ -482,7 +482,7 @@ If you playtest the experience now, you'll notice that the custom meter correctl
By default, the Roblox health metering system includes a gradual healing effect which allows characters to slowly regenerate health. If you wish to disable this effect, insert an empty `Class.Script` named **Health** into the `Class.StarterCharacterScripts` container. This will prevent the default internal script from loading for each player character, effectively removing the regeneration effect.
-### Animate the meter bar
+### Animate the Meter Bar
To add an extra level of polish to the custom meter, you can animate health changes through **tweening**, gradually changing the meter bar's size and color over ½ second.
@@ -589,7 +589,7 @@ If you playtest the experience now, you'll notice that the custom meter tweens b
-### Add a damage effect
+### Add a Damage Effect
The default health meter system includes a brief, subtle red tint on the screen edges when the character is damaged. By [disabling the default meter](#disable-the-default-meter), this effect is removed, but you can replace it with your own implementation.
@@ -691,7 +691,7 @@ The default health meter system includes a brief, subtle red tint on the screen
```
- Key additions/changes
+ Key Additions/Changes
diff --git a/content/en-us/tutorials/use-case-tutorials/ui/interactive-ui.md b/content/en-us/tutorials/use-case-tutorials/ui/interactive-ui.md
index 9e237e4c3..a0b60fefc 100644
--- a/content/en-us/tutorials/use-case-tutorials/ui/interactive-ui.md
+++ b/content/en-us/tutorials/use-case-tutorials/ui/interactive-ui.md
@@ -1,11 +1,11 @@
---
-title: Make UI interactive
+title: Making UI Interactive
description: Learn how to build interactive UI and connect stateful scripts to power it.
---
import BetaAlert from '../../../includes/beta-features/beta-alert.md'
-A **HUD** (**Heads-Up Display**) in your experience commonly displays non‑interactive UI elements such as the health meter demonstrated in [Create HUD Meters](../ui/create-hud-meters.md). Atop this, almost every experience requires **interactive** UI such as buttons that respond to player activation, animate when activated, tween in/out menus with other interactive controls, etc.
+A **HUD** (**Heads-Up Display**) in your experience commonly displays non‑interactive UI elements such as the health meter demonstrated in [Creating HUD Meters](../ui/creating-hud-meters.md). Atop this, almost every experience requires **interactive** UI such as buttons that respond to player activation, animate when activated, tween in/out menus with other interactive controls, etc.
@@ -17,15 +17,15 @@ Using [UI Fundamentals - HUD Meter](https://www.roblox.com/games/1045069158
- How to connect buttons to player activation to toggle in/out the settings menu.
- How to connect draggable UI sliders to adjust the volume of sound effects and background ambience separately.
-## Use the Device Emulator
+## Using the Device Emulator
-As noted in [Create HUD Meters](../ui/create-hud-meters.md), phones and tablets have the least amount of screen space, so it's important that your UI elements fit on smaller screens and that they're clearly visible to players. If you haven't done so already, enable the [Device Emulator](../../../studio/test-modes.md#device-emulation) in Studio:
+As noted in [Creating HUD Meters](../ui/creating-hud-meters.md), phones and tablets have the least amount of screen space, so it's important that your UI elements fit on smaller screens and that they're clearly visible to players. If you haven't done so already, enable the [Device Emulator](../../../studio/testing-modes.md#device-emulation) in Studio:
1. Open the [UI Fundamentals - HUD Meter](https://www.roblox.com/games/104506915856758/UI-Fundamentals-HUD-Meter) template in Studio.
-2. From the **Test** tab, toggle on the **Device** tool.
+2. From the [Test](../../../studio/test-tab.md) tab, toggle on the **Device** tool.
@@ -33,7 +33,7 @@ As noted in [Create HUD Meters](../ui/create-hud-meters.md), phones and tablets
-## Create the settings button
+## Create the Settings Button
`Class.GuiButton|GuiButtons` are interactive user interface elements with built‑in functionality such as the multi‑platform `Class.GuiButton.Activated|Activated` event which fires when the button is clicked or tapped. The `Class.GuiButton` class extends to two variations, `Class.TextButton` and `Class.ImageButton`, and this tutorial uses a "gear" shaped `Class.ImageButton` to toggle the settings menu open or closed.
@@ -41,7 +41,7 @@ As noted in [Create HUD Meters](../ui/create-hud-meters.md), phones and tablets
To construct the settings button:
-1. In the **Explorer** window, locate **HUDContainer** inside `Class.StarterGui`.
+1. In the [Explorer](../../../studio/explorer.md) window, locate **HUDContainer** inside `Class.StarterGui`.
@@ -51,7 +51,7 @@ To construct the settings button:
-3. With the new button selected, set the following in the **Properties** window:
+3. With the new button selected, set the following in the [Properties](../../../studio/properties.md) window:
- `Class.ImageButton.AnchorPoint|AnchorPoint` = `0.5, 0.25` (horizontal center and vertical upper quarter)
- `Class.ImageButton.BackgroundTransparency|BackgroundTransparency` = `1` (fully transparent)
@@ -76,7 +76,7 @@ To construct the settings button:
-## Create the settings menu
+## Create the Settings Menu
@@ -84,9 +84,9 @@ The new [settings button](#create-the-settings-button) will be scripted to toggl
-### Create the parent frame
+### Create the Parent Frame
-As noted in [Create HUD Meters](../ui/create-hud-meters.md), a `Class.Frame` serves as a container for other UI objects. The entire settings menu will be constructed with a single parent frame, making it simple to manage as a stateful object that reacts to input differently depending on the current state.
+As noted in [Creating HUD Meters](../ui/creating-hud-meters.md), a `Class.Frame` serves as a container for other UI objects. The entire settings menu will be constructed with a single parent frame, making it simple to manage as a stateful object that reacts to input differently depending on the current state.
1. Insert a `Class.Frame` into **HUDContainer** and rename it **SettingsMenu**.
@@ -137,7 +137,7 @@ As noted in [Create HUD Meters](../ui/create-hud-meters.md), a `Class.Frame` ser
-### Construct a slider
+### Construct a Slider
To allow players to adjust volume levels, the settings menu will contain two draggable **slider widgets** powered by `Class.UIDragDetector`, a convenient object that facilitates interaction with 2D user interface elements.
@@ -169,7 +169,7 @@ To create a parent container for the first slider:
- `Class.UIListLayout.HorizontalFlex|HorizontalFlex` = `Enum.UIFlexAlignment.Fill|Fill` (resize elements horizontally to fill the entire parent container, overriding their defined width)
- `Class.UIListLayout.VerticalAlignment|VerticalAlignment` = `Enum.VerticalAlignment.Center|Center` (align elements along their vertical center)
-#### Slider icon
+#### Slider Icon
A simple icon including an audio note and "burst" symbol helps players identify the slider's purpose when they open the settings menu.
@@ -195,7 +195,7 @@ A simple icon including an audio note and "burst" symbol helps players identify
-#### Range frame
+#### Range Frame
Directly to the right of the [icon](#slider-icon), the interactive portion of the slider should be contained within another `Class.Frame`.
@@ -228,7 +228,7 @@ Directly to the right of the [icon](#slider-icon), the interactive portion of th
-#### Interactive handle
+#### Interactive Handle
With the [slider container](#range-frame) constructed, you can now create a **draggable handle** for players to interact with during gameplay.
@@ -278,7 +278,7 @@ If you playtest the experience now, you'll be able to drag the handle left and r
-#### Inner fill
+#### Inner Fill
To more clearly indicate that the slider controls a 0% to 100% range, you can add an **inner fill** to the left side of the container which will sync with the handle's variable position.
@@ -310,7 +310,7 @@ To more clearly indicate that the slider controls a 0% to 100% range, you can ad
-### Duplicate the slider
+### Duplicate the Slider
With the [first slider](#construct-a-slider) constructed, you can easily duplicate it and modify some visual aspects to indicate another purpose, in this case the volume level of background audio symbolized by an icon of musical notes.
@@ -367,7 +367,7 @@ With the [first slider](#construct-a-slider) constructed, you can easily duplica
-### Create the close button
+### Create the Close Button
The final element of the settings menu is a **close button** which provides players an additional input to close the menu (the **SettingsButton** in the top‑center will serve the same purpose).
@@ -394,11 +394,11 @@ The final element of the settings menu is a **close button** which provides play
-## Create the control modules
+## Create the Control Modules
An extensible **control module** setup makes interactive UI management more streamlined than individual scripts placed within each object. `Class.ModuleScript|ModuleScripts` facilitate this extensible functionality by letting you reuse code between scripts on different sides of the client‑server boundary or the same side of the boundary.
-### Stateful object controller
+### Stateful Object Controller
The following stateful object controller module lets you attach behavior to UI objects such as **SettingsButton** and **SettingsMenu**, and easily toggle/tween between various states. To create the module:
@@ -491,7 +491,7 @@ The following stateful object controller module lets you attach behavior to UI o
-### Slider controller
+### Slider Controller
An additional module initializes and controls the two volume sliders. It also allows you to connect a callback function to each slider in order to detect player interaction with the slider and apply desired changes in the experience.
@@ -591,7 +591,7 @@ An additional module initializes and controls the two volume sliders. It also al
-## Create the settings script
+## Create the Settings Script
With the [settings button](#create-the-settings-button) and [settings menu](#create-the-settings-menu) finalized, you can hook everything together with a single script that utilizes the [control modules](#create-the-control-modules).
diff --git a/content/en-us/tutorials/use-case-tutorials/ui/proximity-prompts.md b/content/en-us/tutorials/use-case-tutorials/ui/proximity-prompts.md
index b719ccc81..8a2e15f74 100644
--- a/content/en-us/tutorials/use-case-tutorials/ui/proximity-prompts.md
+++ b/content/en-us/tutorials/use-case-tutorials/ui/proximity-prompts.md
@@ -1,5 +1,5 @@
---
-title: Add proximity prompts
+title: Adding Proximity Prompts
description: The process for creating an interactive prompt that triggers an action on user input.
---
@@ -13,7 +13,7 @@ This tutorial uses the [Dungeon Delve](https://www.roblox.com/games/6749940622/D
-## Create a prompt
+## Create a Prompt
On-screen prompts are generated by a `Class.ProximityPrompt` object parented to an `Class.Attachment`, `Class.BasePart`, or `Class.Model`.
@@ -43,7 +43,7 @@ On-screen prompts are generated by a `Class.ProximityPrompt` object parented to
-### Prompt appearance
+### Prompt Appearance
Prompts consist of three primary elements, each of which can be controlled by the following properties:
@@ -64,7 +64,7 @@ To customize the appearance of the prison door prompt, make the following change
-### Activation distance
+### Activation Distance
Prompts appear when the user's **character** moves within the defined **MaxActivationDistance** range of the prompt object's parent.
@@ -74,7 +74,7 @@ The default value works well in most cases, but you can push user interaction cl
-### Hold duration
+### Hold Duration
The **HoldDuration** property value determines how quickly the prompt's action is triggered, in seconds. Since this door must be picked to unlock it, change the **HoldDuration** property to **4**.
@@ -84,7 +84,7 @@ The **HoldDuration** property value determines how quickly the prompt's action i
-## Implement an action
+## Implement an Action
The best way to detect prompt events is through `Class.ProximityPromptService` — this lets you detect events centrally without attaching a script to each prompt object.
diff --git a/content/en-us/tutorials/use-case-tutorials/use-case-tutorial-overview.md b/content/en-us/tutorials/use-case-tutorials/use-case-tutorial-overview.md
index 98fa01024..85dde975a 100644
--- a/content/en-us/tutorials/use-case-tutorials/use-case-tutorial-overview.md
+++ b/content/en-us/tutorials/use-case-tutorials/use-case-tutorial-overview.md
@@ -1,5 +1,5 @@
---
-title: Use case tutorials
+title: Use Case Tutorials
description: An overview of creation use case tutorials covering topics like modeling, UI, and visual effects.
hideInPageNavigation: true
---
@@ -12,7 +12,7 @@ hideInPageNavigation: true
**Modeling** is the process of crafting 3D objects for props, environments, and characters within your experiences. This process is important because it allows you to create both the visual and interactive content that encourages players to explore and engage with the 3D space.
-Studio modeling
+Studio Modeling
Use solid modeling operations directly in Studio to form complex shapes by unioning and negating basic parts.
@@ -23,11 +23,11 @@ Use solid modeling operations directly in Studio to form complex shapes by union
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Intro to world building
+ Intro to World Buiding
@@ -39,11 +39,11 @@ Use solid modeling operations directly in Studio to form complex shapes by union
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Create neon signs with solid modeling
+ Creating Neon Signs with Solid Modeling
@@ -55,18 +55,18 @@ Use solid modeling operations directly in Studio to form complex shapes by union
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Assemble modular environments
+ Assembling Modular Environments
-Blender modeling
+Blender Modeling
Use third-party modeling tools like Blender to create meshes, then import them into Studio using the 3D Importer.
@@ -77,11 +77,11 @@ Use third-party modeling tools like Blender to create meshes, then import them i
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Box modeling 101
+ Box Modeling 101
@@ -107,25 +107,25 @@ Use third-party modeling tools like Blender to create meshes, then import them i
-Related docs
+Related Docs
- [Parts](../../parts/index.md)
-- [Solid modeling](../../parts/solid-modeling.md)
+- [Solid Modeling](../../parts/solid-modeling.md)
- [Meshes](../../parts/meshes.md)
-- [Texture and decals](../../parts/textures-decals.md)
-- [Mesh specifications](../../art/modeling/specifications.md)
-- [Texture specifications](../../art/modeling/texture-specifications.md)
-- [Export requirements](../../art/modeling/export-requirements.md)
-- [Roblox Blender plugin](../../art/modeling/roblox-blender-plugin.md)
+- [Texture and Decals](../../parts/textures-decals.md)
+- [Mesh Specifications](../../art/modeling/specifications.md)
+- [Texture Specifications](../../art/modeling/texture-specifications.md)
+- [Export Requirements](../../art/modeling/export-requirements.md)
+- [Roblox Blender Plugin](../../art/modeling/roblox-blender-plugin.md)
-User interfaces
+User Interfaces
**User interfaces** (UI) are visual or interactive elements that either provide essential gameplay information or teach players how to complete unique user flows within your experiences. Strategically implementing UI in key locations on-screen and in the 3D space is important because UI communicates what players need to know to be successful and to have a positive user experience, such as information about their main objective or their location in the overall map.
@@ -138,11 +138,11 @@ Use third-party modeling tools like Blender to create meshes, then import them i
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
@@ -154,11 +154,11 @@ Use third-party modeling tools like Blender to create meshes, then import them i
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Make UI interactive
+ Making UI Interactive
@@ -247,11 +247,11 @@ Use third-party modeling tools like Blender to create meshes, then import them i
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Playing positional sounds
+ Playing Positional Sounds
@@ -362,11 +362,11 @@ Use third-party modeling tools like Blender to create meshes, then import them i
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Create waterfalls
+ Creating Waterfalls
@@ -378,11 +378,11 @@ Use third-party modeling tools like Blender to create meshes, then import them i
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Create volcanoes
+ Creating Volcanoes
@@ -393,11 +393,11 @@ Use third-party modeling tools like Blender to create meshes, then import them i
-Related docs
+Related Docs
-- [Particle emitters](../../effects/particle-emitters.md)
+- [Particle Emitters](../../effects/particle-emitters.md)
- [Beams](../../effects/beams.md)
- [Trails](../../effects/trails.md)
- [Flipbooks](../../effects/particle-emitters.md#flipbooks)
@@ -424,7 +424,7 @@ Use third-party modeling tools like Blender to create meshes, then import them i
@@ -466,15 +466,15 @@ Use third-party modeling tools like Blender to create meshes, then import them i
-Related docs
+Related Docs
- [Assemblies](../../physics/assemblies.md)
-- [Network ownership](../../physics/network-ownership.md)
-- [Mechanical constraints](../../physics/mechanical-constraints.md)
-- [Mover constraints](../../physics/mover-constraints.md)
-- [Roblox units](../../physics/units.md)
+- [Network Ownership](../../physics/network-ownership.md)
+- [Mechanical Constraints](../../physics/mechanical-constraints.md)
+- [Mover Constraints](../../physics/mover-constraints.md)
+- [Roblox Units](../../physics/units.md)
@@ -487,7 +487,7 @@ Use third-party modeling tools like Blender to create meshes, then import them i
**Animation** is the process of creating motion for your characters, objects, and environments using internal rigs that you can pose between keyframes. Designing models with rigging and skinning data is important because it allows you to create engaging, dynamic, and expressive objects that bend and flex naturally.
-Studio animation
+Studio Animation
Use the Animation Editor directly in Studio to create animations for models or meshes with rigging and skinning data.
@@ -498,11 +498,11 @@ Use the Animation Editor directly in Studio to create animations for models or m
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Create character animations
+ Creating Character Animations
@@ -514,18 +514,18 @@ Use the Animation Editor directly in Studio to create animations for models or m
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Play character animations
+ Playing Character Animations
-Blender animation
+Blender Animation
Use third-party modeling tools like Blender to create meshes with rigging and skinning data, then import them into Studio using the 3D Importer.
@@ -536,15 +536,15 @@ Use third-party modeling tools like Blender to create meshes with rigging and sk
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Rig and skin a simple mesh
+ Rigging and Skinning a Simple Mesh
@@ -556,15 +556,15 @@ Use third-party modeling tools like Blender to create meshes with rigging and sk
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Rig and skin a humanoid model
+ Rigging and Skinning a Humanoid Model
@@ -634,11 +634,11 @@ Use third-party modeling tools like Blender to create meshes with rigging and sk
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Properties and attributes
+ Properties and Attributes
@@ -666,11 +666,11 @@ Use third-party modeling tools like Blender to create meshes with rigging and sk
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Save data
+ Saving Data
@@ -680,20 +680,20 @@ Use third-party modeling tools like Blender to create meshes with rigging and sk
-Related docs
+Related Docs
-- [Reuse code](../../scripting/module.md)
-- [Schedule code](../../scripting/scheduler.md)
-- [Luau reference](../../luau/index.md)
+- [Reusing Code](../../scripting/module.md)
+- [Scheduling Code](../../scripting/scheduler.md)
+- [Luau Reference](../../luau/index.md)
-Camera and input
+Camera and Input
**Camera** is the object that determines what the player is able to see in the 3D space, and **input** is the method or device in which players access and interact with your experience, such as a mobile device or gamepad. Designing gameplay around your camera configuration and which input types players can use to access your experience is important because your design decisions directly impact accessibility, user experience, and how players can engage with objects.
@@ -706,11 +706,11 @@ Use third-party modeling tools like Blender to create meshes with rigging and sk
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Create a first-person camera
+ Creating a First-Person Camera
@@ -722,11 +722,11 @@ Use third-party modeling tools like Blender to create meshes with rigging and sk
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Create a side-scrolling camera
+ Creating a Side-Scrolling Camera
@@ -738,11 +738,11 @@ Use third-party modeling tools like Blender to create meshes with rigging and sk
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Create an isometric camera
+ Creating an Isometric Camera
@@ -754,11 +754,11 @@ Use third-party modeling tools like Blender to create meshes with rigging and sk
style={{position: "relative", paddingBottom: "56.25%", height: 0}}>
- Detect user input
+ Detecting User Input
@@ -767,14 +767,14 @@ Use third-party modeling tools like Blender to create meshes with rigging and sk
-Related docs
+Related Docs
-- [Customize the camera](../../workspace/camera.md)
-- [Mouse and keyboard input](../../input/mouse-and-keyboard.md)
-- [Mobile input](../../input/mobile.md)
-- [Gamepad input](../../input/gamepad.md)
+- [Customizing the Camera](../../workspace/camera.md)
+- [Mouse and Keyboard Input](../../input/mouse-and-keyboard.md)
+- [Mobile Input](../../input/mobile.md)
+- [Gamepad Input](../../input/gamepad.md)
diff --git a/content/en-us/tutorials/use-case-tutorials/vfx/basic-particle-effects.md b/content/en-us/tutorials/use-case-tutorials/vfx/basic-particle-effects.md
index 8711a42a2..6259332cd 100644
--- a/content/en-us/tutorials/use-case-tutorials/vfx/basic-particle-effects.md
+++ b/content/en-us/tutorials/use-case-tutorials/vfx/basic-particle-effects.md
@@ -1,5 +1,5 @@
---
-title: Basic particle effects
+title: Basic Particle Effects
description: The process of creating particles to elevate the visual effects in your experience.
---
@@ -11,7 +11,7 @@ In this tutorial, you will use a `Class.ParticleEmitter` object to create a spar
-## Particle emitters
+## Particle Emitters
The `Class.ParticleEmitter` is a special type of object that will **emit** particles from its position when parented to a part or `Class.Attachment`.
@@ -37,7 +37,7 @@ The example provided below is a model of a gold nugget. A simple particle effect
The pre-made `Class.Fire` and `Class.Smoke` objects can be a convenient way to save time on creating effects, but they are far less customizable than ParticleEmitters.
-## Particle emission
+## Particle Emission
Particles are generated randomly throughout the entire volume of a part. They emerge from one **face** of the part according to the **EmissionDirection** property. It defaults to **Top**, meaning the top surface of a part. If you rotate the part, the direction the particles are emitted from will change accordingly.
@@ -51,7 +51,7 @@ If you resize the part to be bigger, the particles will be emitted over a wider
-## Particle properties
+## Particle Properties
### Color
@@ -105,7 +105,7 @@ SpreadAngle has an **X** and a **Y** value which determine the range of angles t
-### Additional properties
+### Additional Properties
To further improve the sparkle effect, try the following property values.
diff --git a/content/en-us/tutorials/use-case-tutorials/vfx/create-volcanoes.md b/content/en-us/tutorials/use-case-tutorials/vfx/creating-volcanoes.md
similarity index 99%
rename from content/en-us/tutorials/use-case-tutorials/vfx/create-volcanoes.md
rename to content/en-us/tutorials/use-case-tutorials/vfx/creating-volcanoes.md
index b18d620f7..4300d2510 100644
--- a/content/en-us/tutorials/use-case-tutorials/vfx/create-volcanoes.md
+++ b/content/en-us/tutorials/use-case-tutorials/vfx/creating-volcanoes.md
@@ -1,5 +1,5 @@
---
-title: Create volcanic eruptions with VFX
+title: Creating Volcanic Eruptions with VFX
description: The process of creating volcanoes to elevate your visual and gameplay requirements.
---
@@ -28,7 +28,7 @@ You can create your own textures in third-party texture creation tools and follo
-## Break down reference
+## Break Down Reference
To create credible volcanoes, it's important to reference real-world volcanic eruptions in the design process because it allows you to break down the subject matter into individual components with distinct visual and behavioral characteristics. For example, the sample [Volcano Island - Complete](https://www.roblox.com/games/17374256579/Volcano-Island-Complete) experience references the volcanic eruption in Iceland to inform all texture and VFX design decisions relating to the caldera and its surrounding terrain.
@@ -53,7 +53,7 @@ It's useful to break down a volcano that's erupting into individual components s
The following sections provide an in-depth analysis of the different design decisions and techniques you can use to recreate each of these components. As you review these decisions and experiment with various lighting, `Class.ParticleEmitter`, and `Class.Beam` properties, you will learn how to utilize lighting and VFX to solve the unique environmental requirements for your own experiences.
-## Configure lighting
+## Configure Lighting
To make an environmental element a point of interest within your experience, it's important to increase its contrast against the overall environment so that it stands out as something that players should explore. For example, to draw players into the caldera, you can configure your lighting sources so that the volcano's lava appears to glow as the only light source within an otherwise dark environment.
@@ -75,7 +75,7 @@ This section of the tutorial teaches you how to utilize both types of lighting s
-### Local lighting
+### Local Lighting
Local lighting is the luminescence from local [light sources](../../../effects/light-sources.md) in your experience, such as `Class.SpotLight`, `Class.SurfaceLight`, and `Class.PointLight` objects. Local lighting is important to add to your volcano because while you can apply brightness to your `Class.ParticleEmitter` and `Class.Beam` textures, they cannot fill the canyon with enough light alone to realistically simulate how the caldera and its flowing lava would illuminate the environment in the real world.
@@ -179,11 +179,11 @@ To recreate the global lighting in the sample [Volcano Island - Complete](https:
-## Configure volcano
+## Configure Volcano
Now that your local and global lighting configuration is complete, it's time to configure all of the VFX objects relating to the actual volcano and its surrounding terrain. As you follow these instructions that exactly recreate the final environment within the sample [Volcano Island](https://www.roblox.com/games/17374256579/Volcano-Island-Complete) `.rbxl` file, observe how each step works together to add character, movement, and illuminance to the environment.
-### Surface ripples
+### Surface Ripples
**Surface ripples** are the small lava waves that flow across the surface of the caldera as a result of internal magma and pressurized gasses moving upward from beneath the earth's crust. This visual phenomenon conveys the real-world physical process of convection, or the movement within a fluid when hotter fluid rises to the surface, and it adds to the realism of your scene.
@@ -352,7 +352,7 @@ To recreate the glowing embers from the surface of the caldera in the sample [Vo
-### Lava splashes
+### Lava Splashes
**Lava splashes** are bursts of thin molten rock that erupt upward from the volcano as a result of internal magma and pressurized gasses applying enough force to break the surface tension of the lava on top of the caldera. This core component of a volcano is one of the most common signs in determining that a volcano is no longer dormant and is actively erupting.
@@ -480,7 +480,7 @@ To recreate the splashing lava from the surface of the caldera in the sample [Vo
Features with custom textures such as flipbooks cost memory to render. If you use many flipbooks with other features that use high memory, then clients automatically deactivate flipbooks when they are low on memory, which is likely for older mobile phones. To reduce the memory usage of flipbooks, use fewer unique animated particle effects or choose a texture of smaller resolution.
-### Lava flow
+### Lava Flow
A **lava flow** is a mass of lava that erupts and oozes away from the caldera and across the earth's surface during a volcanic eruption. As the lava cools due to its exposure to air, it solidifies and transforms into solid rock, creating new land mass.
@@ -609,7 +609,7 @@ To recreate the flowing magma from the caldera in the sample [Volcano Island - C
-### Smoke plume
+### Smoke Plume
A **smoke plume** from the caldera emits warm pressurized gas, steam, and volcanic ash into the atmosphere. This mixture of volcanic emission can be seen for miles in the real world, so volcano designs often incorporate large smoke plumes to be a significant point of interest in the 3D space.
diff --git a/content/en-us/tutorials/use-case-tutorials/vfx/create-waterfalls.md b/content/en-us/tutorials/use-case-tutorials/vfx/creating-waterfalls.md
similarity index 99%
rename from content/en-us/tutorials/use-case-tutorials/vfx/create-waterfalls.md
rename to content/en-us/tutorials/use-case-tutorials/vfx/creating-waterfalls.md
index 544e27a50..faa378af0 100644
--- a/content/en-us/tutorials/use-case-tutorials/vfx/create-waterfalls.md
+++ b/content/en-us/tutorials/use-case-tutorials/vfx/creating-waterfalls.md
@@ -1,5 +1,5 @@
---
-title: Create waterfalls with VFX
+title: Creating Waterfalls with VFX
description: The process of creating waterfalls to elevate your visual and gameplay requirements.
---
@@ -20,7 +20,7 @@ You can create your own textures in third-party texture creation tools and follo
-## Break down reference
+## Break Down Reference
To create credible waterfalls, it's important to reference real-world natural features in the design process because it allows you to break down the subject matter into individual components with distinct visual and behavioral characteristics. For example, the sample [Waterfall Island](https://www.roblox.com/games/16454663889/Use-Case-Tutorials-Volcano-Island) experience references Snoqualmie Falls in Washington state to inform all texture and VFX design decisions relating to the waterfall and its surrounding terrain.
@@ -45,7 +45,7 @@ While a waterfall is a continuous and connected stream of water that involves mu
The following sections provide an in-depth analysis of the different design decisions and techniques you can use to recreate each of these waterfall components that make up the main drop in the sample's 3D space. As you review these decisions and experiment with various `Class.Beam` and `Class.ParticleEmitter` properties, you will learn how to utilize VFX to solve the unique environmental requirements for your own experiences.
-## Configure cascades
+## Configure Cascades
A **cascade** is the falling water that descends over the edge of cliffs or bluffs into underlying plunge pools. Cascades fall at different rates depending on both their volume of water and the scale of their drop into the plunge pool. For example, the sample's main drop appears to fall more slowly because there is a large volume of water falling over a large distance, but the sample's second drop appears to fall more quickly because a smaller volume of water is falling over a short distance.
@@ -217,7 +217,7 @@ To recreate the cascades for the main drop in the sample [Waterfall Island](http
-## Configure splashes
+## Configure Splashes
When cascades impact the density of the underlying plunge pool, the water propels upward from the impact point to create **splashes**. As this aerosolized water propels upward, it expands and breaks apart from itself to produce droplets that scatter in various directions.
@@ -306,7 +306,7 @@ To recreate the splashes at the base of the main drop in the sample [Waterfall I
-## Configure white water
+## Configure White Water
**White water** arises as the water source becomes more turbulent as it gains velocity when approaching its descent and colliding with objects in its path. This results in aerated, webby water that appears white due to more air bubbles in the water source.
@@ -397,7 +397,7 @@ To recreate the white water where the outflow collides with the cliff's boulders
-## Configure foam
+## Configure Foam
Unlike splashes that propel upward as cascades impact the plunge pool, **foam** is aerated water that ripples outward from the base of the impact point. Similar to splashes, foam expands and breaks apart from itself into web-like droplets as it becomes aerosolized.
@@ -452,7 +452,7 @@ To recreate the foam at the base of the main drop in the sample [Waterfall Islan
-## Configure mist
+## Configure Mist
As cascades make impact with the plunge pool, some of the water evaporates and condenses in the cool, humid air to create **mist**. Mist vapors don't catch lighting in the same way that hard surfaces do; instead, they reflect light in often unexpected ways to appear bright within the overall environment until they completely evaporate.
diff --git a/content/en-us/tutorials/use-case-tutorials/vfx/custom-particle-effects.md b/content/en-us/tutorials/use-case-tutorials/vfx/custom-particle-effects.md
index 3c8c29586..e538160e1 100644
--- a/content/en-us/tutorials/use-case-tutorials/vfx/custom-particle-effects.md
+++ b/content/en-us/tutorials/use-case-tutorials/vfx/custom-particle-effects.md
@@ -1,5 +1,5 @@
---
-title: Custom particle effects
+title: Custom Particle Effects
description: The process for creating a multicolor plume of smoke from an active volcano.
---
@@ -9,7 +9,7 @@ Time to look at a more complex example of particle effects. You'll make a multic
-## Starter project
+## Starter Project
First up, you'll need something like a volcano you can use for the effect. The [Treasure Island example world](https://www.roblox.com/games/6307505882/Treasure-Island) pictured in this tutorial includes a volcano.
@@ -28,7 +28,7 @@ A volcano with an orange neon part will be used to emit particles. This part is
-## Particle texture
+## Particle Texture
A `Class.ParticleEmitter` has a property called **Texture** that determines the image that will be repeated in the effect. If you want to use your own image, you'll need to upload it to Roblox and get the **Asset ID** to paste into that property. See [Textures and Decals](../../../parts/textures-decals.md) for more details.
@@ -48,7 +48,7 @@ For a smoke effect, a circle with faded edges works well. A pre-made example of

-## Fading effect
+## Fading Effect
Despite the change of texture, the volcano effect still doesn't look much like smoke. It would look better if the particles faded out over time in the same way that smoke dissipates in the air.
@@ -72,7 +72,7 @@ Some emitter properties can be set up to change over time with a **sequence**. S
-## Growing smoke
+## Growing Smoke
To really look like smoke, the particles should be large enough to overlap with each other and should spread as they rise from the source.
@@ -89,7 +89,7 @@ This can be achieved by applying a sequence to the **Size** property. By making

-## Color sequences
+## Color Sequences
Sequences aren't just for linear property values - you can even use them to change the color of particles over time.
@@ -122,7 +122,7 @@ The **Acceleration** property determines how the speed of particles changes over
Understanding how these properties can work together is the key to achieving many effects — for instance, you could simulate water drops falling from a surface to the ground by setting **Speed** to **0** and **Y** acceleration to a negative value.
-## Thicker smoke
+## Thicker Smoke
If the acceleration change has spread the smoke particles out too much, you can increase the **Rate** property to thicken it back up again. A rate of **40** works nicely here. Set the emitter's **Rate** property to **40.**
diff --git a/content/en-us/tutorials/use-case-tutorials/vfx/laser-traps-with-beams.md b/content/en-us/tutorials/use-case-tutorials/vfx/laser-traps-with-beams.md
index f6a4ab57d..07d7724dd 100644
--- a/content/en-us/tutorials/use-case-tutorials/vfx/laser-traps-with-beams.md
+++ b/content/en-us/tutorials/use-case-tutorials/vfx/laser-traps-with-beams.md
@@ -1,5 +1,5 @@
---
-title: Create laser beams with VFX
+title: Creating Laser Beams
description: A tutorial on creating a laser beam that sets an avatar's health to 0 on impact.
---
@@ -18,7 +18,7 @@ You can create your own assets in third-party modeling tools and follow along wi
-## Get blaster asset
+## Get Blaster Asset
The **Creator Store** is a tab of the Toolbox that you can use to find all assets that are made by Roblox and the Roblox community for use within your projects, including model, image, mesh, audio, plugin, video, and font assets. You can use the Creator Store to add an individual asset or asset library directly into an open experience.
@@ -45,7 +45,7 @@ To get this blaster asset from your inventory into your experience:
4. Click the **Laser Beam Blaster** tile. The model displays in your viewport.
-## Set up a collision box
+## Setup a Collision Box
The complete laser beam that sets players health to zero on impact needs to be able to detect when players collide with the laser. Because `Class.Beam` objects don't have default collision detection capabilities, you must set up collision detection with basic parts.
@@ -69,7 +69,7 @@ To set up the collision box:
-## Configure attachments
+## Configure Attachments
Before you add a `Class.Beam` object to your blaster, it's important to configure two `Class.Attachment` objects in the 3D space to represent the reach of the laser's emission from the blaster's emitter bulb. Beams operate by rendering a texture between attachments, so if you don't have attachments for the beam to reference, it cannot function at all.
@@ -99,7 +99,7 @@ To configure attachments for the laser beam:
-## Customize the beam
+## Customize the Beam
Now that you have `Class.Attachment` objects in the 3D space, you can add and customize a `Class.Beam` object to emulate the visual characteristics of a laser beam. This tutorial provides guidance on how to create a futuristic, bright pink beam that animates quickly, but by experimenting with the same properties, you can create a variety of different special effects.
@@ -132,7 +132,7 @@ To customize the beam:
For more information on all beam properties you can customize, see [Beams](../../../effects/beams.md).
-## Script damage behavior
+## Script Damage Behavior
Your laser beam is currently aesthetically pleasing for its environment, but it's also completely harmless as a blaster weapon. To modify the laser blaster so that it can deal damage to players, you must add in a script to the collision box that triggers this behavior.
diff --git a/content/en-us/tutorials/use-case-tutorials/vfx/use-particles-for-explosions.md b/content/en-us/tutorials/use-case-tutorials/vfx/using-particles-for-explosions.md
similarity index 97%
rename from content/en-us/tutorials/use-case-tutorials/vfx/use-particles-for-explosions.md
rename to content/en-us/tutorials/use-case-tutorials/vfx/using-particles-for-explosions.md
index b5ae296f5..3101fb207 100644
--- a/content/en-us/tutorials/use-case-tutorials/vfx/use-particles-for-explosions.md
+++ b/content/en-us/tutorials/use-case-tutorials/vfx/using-particles-for-explosions.md
@@ -1,5 +1,5 @@
---
-title: Create explosions with VFX
+title: Using Particles for Explosions
description: The process for creating a trap that emits a burst of particles when it kills a player.
---
@@ -9,7 +9,7 @@ Previously, you worked with particles that played continuously, like [smoke from
-## Emitter setup
+## Emitter Setup
The explosion will use a ParticleEmitter with some changed properties that will create a burst.
@@ -61,7 +61,7 @@ The explosion will use a ParticleEmitter with some changed properties that will

-## Test particle bursts
+## Testing Particle Bursts
To test the particle burst, you can use a Studio plugin developed by Roblox.
@@ -83,7 +83,7 @@ To test the particle burst, you can use a Studio plugin developed by Roblox.
-## Color and transparency
+## Color and Transparency
Some extra steps can make the explosion look more impressive.
@@ -99,7 +99,7 @@ Some extra steps can make the explosion look more impressive.

-## Script setup
+## Script Setup
With the emitter complete, the explosion can now be played through a script. The script works by checking for players touching the trap. Whenever it detects someone, the particles will emit and the player will die.
@@ -136,7 +136,7 @@ With the emitter complete, the explosion can now be played through a script. The
trapObject.Touched:Connect(killPlayer)
```
-## Play the explosion
+## Play the Explosion
In scripts, particles are emitted using the `Class.ParticleEmitter:Emit()|Emit()` function. This creates a one-time burst of a number of particles.
diff --git a/content/en-us/ui/2D-paths.md b/content/en-us/ui/2D-paths.md
index 4072e3e45..3371a6367 100644
--- a/content/en-us/ui/2D-paths.md
+++ b/content/en-us/ui/2D-paths.md
@@ -1,5 +1,5 @@
---
-title: 2D paths
+title: 2D Paths
description: The Path2D instance, along with its API methods and properties, lets you implement 2D splines and 2D curved lines.
---
@@ -7,7 +7,7 @@ The `Class.Path2D` instance, along with its API methods and properties, lets you
-## Create a 2D path
+## Creating a 2D Path
To add a `Class.Path2D` to the screen or an in-experience object:
@@ -19,21 +19,21 @@ To add a `Class.Path2D` to the screen or an in-experience object:
-3. Begin clicking on the screen to add a series of **control points** to form a path. The initial path will likely be imprecise but you can [fine‑tune](#move-points) the position of any control point later.
+3. Begin clicking on the screen to add a series of **control points** to form a path. The initial path will likely be imprecise but you can [fine‑tune](#moving-points) the position of any control point later.
- If you drag the mouse after clicking, [tangents](#control-point-tangents) will be created on that point. Tangents can also be procedurally [added](#add-tangents) to any control point.
+ If you drag the mouse after clicking, [tangents](#control-point-tangents) will be created on that point. Tangents can also be procedurally [added](#adding-tangents) to any control point.
4. When finished, click the widget's **Done** button or press Enter.
-## Modify control points
+## Modifying Control Points
With a `Class.Path2D` selected in the [Explorer](../studio/explorer.md) hierarchy, you can modify its individual control points as well as their [tangents](#control-point-tangents).
-### Move points
+### Moving Points
To move an individual control point on a path, enable the **Select** tool (V) and then click‑and‑drag it to a new position.
@@ -49,7 +49,7 @@ Note that a point's position is not absolute, but rather **relative** to the pat
-### Add points
+### Adding Points
New control points can be added to a `Class.Path2D` either between two existing points or from either end point using the **Add Point** tool (P).
@@ -70,19 +70,19 @@ New control points can be added to a `Class.Path2D` either between two existing
Remember that if you drag the mouse after clicking to add a new control point, [tangents](#control-point-tangents) will be created on that point.
-### Delete points
+### Deleting Points
To delete a control point, hover over and right‑click it, then select **Delete Point** from the contextual popup menu.
-### Control point tangents
+### Control Point Tangents
Control point **tangents** let you create and adjust curves on a path.
-#### Add tangents
+#### Adding Tangents
To add tangents to any control point that doesn't already have tangents:
@@ -90,11 +90,11 @@ To add tangents to any control point that doesn't already have tangents:
-2. Hover over the desired control point, then click to add two [mirrored](#break-and-mirror) tangents (optionally drag after clicking to [adjust](#adjust-tangents) the new tangents).
+2. Hover over the desired control point, then click to add two [mirrored](#breaking-and-mirroring) tangents (optionally drag after clicking to [adjust](#adjusting-tangents) the new tangents).
-#### Adjust tangents
+#### Adjusting Tangents
To adjust existing tangents for an individual control point:
@@ -113,9 +113,9 @@ In the [Properties](../studio/properties.md) window, expand the `Class.Path2D.Se
-2. Set the position for `Datatype.Path2DControlPoint.LeftTangent|LeftTangent` and/or `Datatype.Path2DControlPoint.RightTangent|RightTangent`. Note that this will [break the mirrored behavior](#break-and-mirror) of the tangents.
+2. Set the position for `Datatype.Path2DControlPoint.LeftTangent|LeftTangent` and/or `Datatype.Path2DControlPoint.RightTangent|RightTangent`. Note that this will [break the mirrored behavior](#breaking-and-mirroring) of the tangents.
-#### Delete tangents
+#### Deleting Tangents
To delete both tangents from a control point, hover over and right-click that point, then select **Clear Tangents** from the contextual popup menu.
@@ -125,9 +125,9 @@ To delete just one of the tangents (left or right), hover over and right‑click
-#### Break and mirror
+#### Breaking and Mirroring
-By default, tangents mirror each other. When you [drag to adjust](#adjust-tangents) one tangent marker, the paired tangent point will move in unison.
+By default, tangents mirror each other. When you [drag to adjust](#adjusting-tangents) one tangent marker, the paired tangent point will move in unison.
@@ -139,7 +139,7 @@ To "break" the tangents so that each can be moved independently of the other, ho
To re-establish mirror behavior, hover over and right‑click the associated control point, then select **Mirror Tangents** from the contextual menu. Note that you will **not** see an immediate change in the path after re‑establishing mirror behavior, as the system cannot predict which tangent point you want to begin mirroring. Mirror behavior will resume only once you [drag to adjust](#adjusting-tangents) one of the tangent markers.
-## Path visual properties
+## Path Visual Properties
You can customize the visual appearance of a `Class.Path2D` with the following properties:
@@ -181,11 +181,11 @@ You can customize the visual appearance of a `Class.Path2D` with the following p
- ZIndex layering
+ ZIndex Layering
-## Path scripting
+## Path Scripting
Scripting is useful for several path-related workflows. The following examples use methods such as `Class.Path2D:GetControlPoints()|GetControlPoints()` which returns a table of `Datatype.Path2DControlPoint|Path2DControlPoints` and `Class.Path2D:GetPositionOnCurveArcLength()|GetPositionOnCurveArcLength()` which returns the `Datatype.UDim2` position at a given `t` value along the spline.
diff --git a/content/en-us/ui/3D-drag-detectors.md b/content/en-us/ui/3D-drag-detectors.md
index f46372452..92ef75530 100644
--- a/content/en-us/ui/3D-drag-detectors.md
+++ b/content/en-us/ui/3D-drag-detectors.md
@@ -1,15 +1,15 @@
---
-title: 3D drag detectors
+title: 3D Drag Detectors
description: 3D drag detectors facilitate and encourage interaction with 3D objects in an experience, such as opening doors and drawers, sliding a part around, and much more.
---
The `Class.DragDetector` instance facilitates and encourages interaction with 3D objects in an experience, such as opening doors and drawers, sliding a part around, grabbing and tossing a bowling ball, pulling back and firing a slingshot, and much more. Key features include:
-- Place a `Class.DragDetector` under any `Class.BasePart` or `Class.Model` to [make it draggable](#make-objects-draggable) via all inputs (mouse, touch, gamepad, and VR), all without a single line of code.
+- Place a `Class.DragDetector` under any `Class.BasePart` or `Class.Model` to [make it draggable](#making-objects-draggable) via all inputs (mouse, touch, gamepad, and VR), all without a single line of code.
- Choose from several [drag styles](#drag-style), define how the object [responds to motion](#response-to-motion), and optionally apply [axis or movement limits](#axis--movement-limits).
-- Scripts can [respond to manipulation of dragged objects](#script-responses-to-clicking-and-dragging) to drive UI or make logical decisions, such as adjusting the light level in a room based on a sliding wall switch dimmer.
+- Scripts can [respond to manipulation of dragged objects](#scripting-responses-to-clicking-and-dragging) to drive UI or make logical decisions, such as adjusting the light level in a room based on a sliding wall switch dimmer.
- Players can manipulate anchored parts or models and they'll stay exactly where you put them upon release.
@@ -17,7 +17,7 @@ The `Class.DragDetector` instance facilitates and encourages interaction with 3D
-## Make objects draggable
+## Making Objects Draggable
To make any part or model draggable, simply add a `Class.DragDetector` as a direct descendant.
@@ -32,9 +32,9 @@ To make any part or model draggable, simply add a `Class.DragDetector` as a dire
Remember that `Class.DragDetector|DragDetectors` only work in Studio if you're **not** using the **Select**, **Move**, **Scale**, or **Rotate** tools.
-## Customize drag detectors
+## Customizing Drag Detectors
-### Drag style
+### Drag Style
`Class.DragDetector|DragDetectors` map cursor motion to virtual lines and planes to calculate proposed 3D motion. Through the `Class.DragDetector.DragStyle|DragStyle` property, you can choose from different mappings to suit your needs. For example, **TranslatePlane** produces translation in a virtual plane, whereas **RotateAxis** produces rotation about a virtual axis.
@@ -85,7 +85,7 @@ Remember that `Class.DragDetector|DragDetectors` only work in Studio if you're *
-### Drag direction
+### Drag Direction
By default, 3D motion and the associated `Class.DragDetector.DragStyle|DragStyle` map to world space. However, you may want to change the `Class.DragDetector.ReferenceInstance|ReferenceInstance`, `Class.DragDetector.Orientation|Orientation`, or `Class.DragDetector.Axis|Axis`, for example when building drag detectors into [models with adjustable parts](#anchored-models-with-adjustable-parts).
@@ -116,7 +116,7 @@ By default, 3D motion and the associated `Class.DragDetector.DragStyle|DragStyle
-### Response to motion
+### Response to Motion
The `Class.DragDetector.ResponseStyle|ResponseStyle` property specifies how an object responds to the proposed motion, depending on whether the object is `Class.BasePart.Anchored|Anchored` or not.
@@ -124,8 +124,8 @@ The `Class.DragDetector.ResponseStyle|ResponseStyle` property specifies how an o
Setting
-
Anchored behavior
-
Unanchored behavior
+
Anchored Behavior
+
Unanchored Behavior
@@ -141,7 +141,7 @@ The `Class.DragDetector.ResponseStyle|ResponseStyle` property specifies how an o
`Enum.DragDetectorResponseStyle.Custom|Custom`
-
The object will not move at all, but `Class.DragDetector.DragFrame|DragFrame` will still be updated and you can [respond to drag manipulation](#script-responses-to-clicking-and-dragging) however you'd like.
+
The object will not move at all, but `Class.DragDetector.DragFrame|DragFrame` will still be updated and you can [respond to drag manipulation](#scripting-responses-to-clicking-and-dragging) however you'd like.
(same as anchored)
@@ -151,7 +151,7 @@ The `Class.DragDetector.ResponseStyle|ResponseStyle` property specifies how an o
Remember that `Class.DragDetector|DragDetectors` only work in Studio if you're **not** using the **Select**, **Move**, **Scale**, or **Rotate** tools.
-### Axis & movement limits
+### Axis & Movement Limits
By default, there are no limits to 3D motion beyond the inherent restrictions of the `Class.DragDetector.DragStyle|DragStyle`. If necessary, you can apply minimum and maximum limits to both translation and rotation. Note, however, that these are **not** constraints; they merely impede the drag detector's attempts to generate motion in order to remain within limits.
@@ -183,7 +183,7 @@ By default, there are no limits to 3D motion beyond the inherent restrictions of
When using axis/movement limits, you should always set the detector's `Class.DragDetector.ReferenceInstance|ReferenceInstance` so that the limits are relative to a dedicated reference frame. If you fail to establish the reference frame, each drag of the object will reset its limits to its own current world space position/orientation.
-### Drag permissions
+### Drag Permission
Permission of players to interact with a given drag detector instance can be specified by the `Class.DragDetector.PermissionPolicy|PermissionPolicy` property. This is set to `Enum.DragDetectorPermissionPolicy.Everybody` by default, and it can also be changed to support scripted permission controls as shown in the code sample.
@@ -225,7 +225,7 @@ dragDetector:SetPermissionPolicyFunction(function(player, part)
end)
```
-### Physics response
+### Physics Response
Assuming a dragger's [response style](#response-to-motion) is set to **Physical** and it is applied to an unanchored object, that object will be moved by constraint forces that attempt to bring it to the position/orientation given by the proposed motion. You can further customize the physical response through the following properties:
@@ -261,7 +261,7 @@ Assuming a dragger's [response style](#response-to-motion) is set to **Physical*
-### Modifier input
+### Modifier Input
Some `Class.DragDetector.DragStyle|DragStyle` modes allow users to hold down a **modifier** key/button to manipulate the dragged object in different ways. By default, the modifier is `Enum.KeyCode|LeftControl` on PC, `Enum.KeyCode|ButtonR1` on gamepad, or `Enum.KeyCode|ButtonL2` on VR. You can customize these modifiers through the `Class.DragDetector.KeyboardModeSwitchKeyCode|KeyboardModeSwitchKeyCode`, `Class.DragDetector.GamepadModeSwitchKeyCode|GamepadModeSwitchKeyCode`, or `Class.DragDetector.VRSwitchKeyCode|VRSwitchKeyCode` properties of the drag detector instance.
@@ -271,11 +271,11 @@ When the `Class.DragDetector.RunLocally|RunLocally` property is false (default),
When the `Class.DragDetector.RunLocally|RunLocally` property is true, no events are replicated to the server. All custom event signals and registered functions must be in client `Class.LocalScript|LocalScripts` and you must use [remote events](../scripting/events/remote.md) to propagate necessary changes to the server.
-## Script responses to clicking and dragging
+## Scripting Responses to Clicking and Dragging
Through [event signals](#event-signals), property changes, `Enum.DragDetectorDragStyle.Scriptable|Scriptable` drag style, and custom functions, scripts can respond to the manipulation of dragged objects to drive UI or make logical decisions, such as adjusting the light level in a room based on a sliding wall switch dimmer.
-### Event signals
+### Event Signals
Through the following event signals, you can detect when a user starts, continues, and ends dragging an object.
@@ -322,7 +322,7 @@ dragDetector.DragEnd:Connect(function()
end)
```
-### Drag frame changes
+### Drag Frame Changes
In addition to [event signals](#event-signals), you can monitor changes to the detector's `Class.DragDetector.DragFrame|DragFrame` directly.
@@ -335,7 +335,7 @@ dragDetector:GetPropertyChangedSignal("DragFrame"):Connect(function()
end)
```
-### Scripted drag style
+### Scripted Drag Style
If you set a detector's `Class.DragDetector.DragStyle|DragStyle` to **Scriptable**, you can provide your own function that takes in a `Datatype.Ray` and returns a world space `Datatype.CFrame`. The detector will move the motion so that the dragged object goes to that custom location/orientation.
@@ -376,7 +376,7 @@ end
dragDetector:SetDragStyleFunction(followTheCursor)
```
-### Custom constraint function
+### Custom Constraint Function
Drag detectors do not have built-in motion rules about grids and snapping, but you can register custom constraint functions to edit the detector's `Class.DragDetector.DragFrame|DragFrame` before it is applied. For example, you can keep motion on a grid by rounding positions to multiples of the grid increment, or simulate a chess game with rules of motion legal to each piece.
@@ -414,15 +414,15 @@ local connection = dragDetector:AddConstraintFunction(2, snapToWorldGrid)
-- When applicable, remove the constraint function by invoking connection:Disconnect()
```
-## Example usage
+## Example Usage
-### Unanchored physical objects
+### Unanchored Physical Objects
A basic implementation of drag detectors is a tower balance game where players must carefully remove pieces and attempt to keep the tower upright. In the following tower structure, each piece has a child `Class.DragDetector` with a default `Class.DragDetector.DragStyle|DragStyle` of **TranslatePlane** so that players can pull the pieces outward but not upward or downward.
-### Anchored models with adjustable parts
+### Anchored Models With Adjustable Parts
You can easily create and share models which are primarily anchored, but which have one or more child parts/models that players can drag. For example, the following desk has two drawers which players can open to inspect what's inside.
@@ -432,13 +432,13 @@ You can easily create and share models which are primarily anchored, but which h
When making children of models draggable, you should set the drag detector's `Class.DragDetector.ReferenceInstance|ReferenceInstance` to an object within the model that can serve as a dedicated reference frame, for example the desk's top surface. This establishes a consistent reference `Datatype.CFrame` for the style/direction of dragging, even if the model is rotated.
-### Drag detectors and constraints
+### Drag Detectors and Constraints
You can combine drag detectors with `Class.Constraint|Constraints`, for example a marionette puppet. In the following setup, the control handles are anchored, the body parts are unanchored, and constraints hold the marionette together. Moving the handles with the **TranslateViewPlane** `Class.DragDetector.DragStyle|DragStyle` makes the marionette dance, and the individual body parts may also be moved with drag detectors, all while the model retains its integrity.
-### 3D user interfaces
+### 3D User Interfaces
3D user interfaces are easily achievable through drag detectors, such as adjusting the brightness of a `Class.SpotLight` based on a sliding switch dimmer. You can also detect the **X** and **Z** axes individually to control two different aspects of a 3D user interface, such as the `Class.ParticleEmitter.Size|Size`, `Class.ParticleEmitter.Speed|Speed`, and `Class.ParticleEmitter.Color|Color` of a `Class.ParticleEmitter`.
diff --git a/content/en-us/ui/9-slice.md b/content/en-us/ui/9-slice.md
index d6bd56950..399302f3d 100644
--- a/content/en-us/ui/9-slice.md
+++ b/content/en-us/ui/9-slice.md
@@ -1,5 +1,5 @@
---
-title: UI 9-slice design
+title: UI 9-Slice Design
description: UI 9-slice design lets you create UI elements of varying sizes without distorting the borders or corners.
---
@@ -24,7 +24,7 @@ internally divided into nine sub-images, each with different scaling rules.
-
Sub-image
+
Sub-Image
Scaling
@@ -48,11 +48,11 @@ internally divided into nine sub-images, each with different scaling rules.
-## Studio editor
+## Studio Editor
Slice configuration is possible by directly setting the `Enum.ScaleType` and slice properties on an image label or button, but Studio's built-in **9-Slice Editor** is more intuitive.
-### Opening the editor
+### Opening the Editor
To open the visual **9-Slice Editor** in Studio:
@@ -72,7 +72,7 @@ To open the visual **9-Slice Editor** in Studio:
-### Set offsets
+### Setting Offsets
In Studio, drag the red lines to set the **offsets** from the left, right, top,
and bottom edges of the image.
diff --git a/content/en-us/ui/animation.md b/content/en-us/ui/animation.md
index 27a8ff3f8..3c63a6759 100644
--- a/content/en-us/ui/animation.md
+++ b/content/en-us/ui/animation.md
@@ -1,5 +1,5 @@
---
-title: UI animation/tweens
+title: UI Animation/Tweens
description: Explains how to animate GuiObjects using the process of tweening.
---
@@ -9,7 +9,7 @@ In animation, **tweening** is the process of generating intermediate frames betw
- Sliding UI menus in and out from the screen edges.
- Gradually animating a health bar between two widths when a user receives a health boost.
-## Single-property tweens
+## Single-Property Tweens
### Position
@@ -248,7 +248,7 @@ Multiple properties control UI borders, depending on the object type.
-
UI object
+
UI Object
Properties
@@ -315,7 +315,7 @@ local tween = TweenService:Create(stroke, tweenInfo, {Color = targetColor, Thick
tween:Play()
```
-## Multi-property tweens
+## Multi-Property Tweens
You can combine any of the [single-property tweens](#single-property-tweens) into more complex tweens by passing multiple target properties to `Class.TweenService:Create()`, for example **position + rotation** or **size + transparency**.
@@ -360,7 +360,7 @@ local tween = TweenService:Create(object, tweenInfo, {Size = targetSize, ImageTr
tween:Play()
```
-## Tween sequences
+## Tween Sequences
You can chain UI animations to occur one after another by playing subsequent tweens upon the previous tween's `Class.TweenBase.Completed|Completed` event. For example, the following script moves an object to the center of the screen, then rotates it by 45°.
@@ -390,7 +390,7 @@ positionTween.Completed:Connect(function()
end)
```
-## Easing options
+## Easing Options
Using the easing options of `Datatype.TweenInfo`, you can control the easing **style** and **direction** of UI animations.
@@ -497,16 +497,16 @@ local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})
-```lua title='Easing direction - InOut' highlight='1'
+```lua title='Easing Direction - InOut' highlight='1'
local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic, Enum.EasingDirection.InOut)
local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})
```
-## Animate text
+## Animating Text
You can easily enhance text-based UI, such as cutscene banners, player instructions, and prompts, with animated effects.
-### Typewriter effect
+### Typewriter Effect
The "typewriter" effect is ideal for `Class.TextLabel|TextLabels` that tell a story, output NPC conversations, etc.
diff --git a/content/en-us/ui/appearance-modifiers.md b/content/en-us/ui/appearance-modifiers.md
index 2d5c7dabe..3ba63a5b1 100644
--- a/content/en-us/ui/appearance-modifiers.md
+++ b/content/en-us/ui/appearance-modifiers.md
@@ -1,5 +1,5 @@
---
-title: UI appearance modifiers
+title: UI Appearance Modifiers
description: Explains how to use appearance modifiers to customize basic user interface objects.
---
@@ -30,7 +30,7 @@ You can configure the gradient by:
- Choosing the gradient's starting point (inside or outside the parent's bounds) through the `Class.UIGradient.Offset|Offset` property.
- Choosing the gradient's angle through the `Class.UIGradient.Rotation|Rotation` property.
-### Color sequence
+### Color Sequence
To set a gradient's color sequence:
@@ -81,7 +81,7 @@ To adjust a gradient's transparency across its range:
- Delete a keypoint by selecting it and clicking the **Delete** button.
- Reset the sequence by clicking the **Reset** button.
-### Offset and rotation
+### Offset and Rotation
The `Class.UIGradient.Offset|Offset` and `Class.UIGradient.Rotation|Rotation` properties let you adjust the gradient's control points and its angle. As illustrated in the following diagrams, `Class.UIGradient.Offset|Offset` is based on a **percentage** of the parent's width or height, and both positive or negative values are valid.
@@ -126,7 +126,7 @@ The `Class.UIStroke` instance applies an outline to text or a border. Key featur
- Three [corner styles](#corner-style) (round, bevel, or miter).
- Stroke [gradient](#color--gradient) support through the `Class.UIGradient` instance.
-### Text outline / border
+### Text Outline / Border
Depending on its parent, `Class.UIStroke` operates as either a **text outline** or as a **border**. When you parent `Class.UIStroke` to a text object, it applies to the text's outline; when you parent `Class.UIStroke` to other `Class.GuiObject|GuiObjects`, it applies to the border.
@@ -173,7 +173,7 @@ You can set the stroke width through the `Class.UIStroke.Thickness|Thickness` pr
Avoid [tweening](../ui/animation.md) the `Class.UIStroke.Thickness|Thickness` property of a `Class.UIStroke` instance applied to **text** objects. This renders and stores many glyph sizes each frame, potentially causing performance issues or text flickering.
-### Color / gradient
+### Color / Gradient
You can set the stroke color through the `Class.UIStroke.Color|Color` property, as well as insert a child `Class.UIGradient` instance to create gradient strokes.
@@ -207,7 +207,7 @@ The `Class.UIStroke.Transparency|Transparency` property sets the stroke transpar
-### Corner style
+### Corner Style
The `Class.UIStroke.LineJoinMode|LineJoinMode` property lets you control how corners are interpreted. It accepts a value of either **Round**, **Bevel**, or **Miter**.
diff --git a/content/en-us/ui/buttons.md b/content/en-us/ui/buttons.md
index 31c52c64a..c5615f602 100644
--- a/content/en-us/ui/buttons.md
+++ b/content/en-us/ui/buttons.md
@@ -1,9 +1,9 @@
---
-title: Text & image buttons
+title: Text & Image Buttons
description: Buttons allow users to prompt an action.
---
-**Buttons** are `Class.GuiObject|GuiObjects` that allow users to perform an action. You can customize buttons to provide context and feedback, such as changing the visual appearance or [scripting](#script-buttons) audible feedback when a user clicks a button.
+**Buttons** are `Class.GuiObject|GuiObjects` that allow users to perform an action. You can customize buttons to provide context and feedback, such as changing the visual appearance or [scripting](#scripting-buttons) audible feedback when a user clicks a button.
There are two types of buttons which you can place [on‑screen](../ui/on-screen-containers.md) or [in‑experience](../ui/in-experience-containers.md):
@@ -13,7 +13,7 @@ There are two types of buttons which you can place [on‑screen](../ui/on-screen
-## Create buttons on the screen
+## Creating Buttons on the Screen
Buttons on a screen are useful to quickly guide users to various menus or pages.
@@ -33,7 +33,7 @@ To add a button to the screen:
-## Create buttons on part faces
+## Creating Buttons on Part Faces
Buttons on a part are useful for allowing users to interact with parts. For
example, you can let users step on a button to complete an action.
@@ -57,10 +57,10 @@ To add a button to the face of a part:
width="800" />
- If you don't see the button, try [choosing a different face](../parts/textures-decals.md#choose-a-face) in the Face property of the SurfaceGui.
+ If you don't see the button, try [choosing a different face](../parts/textures-decals.md#choosing-a-face) in the Face property of the SurfaceGui.
-## Change the appearance of an ImageButton
+## Changing the Appearance of an ImageButton
Changing the appearance of an `Class.ImageButton` when a user is interacting with it provides useful visual feedback. For example, when an `Class.ImageButton` changes visual appearance when a user hovers over it, it lets the user know that it isn't disabled and that they have the option to click it if they want to perform that `Class.ImageButton` action.
@@ -89,13 +89,13 @@ An `Class.ImageButton` has three properties to change its visual appearance:
To change the appearance of an `Class.ImageButton` with user input:
-1. Add an **ImageButton** to a [screen](#create-buttons-on-the-screen) or a [surface](#create-buttons-on-the-screen).
+1. Add an **ImageButton** to a [screen](#creating-buttons-on-the-screen) or a [surface](#creating-buttons-on-the-screen).
2. In the **Explorer** window, click the **ImageButton** object.
3. In the **Properties** window, assign three different respective asset IDs for the **Image**, **HoverImage**, and **PressedImage** properties.
-## Script buttons
+## Scripting Buttons
You can script an action when a user presses a button by connecting the button to a `Class.GuiButton.Activated` event. For example, when you parent the following `Class.LocalScript` to a button, the button changes to a random color every time a user clicks it.
diff --git a/content/en-us/ui/frames.md b/content/en-us/ui/frames.md
index 1c6eeac75..5381cef3e 100644
--- a/content/en-us/ui/frames.md
+++ b/content/en-us/ui/frames.md
@@ -9,7 +9,7 @@ Frames are `Class.GuiObject|GuiObjects` that act as containers for other `Class.
When you manipulate frames, you also manipulate the `Class.GuiObject|GuiObjects` they contain. For example, if you change the position of a `Class.Frame` object with a child `Class.TextLabel`, you also change the position of that label. In addition, all frames are also `Class.GuiObject|GuiObjects`, so you can customize their properties, such as `Class.GuiObject.BackgroundColor3|BackgroundColor3`, `Class.GuiObject.BorderMode|BorderMode`, `Class.GuiObject.Transparency|Transparency`, and `Class.GuiObject.Rotation|Rotation`, to fit the aesthetics of your experience.
-## Frame types
+## Frame Types
There are three primary frame types, each serving a specific purpose in UI design.
@@ -35,7 +35,7 @@ The `Class.ScrollingFrame.CanvasSize|CanvasSize` property determines how large o
The `Class.ScrollingFrame.CanvasPosition|CanvasPosition` property determines your default position within the canvas in pixels, and it sets the scroll bar position accordingly. Note that this property doesn't do anything when the scroll bar isn't visible.
-
Scroll bar
+
Scroll Bar
The **scroll bar** displays your position within the content of the `Class.ScrollingFrame` that isn't visible. There are two types of scroll bars: a vertical scroll bar and a horizontal scroll bar. A vertical scroll bar allows you to scroll up and down, while a horizontal scroll bar allows you to scroll left and right.
diff --git a/content/en-us/ui/grid-table-layouts.md b/content/en-us/ui/grid-table-layouts.md
index bd4d4c91b..85b7e1881 100644
--- a/content/en-us/ui/grid-table-layouts.md
+++ b/content/en-us/ui/grid-table-layouts.md
@@ -1,5 +1,5 @@
---
-title: Grid and table layouts
+title: Grid and Table Layouts
description: How to use grid and table layouts for highly structured user interfaces.
---
@@ -16,7 +16,7 @@ In comparison to `Class.UIListLayout`, `Class.UIGridLayout` and `Class.UITableLa
-## Grid layout
+## Grid Layout
`Class.UIGridLayout` positions sibling `Class.GuiObject|GuiObjects` in a grid of uniform cells of the same size within their parent container. Cells are added by row or column based on the layout's `Class.UIGridLayout.FillDirection|FillDirection` until the next cell doesn't fit, then a new row or column begins. For further control, you can use the `Class.UIGridLayout.FillDirectionMaxCells|FillDirectionMaxCells` property to set the maximum number of cells per row or column.
@@ -39,7 +39,7 @@ Once you insert a `Class.UIGridLayout`, it either overrides or influences the `C
`Class.UIGridLayout` respects any [constraints](../ui/size-modifiers.md) you place on objects within the grid. For example, if an object has a `Class.UISizeConstraint` with a `Class.UISizeConstraint.MinSize|MinSize` property that is higher than the grid's `Class.UIGridLayout.CellSize|CellSize` property, the object will span multiple cells.
-## Table layout
+## Table Layout
`Class.UITableLayout` positions sibling `Class.GuiObject|GuiObjects` and their children into table format. The default `Class.UITableLayout.FillDirection|FillDirection` of `Enum.FillDirection|Vertical` means that siblings are first positioned into rows, and children of those siblings are positioned horizontally to form columns, such that each cell within a row has the same height and each cell within a column has the same width.
diff --git a/content/en-us/ui/in-experience-containers.md b/content/en-us/ui/in-experience-containers.md
index 60b6b1d73..bdf26f745 100644
--- a/content/en-us/ui/in-experience-containers.md
+++ b/content/en-us/ui/in-experience-containers.md
@@ -1,5 +1,5 @@
---
-title: In-experience UI containers
+title: In-Experience UI Containers
description: In-experience UI containers hold SurfaceGuis, BillboardGuis, and GuiObjects that you want to display in the 3D space.
---
@@ -16,6 +16,8 @@ Similar to `Class.Decal|Decals` and `Class.Texture|Textures`, UI objects such as
+### Creating and Parenting
+
To apply a `Class.SurfaceGui` to an in-experience `Class.BasePart`, simply parent it to that part and set the `Class.SurfaceGui.Face` property. Child UI objects then appear on that face of the parent part.
@@ -46,17 +48,21 @@ Interactive UI elements like `Class.ImageButton|ImageButtons` and `Class.TextBut
To assist in choosing the correct face for a `Class.SurfaceGui`, right-click the target part and select **Show Orientation Indicator**. This displays a blue circle with an **F** and a line attached to the object's `Enum.NormalId.Front|Front` face, and a green arrow that points in the direction of the object's `Enum.NormalId.Top|Top` face.
-### Size and position
+### Sizing and Positioning
-The "canvas" of a `Class.SurfaceGui` occupies the entire `Class.SurfaceGui.Face|Face` of the parent or `Class.SurfaceGui.Adornee|Adornee` part. As a best practice, it's recommended that you use **scale** values for the [size](../ui/position-and-size.md#size) and [position](../ui/position-and-size.md#position) of child UI objects like `Class.ImageLabel|ImageLabels`. You can also apply a `Class.UIAspectRatioConstraint` to children of the `Class.SurfaceGui` to maintain their desired aspect ratio regardless of the face's size.
+The "canvas" of a `Class.SurfaceGui` occupies the entire `Class.SurfaceGui.Face|Face` of the parent or `Class.SurfaceGui.Adornee|Adornee` part. As a best practice, it's recommended that you use **scale** values for the [size](../ui/positioning-and-sizing.md#size) and [position](../ui/positioning-and-sizing.md#position) of child UI objects like `Class.ImageLabel|ImageLabels`. You can also apply a `Class.UIAspectRatioConstraint` to children of the `Class.SurfaceGui` to maintain their desired aspect ratio regardless of the face's size.
-### Occlusion mode
+### Container Properties
+
+The following properties let you customize how a `Class.SurfaceGui` is occluded, how light influences its appearance, and how far into the distance players can see its content.
+
+#### Occlusion
The `Class.SurfaceGui.AlwaysOnTop|AlwaysOnTop` property determines whether the `Class.SurfaceGui` will render over top of 3D content or be occluded by it. When set to `false` (default), the `Class.SurfaceGui` renders like other 3D content and is occluded by other 3D objects. When set to `true`, it always renders over top of 3D content and it is not influenced by [brightness/light](#brightness-and-light-influence) in the 3D environment.
-### Brightness and light influence
+#### Brightness and Light Influence
`Class.SurfaceGui.Brightness|Brightness` and `Class.SurfaceGui.LightInfluence|LightInfluence` work in conjunction to determine how environmental light affects the UI content of the `Class.SurfaceGui`.
@@ -77,13 +83,13 @@ The `Class.SurfaceGui.AlwaysOnTop|AlwaysOnTop` property determines whether the `
Note that `Class.SurfaceGui.Brightness|Brightness` is inaccessible in Studio and has no effect when either `Class.SurfaceGui.LightInfluence|LightInfluence` is `1` or `Class.SurfaceGui.AlwaysOnTop|AlwaysOnTop` is `true`.
-### Distance visibility
+#### Distance Visibility
`Class.SurfaceGui.MaxDistance|MaxDistance` controls how far from the camera the `Class.SurfaceGui` will be displayed before it stops rendering. A value of `0` means there is no limit and it will render infinitely far away. The default value of `1000` works fine for most cases.
For `Class.SurfaceGui|SurfaceGuis` that appear outdoors, it's recommended that `Class.SurfaceGui.MaxDistance|MaxDistance` is high enough to ensure that the container's UI is sufficiently small on the screen when it appears or disappears, minimizing the sudden pop‑in/out effect.
-### Display order
+#### Display Order
If multiple `Class.SurfaceGui` containers exist on the same face, you can layer them by Z‑index through their `Class.SurfaceGui.ZOffset|ZOffset` property (changing this does not visually "lift" or "sink" the container from the surface).
@@ -93,7 +99,9 @@ The `Class.BillboardGui` container displays UI objects in the 3D space but, unli
-To link a `Class.BillboardGui` to an in-experience `Class.BasePart` or `Class.Attachment`, simply parent it to that part or attachment and, if desired, adjust its [size/position](#size-and-position-1).
+### Creating and Parenting
+
+To link a `Class.BillboardGui` to an in-experience `Class.BasePart` or `Class.Attachment`, simply parent it to that part or attachment and, if desired, adjust its [size/position](#sizing-and-positioning-1).
@@ -110,9 +118,9 @@ Alternatively, you can place the `Class.BillboardGui` inside a container like `C
Interactive UI elements like `Class.ImageButton|ImageButtons` and `Class.TextButton|TextButtons` inside a `Class.BillboardGui` will only receive user input if they are parented to the player's `Class.PlayerGui`, typically via placing the `Class.BillboardGui` inside `Class.StarterGui` as noted above.
-### Size and position
+### Sizing and Positioning
-For billboard sizing, the [scale](../ui/position-and-size.md#size) components of the `Class.BillboardGui.Size|Size` property set the billboard's stud size in 3D space. For example, a setting of `{10, 0},{2, 0}`(`Datatype.UDim2.fromScale(10, 2)`) forms a billboard with a 10:2 aspect ratio that scales larger or smaller depending on its distance from the camera.
+For billboard sizing, the [scale](../ui/positioning-and-sizing.md#size) components of the `Class.BillboardGui.Size|Size` property set the billboard's stud size in 3D space. For example, a setting of `{10, 0},{2, 0}`(`Datatype.UDim2.fromScale(10, 2)`) forms a billboard with a 10:2 aspect ratio that scales larger or smaller depending on its distance from the camera.
For positioning, the `Class.BillboardGui.StudsOffset|StudsOffset` property shifts the billboard canvas on the **X** axis (left/right), **Y** axis (up/down), and **Z** axis (forward/back) relative to the camera.
@@ -122,11 +130,15 @@ For positioning, the `Class.BillboardGui.StudsOffset|StudsOffset` property shift
When creating a size-scaled `Class.BillboardGui` that contains a `Class.TextLabel`, it's useful to enable the label's `Class.TextLabel.TextScaled|TextScaled` property so that its text scales along with the billboard canvas as the camera distance changes.
-### Occlusion mode
+### Container Properties
+
+The following properties let you customize how a `Class.BillboardGui` is occluded, how light influences its appearance, and how far into the distance players can see its content.
+
+#### Occlusion
The `Class.BillboardGui.AlwaysOnTop|AlwaysOnTop` property determines whether the `Class.BillboardGui` will render over top of 3D content or be occluded by it. When set to `false` (default), the `Class.BillboardGui` renders like other 3D content and is occluded by other 3D objects. When set to `true`, it always renders over top of 3D content and it is not influenced by [brightness/light](#brightness-and-light-influence-1) in the 3D environment.
-### Brightness and light influence
+#### Brightness and Light Influence
`Class.BillboardGui.Brightness|Brightness` and `Class.BillboardGui.LightInfluence|LightInfluence` work in conjunction to determine how environmental light affects the UI content of the `Class.BillboardGui`.
@@ -147,6 +159,6 @@ The `Class.BillboardGui.AlwaysOnTop|AlwaysOnTop` property determines whether the
Note that `Class.BillboardGui.Brightness|Brightness` is inaccessible in Studio and has no effect when either `Class.BillboardGui.LightInfluence|LightInfluence` is `1` or `Class.BillboardGui.AlwaysOnTop|AlwaysOnTop` is `true`.
-### Distance visibility
+#### Distance Visibility
`Class.BillboardGui.MaxDistance|MaxDistance` controls how far from the camera the `Class.BillboardGui` will be displayed before it stops rendering. A value of `0` or `inf` (default) means there is no limit and it will render infinitely far away.
diff --git a/content/en-us/ui/index.md b/content/en-us/ui/index.md
index 2100d5f6b..c60943581 100644
--- a/content/en-us/ui/index.md
+++ b/content/en-us/ui/index.md
@@ -1,23 +1,23 @@
---
-title: User interface
+title: User Interface
description: Explore the wide variety of user interface elements that players can interact with.
---
You can quickly create high-quality graphical user interfaces with minimal scripting requirements using built-in [UI objects](#ui-objects). Depending on where you create it, UI renders either [on-screen](#on-screen-ui) or [within an experience's 3D world](#in-experience-ui).
-## On-screen UI
+## On-Screen UI
[On-screen containers](../ui/on-screen-containers.md) hold UI objects that you want to display on a user's screen. All on-screen UI objects and code are stored and changed on the client.
-## In-experience UI
+## In-Experience UI
[In-experience containers](../ui/in-experience-containers.md) such as `Class.SurfaceGui|SurfaceGuis` and `Class.BillboardGui|BillboardGuis` hold UI objects that you want to display within your experience's 3D world.
-## UI objects
+## UI Objects
Most UI elements are `Class.GuiObject|GuiObjects`, 2D graphical user interface objects that you can parent to containers. The four most common are [frames](../ui/frames.md), [labels](../ui/labels.md), [buttons](../ui/buttons.md), and [text input](../ui/text-input.md) objects.
@@ -52,7 +52,7 @@ Most UI elements are `Class.GuiObject|GuiObjects`, 2D graphical user interface o
Using the `Class.GuiObject.Position|Position`, `Class.GuiObject.Size|Size`, `Class.GuiObject.AnchorPoint|AnchorPoint`, and `Class.GuiObject.ZIndex|ZIndex` properties, you have complete control on how to [position](../ui/positioning-and-sizing.md#position), [size](../ui/positioning-and-sizing.md#size), and [layer](../ui/positioning-and-sizing.md#zindex) `Class.GuiObject|GuiObjects`. You can also use [tweening](../ui/animation.md) to transition a `Class.GuiObject` smoothly from one state to another and provide dynamic visual feedback.
-## Layout and design
+## Layout and Design
Beyond basic properties for adjusting position and size, Roblox also provides layout structures like [list/flex](../ui/list-flex-layouts.md) and [grid](../ui/grid-table-layouts.md), as well as [size modifiers](../ui/size-modifiers.md) and [appearance modifiers](../ui/appearance-modifiers.md).
@@ -72,24 +72,24 @@ Beyond basic properties for adjusting position and size, Roblox also provides la
-## Interactive frameworks
+## Interactive Frameworks
In addition to the core [user interface objects](#ui-objects), the following frameworks provide built‑in and customizable interactivity for your experiences.
-### Proximity prompts
+### Proximity Prompts
-[Proximity prompts](../ui/proximity-prompts.md) are unique built-in UI objects which prompt user interaction to trigger an action when they approach in-experience objects such as doors, light switches, and buttons.
+[Proximity Prompts](../ui/proximity-prompts.md) are unique built-in UI objects which prompt user interaction to trigger an action when they approach in-experience objects such as doors, light switches, and buttons.
-### UI drag detectors
+### UI Drag Detectors
-[UI drag detectors](../ui/ui-drag-detectors.md) facilitate and encourage interaction with 2D user interface elements such as sliders, spinners, and more.
+[UI Drag Detectors](../ui/ui-drag-detectors.md) facilitate and encourage interaction with 2D user interface elements such as sliders, spinners, and more.
-### 3D drag detectors
+### 3D Drag Detectors
-[3D drag detectors](../ui/3D-drag-detectors.md) encourage physical interaction with 3D objects in an experience, such as opening doors and drawers, sliding a part around, grabbing and tossing a bowling ball, pulling back and firing a slingshot, and much more.
+[3D Drag Detectors](../ui/3D-drag-detectors.md) encourage physical interaction with 3D objects in an experience, such as opening doors and drawers, sliding a part around, grabbing and tossing a bowling ball, pulling back and firing a slingshot, and much more.
diff --git a/content/en-us/ui/labels.md b/content/en-us/ui/labels.md
index 54a1a0bc4..0d12bf52d 100644
--- a/content/en-us/ui/labels.md
+++ b/content/en-us/ui/labels.md
@@ -1,5 +1,5 @@
---
-title: Text & image labels
+title: Text & Image Labels
description: Explore how labels display customizable text and images in user interfaces.
---
@@ -13,7 +13,7 @@ import TextFiltering from '../includes/text-filtering/text-filtering.md'
-## Create labels on the screen
+## Creating Labels on the Screen
Labels on a screen are useful for things like displaying images of characters
with dialog.
@@ -34,7 +34,7 @@ To add a label to a screen:
-## Create labels on part faces
+## Creating Labels on Part Faces
Labels on a part are useful for things like creating billboards, posters, and
wallpaper.
@@ -56,12 +56,12 @@ To add a label to the face of a part:
- If you don't see the button, try [choosing a different face](../parts/textures-decals.md#choose-a-face) in the Face property of the SurfaceGui.
+ If you don't see the button, try [choosing a different face](../parts/textures-decals.md#choosing-a-face) in the Face property of the SurfaceGui.
-## Adjust ImageLabel properties
+## Adjusting ImageLabel Properties
-All images within an `Class.ImageLabel` must be assets that have been [imported](../projects/assets/manager.md#import-assets) to Studio. While the image automatically scales to fit the area of the rectangle, the image looks best when it displays at its native resolution.
+All images within an `Class.ImageLabel` must be assets that have been [imported](../projects/assets/manager.md#importing-assets) to Studio. While the image automatically scales to fit the area of the rectangle, the image looks best when it displays at its native resolution.
You can customize the visual appearance of an image with the following
properties:
@@ -74,6 +74,6 @@ properties:
For example, to display only the image and hide the rectangle, set the `Class.GuiObject.BackgroundTransparency|BackgroundTransparency` property to `1`.
-## Text filtering
+## Text Filtering
diff --git a/content/en-us/ui/list-flex-layouts.md b/content/en-us/ui/list-flex-layouts.md
index 015000773..261193595 100644
--- a/content/en-us/ui/list-flex-layouts.md
+++ b/content/en-us/ui/list-flex-layouts.md
@@ -1,5 +1,5 @@
---
-title: List and flex layouts
+title: List and Flex Layouts
description: How to use list layouts and flex settings for highly responsive user interfaces.
---
@@ -11,7 +11,7 @@ The `Class.UIListLayout` positions sibling `Class.GuiObject|GuiObjects` into hor
Once you insert a `Class.UIListLayout`, it either overrides or influences the `Class.GuiObject.Position|Position`, `Class.GuiObject.Rotation|Rotation`, and/or `Class.GuiObject.Size|Size` of all sibling UI objects, so changes to those properties within the [Properties](../studio/properties.md) window or within a script will not have the normal effect.
-## Fill direction
+## Fill Direction
The `Class.UIListLayout.FillDirection|FillDirection` property determines the direction in which the list layout's siblings will render.
@@ -49,7 +49,7 @@ The `Class.UIListLayout.Padding|Padding` property determines the amount of empty
This property does not apply padding **around** the list's overall bounds; see `Class.UIPadding` to apply top, bottom, left, and/or right padding to the contents of the parent.
-## Flex layouts
+## Flex Layouts
Integrating **flex** into a `Class.UIListLayout` is a powerful way to [equally fill/distribute](#equal-fill-or-distribution) or [align/stretch](#item-line-alignment) list items across their line, or [flex specific items](#flexing-individual-items) across a variable space.
@@ -59,7 +59,7 @@ While flex is a powerful tool, you should not apply it to a `Class.UIListLayout`
Additionally, a [grid layout](../ui/grid-table-layouts.md#grid-layout) may be preferable when items should strictly align to a grid in both the **X** and **Y** directions, since grid layouts enforce a consistent cell size while flex layouts may use a variable number of items per line.
-### Equal fill or distribution
+### Equal Fill or Distribution
When the list layout's [fill direction](#fill-direction) is set to `Enum.FillDirection|Horizontal`, the `Class.UIListLayout.HorizontalFlex|HorizontalFlex` property specifies how to distribute extra horizontal space in the parent container. Similarly, when the fill direction is set to `Enum.FillDirection|Vertical`, the `Class.UIListLayout.VerticalFlex|VerticalFlex` property specifies how to distribute extra vertical space.
@@ -91,7 +91,7 @@ One practical use of `Class.UIListLayout.HorizontalFlex|HorizontalFlex` is a **t
-### Item line alignment
+### Item Line Alignment
The `Class.UIListLayout.ItemLineAlignment|ItemLineAlignment` property defines the **cross‑directional** alignment of siblings within a line, letting you align objects of different widths/heights or make objects of lesser width/height fill their entire line.
@@ -114,7 +114,7 @@ One practical use case for `Class.UIListLayout.ItemLineAlignment|ItemLineAlignme
-### Flex individual items
+### Flexing Individual Items
While flexing an entire layout is a powerful utility, certain layouts are more suited to **individual item flexing**. In such layouts, some elements in the list maintain their core size while other items flex to fill variable spaces. One practical usage is a slider bar widget with uniform [labels](../ui/labels.md) on both ends and a flexible slider bar that fills the entire width between.
diff --git a/content/en-us/ui/on-screen-containers.md b/content/en-us/ui/on-screen-containers.md
index 54aef5e86..e2e29715c 100644
--- a/content/en-us/ui/on-screen-containers.md
+++ b/content/en-us/ui/on-screen-containers.md
@@ -1,5 +1,5 @@
---
-title: On-screen UI containers
+title: On-Screen UI Containers
description: Learn how to display UI objects on a user's screen.
---
@@ -14,6 +14,8 @@ For UI containers that hold `Class.GuiObject|GuiObjects` that you want to displa
+## Creating and Parenting
+
To display a `Class.ScreenGui` and its child `Class.GuiObject|GuiObjects` to every player who joins the experience, place it inside the `Class.StarterGui` container. When a player joins an experience and their character first spawns, the `Class.ScreenGui` and its contents clone into the `Class.PlayerGui` container for that player, located within the `Class.Players` container.
@@ -26,21 +28,23 @@ By default, `Class.GuiObject|GuiObjects` inside a `Class.ScreenGui` within `Clas
If `Class.Players.CharacterAutoLoads` is disabled, the contents of `Class.StarterGui` will not be cloned until `Class.Player:LoadCharacter()` is called.
+## Managing Screen Containers
+
As an experience grows in scope, you may require multiple screen interfaces such as a title screen, settings menu, shop interface, and more. In such cases, you can place multiple unique `Class.ScreenGui` containers inside `Class.StarterGui` and toggle each container's `Class.ScreenGui.Enabled|Enabled` property depending on whether it should be visible and active (while `false`, contents will not render, process user input, or update in response to changes).
-The `Class.ScreenGui.Enabled|Enabled` property can be initially toggled through the [Properties](../studio/properties.md) window and/or you can set it during playtime from a client‑side script by [accessing](#access-player-ui) the player's `Class.PlayerGui` and setting it to `true` or `false` for the desired container(s).
+The `Class.ScreenGui.Enabled|Enabled` property can be initially toggled through the [Properties](../studio/properties.md) window and/or you can set it during playtime from a client‑side script by [accessing](#accessing-player-ui) the player's `Class.PlayerGui` and setting it to `true` or `false` for the desired container(s).
When using multiple `Class.ScreenGui` interfaces, you can layer them by Z‑index through their `Class.ScreenGui.DisplayOrder|DisplayOrder` property. See [Display Order](#display-order) for more information.
-## Container properties
+## Container Properties
The following properties let you customize the [screen insets](#screen-insets) across multiple devices, the [display order](#display-order) when using multiple screen containers, and more.
-### Screen insets
+### Screen Insets
Modern phones take advantage of the entire screen but typically include notches, cutouts, and other elements that occupy screen space. Every Roblox experience also includes the **top bar controls** for quick access to the main menu, [chat](../chat/in-experience-text-chat.md), [leaderboard](../players/leaderboards.md), and more.
@@ -71,11 +75,11 @@ No insets are added to the fullscreen area. This mode may result in UI that is o
-### Display order
+### Display Order
When using multiple `Class.ScreenGui` interfaces, you can layer them by Z‑index through their `Class.ScreenGui.DisplayOrder|DisplayOrder` property. For example, to display a modal settings menu on one `Class.ScreenGui` in front of the experience's main user interface on another `Class.ScreenGui`, assign a higher `Class.ScreenGui.DisplayOrder|DisplayOrder` to the modal's than the underlying interface's.
-### Reset on spawn
+### Reset on Spawn
The `Class.ScreenGui.ResetOnSpawn|ResetOnSpawn` boolean property determines if the `Class.ScreenGui` resets (deletes itself and re‑clones into the player's `Class.PlayerGui`) every time the player's character respawns.
@@ -102,9 +106,9 @@ The `Class.ScreenGui.ResetOnSpawn|ResetOnSpawn` boolean property determines if t
-## Access player UI
+## Accessing Player UI
-As noted, parenting a `Class.ScreenGui` to `Class.StarterGui` clones it and its child `Class.GuiObject|GuiObjects` into a player's `Class.PlayerGui` container when they join the experience and their character first spawns.
+As noted, [parenting](#creating-and-parenting) a `Class.ScreenGui` to `Class.StarterGui` clones it and its child `Class.GuiObject|GuiObjects` into a player's `Class.PlayerGui` container when they join the experience and their character first spawns.
If you need to control a player's UI container during playtime, for example to show/hide a specific `Class.ScreenGui` or any of its children, access it as follows from a `Class.LocalScript`:
@@ -121,6 +125,6 @@ titleScreen.Enabled = false -- Hide title screen
settingsMenu.Enabled = true -- Show settings menu
```
-## Disable default UI
+## Disabling Default UI
diff --git a/content/en-us/ui/page-layouts.md b/content/en-us/ui/page-layouts.md
index 8605222a6..0790a5691 100644
--- a/content/en-us/ui/page-layouts.md
+++ b/content/en-us/ui/page-layouts.md
@@ -1,5 +1,5 @@
---
-title: Page layouts
+title: Page Layouts
description: Explore how page layouts organize interface content into distinct pages.
---
diff --git a/content/en-us/ui/position-and-size.md b/content/en-us/ui/positioning-and-sizing.md
similarity index 98%
rename from content/en-us/ui/position-and-size.md
rename to content/en-us/ui/positioning-and-sizing.md
index 1d1bdebde..7a3dc2b7b 100644
--- a/content/en-us/ui/position-and-size.md
+++ b/content/en-us/ui/positioning-and-sizing.md
@@ -1,11 +1,11 @@
---
-title: Position and size UI objects
+title: Positioning and Sizing UI Objects
description: Explains the process of positioning, sizing, and ordering UI objects on a player's screen.
---
Unless UI objects are under control of a [layout structure](#layout-structures) or a [size modifier/constraint](../ui/size-modifiers.md), you have complete control over their [position](#position) and [size](#size). You can also set the Z‑index [layering](#zindex) order in which objects overlap.
-## Core properties
+## Core Properties
All `Class.GuiObject|GuiObjects` share a core set of properties to [position](#position), [size](#size), [anchor](#anchorpoint), and [layer](#zindex) them within an on‑screen or in‑experience container.
@@ -88,7 +88,7 @@ To edit an object's `Class.GuiObject.ZIndex|ZIndex`, locate **ZIndex** in the [P
-## Layout structures
+## Layout Structures
Layout structures let you quickly organize and display `Class.GuiObject|GuiObjects`, for example into a horizontal or vertical [list](../ui/list-flex-layouts.md), a [grid](../ui/grid-table-layouts.md#grid-layout) of equally‑sized tiles, a [page sequence](../ui/page-layouts.md), and more. Layouts typically override or influence the [position](#position)/[size](#size) of objects under their control.
@@ -119,11 +119,11 @@ Layout structures let you quickly organize and display `Class.GuiObject|GuiObjec
-## Cross-platform factors
+## Cross-Platform Factors
Roblox is inherently **cross-platform**, as players can discover and join experiences on a PC or console, then later pick up their phone and continue where they left off. You should design your Roblox experiences to be accessible and enjoyable on **all** platforms that you choose to support, instead of optimizing for one platform and neglecting others.
-### Reserved zones
+### Reserved Zones
On mobile devices, the default controls occupy a portion of the bottom-left and bottom-right corners of the screen. When you design an experience's UI, avoid placing important info or virtual buttons in these zones.
@@ -133,7 +133,7 @@ On mobile devices, the default controls occupy a portion of the bottom-left and
If your experience uses the default control setting of `Enum.DevTouchMovementMode|DevTouchMovementMode.UserChoice`, players on mobile devices will be able to choose their input from **Dynamic Thumbstick**, **Classic Thumbstick**, or **Tap to Move**, causing the on-screen controls and reserved zones to vary slightly. Remember to design your UI around this possibility.
-### Thumb zones
+### Thumb Zones
Most mobile players use two thumbs — one on the virtual thumbstick and one on the jump button. Depending on the physical size of the device and the player's hands, reaching too far from the bottom corners becomes uncomfortable or impossible, so you should avoid placing frequently‑used buttons outside of easy‑to‑reach zones.
@@ -201,7 +201,7 @@ else
end
```
-### Context-based UI
+### Context-Based UI
Screen space is limited on mobile devices, so you should show only the most vital information during active gameplay. For example, if your experience includes a special input action to open doors and treasure chests, it doesn't make sense to constantly show an "open" button on the screen. Instead, use a [proximity prompt](../ui/proximity-prompts.md) or similar method to accept input only when the character approaches a door or chest.
diff --git a/content/en-us/ui/proximity-prompts.md b/content/en-us/ui/proximity-prompts.md
index 5de84689c..c2147df3e 100644
--- a/content/en-us/ui/proximity-prompts.md
+++ b/content/en-us/ui/proximity-prompts.md
@@ -1,5 +1,5 @@
---
-title: Proximity prompts
+title: Proximity Prompts
description: Proximity Prompts allow users to trigger actions when they approach objects in the 3D space.
---
@@ -17,7 +17,7 @@ objects such as doors, light switches, and buttons. Using this object, you can:
See the [Dungeon Delve](https://www.roblox.com/games/6074153281/Dungeon-Delve) sample place for the fully working proximity prompt examples shown in the video above.
-## Create proximity prompts
+## Creating Proximity Prompts
You must parent proximity prompts to the part, model, or attachment that you want a user to interact with. To add a proximity prompt to a `Class.BasePart`, `Class.Model`, or `Class.Attachment` object:
@@ -26,7 +26,7 @@ You must parent proximity prompts to the part, model, or attachment that you wan
-## Customize proximity prompts
+## Customizing Proximity Prompts
You can customize a proximity prompt based on how you want it to [appear](#appearance), when you want it to be [visible](#visibility), and what you want a user to do to [trigger the action](#interactivity).
@@ -103,7 +103,7 @@ You can customize how a user interacts with a proximity prompt through its `Clas
The `Class.ProximityPrompt.HoldDuration|HoldDuration` property determines how many seconds a user has to press a key before the proximity prompt's action triggers. If this property has a value of `0`, the proximity prompt's action triggers immediately.
-
+
#### ClickablePrompt
@@ -113,7 +113,7 @@ The `Class.ProximityPrompt.ClickablePrompt|ClickablePrompt` property specifies i
Note that if a user is using a phone or a tablet, they can always interact with the proximity prompt by directly clicking the proximity prompt regardless of the `Class.ProximityPrompt.ClickablePrompt|ClickablePrompt` property's value.
-## Script proximity prompts
+## Scripting Proximity Prompts
You can connect to proximity prompt events either on the `Class.ProximityPrompt` object itself or globally through `Class.ProximityPromptService`. The `Class.ProximityPromptService` allows you to manage all proximity prompt behavior from one location, preventing any need for duplicate code in your experience.
diff --git a/content/en-us/ui/rich-text.md b/content/en-us/ui/rich-text.md
index 5627c286e..8733a79a6 100644
--- a/content/en-us/ui/rich-text.md
+++ b/content/en-us/ui/rich-text.md
@@ -1,5 +1,5 @@
---
-title: Rich text markup
+title: Rich Text Markup
description: Rich Text Markup are simple markup tags to style sections of a string.
comments: |
1. Replace numbered footnotes with dedicated style.
@@ -7,7 +7,7 @@ comments: |
UI **rich text** utilizes simple markup tags to style sections of a string in bold, italics, underline, fill color, stroke variations, and more. You can apply styling tags to `Class.TextLabel`, `Class.TextButton`, and `Class.TextBox` objects.
-## Enable rich text
+## Enabling Rich Text
You must enable rich text on a per-object basis through its **RichText** property in the [Properties](../studio/properties.md) window, or by setting the property to `true` in a `Class.LocalScript`.
@@ -29,15 +29,15 @@ When editing an object's **Text** property in Studio, toggling the **RichText**
Localizing a game to support other languages removes rich text formatting tags. To ensure formatting appears in other languages, re-apply the tags manually to your localized strings.
-## Supported tags
+## Supported Tags
Rich text tags are similar to XML/HTML tags and you must include both an opening and closing tag around the formatted text.
-`Formatted text`
+`Formatted Text`
You can also nest tags inside each other as long as you close them in the reverse order of how you opened them.
-`Formatted text`
+`Formatted Text`
### Color
@@ -58,7 +58,7 @@ You can also nest tags inside each other as long as you close them in the revers
-### Font face
+### Font Face
` `
@@ -70,7 +70,7 @@ You can also nest tags inside each other as long as you close them in the revers
Font face/family names are listed on the `Datatype.Font` enum reference page.
-### Font family
+### Font Family
` `
@@ -82,7 +82,7 @@ Font face/family names are listed on the `Datatype.Font` enum reference page.
Font face/family names are listed on the `Datatype.Font` enum reference page.
-### Font weight
+### Font Weight
` `
@@ -153,7 +153,7 @@ See [Appearance Modifiers](../ui/appearance-modifiers.md) for details on `
-### Line break
+### Line Break
` `
@@ -172,7 +172,7 @@ See [Appearance Modifiers](../ui/appearance-modifiers.md) for details on `
-### Small caps
+### Small Caps
`` ``
@@ -191,7 +191,7 @@ See [Appearance Modifiers](../ui/appearance-modifiers.md) for details on `
-## Escape forms
+## Escape Forms
If you want to render certain characters like `<` or `>` and exempt them from consideration as part of rich text tags, you can write them in their **escape form**.
diff --git a/content/en-us/ui/size-modifiers.md b/content/en-us/ui/size-modifiers.md
index 8e8f7fb92..191a06403 100644
--- a/content/en-us/ui/size-modifiers.md
+++ b/content/en-us/ui/size-modifiers.md
@@ -1,9 +1,9 @@
---
-title: Size modifiers and constraints
+title: Size Modifiers and Constraints
description: Explains how use size modifiers and size constraints with user interface objects.
---
-Alongside basic [sizing](../ui/position-and-size.md) of UI objects, you can utilize size modifiers to [scale](#scale) an object proportionally or [automatically resize](#automatic-sizing) it. You can also insert [size constraints](#constraints) to control **aspect ratio**, or set a minimum and maximum **size** or **text size**.
+Alongside basic [sizing](../ui/positioning-and-sizing.md) of UI objects, you can utilize size modifiers to [scale](#scale) an object proportionally or [automatically resize](#automatic-sizing) it. You can also insert [size constraints](#constraints) to control **aspect ratio**, or set a minimum and maximum **size** or **text size**.
## Scale
@@ -13,7 +13,7 @@ This modifier is useful for "zooming in" while designing a detailed user interfa
-## Automatic sizing
+## Automatic Sizing
The `Class.GuiObject.AutomaticSize|AutomaticSize` property automatically resizes a parent `Class.GuiObject` to the size of its descendants. You can use this property in a variety of cases, including:
@@ -44,7 +44,7 @@ Once automatic sizing is set, note that other object properties behave as follow
-Similar to the concept of [sizing](../ui/position-and-size.md#size) an object, `Class.GuiObject.AutomaticSize|AutomaticSize` takes the `Class.GuiObject.AnchorPoint|AnchorPoint` property into consideration when resizing content. For example, the following video displays three `Class.TextLabel|TextLabels` that automatically resize from their anchor point.
+Similar to the concept of [sizing](../ui/positioning-and-sizing.md#size) an object, `Class.GuiObject.AutomaticSize|AutomaticSize` takes the `Class.GuiObject.AnchorPoint|AnchorPoint` property into consideration when resizing content. For example, the following video displays three `Class.TextLabel|TextLabels` that automatically resize from their anchor point.
@@ -87,7 +87,7 @@ For example, if you set the `Class.UISizeConstraint.MinSize|MinSize` property to
When a UI object is under control of both a layout structure such as `Class.UIListLayout` and a `Class.UISizeConstraint`, the constraint will **override** the layout and control the object's size.
-### Text size
+### Text Size
The `Class.UITextSizeConstraint` specifies a minimum and maximum font size for a `Class.GuiObject` with text, such as a `Class.TextLabel`, `Class.TextButton`, or `Class.TextBox`. This constraint ensures that the **text** within a `Class.GuiObject` doesn't become illegible or too large.
@@ -101,7 +101,7 @@ For example, the following `Class.TextLabel` object has a `Class.UITextSizeConst
Do not use `Class.UITextSizeConstraint.MinTextSize|MinTextSize` property values lower than `9` or the text will be difficult to read for many viewers.
-### Aspect ratio
+### Aspect Ratio
The `Class.UIAspectRatioConstraint` enforces a **width‑to‑height** aspect ratio on a `Class.GuiObject` regardless of its core size, even if that size is set as a percentage of its parent. For example, inserting this constraint as a child of a `Class.Frame` and setting the constraint's `Class.UIAspectRatioConstraint.AspectRatio|AspectRatio` property to `2` (`2:1`) keeps the frame's width at twice that of its height. Similarly, setting this constraint's `Class.UIAspectRatioConstraint.AspectRatio|AspectRatio` property to `0.5` (`0.5:1`) keeps the frame's width at half that of its height.
diff --git a/content/en-us/ui/text-filtering.md b/content/en-us/ui/text-filtering.md
index 07d25ac3f..8e4ab9656 100644
--- a/content/en-us/ui/text-filtering.md
+++ b/content/en-us/ui/text-filtering.md
@@ -1,5 +1,5 @@
---
-title: Text filtering
+title: Text Filtering
description: Text filtering prevents users from seeing inappropriate language and blocks personally identifiable information.
---
@@ -9,7 +9,7 @@ Applied to various sources and inputs, **text filtering** prevents users from se
Because filtering is crucial for a safe environment, Roblox actively moderates the content of experiences to make sure they meet [community standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards). If Roblox receives reports or automatically detects that your experience doesn't apply text filtering, then the system removes the experience until you add filtering.
-## Filter scenarios
+## Filter Scenarios
Text can be gathered and/or displayed to users in a variety of scenarios, including:
@@ -21,7 +21,7 @@ Text can be gathered and/or displayed to users in a variety of scenarios, includ
- An experience that stores text such as users' pet names using [data stores](../cloud-services/data-stores), where the stored text might include inappropriate words that should be filtered when retrieving them.
-## Filtering process
+## Filtering Process
`Class.TextService:FilterStringAsync()` filters in-experience text by taking a string of text and the `Class.Player.UserId|UserId` of the user who created the text as input. It returns a `Class.TextFilterResult` object which has two additional methods that you can call in different scenarios:
@@ -34,7 +34,7 @@ In the context of `Class.TextBox` input, the following example gathers input on
Do not filter text in real-time "per character entered" into a `Class.TextBox`, as doing so yields for text that's only visible to the user typing it. Instead, filter the entered text **after** the user submits it.
-```lua title="Filtering text input - client script"
+```lua title="Filtering Text Input - Client Script"
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local textBox = script.Parent
diff --git a/content/en-us/ui/text-input.md b/content/en-us/ui/text-input.md
index 051e929d4..82d86b0fe 100644
--- a/content/en-us/ui/text-input.md
+++ b/content/en-us/ui/text-input.md
@@ -1,11 +1,11 @@
---
-title: Text input fields
+title: Text Input Fields
description: Text input fields allow users to input text from their physical or on-screen keyboard.
---
import TextFiltering from '../includes/text-filtering/text-filtering.md'
-A `Class.TextBox` is a rectangle that allows a user to provide text input while it's in focus. When you [script](#script-text-inputs) a `Class.TextBox`, you can use it as a search bar or an input field on a form. To help users know what type of text they should input, you can also provide a prompt through the `Class.TextBox.PlaceholderText|PlaceholderText` property.
+A `Class.TextBox` is a rectangle that allows a user to provide text input while it's in focus. When you [script](#scripting-text-inputs) a `Class.TextBox`, you can use it as a search bar or an input field on a form. To help users know what type of text they should input, you can also provide a prompt through the `Class.TextBox.PlaceholderText|PlaceholderText` property.
@@ -15,7 +15,7 @@ properties such as `Class.GuiObject.BackgroundColor3|BackgroundColor3`,
`Class.GuiObject.Transparency|Transparency`, and
`Class.GuiObject.Rotation|Rotation` to fit the aesthetics of your experience.
-## Create text inputs on the screen
+## Creating Text Inputs on the Screen
A `Class.TextBox` on a screen is useful for
things like an input field for a form.
@@ -34,7 +34,7 @@ To add a `Class.TextBox` to a screen:
1. Insert a **TextBox**.
-## Create text inputs on part faces
+## Creating Text Inputs on Part Faces
To add a `Class.TextBox` to the face of a part:
@@ -57,10 +57,10 @@ To add a `Class.TextBox` to the face of a part:
1. In the **Explorer** window, select the part.
- If you don't see the `Class.TextBox`, try [choosing a different face](../parts/textures-decals.md#choose-a-face) in the Face property of the SurfaceGui.
+ If you don't see the `Class.TextBox`, try [choosing a different face](../parts/textures-decals.md#choosing-a-face) in the Face property of the SurfaceGui.
-## Script text inputs
+## Scripting Text Inputs
Like [buttons](../ui/buttons.md), you can script any action for a `Class.TextBox` object when a user interacts with it. For example, the following script connects the `Class.TextBox.FocusLost|FocusLost` event which fires when the user presses the Enter button or clicks outside the box. If `enterPressed` is `true`, meaning the user submitted the input instead of merely clicking outside the box, the script prints the contents of the entry to the [Output](../studio/output.md) window.
@@ -88,6 +88,6 @@ end
textBox:GetPropertyChangedSignal("Text"):Connect(allowOnlyNumbers)
```
-## Text filtering
+## Text Filtering
diff --git a/content/en-us/ui/ui-drag-detectors.md b/content/en-us/ui/ui-drag-detectors.md
index 797367c3a..96da46248 100644
--- a/content/en-us/ui/ui-drag-detectors.md
+++ b/content/en-us/ui/ui-drag-detectors.md
@@ -1,5 +1,5 @@
---
-title: UI drag detectors
+title: UI Drag Detectors
description: UI drag detectors facilitate and encourage interaction with 2D user interface elements in an experience, such as sliders and spinners.
---
@@ -23,7 +23,7 @@ The `Class.UIDragDetector` instance facilitates and encourages interaction with
For drag detectors that manipulate 3D objects in an experience, such as opening doors and drawers or sliding a part around, see [3D Drag Detectors](../ui/3D-drag-detectors.md).
-## Make UI elements draggable
+## Making UI Elements Draggable
To make any `Class.GuiObject` instances draggable, simply add a `Class.UIDragDetector` as a direct descendant.
@@ -38,9 +38,9 @@ To make any `Class.GuiObject` instances draggable, simply add a `Class.UIDragDet
Remember that `Class.UIDragDetector|UIDragDetectors` only work in Studio if you're **not** using the **Select**, **Move**, **Scale**, or **Rotate** tools, nor certain plugins or Studio's **UI** editor tools.
-## Customize UI drag detectors
+## Customizing UI Drag Detectors
-### Drag style
+### Drag Style
`Class.UIDragDetector|UIDragDetectors` map cursor motion to calculate proposed 2D motion and/or rotation. Through the `Class.UIDragDetector.DragStyle|DragStyle` property, you can choose from different mappings to suit your needs. For example, `Enum.UIDragDetectorDragStyle.TranslatePlane` produces translation in the 2D plane of the `Class.LayerCollector`, while `Enum.UIDragDetectorDragStyle.Rotate` normally produces a rotation instead of translation.
@@ -71,7 +71,7 @@ Remember that `Class.UIDragDetector|UIDragDetectors` only work in Studio if you'
-### Drag direction
+### Drag Direction
By default, 2D motion and the associated `Class.UIDragDetector.DragStyle|DragStyle` map to the space of the ancestor `Class.LayerCollector`. However, you may want to change the `Class.UIDragDetector.ReferenceUIInstance|ReferenceUIInstance` or the `Class.UIDragDetector.DragAxis|DragAxis` when building different UI components.
@@ -97,7 +97,7 @@ By default, 2D motion and the associated `Class.UIDragDetector.DragStyle|DragSty
-### Response to motion
+### Response to Motion
The `Class.UIDragDetector.ResponseStyle` property specifies how an object's position value is changed by the proposed motion. The custom response styles let you use the resulting `Class.UIDragDetector.DragUDim2` and `Class.UIDragDetector.DragRotation` values as desired, without having the detector's parent execute the proposed motion.
@@ -128,7 +128,7 @@ The `Class.UIDragDetector.ResponseStyle` property specifies how an object's posi
-### Translation & rotation limits
+### Translation & Rotation Limits
By default, there are no limits to 2D motion behind the inherent restrictions of the `Class.UIDragDetector.DragStyle|DragStyle`. Limits for both minimum and maximum translations and rotations can be declared with the following properties if desired. Additionally, you can define how the dragged object is constrained within the bounds of a specified `Class.GuiObject` such as a `Class.Frame`.
@@ -161,7 +161,7 @@ By default, there are no limits to 2D motion behind the inherent restrictions of
-### Speed adjustments
+### Speed Adjustments
Through `Class.UIDragDetector.SelectionModeDragSpeed|SelectionModeDragSpeed` and `Class.UIDragDetector.SelectionModeRotateSpeed|SelectionModeRotateSpeed`, you can fine‑tune the maximum drag/rotate speeds for a detector. Furthermore, through `Class.UIDragDetector.UIDragSpeedAxisMapping|UIDragSpeedAxisMapping`, you can fine‑tune the **X**/**Y** dimension dragging speeds, based on the detector's `Class.UIDragDetector.SelectionModeDragSpeed|SelectionModeDragSpeed`.
@@ -188,7 +188,7 @@ Through `Class.UIDragDetector.SelectionModeDragSpeed|SelectionModeDragSpeed` and
-## Script responses to clicking and dragging
+## Scripting Responses to Clicking and Dragging
Through [event signals](#event-signals), property changes, `Enum.UIDragDetectorDragStyle.Scriptable|Scriptable` drag style, and custom functions, scripts can respond to the manipulation of dragged UI elements to drive various settings or make logical decisions, such as sliders that adjust music and sound effect volume separately.
@@ -196,7 +196,7 @@ Through [event signals](#event-signals), property changes, `Enum.UIDragDetectorD
For user-initiated script responses like [Event Signals](#event-signals) and [Scripted Drag Style](#scripted-drag-style), you'll most commonly need to put your script code inside a `Class.LocalScript`, or a `Class.Script` with `Class.BaseScript.RunContext|RunContext` set to `Enum.RunContext.Client|Client`.
-### Event signals
+### Event Signals
Through the following event signals, you can detect when a user starts, continues, and ends dragging an object.
@@ -260,7 +260,7 @@ uiDragDetector.DragEnd:Connect(function(inputPosition)
end)
```
-### Position & rotation changes
+### Position & Rotation Changes
In addition to [event signals](#event-signals), you can monitor changes to the detector's `Class.UIDragDetector.DragUDim2|DragUDim2` and/or `Class.UIDragDetector.DragRotation|DragRotation` properties directly.
@@ -293,7 +293,7 @@ changeHue()
uiDragDetector:GetPropertyChangedSignal("DragRotation"):Connect(changeHue)
```
-### Scripted drag style
+### Scripted Drag Style
If you set a detector's `Class.UIDragDetector.DragStyle` to `Enum.UIDragDetectorDragStyle.Scriptable`, you can provide your own function that takes in a `Datatype.Vector2` of the input position and returns a `Datatype.UDim2` (position) and a float (rotation). The detector will update the object to the computed position/rotation based off of the returns, the `Class.UIDragDetector.DragSpace|DragSpace` property, and the `Class.UIDragDetector.DragRelativity|DragRelativity` property.
@@ -323,7 +323,7 @@ end
uiDragDetector:SetDragStyleFunction(computeSinWaveCoordinate)
```
-### Custom constraint function
+### Custom Constraint Function
`Class.UIDragDetector|UIDragDetectors` do not have built-in motion rules about grids and snapping, but you can register custom constraint functions to edit the detector's `Class.UIDragDetector.DragUDim2` and `Class.UIDragDetector.DragRotation` before they are applied. For example, you can keep motion on a grid by rounding positions to specific increments, or define allowed areas of motion. Note that this is applied **before** any existing translation/rotation limits.
diff --git a/content/en-us/ui/video-frames.md b/content/en-us/ui/video-frames.md
index f54b814bd..f5718b52f 100644
--- a/content/en-us/ui/video-frames.md
+++ b/content/en-us/ui/video-frames.md
@@ -1,13 +1,13 @@
---
-title: Video frames
+title: Video Frames
description: Video assets used on VideoFrame instances allow for video playback in experiences.
---
import BetaAlert from '../includes/beta-features/beta-alert.md'
-Video assets used in `Class.VideoFrame` instances allow for video playback in experiences. You can [upload](#import-videos) videos that you're certain you have permission to use, such as videos you make yourself, and the [asset privacy](../projects/assets/privacy.md) system automatically ensures that the IDs of your uploaded videos can't be accessed by users without the proper permissions.
+Video assets used in `Class.VideoFrame` instances allow for video playback in experiences. You can [upload](#importing-videos) videos that you're certain you have permission to use, such as videos you make yourself, and the [asset privacy](../projects/assets/privacy.md) system automatically ensures that the IDs of your uploaded videos can't be accessed by users without the proper permissions.
-## Import videos
+## Importing Videos
@@ -27,7 +27,7 @@ Videos that don't meet these requirements are rejected. Alpha channels are not s
- Each video upload costs 2,000 Robux.
- You can upload a maximum of three videos within any 30-day period, starting from the date of your first video upload.
-### Upload
+### Uploading
You can upload videos through the [Asset Manager](../projects/assets/manager.md), the [Creator Dashboard](https://create.roblox.com/dashboard/creations?activeTab=Video), or the [Open Cloud API](../cloud/open-cloud/usage-assets.md). To upload through the [Asset Manager](../projects/assets/manager.md):
@@ -46,7 +46,7 @@ You can upload videos through the [Asset Manager](../projects/assets/manager.md)
The video assets are now within the moderation queue and are only visible to you within the **Video** folder of the [Asset Manager](../projects/assets/manager.md) and, after passing moderation, the [Toolbox](../projects/assets/toolbox.md). Although you are initially the only one who can view and use private video assets, the [asset privacy](../projects/assets/privacy.md) system lets you grant usage permissions to specific friends and experiences.
-## Play videos
+## Playing Videos
A `Class.VideoFrame` must be parented to a `Class.ScreenGui`, `Class.SurfaceGui`, or `Class.BillboardGui` in order to be playable.
diff --git a/content/en-us/unity.md b/content/en-us/unity.md
index 51693d4f2..d5ea76e68 100644
--- a/content/en-us/unity.md
+++ b/content/en-us/unity.md
@@ -1,5 +1,5 @@
---
-title: Roblox for Unity developers
+title: Roblox for Unity Developers
description: If you're an experienced Unity developer, use this page to get oriented with Roblox.
comments: This document could use more information (and some links) around replication, remote events, and cloud services.
---
@@ -11,7 +11,7 @@ import Transforms from './includes/engine-comparisons/transforms.md'
This page includes information to help experienced Unity developers get started with Roblox: basic orientation, a conceptual comparison, and key differences between the two platforms.
-## Get oriented
+## Getting Oriented

@@ -26,7 +26,7 @@ However, the Hierarchy window has no predefined structure, whereas the Explorer
Similarly, the Roblox Studio [Asset Manager](projects/assets/manager.md) and [Toolbox](projects/assets/toolbox.md) overlap with the Unity Project window. The Asset Manager lets you manage all assets within your experience, whereas the Toolbox lets you access any assets you've published. The Toolbox also lets you search the Creator Store for assets from Roblox or the community, similar to the Unity Asset Store.
-## Philosophical differences
+## Philosophical Differences
Roblox is a "simulation engine" rather than a traditional game engine. Unity `GameObjects` and Roblox `Class.Part|Parts` both serve as the fundamental building blocks for creating objects in a 3D environment, but in practice, the two are quite different:
@@ -37,7 +37,7 @@ You can see the difference immediately if you create a `GameObject` and a `Part`
From a scripting perspective, `GameObject` is most similar to the Roblox `Class.Instance`, the base class for all other Roblox classes, but because you don't (and can't) create objects of type `Instance`, the comparison isn't especially practical.
-Another comparison is the Unity `GameObject` to the Roblox `Class.Model`. Models act as a container for a collection of interconnected parts in the same way that you might establish a parent-child relationship between many `GameObjects` in Unity. You specify one of the model's parts as its [primary part](parts/models.md#set-a-primary-part) to define the pivot point. Models also hold scripts, animations, sound effects, prompts, constraints, particle emitters, and more.
+Another comparison is the Unity `GameObject` to the Roblox `Class.Model`. Models act as a container for a collection of interconnected parts in the same way that you might establish a parent-child relationship between many `GameObjects` in Unity. You specify one of the model's parts as its [primary part](parts/models.md#setting-a-primary-part) to define the pivot point. Models also hold scripts, animations, sound effects, prompts, constraints, particle emitters, and more.
For example, a Unity `GameObject` might have components for `ParticleSystem`, `Physics3D`, `SpringConstraint`, and a script. In the Hierarchy window, you see a single `GameObject` named `SpringyFireball`. The Inspector window shows the collection of components and properties.
@@ -56,9 +56,9 @@ Roblox's physics-by-default philosophy extends to the process of building 3D mod
Rather than using standard metric units for length and mass, Roblox uses notional units called studs and Roblox Mass Units (RMUs). For approximate metric conversions and recommendations around use, see [Units](physics/units.md).
-## Location matters
+## Location Matters
-Roblox experiences are multiplayer by default, so Roblox Studio includes many different storage locations with specific behaviors. For example, a script might run when you put it in `Class.ReplicatedStorage`, but not when you put it into `Class.StarterPlayerScripts`. For more information, see [Client-server runtime](projects/client-server) and [Object organization](projects/data-model#object-organization).
+Roblox experiences are multiplayer by default, so Roblox Studio includes many different storage locations with specific behaviors. For example, a script might run when you put it in `Class.ReplicatedStorage`, but not when you put it into `Class.StarterPlayerScripts`. For more information, see [Client-Server Runtime](projects/client-server) and [Object Organization](projects/data-model#object-organization).
@@ -80,7 +80,7 @@ Compared to C#, Luau is gradually typed and generally has a less verbose syntax.
For basic syntax differences between the scripting languages, see [Luau and C# Comparison](luau/luau-csharp-comparison.md).
-### Luau code sample
+### Luau Code Sample
@@ -121,7 +121,7 @@ Similar to Unity tools, Roblox Studio supports [plugins](studio/plugins.md), whi
| Unity | Roblox | Notes |
| :--- | :--- | :--- |
| Scene | [Place](projects.md#places) | |
-| GameObject | `Class.Part` or `Class.Model` | See [Philosophical differences](#philosophical-differences). |
+| GameObject | `Class.Part` or `Class.Model` | See [Philosophical Differences](#philosophical-differences). |
| Prefab | [Package](projects/assets/packages.md) | |
| Transform | `Datatype.CFrame` | `CFrame` doesn't include scale information. See [Transforms](#transforms). |
| Hierarchy window | Explorer window | |
diff --git a/content/en-us/unreal.md b/content/en-us/unreal.md
index c7b004325..3b860a506 100644
--- a/content/en-us/unreal.md
+++ b/content/en-us/unreal.md
@@ -1,5 +1,5 @@
---
-title: Roblox for Unreal developers
+title: Roblox for Unreal Developers
description: If you're an experienced Unreal developer, use this page to get oriented with Roblox.
---
@@ -10,7 +10,7 @@ import Transforms from './includes/engine-comparisons/transforms.md'
This page includes information to help experienced Unreal Engine developers get started with Roblox: basic orientation, a conceptual comparison, and key differences between the two platforms.
-## Get oriented
+## Getting Oriented

@@ -20,7 +20,7 @@ Unreal's Outliner and Roblox Studio's [Explorer](studio/explorer.md) are the pri
The Roblox Studio [Asset Manager](projects/assets/manager.md) and [Toolbox](projects/assets/toolbox.md) overlap with the Unreal Content Browser. The Asset Manager lets you manage all assets within your experience, whereas the Toolbox lets you access any assets you've published. The Toolbox also lets you search the Creator Store for assets from Roblox or the community. The Creator Store is similar to the Unreal Engine Marketplace, but you can access it directly from the Studio user interface.
-## Philosophical differences
+## Philosophical Differences
Roblox is a "simulation engine" rather than a traditional game engine. Unreal `Actors` and Roblox `Class.Part|Parts` both serve as fundamental building blocks, but in practice, the two are quite different:
@@ -40,7 +40,7 @@ You can see the difference immediately if you create an `Actor` and a `Part`. Th
-Another useful comparison is the Unreal `Actor` to the Roblox `Class.Model`. Models act as a container for a collection of interconnected parts in the same way that `Actors` in Unreal are containers for components. You specify one of the model's parts as its [primary part](parts/models.md#set-a-primary-part) to define the pivot point. Models also hold scripts, animations, sound effects, prompts, constraints, particle emitters, and more.
+Another useful comparison is the Unreal `Actor` to the Roblox `Class.Model`. Models act as a container for a collection of interconnected parts in the same way that `Actors` in Unreal are containers for components. You specify one of the model's parts as its [primary part](parts/models.md#setting-a-primary-part) to define the pivot point. Models also hold scripts, animations, sound effects, prompts, constraints, particle emitters, and more.
For example, an Unreal `Actor` might have a `NiagraComponent` that uses several emitters to achieve the desired visual effect, a mesh for the shape, a physics constraint to add springiness, and a script for player interactivity. In Outliner, you see a single `Actor` named `SpringyFireball`.
@@ -59,9 +59,9 @@ Roblox's physics-by-default philosophy extends to the process of building 3D mod
Rather than using standard metric units for length and mass, Roblox uses notional units called studs and Roblox Mass Units (RMUs). For approximate metric conversions and recommendations around use, see [Units](physics/units.md).
-## Location matters
+## Location Matters
-Roblox experiences are multiplayer by default, so Roblox Studio includes many different storage locations with specific behaviors. For example, a script might run when you put it in `Class.ReplicatedStorage`, but not when you put it into `Class.StarterPlayerScripts`. For more information, see [Client-server runtime](projects/client-server) and [Object organization](projects/data-model#object-organization).
+Roblox experiences are multiplayer by default, so Roblox Studio includes many different storage locations with specific behaviors. For example, a script might run when you put it in `Class.ReplicatedStorage`, but not when you put it into `Class.StarterPlayerScripts`. For more information, see [Client-Server Runtime](projects/client-server) and [Object Organization](projects/data-model#object-organization).
@@ -83,7 +83,7 @@ Compared to Luau, C++ has an overall performance advantage, which might or might
Unreal also includes a visual scripting system called Blueprints. Roblox has third-party plugins that offer similar functionality, but no comparable system built-in.
-### Luau code sample
+### Luau Code Sample
@@ -124,7 +124,7 @@ Similar to Unreal, Roblox Studio supports [plugins](studio/plugins.md), which ca
| Unreal | Roblox | Notes |
| :--- | :--- | :--- |
| Level | [Place](projects.md#places) | |
-| Actor | `Class.Part` or `Class.Model` | See [Philosophical differences](#philosophical-differences). |
+| Actor | `Class.Part` or `Class.Model` | See [Philosophical Differences](#philosophical-differences). |
| Blueprint Class | [Package](projects/assets/packages.md) | |
| Transform | `Datatype.CFrame` | `CFrame` doesn't include scale information. See [Transforms](#transforms). |
| Outliner | Explorer window | |
diff --git a/content/en-us/what-is-roblox.md b/content/en-us/what-is-roblox.md
index 69f0d111d..541c95952 100644
--- a/content/en-us/what-is-roblox.md
+++ b/content/en-us/what-is-roblox.md
@@ -5,238 +5,238 @@ hideInPageNavigation: true
---
-
-
-
-
-
-
-
-
-
-
Roblox is a 3D creation platform that provides everything you need to build, test, distribute, and monetize your creations.
-
Creations can be items that users equip for their avatars, the 3D experiences that users join, or assets and plugins that you provide to other creators to build with.
-
-
+
+
+
+
+
+
+
+
+
+
Roblox is a 3D creation platform that provides everything you need to build, test, distribute, and monetize your creations.
+
Creations can be items that users equip for their avatars, the 3D experiences that users join, or assets and plugins that you provide to other creators to build with.
+
+
Experiences
Learn, share, and interact with the Roblox community in the following places.
-
-
-
-
-
-Create your first experience
-Create a catapult that launches spheres into blocks to learn important Roblox concepts.
-
-Intro to world building
-Roblox is designed for massive 3D worlds. Learn how to use Roblox Studio to start building!
-
-
-
-
-
-
-
-Intro to physics
-Roblox is a simulation-first engine that mimics the real world. Learn more about how physics operates in the Roblox Engine.
-
-
+
+
+
+
+
+ Create Your First Experience
+ Create a catapult that launches spheres into blocks to learn important Roblox concepts.
+
+
+
diff --git a/content/en-us/workspace/camera.md b/content/en-us/workspace/camera.md
index 209763f99..c5616d4e8 100644
--- a/content/en-us/workspace/camera.md
+++ b/content/en-us/workspace/camera.md
@@ -1,11 +1,11 @@
---
-title: Customize the camera
+title: Customizing the Camera
description: Explains how to configure an experience's camera settings.
---
Roblox's built-in camera powers a default **third person** mode and an optional **first person** mode, so you don't need to build your own following camera. For more customized scenarios, you can adjust the default properties in `Class.Camera` or replace it entirely like for over-the-shoulder, isometric, and weapon scoping views.
-## Basic settings
+## Basic Settings
You can configure common camera settings directly within Studio's `Class.StarterPlayer` object. These settings include [zoom distance](#zoom-distance) and various [camera](#camera-mode), [occlusion](#occlusion-mode), and [movement](#movement-mode) modes.
@@ -17,7 +17,7 @@ You can configure common camera settings directly within Studio's `Class.Starter
-### Zoom distance
+### Zoom Distance
Together, `Class.StarterPlayer.CameraMaxZoomDistance|CameraMaxZoomDistance` and `Class.StarterPlayer.CameraMinZoomDistance|CameraMinZoomDistance` set the range in which players can zoom the camera in respect to their player character. Setting a very high maximum such as 500 allows players to zoom the camera far out in space. If you want to lock the camera to a specific distance away from the character and prevent zooming, set both of these properties to the same value.
@@ -30,7 +30,7 @@ player.CameraMaxZoomDistance = 25
player.CameraMinZoomDistance = 50
```
-### Camera mode
+### Camera Mode
The `Class.StarterPlayer.CameraMode|CameraMode` property sets the overall behavior of the camera between two options:
@@ -53,7 +53,7 @@ The `Class.StarterPlayer.CameraMode|CameraMode` property sets the overall behavi
-### Occlusion mode
+### Occlusion Mode
The `Class.StarterPlayer.DevCameraOcclusionMode|DevCameraOcclusionMode` property controls camera behavior when the player cannot see their character, such as when it's obscured by a `Class.BasePart`.
@@ -81,7 +81,7 @@ The `Class.StarterPlayer.DevCameraOcclusionMode|DevCameraOcclusionMode` property
**Zoom** and **Invisicam** occlusion modes
-### Movement mode
+### Movement Mode
The `Class.StarterPlayer.DevComputerCameraMovementMode|DevComputerCameraMovementMode` (computer) and `Class.StarterPlayer.DevTouchCameraMovementMode|DevTouchCameraMovementMode` (phone/tablet) determine how the player can move the camera around.
@@ -116,7 +116,7 @@ The `Class.StarterPlayer.DevComputerCameraMovementMode|DevComputerCameraMovement
-## Script the camera
+## Scripting the Camera
Each player [client](../projects/client-server.md) has its own `Class.Camera` object residing in the local `Class.Workspace`, accessible through the `Class.Workspace.CurrentCamera` property. You can override Roblox's default camera scripts by setting its `Class.Camera.CameraType|CameraType` to `Enum.CameraType|Scriptable` and then, most commonly, control the camera through the following properties.
diff --git a/content/en-us/workspace/cframes.md b/content/en-us/workspace/cframes.md
index 1df81d814..3cd3f4684 100644
--- a/content/en-us/workspace/cframes.md
+++ b/content/en-us/workspace/cframes.md
@@ -11,9 +11,9 @@ Some examples of `Datatype.CFrame` applications in a game might be:
- Moving the camera so that it focuses on specific NPCs as a player interacts with them.
- Placing a status indicator directly above a player's head to show if they are paralyzed, boosted, poisoned, etc.
-## CFrame basics
+## CFrame Basics
-### Position a CFrame
+### Positioning a CFrame
You can create an empty `Datatype.CFrame` at the default position of (0, 0, 0) by using `Datatype.CFrame.new()`. To position a `Datatype.CFrame` at a specific point, provide x-, y-, and z-coordinates as arguments to `Datatype.CFrame.new()`. In the following example, the `redBlock` part's `Datatype.CFrame` property changes to `newCFrame`, repositioning it to (-2, 2, 4).
@@ -51,7 +51,7 @@ local newCFrame = CFrame.new(newVector3)
redBlock.CFrame = newCFrame
```
-### Rotate a CFrame
+### Rotating a CFrame
To create a rotated `Datatype.CFrame`, use the `Datatype.CFrame.Angles()` constructor, providing a rotation angle in radians for the desired axes. The parameters to `Datatype.CFrame.Angles()` is in radians, not degrees. If you prefer degrees, use `Library.math.rad()` to convert degrees to radians. In the following example, the `redBlock` part rotates 45 degrees counterclockwise on its y-axis.
@@ -76,7 +76,7 @@ redBlock.CFrame = newCFrame
-### Face a CFrame toward a point
+### Facing Toward a Point
You can use `Datatype.CFrame.new()` to point the front surface of a `Datatype.CFrame` at a specific point in the world. In the following example, `redBlock` part positions at (0, 3, 0) and points its front surface, marked by the white circle, at the `blueCube` part.
@@ -103,7 +103,7 @@ redBlock.CFrame = CFrame.new(startPosition, targetPosition)
-### Offset a CFrame
+### Offsetting a CFrame
To offset an object by a specific number of studs from its current position, add or subtract a `Datatype.Vector3` to or from a new `Datatype.CFrame` at the object's position. To get a properly-formatted `Datatype.Vector3` position of an object to use with `Datatype.CFrame.new()`, as seen here, its `Class.BasePart.Position|Position` property (`redBlock.Position`) is a convenient shortcut.
@@ -144,7 +144,7 @@ redBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)
-## Dynamic CFrame orientation
+## Dynamic CFrame Orientation
The `Datatype.CFrame.new()` and `Datatype.CFrame.Angles()` constructors reposition or rotate an object at a specific orientation within the world, but you sometimes can't rely on a fixed world position and rotation angle. For example:
@@ -153,7 +153,7 @@ The `Datatype.CFrame.new()` and `Datatype.CFrame.Angles()` constructors repositi
In these cases, use `Datatype.CFrame` methods instead of their constructors.
-### Relative position
+### Relative Position
The `Datatype.CFrame:ToWorldSpace()` function transforms an object's `Datatype.CFrame` — respecting its own local orientation — to a new **world** orientation. This makes it ideal for offsetting a part relative to itself or another object, regardless of how it's currently positioned/rotated.
@@ -178,7 +178,7 @@ redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)
-### Relative rotation
+### Relative Rotation
You can also use `Datatype.CFrame:ToWorldSpace()` to rotate an object relative to itself. In the following example, the `redBlock` part rotates 70 degrees counterclockwise on its y-axis and 20 degrees clockwise on its z-axis.
@@ -200,7 +200,7 @@ redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
-### Face a specific surface toward a point
+### Facing a Specific Surface Toward a Point
You can make the front of an object face another object by supplying a `Datatype.Vector3` point as the second parameter of `Datatype.CFrame.new()`. You can also use relative rotation to make any face of the object point toward a `Datatype.Vector3` point. The following example performs two consecutive `Datatype.CFrame` operations:
@@ -237,7 +237,7 @@ redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
-### Find a point between points
+### Finding a Point Between Points
You can use **linear interpolation**, or **lerp**, to position a `Datatype.CFrame` between two points. In the following example, the `redBlock` part repositions between the `greenCube` and `cyanCube` parts. The value of `0.7` places it 70% of the distance away from the green cube.
diff --git a/content/en-us/workspace/collisions.md b/content/en-us/workspace/collisions.md
index c8d8e904a..7635f2e11 100644
--- a/content/en-us/workspace/collisions.md
+++ b/content/en-us/workspace/collisions.md
@@ -5,7 +5,7 @@ description: Explains methods to detect physical collisions, handle collision ev
A collision occurs when two 3D objects come into contact within the 3D world. For customized collision handling, `Class.BasePart` has a set of [collision events](#collision-events) and [collision filtering](#collision-filtering) techniques, so you can control which physical assemblies collide with others.
-## Collision events
+## Collision Events
Collision **events** occur when two `Class.BasePart|BaseParts` touch or stop touching in the 3D world. You can detect these collisions through the `Class.BasePart.Touched|Touched` and `Class.BasePart.TouchEnded|TouchEnded` events which occur regardless of either part's `Class.BasePart.CanCollide|CanCollide` property value. When considering collision handling on parts, note the following:
@@ -71,11 +71,11 @@ end
part.TouchEnded:Connect(onTouchEnded)
```
-## Collision filtering
+## Collision Filtering
Collision **filtering** defines which physical parts collide with others. You can configure filtering for numerous objects through [collision groups](#collision-groups) or you can control collisions on a [part‑to‑part](#part-to-part-filtering) basis with `Class.NoCollisionConstraint` instances.
-### Collision groups
+### Collision Groups
Collision **groups** let you assign `Class.BasePart|BaseParts` to dedicated groups and specify whether or not they collide with those in other groups. Parts within non‑colliding groups pass through each other completely, even if both parts have their `Class.BasePart.CanCollide|CanCollide` property set to `true`.
@@ -88,7 +88,7 @@ You can easily set up collision groups through Studio's **Collision Groups Edito
-The editor functions in either **List View** which favors [docking](../studio/ui-overview.md#reposition-windows) to the left or right side of Studio, or in a wider **Table View**, which favors docking to the top or bottom.
+The editor functions in either **List View** which favors [docking](../studio/ui-overview.md#repositioning-windows) to the left or right side of Studio, or in a wider **Table View**, which favors docking to the top or bottom.
@@ -99,7 +99,7 @@ The editor functions in either **List View** which favors [docking](../stud
-#### Register groups
+#### Registering Groups
@@ -124,7 +124,7 @@ To create a new collision group:
-To create a new collision group through scripting, include the `Class.PhysicsService` service and register the group with `Class.PhysicsService:RegisterCollisionGroup()`. It may be helpful to pre-declare your group names in local variables, as the same strings can be used for [assigning objects](#assign-objects-to-groups) and [configuring groups](#configure-group-collisions) within the same script.
+To create a new collision group through scripting, include the `Class.PhysicsService` service and register the group with `Class.PhysicsService:RegisterCollisionGroup()`. It may be helpful to pre-declare your group names in local variables, as the same strings can be used for [assigning objects](#assigning-objects-to-groups) and [configuring groups](#configuring-group-collisions) within the same script.
```lua title="Collision Group Setup" highlight='1,3,4,7,8'
local PhysicsService = game:GetService("PhysicsService")
@@ -138,13 +138,13 @@ PhysicsService:RegisterCollisionGroup(doors)
```
-Since scripts are not guaranteed to execute in any particular order, it's highly recommended that you register collision groups in a single script. Abstracting group registration among multiple scripts may result in a race condition where a group is not yet registered at the time you [configure groups](#configure-group-collisions) or [assign objects](#assign-objects-to-groups) to them.
+Since scripts are not guaranteed to execute in any particular order, it's highly recommended that you register collision groups in a single script. Abstracting group registration among multiple scripts may result in a race condition where a group is not yet registered at the time you [configure groups](#configuring-group-collisions) or [assign objects](#assigning-objects-to-groups) to them.
-#### Configure group collisions
+#### Configuring Group Collisions
@@ -181,11 +181,11 @@ PhysicsService:CollisionGroupSetCollidable(cubes, doors, false)
-#### Assign objects to groups
+#### Assigning Objects to Groups
-To assign objects to groups you've [registered](#register-groups) through the Studio editor:
+To assign objects to groups you've [registered](#registering-groups) through the Studio editor:
1. Select one or more `Class.BasePart|BaseParts` that qualify as part of a collision group.
2. Assign them to the group by clicking the **⊕** button for its row. Objects can belong to only one collision group at a time, so placing them in a new group removes them from their current group.
@@ -220,7 +220,7 @@ workspace.Door1.CollisionGroup = doors
-#### StudioSelectable collision group
+#### StudioSelectable Collision Group
Tools in Studio use the collision filtering system to determine which objects are candidates for selection when clicking in the 3D viewport. Objects whose assigned collision group does **not** collide with **StudioSelectable** will be ignored.
@@ -242,7 +242,7 @@ local mouseRay = workspace.CurrentCamera:ViewportPointToRay(mouseLocation.X, mou
local filteredSelectionHit = workspace:Raycast(mouseRay.Origin, mouseRay.Direction * 10000, raycastParams)
```
-### Part-to-part filtering
+### Part-to-Part Filtering
To prevent collisions between two specific parts without
setting up [collision groups](#collision-groups), such as between a vehicle's wheel and its chassis, consider the
@@ -253,7 +253,7 @@ constraint. Advantages include:
- Connected parts will not collide with each other, but they can still
collide with other objects.
-### Disable character collisions
+### Disabling Character Collisions
Roblox player characters collide with each other by default. This can lead to
interesting but unintended gameplay, such as characters jumping on top of each other to reach specific areas. If this behavior is undesirable, you can prevent it through the following `Class.Script` in `Class.ServerScriptService`.
@@ -286,7 +286,7 @@ Players.PlayerAdded:Connect(function(player)
end)
```
-## Model collisions
+## Model Collisions
`Class.Model` objects are containers for parts rather than inheriting from `Class.BasePart`, so they can't directly connect to `Class.BasePart.Touched` or `Class.BasePart.TouchEnded` events. To determine whether a model triggers a collision events, you need to loop through its children and connect the custom `onTouched()` and `onTouchEnded()` functions to each child `Class.BasePart`.
@@ -327,7 +327,7 @@ for _, child in model:GetChildren() do
end
```
-## Mesh and solid model collisions
+## Mesh and Solid Model Collisions
`Class.MeshPart` and `Class.PartOperation` (parts joined by [solid modeling](../parts/solid-modeling.md)) are subclasses of `Class.BasePart`, so meshes and solid modeled parts inherit the same [collision events](#collision-events) and [collision filtering](#collision-filtering) options as regular parts. However, since meshes and solid modeled parts usually have more complex geometries, they have a distinctive `Class.TriangleMeshPart.CollisionFidelity|CollisionFidelity` property which determines how precisely the physical bounds align with the visual representation for collision handling.
diff --git a/content/en-us/workspace/index.md b/content/en-us/workspace/index.md
index df7a34ce3..e733849f6 100644
--- a/content/en-us/workspace/index.md
+++ b/content/en-us/workspace/index.md
@@ -1,10 +1,10 @@
---
-title: 3D workspace
-description: Describes the workspace container service, which holds all objects that exist in the 3D world.
+title: 3D Workspace
+description: Describes the Workspace container service, which holds all objects that exist in the 3D world.
---
`Class.Workspace` is a container service that holds objects that you want the
-Roblox Engine to render in the 3D world. You typically will add these objects to
+Roblox engine to render in the 3D world. You typically will add these objects to
the workspace:
- `Class.BasePart` objects, which includes both `Class.Part` and `Class.MeshPart` objects.
@@ -24,7 +24,7 @@ the workspace:
Sphere
Cylinder
Wedge
-
Corner wedge
+
Corner Wedge
@@ -87,7 +87,7 @@ also contain scripts that act on the individual objects of the model.
-## Access the workspace in scripts
+## Accessing the Workspace in Scripts
Within a script, you can access a place's `Class.Workspace` in three different ways, all of which are valid.
diff --git a/content/en-us/workspace/raycasting.md b/content/en-us/workspace/raycasting.md
index c361b585f..2b1d85e0c 100644
--- a/content/en-us/workspace/raycasting.md
+++ b/content/en-us/workspace/raycasting.md
@@ -10,6 +10,8 @@ At its most basic level, **raycasting** is the act of sending out an invisible r
Lasers are fired by floating orbs, and raycasting determines whether a laser hits a platform. Platforms touched by the lasers are temporarily destroyed.
+## Casting a Ray
+
You can cast a ray with the `Class.WorldRoot:Raycast()` method (`Class.WorldRoot:Raycast()|workspace:Raycast()`) from a `Datatype.Vector3` origin in a `Datatype.Vector3` direction.
```lua title='Basic Raycast' highlight='4'
@@ -23,30 +25,7 @@ local raycastResult = workspace:Raycast(rayOrigin, rayDirection)
When casting a ray, the direction parameter should encompass the desired length of the ray. For instance, if the magnitude of the direction is 10, the resulting ray will also be of length 10. The maximum length is 15,000 studs.
-When applicable, you can calculate an unknown directional vector (`rayDirection`) using a known **origin** and **destination**. This is useful when casting a ray between two points that can change, such as from one player character to another.
-
-1. The origin plus a directional vector indicate the ray's destination:
-
- rayOrigin + rayDirection = rayDestination
-
-2. Subtract rayOrigin from both sides of the equation:
-
- rayOrigin + rayDirection − rayOrigin = rayDestination − rayOrigin
-
-3. The ray's direction equals the destination minus the origin:
-
- rayDirection = rayDestination − rayOrigin
-
-```lua highlight='4'
-local rayOrigin = workspace.TestOrigin.Position
-local rayDestination = workspace.TestDestination.Position
-
-local rayDirection = rayDestination - rayOrigin
-
-local raycastResult = workspace:Raycast(rayOrigin, rayDirection)
-```
-
-## Filter options
+### Filtering
`Class.WorldRoot:Raycast()` accepts an optional `Datatype.RaycastParams` object which tells the raycast to selectively include or exclude certain `Class.BasePart|BaseParts`, ignore the **Water** material for `Class.Terrain`, or use a [collision group](../workspace/collisions.md#collision-filtering).
@@ -89,9 +68,34 @@ raycastParams.IgnoreWater = true
local raycastResult = workspace:Raycast(rayOrigin, rayDirection, raycastParams)
```
-## Hit detection
+### Calculating Direction
+
+When applicable, you can calculate an unknown directional vector (`rayDirection`) using a known **origin** and **destination**. This is useful when casting a ray between two points that can change, such as from one player character to another.
+
+1. The origin plus a directional vector indicate the ray's destination:
+
+ rayOrigin + rayDirection = rayDestination
+
+2. Subtract rayOrigin from both sides of the equation:
+
+ rayOrigin + rayDirection − rayOrigin = rayDestination − rayOrigin
+
+3. The ray's direction equals the destination minus the origin:
+
+ rayDirection = rayDestination − rayOrigin
+
+```lua highlight='4'
+local rayOrigin = workspace.TestOrigin.Position
+local rayDestination = workspace.TestDestination.Position
+
+local rayDirection = rayDestination - rayOrigin
+
+local raycastResult = workspace:Raycast(rayOrigin, rayDirection)
+```
+
+## Detecting Hits
-If the [raycasting operation](#cast-a-ray) hits an eligible `Class.BasePart` or `Class.Terrain` cell, a `Datatype.RaycastResult` object is returned containing the results. To test for a hit, confirm that the result is not `nil` and utilize the following properties as needed.
+If the [raycasting operation](#casting-a-ray) hits an eligible `Class.BasePart` or `Class.Terrain` cell, a `Datatype.RaycastResult` object is returned containing the results. To test for a hit, confirm that the result is not `nil` and utilize the following properties as needed.
diff --git a/content/en-us/workspace/streaming.md b/content/en-us/workspace/streaming.md
index 7555451d3..5786a8151 100644
--- a/content/en-us/workspace/streaming.md
+++ b/content/en-us/workspace/streaming.md
@@ -1,16 +1,16 @@
---
-title: Instance streaming
-description: Instance streaming allows the Roblox Engine to dynamically load and unload 3D content in regions of the world.
+title: Instance Streaming
+description: Instance streaming allows the Roblox engine to dynamically load and unload 3D content in regions of the world.
---
-In-experience **instance streaming** allows the Roblox Engine to dynamically load and unload 3D content and related instances in regions of the world. This can improve the overall player experience in several ways, for example:
+In-experience **instance streaming** allows the Roblox engine to dynamically load and unload 3D content and related instances in regions of the world. This can improve the overall player experience in several ways, for example:
- **Faster join times** — Players can start playing in one part of the world while more of the world loads in the background.
- **Memory efficiency** — Experiences can be played on devices with less memory since content is dynamically streamed in and out. More immersive and detailed worlds can be played on a wider range of devices.
- **Improved performance** — Better frame rates and performance, as the server can spend less time and bandwidth synchronizing changes between the world and players in it. Clients spend less time updating instances that aren't currently relevant to the player.
- **Level of detail** — Distant models and terrain remain visible even when they're not streamed to clients, keeping the experience optimized without entirely sacrificing background visuals.
-## Enable streaming
+## Enabling Streaming
Instance streaming is enabled through the **StreamingEnabled** property of the **Workspace** object in Studio. This property cannot be set in a script. Streaming is enabled by default for new places created in Studio.
@@ -18,14 +18,14 @@ Instance streaming is enabled through the **StreamingEnabled** property of the *
Once enabled, it's recommended that you adhere to the following practices:
-- Because clients will not typically have the entire `Class.Workspace` available locally, use the appropriate tool/API to ensure that instances exist before attempting to access them in a `Class.LocalScript`. For example, utilize [per‑model streaming controls](#per-model-streaming-controls), [detect instance streaming](#detect-instance-streaming), or use `Class.Instance:WaitForChild()|WaitForChild()` on objects that may not exist.
+- Because clients will not typically have the entire `Class.Workspace` available locally, use the appropriate tool/API to ensure that instances exist before attempting to access them in a `Class.LocalScript`. For example, utilize [per‑model streaming controls](#per-model-streaming-controls), [detect instance streaming](#detecting-instance-streaming), or use `Class.Instance:WaitForChild()|WaitForChild()` on objects that may not exist.
- Minimize placement of 3D content outside of `Class.Workspace`. Content in containers such as `Class.ReplicatedStorage` or `Class.ReplicatedFirst` is ineligible for streaming and may negatively impact join time and memory usage.
-- If you move a player's character by setting its `Datatype.CFrame`, do so from a server-side `Class.Script` and use [streaming requests](#request-area-streaming) to more quickly load data around the character's new location.
+- If you move a player's character by setting its `Datatype.CFrame`, do so from a server-side `Class.Script` and use [streaming requests](#requesting-area-streaming) to more quickly load data around the character's new location.
- Manually set the player's `Class.Player.ReplicationFocus|ReplicationFocus` only in unique situations such as in experiences that don't use a `Class.Player.Character`. In these cases, make sure the focus is near the object(s) that the player controls to ensure content continues to stream in around the player's interaction point.
-## Technical behavior
+## Technical Behavior
-### Stream in
+### Streaming In
By default, when a player joins an experience with instance streaming enabled, instances in the `Class.Workspace` are replicated to the client, **excluding** the following:
@@ -40,9 +40,9 @@ Then, during gameplay, the server may stream necessary instances to the client,
1 Terrain is treated uniquely, in that the instance replicates to the client when the experience loads, but terrain regions only stream in when needed
-
Model behavior
+
Model Behavior
-Models set to non-default behavior like [Atomic](#atomic) stream in under special rules as outlined in [Per‑model streaming controls](#per-model-streaming-controls). However, default (nonatomic) models are sent differently based on whether [ModelStreamingBehavior](#modelstreamingbehavior) is set to **Default** (**Legacy**) or **Improved**.
+Models set to non-default behavior like [Atomic](#atomic) stream in under special rules as outlined in [Per‑Model Streaming Controls](#per-model-streaming-controls). However, default (nonatomic) models are sent differently based on whether [ModelStreamingBehavior](#modelstreamingbehavior) is set to **Default** (**Legacy**) or **Improved**.
@@ -75,7 +75,7 @@ When [ModelStreamingBehavior](#modelstreamingbehavior) is set to **Improved**, m
-### Stream out
+### Streaming Out
During gameplay, a client may stream out (remove from the player's `Class.Workspace`) regions and the `Class.BasePart|BaseParts` contained within them, based on the behavior set by [StreamOutBehavior](#streamoutbehavior). The process begins with regions furthest away from the player's character (or `Class.Player.ReplicationFocus|ReplicationFocus`) and moves in closer as needed. Regions inside the [StreamingMinRadius](#streamingminradius) range never stream out.
@@ -88,7 +88,7 @@ To further anticipate stream out, examine these scenarios:
Scenario
Example
-
Streaming behavior
+
Streaming Behavior
@@ -110,7 +110,7 @@ To further anticipate stream out, examine these scenarios:
-
Model behavior
+
Model Behavior
If you set [ModelStreamingBehavior](#modelstreamingbehavior) to **Improved**, the engine may stream out [Default](#default--nonatomic) ([Nonatomic](#default--nonatomic)) models when they're eligible to stream out, potentially freeing up memory on the client and reducing the instances which need property updates.
@@ -121,7 +121,7 @@ Under **Improved** model streaming behavior, streaming out of [Default](#default
- A spatial model only streams out completely when its last remaining `Class.BasePart` descendant streams out, since some of the model's spatial parts may be near to the player/replication focus and some far away.
- A non‑spatial model only streams out when an ancestor streams out, equivalent to legacy streaming out behavior.
-### Assemblies and mechanisms
+### Assemblies and Mechanisms
When at least one part of an [assembly](../physics/assemblies.md) is eligible for streaming in, all of the assembly's parts also stream in. However, an assembly will not stream **out** until **all** of its parts are eligible for streaming out. During streaming, all of the `Class.Constraint|Constraints` and `Class.Attachment|Attachments` descending from `Class.BasePart|BaseParts` and atomic or persistent `Class.Model|Models` also stream, helping to ensure consistent physics updates on clients.
@@ -130,8 +130,8 @@ Note that assemblies with **anchored** parts are treated slightly differently th
-
Assembly composition
-
Streaming behavior
+
Assembly Composition
+
Streaming Behavior
@@ -150,7 +150,7 @@ Note that assemblies with **anchored** parts are treated slightly differently th
Avoid creating moving assemblies with unnecessarily large numbers of instances, as all of the instances streaming in unison may cause network/CPU spikes.
-### Timing delay
+### Timing Delay
There may be a slight delay of ~10 milliseconds between when a part is created on the server and when it gets replicated to clients. In each of the following scenarios, you may need to use `Class.Instance:WaitForChild()|WaitForChild()` and other techniques rather than assuming that events and property updates always occur at the same time as part streaming.
@@ -159,7 +159,7 @@ There may be a slight delay of ~10 milliseconds between when a part is created o
Scenario
Example
-
Streaming behavior
+
Streaming Behavior
@@ -181,7 +181,7 @@ There may be a slight delay of ~10 milliseconds between when a part is created o
-## Streaming properties
+## Streaming Properties
The following properties control how instance streaming applies to your experience. All of these properties are **non-scriptable** and must be set on the **Workspace** object in Studio.
@@ -211,13 +211,13 @@ A smaller **StreamingTargetRadius** reduces server workload, as the server will
### StreamOutBehavior
-The **StreamOutBehavior** property sets the [streaming out](#stream-out) behavior according to one of the following values:
+The **StreamOutBehavior** property sets the [streaming out](#streaming-out) behavior according to one of the following values:
Setting
-
Streaming behavior
+
Streaming Behavior
@@ -236,13 +236,13 @@ The **StreamOutBehavior** property sets the [streaming out](#stream-out) behavio
-## Per-model streaming controls
+## Per-Model Streaming Controls
Globally, the [ModelStreamingBehavior](#modelstreamingbehavior) property lets you control how models are streamed in on join. Additionally, to avoid issues with streaming on a per-model basis and minimize use of `Class.Instance:WaitForChild()|WaitForChild()`, you can customize how `Class.Model|Models` and their descendants stream through their `Class.Model.ModelStreamingMode|ModelStreamingMode` property.
-### Default / nonatomic
+### Default / Nonatomic
When a `Class.Model` is set to **Default** or **Nonatomic**, streaming behavior varies based on whether [ModelStreamingBehavior](#modelstreamingbehavior) is set to **Default** (**Legacy**) or **Improved**.
@@ -250,7 +250,7 @@ When a `Class.Model` is set to **Default** or **Nonatomic**, streaming behavior
[ModelStreamingBehavior](#modelstreamingbehavior)
-
Technical behavior
+
Technical Behavior
@@ -265,7 +265,7 @@ When a `Class.Model` is set to **Default** or **Nonatomic**, streaming behavior
-See [technical behavior](#technical-behavior) for more details.
+See [Technical Behavior](#technical-behavior) for more details.
### Atomic
@@ -313,9 +313,9 @@ Runtime performance impacts of persistent models after replication are mostly th
Models set to **PersistentPerPlayer** behave the same as [Persistent](#persistent) for players that have been added using `Class.Model:AddPersistentPlayer()`. For other players, behavior is the same as [Atomic](#atomic). You can revert a model from player persistence via `Class.Model:RemovePersistentPlayer()`.
-## Request area streaming
+## Requesting Area Streaming
-If you set the `Datatype.CFrame` of a player character to a region which isn't currently loaded, [streaming pause](#customize-the-pause-screen) occurs, if enabled. If you know the character will be moving to a specific area, you can call `Class.Player:RequestStreamAroundAsync()` to request that the server sends regions around that location to the client.
+If you set the `Datatype.CFrame` of a player character to a region which isn't currently loaded, [streaming pause](#customizing-the-pause-screen) occurs, if enabled. If you know the character will be moving to a specific area, you can call `Class.Player:RequestStreamAroundAsync()` to request that the server sends regions around that location to the client.
The following scripts show how to fire a client-to-server [remote event](../scripting/events/remote.md) to teleport a player within a place, yielding at the streaming request before moving the character to a new `Datatype.CFrame`.
@@ -354,7 +354,7 @@ teleportEvent:FireServer(teleportTarget)
Requesting streaming around an area is **not a guarantee** that the content will be present when the request completes, as streaming is affected by the client's network bandwidth, memory limitations, and other factors.
-## Detect instance streaming
+## Detecting Instance Streaming
In some cases, it's necessary to detect when an object streams in or out and react to that event. A useful pattern for streaming detection is as follows:
@@ -392,7 +392,7 @@ In some cases, it's necessary to detect when an object streams in or out and rea
end
```
-## Customize the pause screen
+## Customizing the Pause Screen
The `Class.Player.GameplayPaused` property indicates the player's current pause state. This property can be used with a `Class.Instance:GetPropertyChangedSignal()|GetPropertyChangedSignal()` connection to show or hide a custom GUI.
@@ -415,7 +415,7 @@ end
player:GetPropertyChangedSignal("GameplayPaused"):Connect(onPauseStateChanged)
```
-## Model level of detail
+## Model Level of Detail
When streaming is enabled, `Class.Model|Models` outside of the currently streamed area will not be visible by default. However, you can instruct the engine to render lower resolution "imposter" meshes for models that are not present on clients through each model's `Class.Model.LevelOfDetail|LevelOfDetail` property.
@@ -435,8 +435,8 @@ When streaming is enabled, `Class.Model|Models` outside of the currently streame