# Custom commands

The `[Command]` attribute turns any method or property into a command, and will become available for execution in the command field upon recompilation.

## How to create a command <a href="#how-to-create-a-command" id="how-to-create-a-command"></a>

{% tabs %}
{% tab title="Static example" %}

```csharp
using UnityEngine;
using Ghostlike.Commands;

public static class NumberCommands
{
    [Command]
    public static int RandomNumber(int from, int to)
    {
        return Random.Range(from, to);
    }
}
```

The method can be executed immediately by typing: `randomnumber 0 10` in the command field.
{% endtab %}

{% tab title="Non-static example" %}

```csharp
using UnityEngine;
using Ghostlike.Commands;

public class Player : MonoBehaviour
{
    [SerializeField] private float maxHealth;
    private float currentHealth;

    [Command]
    public int Heal(int amount)
    {
        currentHealth += amount;
        currentHealth = Mathf.Clamp(currentHealth, 0, maxHealth);
    }
}
```

Contrary to static methods, a non-static method requires an instance in order to be invoked.

Instances are found automatically with `Object.FindObjectsByType`. This means there is no additional setup required on your part.

Executing the command like this: `heal 10` will heal all instances of `Player` found in the scene. A name can be specified in order to execute the command only on instances with the specified name. It can be specified at the end of the input, prefixed with `@`. Like so: `heal 10 @MyPlayer`.
{% endtab %}
{% endtabs %}
