Не работает отложенный вызов функции через делегаты

Рейтинг: 0Ответов: 2Опубликовано: 13.07.2023

Я длеаю игру на Unity и пишу функции атаки.

Суть кода в том, чтобы после нажатия кнопки через определённое время вызывалась функция нанесения урона. Когда атака была только одного типа, я справлялся с помощью Invoke("Hitting", time), но появилась атака другого типа со своими приколами, и теперь нужно положить в параметры обеих функций переменные и этот метод уже не катит. Я попробовал задействовать Task с делегатами и вот что вышло:

public class Character : MonoBehaviour
{
    ...
    delegate void DealingDamage(int damageType);
    DealingDamage ddamage;
    ...
    private void Attack()
    {
        if(Input.GetKeyDown(KeyCode.Mouse0))
        {
            ...
            int damageType = 0;
            ddamage = Hitting;
            Action action = () => ddamage(damageType);
            Expectation(action, 750);    // warning CS4014
        }
    }
    public async Task Expectation(Action action, int timeout) // функция вызывается
    {
        await Task.Delay(timeout).ContinueWith(t => action);
         
    }
    private void Hitting(int damageType) //функция не вызывается
    {
        ...
    }

Проблема в том, что Expectation() вызывается, а Hitting() нет и при вызове первой вылезает ошибка.

В общем, что не так и как решить?

Ответы

▲ 1

Вы передаете делагат в качестве параметра но не вызываете его внутри метода Expectation.

public async Task Expectation(Action action, int timeout)
{
    await Task.Delay(timeout);
    action.Invoke();
}
▲ -1

Вместо t=>action написать t=>{action();}