在 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/