# Create Abilities

![](https://1340676967-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M8l5PZfaFjJjqh2m8kH%2Fuploads%2FFcmpMADTcIhLOcYWxlD0%2Fability_1.png?alt=media\&token=bea1f0bf-77e6-495f-a8f4-2b9ec490055d)

### First, Create The Data

To create Abilities you need to create a new `DataEntity` that derives from `AbilityBase`. In Prodigy there are several of these already that are hopefully fairly generic and you can use them for a few similar Abilities with nothing more than VFX and property changes.&#x20;

If you need some custom behavior in a unique ability that the default classes don't provide - just make your own! It's not difficult, just derive from the class you want (like `AbilityBase`) and implement what you want to happen by overriding the abstract class methods. The `AgentAbilities` component in the game will be calling those methods as needed, so you just have to fill them with behavior.

### Check out those options!

The headers for the variables are helpers to indicate when those variables are relevant. Basic info includes cooldowns and channeling information. When you get either **OnBegin** or **OnUse** called you can fire VFX, use any number of `AnimatorOperation`.

**OnBegin** is for when the Agent begin's the ability. Channeling fx would start in "begin".&#x20;

**OnUse** is for when the ability 'occurs'. This is generally the time when you apply damage and effects or forces. This typically gets called back from the Animator which has a component in the Ability state that lets the Agent know when the correct time to 'Use' the ability is. It's the same sort of arrangement used in Melee weapons.

If a cast time is zero, then both of these will fire simultaneously. This arrangement gives you enough control to do most things.
