1max1 писал(а):
Используется csharp
class XXX : MonoBehaviour
{
List<(UnityAction<GameObject> action, int priority)> methods = new List<(UnityAction<GameObject>, int)>();
void Start()
{
AddMethod((arg0) => print(arg0.name), 0);
var go1 = new GameObject("GO_1");
var go2 = new GameObject("GO_2");
var go3 = new GameObject("GO_3");
methods[0].action(go1); // GO_1
methods[0].action(go2); // GO_2
methods[0].action(go3); // GO_3
}
void AddMethod(UnityAction<GameObject> action, int priority)
{
methods.Add((action, priority));
methods.Sort((l, r) => l.priority.CompareTo(r.priority));
}
}
Короче, шаманю, шаманю, а что-то получается, но при этом другое отпадывает )))
Возможно я как-то не очень доходчиво объясняю свою цель. Поясню в кратце.
В процессе игры постоянно появляется потребность запускать методы, но предварительно проверив переменную. Как только переменная условно говоря >0, можно запустить метод. Но пока переменная <0 таких методов в очереди на запуск можно скопиться несколько десятков.
Вывод: мне нужно где-то хранить эти методы. Причём у них есть приоритет очередности запуска между собой, а не просто последовательно по времени их появления. А также, каждый метод должен взять себе параметр именно при своей генерации ,а не при запуске, т.к. потом ссылку на этот параметр можно уже не получить. Поэтому я пытаюсь где-то сохранить метод и параметр, который в него войдёт, и ждать время, когда можно будет его запустить, а не закидывать параметр в тот момент, когда можно его вызвать.
Я пробовал вместо методов использовать корутины с отложенным запуском через waitseconds и пробовал while. Но это всё или зависон игры или большие сложности.
Наверняка это требовалось многим людям и это должно быть как-то прописано в .net.
Поэтому пришёл к выводу попробовать сделать список методов. Но метод должен быть с параметром, который он берёт до попадания в список, а не при вызове, т.к. не возможно синхронизировать какой параметр к какому методу идёт, тем более после пересортировки методов внутри списка.
Поэтому тасуя ваш, свой и код из сети у меня то получается передать метод с нужным параметром в список (подтверждаю дебагом), то просто вызвать его до сортировки,а вот передать метод с нужным параметром, перетасовать его в списке и вызвать уже готовый метод, идущий первый в списке по приоритету пока не получается ))
А ваш код даёт ответы, но вписать в реалии моего скрипта не получается ))
Я не прогер по образованию, а при самостоятельном постижении не получается добиться нужного результата,
Может у вас получится что-то нашаманить?))
Вот мои исходные данные:
// список , куда добавляются методы с параметрами и тут же пересортировываются
public List<(UnityAction<GameObject> action, int priority)> methods = new List<(UnityAction<GameObject>, int)>();
// это выражение работает,
AddMethod((gameObject) => someMethod(gameObject), 1);
// ваш метод кот-ый пересортировывает список (он безотказно работает)
public void AddMethod(UnityAction<GameObject> action, int priority) {
methods.Add((action, priority));
methods.Sort((l, r) => l.prior.CompareTo(r.prior));
}
---
почему-то ругается на invoke в этой строчке
methods[0].action.Invoke(); // берём первое на очереди
мол отсутствует аргумент, соотв-щий какому-то arg0. Про arg0 тоже не понял что это , в инете лазил.
а это выражение работает: параметр gameObject передаётся в в метод в список
methods[0].action(gameObject);
// но это строчка работает только в скрипте, кот-ый лежит на этом gameObject, не могу понять как написать так, чтобы gameObject передать туда ссылкой
----
В общем, вот так. )