[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# History

## Revisions

Compare revisions

  * small update for new stuff

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Jan 11, 2026

240f1a3

  * corrected some things

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Dec 23, 2025

c6efa8a

  * Update 3.-Updating-Animations.md

[ ChadMcOrgans2022 ](https://github.com/ChadMcOrgans2022) committed Nov 28, 2025

26998e1

  * Update 3.-Updating-Animations.md

[ ChadMcOrgans2022 ](https://github.com/ChadMcOrgans2022) committed Nov 28, 2025

6a6578b

  * Added a wiki page for changing animations

[ ChadMcOrgans2022 ](https://github.com/ChadMcOrgans2022) committed Nov 28, 2025

4e63cf9

  * this has happened to me twice and it's annoying

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Nov 22, 2025

8004981

  * 1.4.9 update

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Nov 20, 2025

842605f

  * updated format

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Nov 18, 2025

0941483

  * will redo soon

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Nov 16, 2025

478a708

  * how do i mess up this bad

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Nov 13, 2025

4207e92

  * vscode link

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Nov 11, 2025

505b6a7

  * sorry, aftman isn't needed!

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Nov 10, 2025

b981030

  * i forgot

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Nov 8, 2025

f7adbeb

  * joining a project

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 30, 2025

741fd67

  * uh

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 30, 2025

44ba746

  * contributing

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 30, 2025

b1d93e6

  * project json

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 28, 2025

0d27f9d

  * getting started page

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 26, 2025

83f7984

  * important

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 23, 2025

d8e59b0

  * json note

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 23, 2025

ff8523b

  * s

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 20, 2025

89786ec

  * spaces

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 20, 2025

4de9f90

  * screengui creation

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 20, 2025

bb9811f

  * skin creation added

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 20, 2025

b99544d

  * bolding

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 20, 2025

9f73a22

  * rev

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 20, 2025

eabc6f8

  * revision

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 20, 2025

5f92447

  * space fixing

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 20, 2025

b640eee

  * added character definition

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 20, 2025

6f6f0a2

  * test faq

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 20, 2025

4e11d95


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# [History](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/_history) / Home

## Revisions

Compare revisions

  * project json

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 28, 2025

[0d27f9d](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Home/0d27f9d6676efd834e71e67a2a4538b11e1cf649)

  * important

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 23, 2025

[d8e59b0](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Home/d8e59b0a3fdfe05a473c7842aa31d910053e1f2c)

  * json note

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 23, 2025

[ff8523b](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Home/ff8523b52944b776908974d17fd1834e0ed4346f)

  * test faq

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 20, 2025

[4e11d95](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Home/4e11d95fb5ec0888ebf3bd5e9ce4f8d89d466b4f)

  * Initial Home page

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 20, 2025

[4c2170a](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Home/4c2170a67aaaf571e828a3dd017f2b9c6833e403)


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# Contributing

Jump to bottom

LrgeAlvaro8882 edited this page Oct 30, 2025 · [2 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Contributing/_history)

### Quick note

Read [Quick Note](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started#quick-note), [Required VSCode Extensions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started#required-vscode-extensions) and [Recommended VSCode Extensions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started#recommended-vscode-extensions) from [0\. Getting Started](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started).

Also know that I'll refer to **Pull Requests** as **PRs**.

## Creating the PR's repository

First, go to [Dysymmetrical's repository](https://github.com/CodeBotsStudio/Dysymmetrical) and click the button labeled `Fork` at the top right.

Then, leave everything as is _except_ for the name, that'll be named after a summary of 1-3 words of your changes (it can literally be named whatever you want but yeah).

In GitHub Desktop, clone the repository you just created in your local machine (PC) and open it with VSCode. Then, set it up like it says in [0\. Getting Started](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/0.-Getting-Started).

When you get prompted with what you'll use the fork for, indicate that it's for contributing to the parent project.

When you've done your changes and commits, go to your GitHub page and click `Contribute`, then `Open Pull Request`.

Name your PR and describe what you've done in its description, then hit `Create Pull Request`.

After this, your PR will be reviewed and maybe merged into the main branch. You'll also get a thank you. :>

When your PR has been closed, you can remove the PR's repository from your account if you want to.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 1. Creating A Character

Jump to bottom

LrgeAlvaro8882 edited this page Dec 23, 2025 · [5 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/1.-Creating-A-Character/_history)

### Quick note

All of the classes are in `ReplicatedStorage/Classes` (e.g. `Character` & `Ability`). This is useful for type checking and for getting the default settings for each class.

It's also important to use `Class.CreateClass()` to make sure that everything necessary is there and that nothing will break (almost) every time the engine is updated.

For assets (that aren't bound to the character's model) used in abilities, define them in `Character.Config` to be able to change them in skin definitions.

### Making the script

Create a new script in `ReplicatedStorage/Characters/(CHARACTERTYPE)` with your character's name as the script name. It should be formatted without spaces and preferably case-sensitive.

For example, I have a character called "Nullex Voyd", so the script will be called `NullexVoyd.luau` in Git.

The character's model that'll be applied to the player will go in `ReplicatedStorage/Assets/Characters/(CHARACTERTYPE)` with the same name as the script. If it isn't named the same it won't work.

  * If you want to make sure a character model never gets leaked and is 100% secure, place it in `ServerStorage/Assets/Characters/(CHARACTERTYPE)` instead. This is useful for dev characters, as it will disable this character's preview on hover in the shop.

### Writing the script

First, we'll define what's the actual character table. Since Nullex Voyd is a killer, I'll do like so:

  * Get the default settings for the set role of the character
  * Set its `Config` variables (read them in the class for further info)
  * For variables that affect how the gameplay plays out with the character, GameplayConfig is available. Set all of the variables that affect gameplay in abilities there to make sure not to change them in skins.

Now, we'll define every ability. All of the abilities should be in an `Abilities` table in `GameplayConfig`, located in the same place as the `Config` table.

Starting with the slash:

The slash is the easiest out of them all as it's already pre-written. `Slash.Duration` is how long the hitbox will linger when enabled. In the Slash config, you can also set `Slash.Damage`.

After that, you can define any abilities you want. They'll be set in the order that you add them to the final table. As an example I'll use the "Callback Ping" ability for Nullex:

  * We create any constants that don't depend on being unique per player.
  * We define the ability basing off of the default settings.
    * Take into account that `Ability.InputName` takes the name of one of the ability input keys defined in `StarterPlayer/StarterPlayerScripts/InputManager:Init()`.

After defining the Config, we move on to making the ability's behaviour.

**QUICK NOTE:** Abilities also have an optional callback called `Ability:ExtraInit()` that only takes `self: Ability.Ability` as an argument just in case you want to create variables or execute code whenever an ability is initialized.

Instead of doing `Ability.Behaviour = function(self) end` you may also do `function Ability:Behaviour() end` and `self` will still be passed, apart from looking nicer. `Ability:Behaviour()` is first called by the server when it receives a signal and checks if it's possible to use the ability. Then, it sends a signal to the client to execute the same function. So, the functions should be split between client and server for it to work properly. They may also have common code, though on rare occasions.

We do this with every ability we want the character to have and, at the end, we define the ability table with all the abilities in order.

After this, define the character's info that'll show up in its `More Info` page. It's optional when the character isn't finished, but you'll eventually have to do it. Make sure to read the template characters to know how to write this.

Then, we return the character table for usage outside of the module.

### Extra attributes

If the character is supposed to be only for developers, add the `Dev` tag to the script in Studio and move the character's model to `ReplicatedStorage/Assets/Characters/(CHARACTERTYPE)`.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 1. Creating A Character

Jump to bottom

LrgeAlvaro8882 edited this page Nov 18, 2025 · [5 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/1.-Creating-A-Character/_history)

### Quick note

All of the classes are in `ReplicatedStorage/Classes` (e.g. `Character` & `Ability`). This is useful for type checking and for getting the default settings for each class.

It's also important to use `Class:GetDefaultClassSettings()` to make sure that everything necessary is there and that nothing will break (almost) every time the engine is updated.

For assets (that aren't bound to the character's model) used in abilities, define them in `Character.Config` to be able to change them in skin definitions.

### Making the script

Create a new script in `ReplicatedStorage/Characters/(CHARACTERTYPE)` with your character's name as the script name. It should be formatted without spaces and preferably case-sensitive.

For example, I have a character called "Nullex Voyd", so the script will be called `NullexVoyd.luau` in Git.

The character's model that'll be applied to the player will go in `ServerStorage/Assets/Characters/(CHARACTERTYPE)` with the same name as the script. If it isn't named the same it won't work.

### Writing the script

First, we'll define what's the actual character table. Since Nullex Voyd is a killer, I'll do like so:

  * Get the default settings for the set role of the character
  * Set its `Config` variables (read them in the class for further info)
  * For variables that affect how the gameplay plays out with the character, GameplayConfig is available. Set all of the variables that affect gameplay in abilities there to make sure not to change them in skins.

Now, we'll define every ability. All of the abilities should be in an `Abilities` table in `GameplayConfig`, located in the same place as the `Config` table.

Starting with the slash:

The slash is the easiest out of them all as it's already pre-written. `Slash.Duration` is how long the hitbox will linger when enabled. In the Slash config, you can also set `Slash.Damage`.

After that, you can define any abilities you want. They'll be set in the order that you add them to the final table. As an example I'll use the "Callback Ping" ability for Nullex:

  * We create any constants that don't depend on being unique per player.
  * We define the ability basing off of the default settings.
    * Take into account that `Ability.InputName` takes the name of one of the ability input keys defined in `StarterPlayer/StarterPlayerScripts/InputManager:Init()`.

After defining the Config, we move on to making the ability's behaviour.

**QUICK NOTE:** Abilities also have an optional callback called `Ability:ExtraInit()` that only takes `self: Ability.Ability` as an argument just in case you want to create variables or execute code whenever an ability is initialized.

Instead of doing `Ability.Behaviour = function(self) end` you may also do `function Ability:Behaviour() end` and `self` will still be passed, apart from looking nicer. `Ability:Behaviour()` is first called by the server when it receives a signal and checks if it's possible to use the ability. Then, it sends a signal to the client to execute the same function. So, the functions should be split between client and server for it to work properly. They may also have common code, though on rare occasions.

We do this with every ability we want the character to have and, at the end, we define the ability table with all the abilities in order.

After this, define the character's info that'll show up in its `More Info` page. It's optional when the character isn't finished, but you'll eventually have to do it. Make sure to read the template characters to know how to write this.

Then, we return the character table for usage outside of the module.

### Extra attributes

If the character is supposed to be only for developers, add the `Dev` tag to the script in Studio.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 1. Creating A Character

Jump to bottom

LrgeAlvaro8882 edited this page Oct 20, 2025 · [5 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/1.-Creating-A-Character/_history)

### Quick note

All of the classes are in `ReplicatedStorage/Classes` (e.g. `Character` & `Ability`). This is useful for type checking and for getting the default settings for each class.

It's also important to use `Class:GetDefaultClassSettings()` to make sure that everything necessary is there and that nothing will break (almost) every time the engine is updated.

For assets (that aren't bound to the character's model) used in abilities, define them in `Character.Config` to be able to change them in skin definitions.

### Making the script

Create a new script in `ReplicatedStorage/Characters/(CHARACTERTYPE)` with your character's name as the script name. It should be formatted without spaces and preferably case-sensitive.

For example, I have a character called "Nullex Voyd", so the script will be called `NullexVoyd.luau` in Git.

The character's model that'll be applied to the player will go in `ServerStorage/Assets/Characters/(CHARACTERTYPE)` with the same name as the script. If it isn't named the same it won't work.

### Writing the script

First, we'll define what's the actual character table. Since Nullex Voyd is a killer, I'll do like so:

  * Get the default settings for the set role of the character
  * Set its `Config` variables (read them in the class for further info)
  * For variables that affect how the gameplay plays out with the character, GameplayConfig is available. Set all of the variables that affect gameplay in abilities here to make sure not to change them in skins.

Now, we'll define every ability.

Starting with the slash:

The slash is the easiest out of them all as it's already pre-written. `Slash.Duration` is how long the hitbox will linger when enabled. In the Slash config, you can also set `Slash.Damage`.

After that, you can define any abilities you want. They'll be set in the order that you add them to the final table. As an example I'll use the "Callback Ping" ability for Nullex:

  * We create any constants that don't depend on being unique per player.
  * We define the ability basing off of the default settings.
    * Take into account that `Ability.InputName` takes the name of one of the ability input keys defined in `StarterPlayer/StarterPlayerScripts/InputManager:Init()`.

After defining the Config, we move on to making the ability's behaviour.

**QUICK NOTE:** Abilities also have an optional callback called `Ability:ExtraInit()` that only takes `self: Ability.Ability` as an argument just in case you want to create variables or execute code whenever an ability is initialized.

Instead of doing `Ability.Behaviour = function(self) end` you may also do `function Ability:Behaviour() end` and `self` will still be passed, apart from looking nicer. `Ability:Behaviour()` is first called by the server when it receives a signal and checks if it's possible to use the ability. Then, it sends a signal to the client to execute the same function. So, the functions should be split between client and server for it to work properly. They may also have common code, though on rare occasions.

We do this with every ability we want the character to have and, at the end, we define the ability table with all the abilities in order. Then, we return the character table for usage outside of the module.

### Extra attributes

If the character is supposed to be only for developers, add the `Dev` tag to the script in Studio.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 1. Creating A Character

Jump to bottom

LrgeAlvaro8882 edited this page Nov 20, 2025 · [5 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/1.-Creating-A-Character/_history)

### Quick note

All of the classes are in `ReplicatedStorage/Classes` (e.g. `Character` & `Ability`). This is useful for type checking and for getting the default settings for each class.

It's also important to use `Class:GetDefaultClassSettings()` to make sure that everything necessary is there and that nothing will break (almost) every time the engine is updated.

For assets (that aren't bound to the character's model) used in abilities, define them in `Character.Config` to be able to change them in skin definitions.

### Making the script

Create a new script in `ReplicatedStorage/Characters/(CHARACTERTYPE)` with your character's name as the script name. It should be formatted without spaces and preferably case-sensitive.

For example, I have a character called "Nullex Voyd", so the script will be called `NullexVoyd.luau` in Git.

The character's model that'll be applied to the player will go in `ReplicatedStorage/Assets/Characters/(CHARACTERTYPE)` with the same name as the script. If it isn't named the same it won't work.

### Writing the script

First, we'll define what's the actual character table. Since Nullex Voyd is a killer, I'll do like so:

  * Get the default settings for the set role of the character
  * Set its `Config` variables (read them in the class for further info)
  * For variables that affect how the gameplay plays out with the character, GameplayConfig is available. Set all of the variables that affect gameplay in abilities there to make sure not to change them in skins.

Now, we'll define every ability. All of the abilities should be in an `Abilities` table in `GameplayConfig`, located in the same place as the `Config` table.

Starting with the slash:

The slash is the easiest out of them all as it's already pre-written. `Slash.Duration` is how long the hitbox will linger when enabled. In the Slash config, you can also set `Slash.Damage`.

After that, you can define any abilities you want. They'll be set in the order that you add them to the final table. As an example I'll use the "Callback Ping" ability for Nullex:

  * We create any constants that don't depend on being unique per player.
  * We define the ability basing off of the default settings.
    * Take into account that `Ability.InputName` takes the name of one of the ability input keys defined in `StarterPlayer/StarterPlayerScripts/InputManager:Init()`.

After defining the Config, we move on to making the ability's behaviour.

**QUICK NOTE:** Abilities also have an optional callback called `Ability:ExtraInit()` that only takes `self: Ability.Ability` as an argument just in case you want to create variables or execute code whenever an ability is initialized.

Instead of doing `Ability.Behaviour = function(self) end` you may also do `function Ability:Behaviour() end` and `self` will still be passed, apart from looking nicer. `Ability:Behaviour()` is first called by the server when it receives a signal and checks if it's possible to use the ability. Then, it sends a signal to the client to execute the same function. So, the functions should be split between client and server for it to work properly. They may also have common code, though on rare occasions.

We do this with every ability we want the character to have and, at the end, we define the ability table with all the abilities in order.

After this, define the character's info that'll show up in its `More Info` page. It's optional when the character isn't finished, but you'll eventually have to do it. Make sure to read the template characters to know how to write this.

Then, we return the character table for usage outside of the module.

### Extra attributes

If the character is supposed to be only for developers, add the `Dev` tag to the script in Studio and move the character's model to `ReplicatedStorage/Assets/Characters/(CHARACTERTYPE)`.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 2. Creating A Skin

Jump to bottom

LrgeAlvaro8882 edited this page Nov 13, 2025 · [6 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/2.-Creating-A-Skin/_history)

### Quick note

All of the classes are in `ReplicatedStorage/Classes` (e.g. `Character` & `Ability`). This is useful for type checking and for getting the default settings for each class.

It's also important to use `Class:GetDefaultClassSettings()` to make sure that everything necessary is there and that nothing will break (almost) every time the engine is updated.

For assets (that aren't bound to the character's model) used in abilities, define them in `Character.Config` to be able to change them in skin definitions.

### Making the script

Create a new script in `ReplicatedStorage/Characters/Skins/(CHARACTERTYPE)/(CHARACTERNAME)` with the skin's name as the script's name and the character that this skin will be for. Just like the character formatting, the name of the script should be formatted without spaces and preferably case-sensitive.

For example, I have a skin for Nullex called "Cyn" (yes, the Murder Drones character), so the script will be like so: `ReplicatedStorage/Characters/Skins/Nullex Voyd/Cyn.luau`.

The skin's model that'll be applied to the player will go in `ServerStorage/Assets/Characters/Skins/(CHARACTERTYPE)/(CHARACTERNAME)` with the same name as the script. If it isn't named the same it won't work.

### Writing the script

Making a skin is a lot simpler than making a character, as the abilities are already defined and only aesthetics have to be changed.

We have to copy the entire table of the root character from `ReplicatedStorage/Characters/(CHARACTERTYPE)` and change variables from the Config.

  * We define the skin by copying the root character's table over and replace anything. The price will be for the skin and the quote will show up in the buy notification.
  * We simply return the skin table.

You shouldn't change GameplayConfig at all since that would make a skin P2W or P2L. Skins are supposed to be **cosmetic**.

### Extra attributes

If the skin is supposed to be only for developers, add the `Dev` tag to the script in Studio.

If not, if the skin is a milestone, add the `Milestone` tag to the script in Studio.

Any skin that isn't purchasable in the shop should have negative price as the skins in the inventory are ordered by lowest to highest price.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 2. Creating A Skin

Jump to bottom

LrgeAlvaro8882 edited this page Nov 18, 2025 · [6 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/2.-Creating-A-Skin/_history)

### Quick note

All of the classes are in `ReplicatedStorage/Classes` (e.g. `Character` & `Ability`). This is useful for type checking and for getting the default settings for each class.

It's also important to use `Class:GetDefaultClassSettings()` to make sure that everything necessary is there and that nothing will break (almost) every time the engine is updated.

For assets (that aren't bound to the character's model) used in abilities, define them in `Character.Config` to be able to change them in skin definitions.

### Making the script

Create a new script in `ReplicatedStorage/Characters/Skins/(CHARACTERTYPE)/(CHARACTERNAME)` with the skin's name as the script's name and the character that this skin will be for. Just like the character formatting, the name of the script should be formatted without spaces and preferably case-sensitive.

For example, I have a skin for Nullex called "Cyn" (yes, the Murder Drones character), so the script will be like so: `ReplicatedStorage/Characters/Skins/Nullex Voyd/Cyn.luau`.

The skin's model that'll be applied to the player will go in `ServerStorage/Assets/Characters/Skins/(CHARACTERTYPE)/(CHARACTERNAME)` with the same name as the script. If it isn't named the same it won't work.

### Writing the script

Making a skin is a lot simpler than making a character, as the abilities are already defined and only aesthetics have to be changed.

We have to copy the entire table of the root character from `ReplicatedStorage/Characters/(CHARACTERTYPE)` and change variables from the Config.

  * We define the skin by copying the root character's table over and replace anything using `Utils:DeepTableOverwrite()`, which will overwrite any values in the original table that you set in the new one. The price will be for the skin and the quote will show up in the buy notification.
  * We simply return the skin table.

You shouldn't change GameplayConfig at all since that would make a skin P2W or P2L. Skins are supposed to be **cosmetic**.

### Extra attributes

If the skin is supposed to be only for developers, add the `Dev` tag to the script in Studio.

If not, if the skin is a milestone, add the `Milestone` tag to the script in Studio.

Any skin that isn't purchasable in the shop should have negative price as the skins in the inventory are ordered by lowest to highest price.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 2. Creating A Skin

Jump to bottom

LrgeAlvaro8882 edited this page Dec 23, 2025 · [6 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/2.-Creating-A-Skin/_history)

### Quick note

All of the classes are in `ReplicatedStorage/Classes` (e.g. `Character` & `Ability`). This is useful for type checking and for getting the default settings for each class.

It's also important to use `Class.CreateClass()` to make sure that everything necessary is there and that nothing will break (almost) every time the engine is updated.

For assets (that aren't bound to the character's model) used in abilities, define them in `Character.Config` to be able to change them in skin definitions.

### Making the script

Create a new script in `ReplicatedStorage/Characters/Skins/(CHARACTERTYPE)/(CHARACTERNAME)` with the skin's name as the script's name and the character that this skin will be for. Just like the character formatting, the name of the script should be formatted without spaces and preferably case-sensitive.

For example, I have a skin for Nullex called "Cyn" (yes, the Murder Drones character), so the script will be like so: `ReplicatedStorage/Characters/Skins/Nullex Voyd/Cyn.luau`.

The skin's model that'll be applied to the player will go in `ReplicatedStorage/Assets/Characters/Skins/(CHARACTERTYPE)/(CHARACTERNAME)` with the same name as the script. If it isn't named the same it won't work.

  * If you want to make sure a character model never gets leaked and is 100% secure, place it in `ServerStorage/Assets/Characters/(CHARACTERTYPE)/(CHARACTERNAME)` instead. This is useful for dev characters, as it will disable this character's preview on hover in the shop.

### Writing the script

Making a skin is a lot simpler than making a character, as the abilities are already defined and only aesthetics have to be changed.

We have to copy the entire table of the root character from `ReplicatedStorage/Characters/(CHARACTERTYPE)` and change variables from the Config.

  * We define the skin by copying the root character's table over and replace anything using `Utils:DeepTableOverwrite()`, which will overwrite any values in the original table that you set in the new one. The price will be for the skin and the quote will show up in the buy notification.
  * We simply return the skin table.

You shouldn't change GameplayConfig at all since that would make a skin P2W or P2L. Skins are supposed to be **cosmetic**.

### Extra attributes

If the skin is supposed to be only for developers, add the `Dev` tag to the script in Studio and move it to `ServerStorage/Assets/Characters/Skins/(CHARACTERTYPE)/(CHARACTERNAME)`.

If not, if the skin is a milestone, add the `Milestone` tag to the script in Studio and move it to `ServerStorage/Assets/Characters/Skins/(CHARACTERTYPE)/(CHARACTERNAME)`.

Any skin that isn't purchasable in the shop should have negative price as the skins in the inventory are ordered by lowest to highest price.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 2. Creating A Skin

Jump to bottom

LrgeAlvaro8882 edited this page Oct 20, 2025 · [6 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/2.-Creating-A-Skin/_history)

### Quick note

All of the classes are in `ReplicatedStorage/Classes` (e.g. `Character` & `Ability`). This is useful for type checking and for getting the default settings for each class.

It's also important to use `Class:GetDefaultClassSettings()` to make sure that everything necessary is there and that nothing will break (almost) every time the engine is updated.

For assets (that aren't bound to the character's model) used in abilities, define them in `Character.Config` to be able to change them in skin definitions.

### Making the script

Create a new script in `ReplicatedStorage/Characters/Skins/(CHARACTERTYPE)/(CHARACTERNAME)` with the skin's name as the script's name and the character that this skin will be for. Just like the character formatting, the name of the script should be formatted without spaces and preferably case-sensitive.

For example, I have a skin for Nullex called "Cyn" (yes, the Murder Drones character), so the script will be like so: `ReplicatedStorage/Characters/Skins/Nullex Voyd/Cyn.luau`.

The skin's model that'll be applied to the player will go in `ServerStorage/Assets/Characters/(CHARACTERTYPE)/(CHARACTERNAME)` with the same name as the script. If it isn't named the same it won't work.

### Writing the script

Making a skin is a lot simpler than making a character, as the abilities are already defined and only aesthetics have to be changed.

We have to copy the entire table of the root character from `ReplicatedStorage/Characters/(CHARACTERTYPE)` and change variables from the Config.

  * We define the skin by copying the root character's table over and replace anything. The price will be for the skin and the quote will show up in the buy notification.
  * We simply return the skin table.

You shouldn't change GameplayConfig at all since that would make a skin P2W or P2L. Skins are supposed to be **cosmetic**.

### Extra attributes

If the skin is supposed to be only for developers, add the `Dev` tag to the script in Studio.

If not, if the skin is a milestone, add the `Milestone` tag to the script in Studio.

Any skin that isn't purchasable in the shop should have negative price as the skins in the inventory are ordered by lowest to highest price.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 2. Creating A Skin

Jump to bottom

LrgeAlvaro8882 edited this page Nov 20, 2025 · [6 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/2.-Creating-A-Skin/_history)

### Quick note

All of the classes are in `ReplicatedStorage/Classes` (e.g. `Character` & `Ability`). This is useful for type checking and for getting the default settings for each class.

It's also important to use `Class:GetDefaultClassSettings()` to make sure that everything necessary is there and that nothing will break (almost) every time the engine is updated.

For assets (that aren't bound to the character's model) used in abilities, define them in `Character.Config` to be able to change them in skin definitions.

### Making the script

Create a new script in `ReplicatedStorage/Characters/Skins/(CHARACTERTYPE)/(CHARACTERNAME)` with the skin's name as the script's name and the character that this skin will be for. Just like the character formatting, the name of the script should be formatted without spaces and preferably case-sensitive.

For example, I have a skin for Nullex called "Cyn" (yes, the Murder Drones character), so the script will be like so: `ReplicatedStorage/Characters/Skins/Nullex Voyd/Cyn.luau`.

The skin's model that'll be applied to the player will go in `ReplicatedStorage/Assets/Characters/Skins/(CHARACTERTYPE)/(CHARACTERNAME)` with the same name as the script. If it isn't named the same it won't work.

### Writing the script

Making a skin is a lot simpler than making a character, as the abilities are already defined and only aesthetics have to be changed.

We have to copy the entire table of the root character from `ReplicatedStorage/Characters/(CHARACTERTYPE)` and change variables from the Config.

  * We define the skin by copying the root character's table over and replace anything using `Utils:DeepTableOverwrite()`, which will overwrite any values in the original table that you set in the new one. The price will be for the skin and the quote will show up in the buy notification.
  * We simply return the skin table.

You shouldn't change GameplayConfig at all since that would make a skin P2W or P2L. Skins are supposed to be **cosmetic**.

### Extra attributes

If the skin is supposed to be only for developers, add the `Dev` tag to the script in Studio and move it to `ServerStorage/Assets/Characters/Skins/(CHARACTERTYPE)/(CHARACTERNAME)`.

If not, if the skin is a milestone, add the `Milestone` tag to the script in Studio and move it to `ServerStorage/Assets/Characters/Skins/(CHARACTERTYPE)/(CHARACTERNAME)`.

Any skin that isn't purchasable in the shop should have negative price as the skins in the inventory are ordered by lowest to highest price.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 3. Updating Animations

Jump to bottom

ChadMcOrgans2022 edited this page Nov 28, 2025 · [3 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/3.-Updating-Animations/_history)

### Quick Note

The default animations need to be changed no matter what. If you do not change them, you will get an error and the animations won't play.

### Finding your Animation's ID

To find your Animation ID, navigate to your Creator Dashboard and find the animations. Click on the one you want to swap and copy the string of numbers in the link. This is your Animation ID. If you don't own the game place, you may need to allow the game or owner to use the animations.

### Changing the Default Animations

Navigate to ReplicatedStorage/Classes. Open the Character script.

#### Changing the Default **Killer** Animations

Find the function called `CharTypes:GetDefaultKillerSettings()`. Scroll down to the AnimationIDs list. It should look something like this.

        AnimationIDs = {
            IdleAnimation = "rbxassetid://(id)",
            WalkAnimation = "rbxassetid://(id)",
            RunAnimation = "rbxassetid://(id)",
            SlashAnimation = "rbxassetid://(id)",
         },

Swap out the default animation IDs with your animation IDs.

To find these, navigate to your Creator Dashboard and find the animations. Click on the one you want to swap and copy the string of numbers in the link. This is your Animation ID.

#### Changing the Default **Survivor** Animations

Find the function called `CharTypes:GetDefaultSurvivorSettings()`. Scroll down to the AnimationIDs list. Similar to before, it should look something like this.

        AnimationIDs = {
            IdleAnimation = "rbxassetid://(id)",
            WalkAnimation = "rbxassetid://(id)",
            RunAnimation = "rbxassetid://(id)",
         },

Swap out the default animation IDs with your animation IDs.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# 3. Updating Animations

Jump to bottom

ChadMcOrgans2022 edited this page Nov 28, 2025 · [3 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/3.-Updating-Animations/_history)

### Quick Note

The default animations need to be changed no matter what. If you do not change them, you will get an error and the animations won't play.

### Finding your Animation's ID

To find your Animation ID, navigate to your Creator Dashboard and find the animations. Click on the one you want to swap and copy the string of numbers in the link. This is your Animation ID. If you don't own the game place, you may need to allow the game or owner to use the animations.

### Changing the Default Animations

Navigate to ReplicatedStorage/Classes. Open the Character script.

#### Changing the Default **Killer** Animations

Find the function called `CharTypes:GetDefaultKillerSettings()`. Scroll down to the AnimationIDs list. It should look something like this.

        AnimationIDs = {
            IdleAnimation = "rbxassetid://(id)",
            WalkAnimation = "rbxassetid://(id)",
            RunAnimation = "rbxassetid://(id)",
            SlashAnimation = "rbxassetid://(id)",
         },

Swap out the default animation IDs with your animation IDs.

To find these, navigate to your Creator Dashboard and find the animations. Click on the one you want to swap and copy the string of numbers in the link. This is your Animation ID.

#### Changing the Default **Survivor** Animations

Find the function called `CharTypes:GetDefaultSurvivorSettings()`. Scroll down to the AnimationIDs list. Similar to before, it should look something like this.

        AnimationIDs = {
            IdleAnimation = "rbxassetid://(id)",
            WalkAnimation = "rbxassetid://(id)",
            RunAnimation = "rbxassetid://(id)",
         },

Swap out the default animation IDs with your animation IDs.

-# This page was brought to you by: MuffinCakes65

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# History

## Revisions

  * Initial Home page

[ LrgeAlvaro8882 ](https://github.com/LrgeAlvaro8882) committed Oct 20, 2025

4c2170a


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# Home

Jump to bottom

LrgeAlvaro8882 edited this page Oct 23, 2025 · [5 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Home/_history)

Welcome to the Dysymmetrical wiki!

# Frequently Asked Questions

### Q: "What `X.project.json` file to I use in the Rojo sync server?"

A: I always use `default.project.json`. I've never tried `pack.default.json` but I'm sure it works as well.

### Q: "It says that Rojo tries to find a `$path` called 'Packages' and it doesn't serve!"

A: Run `wally install` in the terminal to update your packages.

### Q: "Do I mandatorily _definetly_ have to install and use Rojo to use this engine?"

A: Not really, but it's useful to collaborate with people, to keep To-Do's to date in an easier way, and to update the engine periodically.

### Q: "Can I remove the `print()` statements containing the credits for your engine?"

A: You can as long as you leave credit in the released game's description. Credit is mandatory.

### Q: "When I download the engine to test it, the animations, (probably) abilities and `X` features don't work!"

A: It may be missing permission for assets uploaded by CodeBots or me messing up something specific in the code. Usually my mess-ups are fixed momentarily as I test everything as much as I can. Try to replace the assets and/or wait for updating the engine.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# Home

Jump to bottom

LrgeAlvaro8882 edited this page Oct 20, 2025 · [5 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Home/_history)

Welcome to the Dysymmetrical wiki!

# Frequently Asked Questions

### Q: "Do I mandatorily _definetly_ have to install and use Rojo to use this engine?"

A: Not really, but it's useful to collaborate with people, to keep To-Do's to date in an easier way, and to update the engine periodically.

### Q: "Can I remove the `print()` statements containing the credits for your engine?"

A: You can as long as you leave credit in the released game's description. Credit is mandatory.

### Q: "When I download the engine to test it, the animations, (probably) abilities and `X` features don't work!"

A: It may be missing permission for assets uploaded by CodeBots or me messing up something specific in the code. Usually my mess-ups are fixed momentarily as I test everything as much as I can. Try to replace the assets and/or wait for updating the engine.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# Home

Jump to bottom

LrgeAlvaro8882 edited this page Oct 23, 2025 · [5 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Home/_history)

Welcome to the Dysymmetrical wiki!

# Frequently Asked Questions

### Q: "What `X.project.json` file to I use in the Rojo sync server?"

A: I always use `default.project.json`. I've never tried `pack.default.json` but I'm sure it works as well.

### Q: "Do I mandatorily _definetly_ have to install and use Rojo to use this engine?"

A: Not really, but it's useful to collaborate with people, to keep To-Do's to date in an easier way, and to update the engine periodically.

### Q: "Can I remove the `print()` statements containing the credits for your engine?"

A: You can as long as you leave credit in the released game's description. Credit is mandatory.

### Q: "When I download the engine to test it, the animations, (probably) abilities and `X` features don't work!"

A: It may be missing permission for assets uploaded by CodeBots or me messing up something specific in the code. Usually my mess-ups are fixed momentarily as I test everything as much as I can. Try to replace the assets and/or wait for updating the engine.

### Clone this wiki locally


[ CodeBotsStudio ](https://github.com/CodeBotsStudio) / ** [Dysymmetrical](https://github.com/CodeBotsStudio/Dysymmetrical) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical) You must be signed in to change notification settings
  * [ Fork 13 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)
  * [ Star  32 ](https://github.com/login?return_to=%2FCodeBotsStudio%2FDysymmetrical)

# Home

Jump to bottom

Dyscarn edited this page Oct 20, 2025 · [5 revisions](https://github.com/CodeBotsStudio/Dysymmetrical/wiki/Home/_history)

Welcome to the Dysymmetrical wiki!

### Clone this wiki locally


# VFX Editor

An all-in-one tool for creating visual effects on Roblox.

## Features

This plugin replaces and revamps the functionality of features that previously required multiple plugins to achieve. It includes:

- A custom number sequence editor, supporting a wide range of easing styles and full Bezier curve support.
- A color sequence editor
- A texture storage system, which simulates a custom file system for textures, with full flipbook support.
- Comprehensive support for every relevant property, allowing you to replace multiple plugins and the default Roblox properties window with a single, all-encompassing tool.
- Full support for undo/redo on almost every action.
- Full theme support, with both a default light and dark theme.
- A lightweight mode, offering a stripped-down version of the plugin that includes only the most essential features, designed to mimic the original properties window for a minimal learning curve.

## Getting Started

To get started, you can either get the plugin on the Roblox Marketplace [here](https://create.roblox.com/store/asset/18800449515) for automatic updates, build the plugin yourself or grab it from GitHub releases.

## Installing via GitHub releases
1. Click the latest release under "Releases"
2. Download the "build.rbxm" file
3. Open your Plugins folder (if you are not sure where this is, open Studio, navigate to the Plugins tab and click the "Plugins Folder" button)
4. Drag "build.rbxm" into this folder and restart Studio

## Building

### Prerequisites

To build the plugin, you will need [Aftman](https://github.com/LPGhatguy/aftman), a toolchain manager.

### Instructions

To build the plugin, clone the repository and run the following commands:

```bash
aftman install
lune run build

Then place the `build.rbxm` file in your Roblox plugins folder and restart Roblox Studio.

## Wiki

For more information on how to use the plugin, please refer to the [wiki](https://github.com/VirtualButFake/vfx-editor/wiki)

## Contributing

Contributions are always welcomed. Code should follow Stylua and Selene formatting conventions. To contribute, fork this repository, make your changes, and create a pull request. Please make sure to test your changes before creating a pull request.

In order to run the stories to test your code, place a .luau file with the following code in your plugins folder:

```luau
plugin.Name = "plugin"

and make sure that `Plugin Debugging` is enabled in the Studio settings.
This will then allow the components to find a plugin when needed. [Flipbook](https://github.com/flipbook-labs/flipbook) is recommended as the storybook plugin.

This plugin is by no means perfect. If you find any bugs or have any suggestions, please create an issue.

## Changelog

For a full list of changes, please refer to the [changelog](CHANGELOG.md).

## License

This project is licensed under the MIT License - see the [LICENSE.md](https://github.com/virtualbutfake/vfx-editor/blob/main/LICENSE.md) file for details.


[ VirtualButFake ](https://github.com/VirtualButFake) / ** [vfx-editor](https://github.com/VirtualButFake/vfx-editor) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor) You must be signed in to change notification settings
  * [ Fork 1 ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor)
  * [ Star  21 ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor)

# Home

Jump to bottom

Tijn Epema edited this page Oct 8, 2024 · [12 revisions](https://github.com/VirtualButFake/vfx-editor/wiki/Home/_history)

# Introduction

Welcome to the VFX Editor User Guide. The plugin is relatively straightforward, but features some powerful tools that aren't obvious at first glance. This guide will help you get the most out of the plugin.

Each tool and feature in the plugin will be shortly explained, per interface.

## Main Interface

By default, the default interface features a topbar that contains a list of the current items, a button to add the currently selected item in the Explorer, a button to open the Texture Storage and a button to open the settings.

Below that, a search bar is available. This allows you to search either on instance names or on their properties.

The instance view is visible below the search bar. This view shows, by default, a tree view with all of the descendants of your selected instance. All properties will be visible in the properties view, sorted by category, which are all collapsible, just like the sub-instances.

Right clicking on an instance will open up a context menu, featuring a button to delete the instance, create a new tab for it, select it in the explorer and a button to to collapse it's descendants and properties. On "container" elements, which are Parts, Models and Attachments, there is an additional Insert Object button.

Holding the control key while clicking a property will select it. Selecting another property while holding control will add it to the selection, **if the types match**. A type is determined based on the following rules:

  * Are the properties of a similiar (primitive) type? (e.g. number, string, boolean, Color3, NumberSequence, etc.)
  * Do the properties serve a similiar purpose, and function by the same rules (e.g. Size and Transparency are both a NumberSequence, but have different purposes and rules)

If the types match, the property will be highlighted when hovering over it and holding the control key. Selection this way supports an unlimited amount of properties. Changes made to any selected property will replicate to all other selected properties. This way, editing multiple properties at once is made easy.

Right clicking a property will allow you to copy it's value or paste it's value to another property. This follows the same rules as the selection.

Also, something to keep in mind while using the plugin is that changes are recorded automatically and can be reverted through CTRL+Z. This is also the case for changes made to multiple properties at once.

## Texture Storage/Picker

The texture picker contains a simple file system in which textures and folders can be stored up to any depth. This menu can be opened by clicking the Texture Storage button in the topbar, or by clicking a texture property.

Within this view, textures or folders can be created using the plus button in the top right. Alternatively, you can import data through the import button, allowing you to import via instances (allowing you to easily import e.g. VFX baseplates) or JSON, which allows you to share textures with others. You can also export data into JSON through the export button, which allows you to export either your current folder or the entire storage.

When you've got a list of textures, you can hold the control key to select multiple textures. Alternatively, you can hold shift and click to select a range of textures. You can then right click to open up a context menu that allows you to move or delete the textures.

When you right click a texture, you can edit it, move it or delete it. The texture storage has full support for flipbooks and displays them in the editor, but requires HTTP request support to display some textures. If a texture is not displayed, turn on HTTP requests in the Studio settings.

## NumberSequence Editor

The NumberSequence editor is a carbon copy of the existing Studio editor, with a few added features. Clicking in the graph will place a graph point which is by default linearly interpolated. However, right clicking will open up a context menu in which easing styles and directions can be configured. Selecting "bezier" will show handles that can be dragged in order to customize the bezier curve. These styles will be saved through attributes. If this attribute is lost, all easing data will be reset and a new curve will be generated based on the current points.

Nodes can be dragged around freely and order will be arranged depending on position. The envelope handle can be dragged up and down freely and will limit itself based on the maximum and minimum values set.

Values can also be customized by hand through the text boxes in the bottom of the screen.

## ColorSequence Editor

The ColorSequence editor is just a visual and functional refresh of the existing editor. As such, there's no new features to be found here and usage should be fairly straightforward.

## Settings

The settings allow you to customize certain aspects of the plugin. The available options are:

  * **Lightweight Mode**: This feature is further explained below.
  * **Max Instance Depth**: The max depth the instance tree will show. This is useful for performance reasons, as the plugin will have to load all instances and their properties.
  * **Max Size**: "Size" properties have a set upper limit by Roblox. This setting allows you to set a custom limit for these properties, which is useful when you want to make particularly large effects.
  * **Max Squash:**: The exact same as the Max Size setting, but for "Squash" properties.
  * **Treeview Virtual Scroller**: The tree view contains thousands of UI instances and can be slow to scroll. This setting will unload all properties until they are in view. This will reduce lag at the cost of visual fidelity, as properties may take a moment to load in. These properties are however cached, and the initial performance hit will only be present the first time you scroll to a new instance.
  * **Graph Editor Default Style**: The default style for the graph editor when creating new nodes. The default is "Linear".

## Lightweight Mode

We recognize that getting used to the plugin may require an initial learning curve. We want to make this plugin as easy to use as possible, and as such, Lightweight Mode was created. It is designed to mimic the existing Studio properties window as closely as possible, while still offering the benefits of the plugin. This mode can be toggled in the settings. We recommend you to place this mode where you'd normally place your properties window.

This mode gets rid of the topbar, search mode dropdown and instance headers (as long as there is only one instance). When multiple instances are selected, each instance will be individually displayed with their headers, allowing modification of multiple properties through holding control. The children are not shown.

### Clone this wiki locally


[ VirtualButFake ](https://github.com/VirtualButFake) / ** [vfx-editor](https://github.com/VirtualButFake/vfx-editor) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor) You must be signed in to change notification settings
  * [ Fork 1 ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor)
  * [ Star  21 ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor)

# [History](https://github.com/VirtualButFake/vfx-editor/wiki/_history) / Home

## Revisions

Compare revisions

  * Updated Home (markdown)

[ VirtualButFake ](https://github.com/VirtualButFake) committed Oct 8, 2024

[2fc52ef](https://github.com/VirtualButFake/vfx-editor/wiki/Home/2fc52ef7ab9774e86af80d8b05d91f4f80c8d473)

  * Updated Home (markdown)

[ VirtualButFake ](https://github.com/VirtualButFake) committed Aug 4, 2024

[127001a](https://github.com/VirtualButFake/vfx-editor/wiki/Home/127001a32ed106aca86539d1cc504a4530a0c44e)

  * Merge branch 'master' of https://github.com/VirtualButFake/vfx-editor.wiki

[ VirtualButFake ](https://github.com/VirtualButFake) committed Aug 4, 2024

[4e53fa6](https://github.com/VirtualButFake/vfx-editor/wiki/Home/4e53fa639131da8880ab9681e9b99cc95eb206d6)

  * edit images

[ VirtualButFake ](https://github.com/VirtualButFake) committed Aug 4, 2024

[f9d6053](https://github.com/VirtualButFake/vfx-editor/wiki/Home/f9d60531adea058217b47f98ab18d60993c521f7)

  * Updated Home (markdown)

[ VirtualButFake ](https://github.com/VirtualButFake) committed Jul 29, 2024

[2cfbbd4](https://github.com/VirtualButFake/vfx-editor/wiki/Home/2cfbbd4651ac01b4920b763f647b99af0f40a7b5)

  * set up wiki

[ VirtualButFake ](https://github.com/VirtualButFake) committed Jul 29, 2024

[95f3340](https://github.com/VirtualButFake/vfx-editor/wiki/Home/95f334019a83853afee3433c8c3027fc7f79fa98)

  * add headers

[ VirtualButFake ](https://github.com/VirtualButFake) committed Jul 27, 2024

[ef35dd8](https://github.com/VirtualButFake/vfx-editor/wiki/Home/ef35dd89445f01d458dfe5f7aaf3aabc915300a0)

  * test commit signing

[ VirtualButFake ](https://github.com/VirtualButFake) committed Jul 27, 2024

[e499a0f](https://github.com/VirtualButFake/vfx-editor/wiki/Home/e499a0f3aa9f59a9f3b1d17440abcafe23276b71)

  * remove header

[ VirtualButFake ](https://github.com/VirtualButFake) committed Jul 27, 2024

[c26b276](https://github.com/VirtualButFake/vfx-editor/wiki/Home/c26b276dac26535f53170bf3844b0428d1c8bb4f)

  * test

[ VirtualButFake ](https://github.com/VirtualButFake) committed Jul 27, 2024

[71be75b](https://github.com/VirtualButFake/vfx-editor/wiki/Home/71be75b63076999e77563a998d85bf8e0b3a1b6f)

  * test

[ VirtualButFake ](https://github.com/VirtualButFake) committed Jul 27, 2024

[dad8d6c](https://github.com/VirtualButFake/vfx-editor/wiki/Home/dad8d6c4e5765c3ca9b51d3a640655edf5fb98c6)

  * Initial Home page

[ VirtualButFake ](https://github.com/VirtualButFake) committed Jul 27, 2024

[f828085](https://github.com/VirtualButFake/vfx-editor/wiki/Home/f828085768dd6c81d505a463d30e44210168276c)


[ VirtualButFake ](https://github.com/VirtualButFake) / ** [vfx-editor](https://github.com/VirtualButFake/vfx-editor) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor) You must be signed in to change notification settings
  * [ Fork 1 ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor)
  * [ Star  21 ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor)

# History

## Revisions

Compare revisions

  * Updated Home (markdown)

[ VirtualButFake ](https://github.com/VirtualButFake) committed Oct 8, 2024

2fc52ef

  * Updated Home (markdown)

[ VirtualButFake ](https://github.com/VirtualButFake) committed Aug 4, 2024

127001a

  * Merge branch 'master' of https://github.com/VirtualButFake/vfx-editor.wiki

[ VirtualButFake ](https://github.com/VirtualButFake) committed Aug 4, 2024

4e53fa6

  * edit images

[ VirtualButFake ](https://github.com/VirtualButFake) committed Aug 4, 2024

f9d6053

  * Updated Home (markdown)

[ VirtualButFake ](https://github.com/VirtualButFake) committed Jul 29, 2024

2cfbbd4

  * set up wiki

[ VirtualButFake ](https://github.com/VirtualButFake) committed Jul 29, 2024

95f3340

  * add headers

[ VirtualButFake ](https://github.com/VirtualButFake) committed Jul 27, 2024

ef35dd8

  * test commit signing

[ VirtualButFake ](https://github.com/VirtualButFake) committed Jul 27, 2024

e499a0f

  * remove header

[ VirtualButFake ](https://github.com/VirtualButFake) committed Jul 27, 2024

c26b276

  * test

[ VirtualButFake ](https://github.com/VirtualButFake) committed Jul 27, 2024

71be75b

  * test

[ VirtualButFake ](https://github.com/VirtualButFake) committed Jul 27, 2024

dad8d6c

  * Initial Home page

[ VirtualButFake ](https://github.com/VirtualButFake) committed Jul 27, 2024

f828085

  * Simple tips and tricks that the plugin doesn't really tell you about

[ VirtualButFake ](https://github.com/VirtualButFake) committed Jul 27, 2024

34221c2


[ VirtualButFake ](https://github.com/VirtualButFake) / ** [vfx-editor](https://github.com/VirtualButFake/vfx-editor) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor) You must be signed in to change notification settings
  * [ Fork 1 ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor)
  * [ Star  21 ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor)

# Home

Jump to bottom

Virtual edited this page Aug 4, 2024 · [12 revisions](https://github.com/VirtualButFake/vfx-editor/wiki/Home/_history)

# Introduction

Welcome to the VFX Editor User Guide. The plugin is relatively straightforward, but features some powerful tools that aren't obvious at first glance. This guide will help you get the most out of the plugin.

Each tool and feature in the plugin will be shortly explained, per interface.

## Main Interface

By default, the default interface features a topbar that contains a list of the current items, a button to add the currently selected item in the Explorer, a button to open the Texture Storage and a button to open the settings.

Below that, a search bar is available. This allows you to search either on instnace names or on their properties.

The instance view is visible below the search bar. This view shows, by default, a tree view with all of the descendants of your selected instance. All properties will be visible in the properties view, sorted by category, which are all collapsible, just like the sub-instances.

Right clicking on an instance will open up a context menu, featuring a button to delete the instance, create a new tab for it, select it in the explorer and a button to to collapse it's descendants and properties. On "container" elements, which are Parts, Models and Attachments, there is an additional Insert Object button.

Holding the control key while clicking a property will select it. Selecting another property while holding control will add it to the selection, **if the types match**. A type is determined based on the following rules:

  * Are the properties of a similiar (primitive) type? (e.g. number, string, boolean, Color3, NumberSequence, etc.)
  * Do the properties serve a similiar purpose, and function by the same rules (e.g. Size and Transparency are both a NumberSequence, but have different purposes and rules)

If the types match, the property will be highlighted when hovering over it and holding the control key. Selection this way supports an unlimited amount of properties. Changes made to any selected property will replicate to all other selected properties. This way, editing multiple properties at once is made easy.

Right clicking a property will allow you to copy it's value or paste it's value to another property. This follows the same rules as the selection.

Also, something to keep in mind while using the plugin is that changes are recorded automatically and can be reverted through CTRL+Z. This is also the case for changes made to multiple properties at once.

## Texture Storage/Picker

The texture picker contains a simple file system in which textures and folders can be stored up to any depth. This menu can be opened by clicking the Texture Storage button in the topbar, or by clicking a texture property.

Within this view, textures or folders can be created using the plus button in the top right. Alternatively, you can import data through the import button, allowing you to import via instances (allowing you to easily import e.g. VFX baseplates) or JSON, which allows you to share textures with others. You can also export data into JSON through the export button, which allows you to export either your current folder or the entire storage.

When you've got a list of textures, you can hold the control key to select multiple textures. Alternatively, you can hold shift and click to select a range of textures. You can then right click to open up a context menu that allows you to move or delete the textures.

When you right click a texture, you can edit it, move it or delete it. The texture storage has full support for flipbooks and displays them in the editor, but requires HTTP request support to display some textures. If a texture is not displayed, turn on HTTP requests in the Studio settings.

## NumberSequence Editor

The NumberSequence editor is a carbon copy of the existing Studio editor, with a few added features. Clicking in the graph will place a graph point which is by default linearly interpolated. However, right clicking will open up a context menu in which easing styles and directions can be configured. Selecting "bezier" will show handles that can be dragged in order to customize the bezier curve. These styles will be saved through attributes. If this attribute is lost, all easing data will be reset and a new curve will be generated based on the current points.

Nodes can be dragged around freely and order will be arranged depending on position. The envelope handle can be dragged up and down freely and will limit itself based on the maximum and minimum values set.

Values can also be customized by hand through the text boxes in the bottom of the screen.

## ColorSequence Editor

The ColorSequence editor is just a visual and functional refresh of the existing editor. As such, there's no new features to be found here and usage should be fairly straightforward.

## Settings

The settings allow you to customize certain aspects of the plugin. The available options are:

  * **Lightweight Mode**: This feature is further explained below.
  * **Max Instance Depth**: The max depth the instance tree will show. This is useful for performance reasons, as the plugin will have to load all instances and their properties.
  * **Max Size**: "Size" properties have a set upper limit by Roblox. This setting allows you to set a custom limit for these properties, which is useful when you want to make particularly large effects.
  * **Max Squash:**: The exact same as the Max Size setting, but for "Squash" properties.
  * **Treeview Virtual Scroller**: The tree view contains thousands of UI instances and can be slow to scroll. This setting will unload all properties until they are in view. This will reduce lag at the cost of visual fidelity, as properties may take a moment to load in. These properties are however cached, and the initial performance hit will only be present the first time you scroll to a new instance.
  * **Graph Editor Default Style**: The default style for the graph editor when creating new nodes. The default is "Linear".

## Lightweight Mode

We recognize that getting used to the plugin may require an initial learning curve. We want to make this plugin as easy to use as possible, and as such, Lightweight Mode was created. It is designed to mimic the existing Studio properties window as closely as possible, while still offering the benefits of the plugin. This mode can be toggled in the settings. We recommend you to place this mode where you'd normally place your properties window.

This mode gets rid of the topbar, search mode dropdown and instance headers (as long as there is only one instance). When multiple instances are selected, each instance will be individually displayed with their headers, allowing modification of multiple properties through holding control. The children are not shown.

### Clone this wiki locally


[ VirtualButFake ](https://github.com/VirtualButFake) / ** [vfx-editor](https://github.com/VirtualButFake/vfx-editor) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor) You must be signed in to change notification settings
  * [ Fork 1 ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor)
  * [ Star  21 ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor)

# Home

Jump to bottom

Virtual edited this page Jul 27, 2024 · [12 revisions](https://github.com/VirtualButFake/vfx-editor/wiki/Home/_history)

## Introduction

Welcome to the VFX Editor User Guide. The plugin is relatively straightforward, but features some powerful tools that aren't obvious at first glance. This guide will help you get the most out of the plugin.

We will explain each of the tools and features in the plugin and go through tips on how to use them more effectively.

### Clone this wiki locally


[ VirtualButFake ](https://github.com/VirtualButFake) / ** [vfx-editor](https://github.com/VirtualButFake/vfx-editor) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor) You must be signed in to change notification settings
  * [ Fork 1 ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor)
  * [ Star  21 ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor)

# Home

Jump to bottom

Virtual edited this page Jul 29, 2024 · [12 revisions](https://github.com/VirtualButFake/vfx-editor/wiki/Home/_history)

# Introduction

Welcome to the VFX Editor User Guide. The plugin is relatively straightforward, but features some powerful tools that aren't obvious at first glance. This guide will help you get the most out of the plugin.

Each tool and feature in the plugin will be shortly explained, per interface.

## Main Interface

By default, the default interface features a topbar that contains a list of the current items, a button to add the currently selected item in the Explorer, a button to open the Texture Storage and a button to open the settings.

Below that, a search bar is available. This allows you to search either on instnace names or on their properties.

The instance view is visible below the search bar. This view shows, by default, a tree view with all of the descendants of your selected instance. All properties will be visible in the properties view, sorted by category, which are all collapsible, just like the sub-instances.

Right clicking on an instance will open up a context menu, featuring a button to delete the instance, create a new tab for it, select it in the explorer and a button to to collapse it's descendants and properties. On "container" elements, which are Parts, Models and Attachments, there is an additional Insert Object button.

Holding the control key while clicking a property will select it. Selecting another property while holding control will add it to the selection, **if the types match**. A type is determined based on the following rules:

  * Are the properties of a similiar (primitive) type? (e.g. number, string, boolean, Color3, NumberSequence, etc.)
  * Do the properties serve a similiar purpose, and function by the same rules (e.g. Size and Transparency are both a NumberSequence, but have different purposes and rules)

If the types match, the property will be highlighted when hovering over it and holding the control key. Selection this way supports an unlimited amount of properties. Changes made to any selected property will replicate to all other selected properties. This way, editing multiple properties at once is made easy.

Right clicking a property will allow you to copy it's value or paste it's value to another property. This follows the same rules as the selection.

Also, something to keep in mind while using the plugin is that changes are recorded automatically and can be reverted through CTRL+Z. This is also the case for changes made to multiple properties at once.

## Texture Storage/Picker

The texture picker contains a simple file system in which textures and folders can be stored up to any depth. This menu can be opened by clicking the Texture Storage button in the topbar, or by clicking a texture property.

Within this view, textures or folders can be created using the plus button in the top right. Alternatively, you can import data through the import button, allowing you to import via instances (allowing you to easily import e.g. VFX baseplates) or JSON, which allows you to share textures with others. You can also export data into JSON through the export button, which allows you to export either your current folder or the entire storage.

When you've got a list of textures, you can hold the control key to select multiple textures. Alternatively, you can hold shift and click to select a range of textures. You can then right click to open up a context menu that allows you to move or delete the textures.

When you right click a texture, you can edit it, move it or delete it. The texture storage has full support for flipbooks and displays them in the editor, but requires HTTP request support to display some textures. If a texture is not displayed, turn on HTTP requests in the Studio settings.

## NumberSequence Editor

The NumberSequence editor is a carbon copy of the existing Studio editor, with a few added features. Clicking in the graph will place a graph point which is by default linearly interpolated. However, right clicking will open up a context menu in which easing styles and directions can be configured. Selecting "bezier" will show handles that can be dragged in order to customize the bezier curve. These styles will be saved through attributes. If this attribute is lost, all easing data will be reset and a new curve will be generated based on the current points.

Nodes can be dragged around freely and order will be arranged depending on position. The envelope handle can be dragged up and down freely and will limit itself based on the maximum and minimum values set.

Values can also be customized by hand through the text boxes in the bottom of the screen.

## ColorSequence Editor

The ColorSequence editor is just a visual and functional refresh of the existing editor. As such, there's no new features to be found here and usage should be fairly straightforward.

## Settings

The settings allow you to customize certain aspects of the plugin. The available options are:

  * **Lightweight Mode**: This feature is further explained below.
  * **Max Instance Depth**: The max depth the instance tree will show. This is useful for performance reasons, as the plugin will have to load all instances and their properties.
  * **Max Size**: "Size" properties have a set upper limit by Roblox. This setting allows you to set a custom limit for these properties, which is useful when you want to make particularly large effects.
  * **Max Squash:**: The exact same as the Max Size setting, but for "Squash" properties.
  * **Treeview Virtual Scroller**: The tree view contains thousands of UI instances and can be slow to scroll. This setting will unload all properties until they are in view. This will reduce lag at the cost of visual fidelity, as properties may take a moment to load in. These properties are however cached, and the initial performance hit will only be present the first time you scroll to a new instance.
  * **Graph Editor Default Style**: The default style for the graph editor when creating new nodes. The default is "Linear".

## Lightweight Mode

We recognize that getting used to the plugin may require an initial learning curve. We want to make this plugin as easy to use as possible, and as such, Lightweight Mode was created. It is designed to mimic the existing Studio properties window as closely as possible, while still offering the benefits of the plugin. This mode can be toggled in the settings. We recommend you to place this mode where you'd normally place your properties window.

This mode gets rid of the topbar, search mode dropdown and instance headers (as long as there is only one instance). When multiple instances are selected, each instance will be individually displayed with their headers, allowing modification of multiple properties through holding control. The children are not shown.

### Clone this wiki locally


[ VirtualButFake ](https://github.com/VirtualButFake) / ** [vfx-editor](https://github.com/VirtualButFake/vfx-editor) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor) You must be signed in to change notification settings
  * [ Fork 1 ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor)
  * [ Star  21 ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor)

# Home

Jump to bottom

Tijn Epema edited this page Jul 29, 2024 · [12 revisions](https://github.com/VirtualButFake/vfx-editor/wiki/Home/_history)

# Introduction

Welcome to the VFX Editor User Guide. The plugin is relatively straightforward, but features some powerful tools that aren't obvious at first glance. This guide will help you get the most out of the plugin.

Each tool and feature in the plugin will be shortly explained, per interface.

## Main Interface

By default, the default interface features a topbar that contains a list of the current items, a button to add the currently selected item in the Explorer, a button to open the Texture Storage and a button to open the settings.

Below that, a search bar is available. This allows you to search either on instnace names or on their properties.

The instance view is visible below the search bar. This view shows, by default, a tree view with all of the descendants of your selected instance. All properties will be visible in the properties view, sorted by category, which are all collapsible, just like the sub-instances.

Right clicking on an instance will open up a context menu, featuring a button to delete the instance, create a new tab for it, select it in the explorer and a button to to collapse it's descendants and properties. On "container" elements, which are Parts, Models and Attachments, there is an additional Insert Object button.

Holding the control key while clicking a property will select it. Selecting another property while holding control will add it to the selection, **if the types match**. A type is determined based on the following rules:

  * Are the properties of a similiar (primitive) type? (e.g. number, string, boolean, Color3, NumberSequence, etc.)
  * Do the properties serve a similiar purpose, and function by the same rules (e.g. Size and Transparency are both a NumberSequence, but have different purposes and rules)

If the types match, the property will be highlighted when hovering over it and holding the control key. Selection this way supports an unlimited amount of properties. Changes made to any selected property will replicate to all other selected properties. This way, editing multiple properties at once is made easy.

Right clicking a property will allow you to copy it's value or paste it's value to another property. This follows the same rules as the selection.

Also, something to keep in mind while using the plugin is that changes are recorded automatically and can be reverted through CTRL+Z. This is also the case for changes made to multiple properties at once.

## Texture Storage/Picker

The texture picker contains a simple file system in which textures and folders can be stored up to any depth. This menu can be opened by clicking the Texture Storage button in the topbar, or by clicking a texture property.

Within this view, textures or folders can be created using the plus button in the top right. Alternatively, you can import data through the import button, allowing you to import via instances (allowing you to easily import e.g. VFX baseplates) or JSON, which allows you to share textures with others. You can also export data into JSON through the export button, which allows you to export either your current folder or the entire storage.

When you've got a list of textures, you can hold the control key to select multiple textures. Alternatively, you can hold shift and click to select a range of textures. You can then right click to open up a context menu that allows you to move or delete the textures.

When you right click a texture, you can edit it, move it or delete it. The texture storage has full support for flipbooks and displays them in the editor, but requires HTTP request support to display some textures. If a texture is not displayed, turn on HTTP requests in the Studio settings.

## NumberSequence Editor

The NumberSequence editor is a carbon copy of the existing Studio editor, with a few added features. Clicking in the graph will place a graph point which is by default linearly interpolated. However, right clicking will open up a context menu in which easing styles and directions can be configured. Selecting "bezier" will show handles that can be dragged in order to customize the bezier curve. These styles will be saved through attributes. If this attribute is lost, all easing data will be reset and a new curve will be generated based on the current points.

Nodes can be dragged around freely and order will be arranged depending on position. The envelope handle can be dragged up and down freely and will limit itself based on the maximum and minimum values set.

Values can also be customized by hand through the text boxes in the bottom of the screen.

## ColorSequence Editor

The ColorSequence editor is just a visual and functional refresh of the existing editor. As such, there's no new features to be found here and usage should be fairly straightforward.

## Settings

The settings allow you to customize certain aspects of the plugin. The available options are:

  * **Lightweight Mode**: This feature is further explained below.
  * **Max Instance Depth**: The max depth the instance tree will show. This is useful for performance reasons, as the plugin will have to load all instances and their properties.
  * **Max Size**: "Size" properties have a set upper limit by Roblox. This setting allows you to set a custom limit for these properties, which is useful when you want to make particularly large effects.
  * **Max Squash:**: The exact same as the Max Size setting, but for "Squash" properties.
  * **Treeview Virtual Scroller**: The tree view contains thousands of UI instances and can be slow to scroll. This setting will unload all properties until they are in view. This will reduce lag at the cost of visual fidelity, as properties may take a moment to load in. These properties are however cached, and the initial performance hit will only be present the first time you scroll to a new instance.
  * **Graph Editor Default Style**: The default style for the graph editor when creating new nodes. The default is "Linear".

## Lightweight Mode

We recognize that getting used to the plugin may require an initial learning curve. We want to make this plugin as easy to use as possible, and as such, Lightweight Mode was created. It is designed to mimic the existing Studio properties window as closely as possible, while still offering the benefits of the plugin. This mode can be toggled in the settings. We recommend you to place this mode where you'd normally place your properties window.

This mode gets rid of the topbar, search mode dropdown and instance headers (as long as there is only one instance). When multiple instances are selected, each instance will be individually displayed with their headers, allowing modification of multiple properties through holding control. The children are not shown.

### Clone this wiki locally


[ VirtualButFake ](https://github.com/VirtualButFake) / ** [vfx-editor](https://github.com/VirtualButFake/vfx-editor) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor) You must be signed in to change notification settings
  * [ Fork 1 ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor)
  * [ Star  21 ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor)

# Home

Jump to bottom

Virtual edited this page Jul 27, 2024 · [12 revisions](https://github.com/VirtualButFake/vfx-editor/wiki/Home/_history)

# Introduction

Welcome to the VFX Editor User Guide. The plugin is relatively straightforward, but features some powerful tools that aren't obvious at first glance. This guide will help you get the most out of the plugin.

We will explain each of the tools and features in the plugin and go through tips on how to use them more effectively.

## Main Interface

## Texture Storage/Editor

## NumberSequence Editor

## ColorSequence Editor

## Settings

## Lightweight Mode

### Clone this wiki locally


[ VirtualButFake ](https://github.com/VirtualButFake) / ** [vfx-editor](https://github.com/VirtualButFake/vfx-editor) ** Public

  * [ Notifications ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor) You must be signed in to change notification settings
  * [ Fork 1 ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor)
  * [ Star  21 ](https://github.com/login?return_to=%2FVirtualButFake%2Fvfx-editor)

# Home

Jump to bottom

Virtual edited this page Jul 27, 2024 · [12 revisions](https://github.com/VirtualButFake/vfx-editor/wiki/Home/_history)

# VFX Editor User Guide

## Introduction

Welcome to the VFX Editor User Guide. The plugin is relatively straightforward, but features some powerful tools that aren't obvious at first glance. This guide will help you get the most out of the plugin.

We will explain each of the tools and features in the plugin and go through tips on how to use them more effectively.

### Clone this wiki locally