Как передать в параметр метода метод - Unity

225
06 января 2018, 00:12

Есть Скрипт_1 - SoundManager.cs, в нем содержится:

public IEnumerator playAudio()   {
    SoundSourceCallAnimal.Play(); // AudioSOurce
    yield return new WaitForSeconds(SoundSourceCallAnimal.clip.length);
    //Здесь должен выполняться метод из другого скрипта
}

Скрипт_2:

public void AcceptCameAnimal()      {
        StartCoroutine (SoundManager.Instance.playAudio ("Сюда я должен передать некий метод с параметром int - SwitchVoiceAnimal (randomAnimalShow)"));
    }
private void SwitchVoiceAnimal(int rand)
    {
        switch (rand) 
        {
        case 0: Debug.Log ("Tiger");    SoundManager.Instance.PlayAnimal(rand); break;
        case 1: Debug.Log ("Sheep");    SoundManager.Instance.PlayAnimal(rand); break;
        case 2: Debug.Log ("Pig");      SoundManager.Instance.PlayAnimal(rand); break;
        case 3: Debug.Log ("Monkey");   SoundManager.Instance.PlayAnimal(rand); break;
        case 4: Debug.Log ("Elephant"); SoundManager.Instance.PlayAnimal(rand); break;
        case 5: Debug.Log ("Dog");      SoundManager.Instance.PlayAnimal(rand); break;
        case 6: Debug.Log ("Cow");      SoundManager.Instance.PlayAnimal(rand); break;
        case 7: Debug.Log ("Chicken");  SoundManager.Instance.PlayAnimal(rand); break;
        case 8: Debug.Log ("Cat");      SoundManager.Instance.PlayAnimal(rand); break;
        }
    }

Объясните пожалуйста как такое грамотно реализовывают

Answer 1

Вообще конечно сомнительная затея хотя бы потому что метод playAudio одновременно и является итератором и при этом выполняет какие-то побочные действия, что само по себе выглядит странно, и на мой взгляд это довольно грязный код. Но если очень уж хочется, то в C# есть делегаты, в частности Action:

public IEnumerator playAudio(Action<int> act)   
{
    SoundSourceCallAnimal.Play(); // AudioSOurce
    yield return new WaitForSeconds(SoundSourceCallAnimal.clip.length);
    if(act != null)
        act(10); // вместо 10 можете подставить любое значение типа int
}
//...
public void AcceptCameAnimal()
{
    StartCoroutine (SoundManager.Instance.playAudio(SwitchVoiceAnimal);
}

Однако же на вашем месте я бы пересмотрел логику метода playAudio

READ ALSO
Не воспроизводится музыка - Unity

Не воспроизводится музыка - Unity

При запуске игры, через 20 секунд включается панель, и вызывается метод, в этом методе запускается музыкаПроблема: после запуска метода, музыка...

320
Интерфейс IDisposable

Интерфейс IDisposable

Появились некоторые вопросы касательно реализацию IDisposable по шаблону, который предлагает Микрософт, где еще задействован финализатор

174
SQL query, BETWEEN. Windows forms. Запрос

SQL query, BETWEEN. Windows forms. Запрос

Не работает SQL запрос с BETWEENНеобходимо создавать отчет с данными о пациентах за период времени, заданный пользователем

218
Как начать учить angular [требует правки]

Как начать учить angular [требует правки]

Хочу начать учить Ангуляр, вот только много видеоуроков на ютубе уже устарели, ангуляров уже 5 вроде, а во всяких ответах на Тостере пишут,...

240