创建从另一个脚本启动协同程序的事件

本文关键字:程序 事件 启动 另一个 脚本 创建 | 更新日期: 2023-09-27 18:03:24

我正在制作一个事件,当它触发时,它会执行failLevel的内容。为此,我制作了一个委托

    public delegate Coroutine FailGame(IEnumerator function);
    public static event FailGame gameFailedEvent;

像这样,我为它订阅了适当的功能

void Start ()
    {
        gameFailedEvent += StartCoroutine;
    }

当它从相同的脚本调用时,它就会工作,如下所示:

gameFailedEvent(WaitThenFailLevel());

当这个WaitThenFailLevel((看起来像这样时:

IEnumerator WaitThenFailLevel()
    {
        CharacterController2D.playerDied = true;
        if (CharacterController2D.animState != CharacterController2D.CharAnimStates.fall)
        {
            CharacterController2D.currentImageIndex = 0;
            CharacterController2D.animState = CharacterController2D.CharAnimStates.fall;
        }
        CharacterController2D.movementDisabled = true;
        yield return new WaitForSeconds(0.2f);
        StartCoroutine(ScaleTime(1.0f, 0.0f, 1.2f));
    }

这里很好用。现在,我有了另一个可以杀死玩家的对象(我知道有危险的时候(,我不想再复制粘贴所有东西,我只想让它触发上面脚本中的静态事件。

我确实试过让WaitThenFailGame功能

public static

并使我的所有其他Enumerator都是静态的,但我得到了一个名为"非静态字段需要对象引用…"的错误因此,我尝试了活动的东西。一切都很好,但我不能从另一个脚本中调用事件,因为我不能将上面提到的脚本中的函数传递给它。现在该怎么办?

创建从另一个脚本启动协同程序的事件

下面是示例代码:

EventContainor.cs

public class EventContainer : MonoBehaviour
{
    public static event Action<string> OnGameFailedEvent;
    void Update()
    {
        if (Input.GetKey(KeyCode.R))
        {
            // fire the game failed event when user press R.
            if(OnGameFailedEvent = null)
                OnGameFailedEvent("some value");
        }
    }
}

Listener.cs

public class Listener : MonoBehaviour
{
    void Awake()
    {
        EventContainer.OnGameFailedEvent += EventContainer_OnGameFailedEvent;
    }
    void EventContainer_OnGameFailedEvent (string value)
    {
        StartCoroutine(MyCoroutine(value));
    }
    IEnumerator MyCoroutine(string someParam)
    {
        yield return new WaitForSeconds(5);
        Debug.Log(someParam);
    }
}
using UnityEngine;
public class ScriptA : MonoBehaviour
{
  public ScriptB anyName;

  void Update()
  {
    anyName.DoSomething();
  }
}

using UnityEngine;
public class ScriptB : MonoBehaviour
{
  public void DoSomething()
  {
     Debug.Log("Hi there");
  }
}

这是脚本之间的链接函数,从这里复制,也许协程是一样的,然后你需要在void Start() {}中启动协程,你可能会发现这也很有用。