Как реализовать сложную очередность методов [РЕШЕНО]

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

Как реализовать сложную очередность методов [РЕШЕНО]

Сообщение greatPretender 27 янв 2020, 22:01

Вечер добрый всем!
Появилась потребность реализовать сложную очередность вызовов методов, но никак не могу достичь нужно результата.
В общем , данность такая:
мой код генерирует Пару:
1- метод, который нужно вызвать и
2- генерирует одну цифру от 1 до 20. Цифра это приоритет вызова данного метода среди всех остальных методов.
Всё это происходит в среднем раз в интервале от 1-ой до 10 секунд.
ИИ всё это по идее должно записать в какой-то список, а потом запускаться по одному методу по очереди .
т.е. набор данных получается такой:
Метод4, 3
Метод3, 5
Метод2, 1
Метод3, 1
Метод2, 5
Метод1, 3

Но мне нужно чтобы запускал эти методы по очереди, чтобы я делал например вызов метода так: List.First или List[0]
и этот список уже был отсортирован по очереди.
Как мне это сделать, если в SirtedList нельзя использовать одинаковые ключи ?
Заранее спасибо)
Последний раз редактировалось greatPretender 29 янв 2020, 16:53, всего редактировалось 1 раз.
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Как реализовать сложную очередность методов

Сообщение 1max1 27 янв 2020, 23:27

Синтаксис:
Используется csharp
class XXX : MonoBehaviour
{
    List<(UnityAction action, int priority)> methods = new List<(UnityAction, int)>();

    void Start()
    {
        for (int i = 0; i < 10; ++i)
        {
            int p = Random.Range(0, 20);
            int _i = i;

            AddMethod(() => print($"i:{_i} p:{p}"), p);
        }

        for (int i = 0; i < 10; ++i)
            methods[i].action.Invoke();
    }

    void AddMethod(UnityAction action, int priority)
    {
        methods.Add((action, priority));

        methods.Sort((l, r) => r.priority.CompareTo(l.priority));
    }
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как реализовать сложную очередность методов

Сообщение greatPretender 28 янв 2020, 19:57

[quote="1max1"][/quote]
В целом, функционально всё понял в вашем коде, спасибо. Вариант с ComparereTo нравится))
Но т.к. я немного некорректно сформулировал задачу у меня несколько вопросов:
1. не могу понять что конкретно происходит в этой сторочке: print($"i:{_i} p:{p}"), p), особенно print и двоеточия. В инете не смог разобрать применительно к вашему варианту.
2. for (int i = 0; i < 10; ++i)
methods[i].action.Invoke();
Здесь у вас вызываются все методы через цикл. Но мне это не нужно.
У меня вызов методов из списка происходит когда определённая переменная становится >0.
Как мне скорректировать ваш вариант кода для запуска первого на очереди метода?
Так правильно?: if (perem > 0) methods[0].action.Invoke(); Вместо i стоит 0, т.к. после вызова данный метод удаляется из списка , список самокорректируется и поэтому я всегда вызываю первый на очереди, ведь в методе AddMethod список всегда отсортирован.
3. methods.Sort((l, r) => r.priority.CompareTo(l.priority)); а вы не знаете как сортируются методы, как расположены в списке , у которых одинаковое значение приоритета?
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Как реализовать сложную очередность методов

Сообщение 1max1 28 янв 2020, 20:37

1. Тоже что и Debug.Log.
2. Я цикл для примера привел, чтобы ты увидел что происходит. Все методы отсортированы по приоритету. Да, первый в списке имеет высший приоритет.
3. Скорей всего если, к примеру, приоритеты будут идти так: "1, 5а, 3, 5б, 5в", то отсортирует так: "5а, 5б, 5в, 3, 1" (буквы тут для наглядности).
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как реализовать сложную очередность методов

Сообщение greatPretender 28 янв 2020, 20:45

1max1 писал(а):1. Тоже что и Debug.Log.
2. Я цикл для примера привел, чтобы ты увидел что происходит. Все методы отсортированы по приоритету. Да, первый в списке имеет высший приоритет.
3. Скорей всего если, к примеру, приоритеты будут идти так: "1, 5а, 3, 5б, 5в", то отсортирует так: "5а, 5б, 5в, 3, 1" (буквы тут для наглядности).

1. и 2. - всё понял. Спасибо.
а по 3-ему вопрос:
а если будет так (3, 2, 2, 1, 7, 3, 1) это всё приоритеты, методы я уж не пишу, не важно.
Я так понял будет примерно так: (1, 1, 2, 2, 3, 3, 7) ?
Но какая из единиц будет первая? Та, что была первой добавлена в список? Или алгоритм при одинаковых сортируемых цифрах не известен для использования кода?
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Как реализовать сложную очередность методов

Сообщение 1max1 28 янв 2020, 20:51

Я так понял будет примерно так: (1, 1, 2, 2, 3, 3, 7) ?

У тебя же сортировка от большего к меньшему. Будет все наоборот.
Но какая из единиц будет первая? Та, что была первой добавлена в список?

Это должно ответить на твои вопросы. Смотри консоль.
Синтаксис:
Используется csharp
class XXX : MonoBehaviour
{
    List<(UnityAction action, int priority)> methods = new List<(UnityAction, int)>();

    void Start()
    {
        AddMethod(() => print("1а"), 1);
        AddMethod(() => print("5a"), 5);
        AddMethod(() => print(3), 3);
        AddMethod(() => print("1б"), 1);
        AddMethod(() => print("5б"), 5);
        AddMethod(() => print(10), 10);
        AddMethod(() => print("5в"), 5);
        AddMethod(() => print(2), 2);
        AddMethod(() => print("1в"), 1);

        for (int i = 0; i < methods.Count; ++i)
            methods[i].action.Invoke();
    }

    void AddMethod(UnityAction action, int priority)
    {
        methods.Add((action, priority));

        methods.Sort((l, r) => r.priority.CompareTo(l.priority));
    }
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как реализовать сложную очередность методов

Сообщение greatPretender 28 янв 2020, 21:09

1max1 писал(а):
Я так понял будет примерно так: (1, 1, 2, 2, 3, 3, 7) ?

У тебя же сортировка от большего к меньшему. Будет все наоборот.
Но какая из единиц будет первая? Та, что была первой добавлена в список?


А как сделать от меньшего к большему? Тк. изначально мне нужно это. Я просто в compareto плаваю, поанализировал Metanit и не понял как мне подправить ваш код
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Как реализовать сложную очередность методов

Сообщение 1max1 28 янв 2020, 21:17

Вот это -> methods.Sort((l, r) => r.priority.CompareTo(l.priority));
замени на это-> methods.Sort((l, r) => l.priority.CompareTo(r.priority));

l и r тут местами поменяны, если что))
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как реализовать сложную очередность методов

Сообщение greatPretender 28 янв 2020, 21:24

1max1 писал(а):Вот это -> methods.Sort((l, r) => r.priority.CompareTo(l.priority));
замени на это-> methods.Sort((l, r) => l.priority.CompareTo(r.priority));

l и r тут местами поменяны, если что))

Всё понял.
Я так и чувствовал что в этом дело, но это не знакомый мне синтаксис и команды.
Спасибо)
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Как реализовать сложную очередность методов

Сообщение greatPretender 30 янв 2020, 16:42

1max1 писал(а):Вот это -

У меня возник вопрос.
По идее мне нужно вместо анонимного метода print (или как он там) здесь : AddMethod(() => print("1а"), 1); передать Метод с параметром или двумя , типо так: AddMethod (Method1 (gmeObject go, int numb), 1);
Можно ли это как-то сделать?
У меня пока только один костыль-вариант. Создать 2-ой список , и когда в 1ый список добавляется метод (точнее буду добавлять не метод, а его номер в массиве методов) и его приоритет, то во 2-ой список добавлять тоже номер этого метода (для синхронизации списков) в массиве и gameObject.
А потом при вызове Method1, я к нему через одинаковый номер в списке 1 и в списке 2 добавляют gameObject как параметр.
Но боюсь , что вдруг в результате добавления/сортировки/удаления произойдёт рассинхронизация соответствия списков между собой и всё пойдёт на перекосяк )))
У вас нет каки-н соображений на этот счёт?))
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Как реализовать сложную очередность методов [РЕШЕНО]

Сообщение 1max1 30 янв 2020, 17:41

Вызвать метод из списка ты можешь через инвок. Можно сделать вызов параметров через костыль, но параметр ты сможешь передать только в начале и все. Можно запариться с массивами как ты написал, но это будет сильно усложнять код, лучше пересмотри реализацию своей идеи, может как-то иначе можно.

Синтаксис:
Используется csharp
class XXX : MonoBehaviour
{
    UnityAction unityAction;

    void Start()
    {
        unityAction = mth1;
        unityAction.Invoke(); // 1

        // unityAction = mth2(333); // так не канает, ошибка
        // надо как-то извращаться
        unityAction = mth3(333);
        // или так
        unityAction = () => print(333);
        unityAction.Invoke(); // 333
    }

    void mth1() { print(1); }

    void mth2(int value) { print(value); }

    UnityAction mth3(int value)
    {
        return () => print(value);
    }
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как реализовать сложную очередность методов [РЕШЕНО]

Сообщение greatPretender 30 янв 2020, 20:51

1max1 писал(а):Вызвать метод из списка ты можешь через инвок. Можно сделать вызов параметров через костыль, но параметр ты сможешь передать только в начале и все. Можно запариться с массивами как ты написал, но это будет сильно усложнять код, лучше пересмотри реализацию своей идеи, может как-то иначе можно.

Синтаксис:
Используется csharp
class XXX : MonoBehaviour
{
    UnityAction unityAction;

    void Start()
    {
        unityAction = mth1;
        unityAction.Invoke(); // 1

        // unityAction = mth2(333); // так не канает, ошибка
        // надо как-то извращаться
        unityAction = mth3(333);
        // или так
        unityAction = () => print(333);
        unityAction.Invoke(); // 333
    }

    void mth1() { print(1); }

    void mth2(int value) { print(value); }

    UnityAction mth3(int value)
    {
        return () => print(value);
    }
}

Честно говоря не понял ни вашу мысль, ни ваш код ))
А можно как-н скорректировать эту вашу строчку :
AddMethod(() => print("1а"), 1);
там где метод вставить метод с параметром, чтобы я как параметр передал gameObject из скрипта?
А если нет, то тот мой вариант со вторым списком мне не сложно сделать, пару минут, главное, можете ли вы подтвердить , что при сортировках они не рассинхронизируются?
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Как реализовать сложную очередность методов [РЕШЕНО]

Сообщение greatPretender 30 янв 2020, 21:26

нашёл в инете такой хитрый код:
this.Include(includes, () =>
{
_context.Cars.Include(<parameters>);
});

можно ли как-то так сделать, если у меня массив из методов такой и каждый метод может брать в качества параметра gameObject:
public UnityAction CallDefence = () => { }; // для массива методов
public UnityAction[] CallDefences; // массив методов
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Как реализовать сложную очередность методов [РЕШЕНО]

Сообщение 1max1 30 янв 2020, 21:32

Я нифига не понял, делай как удобней)
На всякий случай, вот пример кода с объектом в качестве параметра:

Синтаксис:
Используется csharp
class XXX : MonoBehaviour
{
    UnityAction unityAction;

    void Start()
    {
        unityAction = mth(gameObject);
        unityAction();
    }

    UnityAction mth(GameObject go)
    {
        return () =>
        {
            // тут делаешь со своим
            // объектом что хочешь
            print(go.name);
            go.name = "asd";
            // бла бла бла...
        };
    }
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как реализовать сложную очередность методов [РЕШЕНО]

Сообщение Susanin 30 янв 2020, 22:59

Можно юзать паттерн Command
Susanin
UNIт
 
Сообщения: 120
Зарегистрирован: 11 дек 2015, 10:52

След.

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

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

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