代码之家  ›  专栏  ›  技术社区  ›  Sean Carey

订阅func事件后未调用coroutine方法

  •  3
  • Sean Carey  · 技术社区  · 8 年前

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

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

    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方法从未被调用。就好像它甚至没有订阅这个活动。我没有任何编译错误。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Programmer    8 年前

    这个 ShootAt 您订阅的函数 OnFire 事件不是正常函数。它是一个协程函数,需要使用 StartCoroutine 叫它。把你的 OnFire.Invoke 呼叫内部 启动协同程序 功能和它应该工作。

    更换

    OnFire.Invoke(mousePosition);
    

    具有

    StartCoroutine(OnFire.Invoke(mousePosition));