Функции Invoke и ко. полезные, когда нам из одной функции нужно вызвать другую функцию с задержкой в несколько секунд. Например, после старта уровня, показать панельку с бонусами, но не сразу, а через две секунды:
public void Start() { Invoke("ShowPanel", 2f); } private void ShowPanel() { //show panel there }
Или есть необходимость создавать игровой объект (пулю из пистолета, монстра, выбегающего из-за угла и т.п.) регулярно с определенной периодичностью. Например, через секунду после старта уровня первый раз и каждые три секунды следующий:
public void Start() { InvokeRepeating("SpawnMonster", 1f, 3f); } private void SpawnMonster() { //Spawn monster there }
И все это удобно, но хардкод имен функций приводит к проблемам, принуждающим держать в голове не нужную информацию и затрудняющим поддержку и рефакторинг кода.
Попробуем решить эту проблему, используя возможности языка C# и написать обертки для функций Invoke и ко.:Для начала напишем метод, который достает имя функции из лямбда выражения, вызывающего эту функцию:
private string GetMethodName(Expression expr) { return ((MethodCallExpression) expr.Body).Method.Name; }
После чего, напишем обертку для функции Invoke, которая принимает на вход не имя функции, а лямбду, вызывающую функцию, достает из лямбды имя и вызывает встроенную в Unity функцию Invoke:
protected void Invoke(Expression expr, float time) { Invoke(GetMethodName(expr), time); }
По аналогию оборачиваем все остальные функции, помещаем обертки в базовый класс и пользуемся.
Вышеприведенные примеры теперь будут выглядеть таким образом:
public void Start() { Invoke(() => ShowPanel(), 2f); } private void ShowPanel() { //show panel there }
и
public void Start() { InvokeRepeating(() => SpawnMonster(), 1f, 3f); } private void SpawnMonster() { //Spawn monster there }
Теперь, любое переименование функции во время рефакторинга приведет к ошибке компиляции либо будут переименованы все вызовы функций автоматически утилитами рефакторинга, если используете такие.Обертки для всех Invoke функций можно взять тут: MonoBehaviourBase.csСпасибо за внимание!