Метод сопрограммы не вызывается после подписки на событие Func - PullRequest
0 голосов
/ 24 мая 2018

В Unity у меня есть следующий скрипт, который содержит функцию, которая принимает Vector2 в качестве аргумента и возвращает IEnumerator

using System;
using System.Collections;
using UnityEngine;

public class Weapon : MonoBehaviour
{
    public static event Func<Vector2, IEnumerator> OnFire;

    private void OnMouseDown()
    {
        Fire();
    }

    private void Fire()
    {
        Vector2 mousePosition = new Vector2(Camera.main.ScreenToWorldPoint(Input.mousePosition).x, Camera.main.ScreenToWorldPoint(Input.mousePosition).y);

        if (OnFire != null)
        {
            OnFire.Invoke(mousePosition);
        }
    }
}

В моем другом скрипте у меня есть сопрограмма, которая подписывается на этот метод

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet : MonoBehaviour
{

    private void Start()
    {
        Weapon.OnFire += ShootAt;
    }

    private IEnumerator ShootAt(Vector2 target)
    {
        yield return new WaitForSeconds(.5f);
        print("Shot at " + target);
    }

    private void OnDestroy()
    {
        Weapon.OnFire -= ShootAt;
    }

}

Но метод ShootAt в моем скрипте Bullet никогда не вызывается.Это как если бы оно даже не подписывалось на событие.У меня нет ошибок компиляции.

1 Ответ

0 голосов
/ 24 мая 2018

Функция ShootAt, на которую вы подписываетесь на событие OnFire, не является нормальной функцией.Это функция сопрограммы, для вызова которой необходимо использовать StartCoroutine.Поместите ваш OnFire.Invoke вызов в функцию StartCoroutine, и он должен работать.

Замените

OnFire.Invoke(mousePosition);

на

StartCoroutine(OnFire.Invoke(mousePosition));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...