订阅Func事件后,不会调用协程方法

时间:2018-05-24 05:24:47

标签: c# unity3d events delegates

在Unity中,我有以下脚本,其中包含一个func,它将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);
        }
    }
}

在我的另一个脚本中,我有一个订阅该方法的Coroutine

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;
    }

}

但我的Bullet脚本中的ShootAt方法永远不会被调用。它似乎甚至没有订阅该活动。我没有任何编译错误。

1 个答案:

答案 0 :(得分:2)

您订阅certificate.pem事件的ShootAt函数不是正常函数。它是一个协程函数,需要使用StartCoroutine来调用它。将OnFire调用放在OnFire.Invoke函数中,它应该可以正常工作。

替换

StartCoroutine

OnFire.Invoke(mousePosition);