Ability =========================================== An ability is split into two classes: .. code-block:: csharp public abstract class AbilityData : RTSScriptableObject, IIconData The data/config half - a plain ``ScriptableObject`` you create asset instances of (icon, sound, etc). Derive your own custom data class from it. .. code-block:: csharp public abstract class Ability : IUnitAbility where T : AbilityData The logic half - a plain C# class (not a ``ScriptableObject``), automatically instantiated at runtime and matched to its data class by the generic argument ``T``. Derive your own custom ability logic from it. It contains several virtual methods ready to be overridden with your own actions (``InitAction``, ``StartUseAction``, ``UpdateAction``, ``CanUse``) — comments in the code should give you more info about it. You can see example ability classes and files — for example ``ChangeWeaponData``/``ChangeWeaponAbility`` or ``CarryOutData``/``CarryOutAbility``. See the **Programming** partition for a full walkthrough of creating your own ability.