Создайте события, которые запускают сопрограмму из другого скрипта

c# events unity3d coroutine

504 просмотра

2 ответа

Я делаю событие, которое выполняет функцию 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

и сделать статическими все мои другие иенумераторы, но я получил ошибку под названием «Ссылка на объект требуется для нестатического поля ...». Поэтому я пробовал материал события. Все хорошо, но я не могу вызвать событие из другого скрипта, потому что не могу передать ему функцию из упомянутого скрипта. Что делать сейчас?

Автор: agiro Источник Размещён: 08.11.2019 11:28

Ответы (2)


1 плюс

Решение

Вот пример кода:

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

}
Автор: Umair M Размещён: 05.09.2016 05:45

1 плюс

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() {}, вы можете также найти это полезным.

Автор: Ahmed I. Elsayed Размещён: 05.09.2016 05:55
Вопросы из категории :
32x32