Страница 1 из 1

Массив void'ов или запуск рандом функции из списка [РЕШЕНО]

СообщениеДобавлено: 16 янв 2018, 21:57
ВерховныйНоуНейм
Начну по порядку...
Я хочу сделать рандомный выбор раунда(волны монстров)
Что у меня написано на данный момент: (корутина, спавнящая монстров)
Синтаксис:
Используется csharp
IEnumerator round1 (float Seconds) {
                ro_on = true;
                Dodox_left ();
                Dodox_right ();
                yield return new WaitForSeconds(20f);
                Dodox_left ();
                Dodox_right ();
                yield return new WaitForSeconds(20f);
                She_right ();
                yield return new WaitForSeconds(2f);
                Dodox_left ();
                yield return new WaitForSeconds(30f);
                Dodox_right ();
                This_left ();
                yield return new WaitForSeconds(30f);
                Dodox_right ();
                yield return new WaitForSeconds(1f);
                Dodox_right ();
                yield return new WaitForSeconds(1f);
                Dodox_left ();
                yield return new WaitForSeconds(1f);
                Dodox_left ();
                yield return new WaitForSeconds(30f);
                Dodox_left ();
                Dodox_right ();
                She_left ();
                yield return new WaitForSeconds(25f);
                This_left ();
                This_right ();
        }

Dodox_left (); - это индивидуальные функции(которые спавнят монстра с права/лева карты, для удобности)
ну и собственно запускатор:
Синтаксис:
Используется csharp
if (ro == 1 && !ro_on && ff_round.GetComponent<Logo_Text> ().UnStopTimer) {
                        StartCoroutine (round1 (0));
                }

Я бы хотел сделать несколько таких корутин например для первой волны было бы 4 вариации.
Мне нужно чтобы рандомно выбиралась волна из списка СуществующиеКарутины_1[Random.Range(0, 4)];
Или есть другой способ? :-??
PS - Создание массива корутин, и добавление туда существующих, не катит

Re: Массив void'ов или запуск рандомной функции из списка

СообщениеДобавлено: 16 янв 2018, 22:06
samana
ВерховныйНоуНейм писал(а):Мне нужно чтобы рандомно выбиралась волна из списка СуществующиеКарутины_1[Random.Range(0, 4)];

ВерховныйНоуНейм писал(а):PS - Создание массива корутин, и добавление туда существующих, не катит


@-) Сначала вы хотите массив корутин, и тут же говорите что массив не катит... И чем тут помочь?..

Re: Массив void'ов или запуск рандомной функции из списка

СообщениеДобавлено: 16 янв 2018, 22:25
Paul Siberdt
Думаю, до момента создания "массива корутин", имеет смысл выдумывать не разнообразный букет функций, а удобный конфигуратор параметров спавна, чтобы все разнообразности выполнять-таки в одной единственной функции, но с разными входными данными.
Придумайте себе класс(или структуру)-конфиг, который содержит направление, позицию, скорость, периоды, размер сисег, длину перьев и так далее, настругайте себе кучу вариантов в ... хе-хе... массив(или словарик), на все случаи жизни, а потом запускайте функцию спавна, передавая ей один из выдуманных конфигов.

Очень здорово, что автор описал, что хочет сделать, а-то полфорума взялась бы сейчас рассуждать о массивах корутинок, делегированиях, событиях и прочей херотени, к вопросу не относящихся. :)

Re: Массив void'ов или запуск рандомной функции из списка

СообщениеДобавлено: 17 янв 2018, 19:12
ВерховныйНоуНейм
Paul Siberdt писал(а):Думаю, до момента создания "массива корутин", имеет смысл выдумывать не разнообразный букет функций, а удобный конфигуратор параметров спавна, чтобы все разнообразности выполнять-таки в одной единственной функции, но с разными входными данными.
Придумайте себе класс(или структуру)-конфиг, который содержит направление, позицию, скорость, периоды, размер сисег, длину перьев и так далее, настругайте себе кучу вариантов в ... хе-хе... массив(или словарик), на все случаи жизни, а потом запускайте функцию спавна, передавая ей один из выдуманных конфигов.

Очень здорово, что автор описал, что хочет сделать, а-то полфорума взялась бы сейчас рассуждать о массивах корутинок, делегированиях, событиях и прочей херотени, к вопросу не относящихся. :)

Идея понятна, но тут не прокатит. У меня слишком все мудрено

Re: Массив void'ов или запуск рандомной функции из списка

СообщениеДобавлено: 17 янв 2018, 19:14
ВерховныйНоуНейм
samana писал(а):
ВерховныйНоуНейм писал(а):Мне нужно чтобы рандомно выбиралась волна из списка СуществующиеКарутины_1[Random.Range(0, 4)];

ВерховныйНоуНейм писал(а):PS - Создание массива корутин, и добавление туда существующих, не катит


@-) Сначала вы хотите массив корутин, и тут же говорите что массив не катит... И чем тут помочь?..

Я имел ввиду что нельзя добавить в МКорутин[0] = корутина();
Но я тут придумал другой способ. Если сейчас получится - опишу

Re: Массив void'ов или запуск рандомной функции из списка

СообщениеДобавлено: 17 янв 2018, 20:44
ВерховныйНоуНейм
В общем объявил я IEnumerator[] R1
И когда начинаю писать текст корутины то он ругается:
Синтаксис:
Используется csharp
IEnumerator R1[] (float sec) {

}

Как я понял, он говорит, что такое название уже есть
А как быть тогда?
Делать простым рандомом числа Random.Range(1,4)
И если например 3, то запускать R1_3?

Re: Массив void'ов или запуск рандомной функции из списка

СообщениеДобавлено: 17 янв 2018, 20:50
samana
ВерховныйНоуНейм писал(а):
Синтаксис:
Используется csharp
IEnumerator R1[] (float sec) { }


Эта сигнатура метода явно с другой планеты :D

Re: Массив void'ов или запуск рандомной функции из списка

СообщениеДобавлено: 17 янв 2018, 21:02
seaman
Вам бы для начала выучить C#

Re: Массив void'ов или запуск рандомной функции из списка

СообщениеДобавлено: 17 янв 2018, 21:19
ВерховныйНоуНейм
Спасибо за совет, но проблема не решена

Re: Массив void'ов или запуск рандомной функции из списка

СообщениеДобавлено: 17 янв 2018, 21:46
waruiyume
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    private List<IEnumerator> actions = new List<IEnumerator>();

        // Use this for initialization
        void Start ()
    {
                actions.Add(Three());
                actions.Add(Two());
                actions.Add(One());

        actions = actions.OrderBy(a=>Random.value).ToList();

        StartCoroutine(Queue());
    }

    IEnumerator Queue()
    {
        foreach (var a in actions)
        {
            yield return StartCoroutine(a);
        }
    }

    IEnumerator One()
    {
        Debug.Log("1");
        yield return new WaitForSeconds(1);
    }

    IEnumerator Two()
    {
        Debug.Log("2");
        yield return new WaitForSeconds(1);
    }

    IEnumerator Three()
    {
        Debug.Log("3");
        yield return new WaitForSeconds(1);
    }
}

 

Re: Массив void'ов или запуск рандомной функции из списка

СообщениеДобавлено: 17 янв 2018, 22:05
samana
Или ещё вариант, чтобы иметь возможность удобно (в моём понимании) заполнить данные для набора волн.

Этот класс просто хранит в себе набор волн, можно его не модифицировать и создать прямо в вашем классе MonoBeh-a.

Синтаксис:
Используется csharp
// Класс, который содержит в себе наборы волн.
class WaveCollection
{
    // структура, которая содержит данные для одной волны (методы и время)
    internal struct Wave
    {
        public Action[] actions;
        public float waitSeconds;

        public Wave(float waitSeconds, params Action[] actions)
        {
            this.actions = actions;
            this.waitSeconds = waitSeconds;
        }
    }

    // массив всех волн
    public List<Wave> waves = new List<Wave>();

    // метод добавляет новую волну
    public WaveCollection AddActions(float waitSeconds, params Action[] actions)
    {
        waves.Add(new Wave(waitSeconds, actions));
        return this;
    }
}


Как использовать? В вашем классе MonoBeh-а :

Синтаксис:
Используется csharp
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Waves : MonoBehaviour
{
   //--------------------------------------
    WaveCollection wave_1; // первый вариант волны для первого уровня
    WaveCollection wave_2; // второй вариант волны для первого уровня

    WaveCollection[] wavesOfRound_1; // массив, который содержит в себе все варианты волн первого уровня

    void Start()
    {
        // создаём первый вариант волны первого уровня
        wave_1 = new WaveCollection().AddActions(10, This_left, This_right).
                                        AddActions(20, She_left, She_left).
                                        AddActions(0, Dodox_right);

        // создаём второй вариант волны первого уровня
        wave_2 = new WaveCollection().AddActions(20, Dodox_left, Dodox_right, She_left).
                                        AddActions(30, This_right, This_left).
                                        AddActions(20, She_left, She_left).
                                        AddActions(0, Dodox_right, Dodox_right, Dodox_left, She_left, This_right);

        // добалвяем все варинаты волн первого уровня в массив
        wavesOfRound_1 = new WaveCollection[] { wave_1, wave_2 };

        // выбираем случайный вариант волн для первого уровня и запускаем корутину с ним
        StartCoroutine("WaveCoroutine", wavesOfRound_1[UnityEngine.Random.Range(0, wavesOfRound_1.Length)]);
    }

    // корутина принимает параметр коллекщицию волн, будет работать для всех вариантов
    IEnumerator WaveCoroutine(WaveCollection waveCollection)
    {
        for (int i = 0; i < waveCollection.waves.Count; i++)
        {
            foreach (Action action in waveCollection.waves[i].actions) action(); // запускаем все методы из текущей волны

            yield return new WaitForSeconds(waveCollection.waves[i].waitSeconds); // задаём время ожидания из текущей волны
        }
    }


    private void This_right()
    {
        Debug.Log("This_right");
    }

    private void This_left()
    {
        Debug.Log("This_left");
    }

    private void She_left()
    {
        Debug.Log("She_left");
    }

    private void Dodox_right()
    {
        Debug.Log("Dodox_right");
    }

    private void Dodox_left()
    {
        Debug.Log("Dodox_left");
    }
}
 

Re: Массив void'ов или запуск рандомной функции из списка

СообщениеДобавлено: 18 янв 2018, 19:17
ВерховныйНоуНейм
Все работает, спасибо! А также спасибо за потраченное время!
*Осталось под себя подделать и можно пускать в производство. :ymapplause:
Изображение