public class SomeGun : Mono
{
[field: SerializeField] GunSO gun {get; set;}
[SerializeField] Animator anim;

int reloadHash;

void Awake()
{
reloadHash = Animator.StringToHash("Reload");
}

public void Init(GunSO source)
{
gun = source;
anim.controller = gun.overrides;
}

public virtual void Reload()
{
Debug.Log($"reloading gun: {gun.fancyName}");
DoReloadLogic(gun.reloadTime);
anim.Play(reloadHash);
}
}

[CreateAssetMenu()]
public class GunSO : ScriptableObject
{
public string fancyName;
public float reloadTime;
public AnimatorOverrideController overrides;
}