> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kinemation.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# 💻Extending the System

> In this section you will learn how to create custom animation modules.

## Overview

A procedural animation feature consists of 2 entities:

* **FPSAnimatorLayerSettings:** a Scriptable Object that contains all the data.

* **IAnimationLayerJob:** a struct that executes custom animation logic.

<Tip>
  **Tip**: the framework uses the Animation Job System, which ensures solid performance even with a large number of characters.
</Tip>

If you open up the source code of the framework, you will notice that every layer has its own folder with 2 .cs files:

<Frame caption={"AdditiveLayer example."}>
  <img src="https://mintcdn.com/kinemation/IMbHDDWE_rjJU7jO/images/scriptable-animation-system/bd410a6b13fd3ef7c74c.png?fit=max&auto=format&n=IMbHDDWE_rjJU7jO&q=85&s=bfa4ed62e333d2c20cf69a5a8618ff04" alt="" width={292} data-path="images/scriptable-animation-system/bd410a6b13fd3ef7c74c.png" />
</Frame>

**FPSAnimatorLayerSettings** class is responsible not just for containing the data, but for instantiating the **IAnimationLayerJob** as well:

**CreateAnimationJob()** method must return a new instance of the desired **IAnimationLayerJob**-type. When you link a new **Animator Profile**, the system iterates over all animation features (*Layer Settings*) and then invokes the *CreateAnimationJob()* method to create the *Layer State*.

## Example

First, create a new **FPSAnimatorLayerSettings**-derived class for data, and **IAnimationLayerJob**-implemented struct:

***

In the next chapter, we will learn how to work with the demo project.
