Ability

An ability is split into two classes:

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.

public abstract class Ability<T> : 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.