c# - 订阅 Func 事件后不会调用协程方法

标签 c# unity3d events delegates

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

}

但是我的 Bullet 脚本中的 ShootAt 方法从未被调用。就好像它甚至没有订阅该事件一样。我没有任何编译错误。

最佳答案

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

替换

OnFire.Invoke(mousePosition);

StartCoroutine(OnFire.Invoke(mousePosition));

关于c# - 订阅 Func 事件后不会调用协程方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50501563/

相关文章:

c# - 获取 JSON 数组的长度

c# - 从另一个脚本更改 Int

javascript - 在鼠标事件之间传递数据

android - 单击 ListView 项目会更改项目内元素的状态?

c# - Unity3d 从定时器访问主线程

具有已知事件签名的 C# 2.0 动态事件订阅

c# - 像 C# 方法 IL 一样发出 IL 但获取 System.InvalidProgramException : Common Language Runtime detected an invalid program

c# - MVC5 Razor View String.Join 每次迭代时反转顺序

c# - 静态哈希表应该有多少容量才能最大程度地减少冲突?

c# - 获取满足sql查询的第二条记录