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

Программирование на Юнити.

Массив 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 - Создание массива корутин, и добавление туда существующих, не катит
Последний раз редактировалось ВерховныйНоуНейм 18 янв 2018, 19:18, всего редактировалось 1 раз.
Изображение
Аватара пользователя
ВерховныйНоуНейм
UNIт
 
Сообщения: 68
Зарегистрирован: 25 фев 2017, 19:56

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

Сообщение samana 16 янв 2018, 22:06

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

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


@-) Сначала вы хотите массив корутин, и тут же говорите что массив не катит... И чем тут помочь?..
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

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

Сообщение Paul Siberdt 16 янв 2018, 22:25

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

Очень здорово, что автор описал, что хочет сделать, а-то полфорума взялась бы сейчас рассуждать о массивах корутинок, делегированиях, событиях и прочей херотени, к вопросу не относящихся. :)
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

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

Сообщение ВерховныйНоуНейм 17 янв 2018, 19:12

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

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

Идея понятна, но тут не прокатит. У меня слишком все мудрено
Изображение
Аватара пользователя
ВерховныйНоуНейм
UNIт
 
Сообщения: 68
Зарегистрирован: 25 фев 2017, 19:56

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

Сообщение ВерховныйНоуНейм 17 янв 2018, 19:14

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

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


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

Я имел ввиду что нельзя добавить в МКорутин[0] = корутина();
Но я тут придумал другой способ. Если сейчас получится - опишу
Изображение
Аватара пользователя
ВерховныйНоуНейм
UNIт
 
Сообщения: 68
Зарегистрирован: 25 фев 2017, 19:56

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

Сообщение ВерховныйНоуНейм 17 янв 2018, 20:44

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

}

Как я понял, он говорит, что такое название уже есть
А как быть тогда?
Делать простым рандомом числа Random.Range(1,4)
И если например 3, то запускать R1_3?
Изображение
Аватара пользователя
ВерховныйНоуНейм
UNIт
 
Сообщения: 68
Зарегистрирован: 25 фев 2017, 19:56

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

Сообщение samana 17 янв 2018, 20:50

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


Эта сигнатура метода явно с другой планеты :D
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

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

Сообщение seaman 17 янв 2018, 21:02

Вам бы для начала выучить C#
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

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

Сообщение ВерховныйНоуНейм 17 янв 2018, 21:19

Спасибо за совет, но проблема не решена
Изображение
Аватара пользователя
ВерховныйНоуНейм
UNIт
 
Сообщения: 68
Зарегистрирован: 25 фев 2017, 19:56

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

Сообщение waruiyume 17 янв 2018, 21:46

Синтаксис:
Используется 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);
    }
}

 
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

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

Сообщение samana 17 янв 2018, 22:05

Или ещё вариант, чтобы иметь возможность удобно (в моём понимании) заполнить данные для набора волн.

Этот класс просто хранит в себе набор волн, можно его не модифицировать и создать прямо в вашем классе 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");
    }
}
 
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

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

Сообщение ВерховныйНоуНейм 18 янв 2018, 19:17

Все работает, спасибо! А также спасибо за потраченное время!
*Осталось под себя подделать и можно пускать в производство. :ymapplause:
Изображение
Изображение
Аватара пользователя
ВерховныйНоуНейм
UNIт
 
Сообщения: 68
Зарегистрирован: 25 фев 2017, 19:56


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6