Как сделать Массив из методов с параметрами [РЕШЕНО]

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

Как сделать Массив из методов с параметрами [РЕШЕНО]

Сообщение greatPretender 02 июл 2017, 14:31

Нужно сделать массив из методов, в каждый из которых передаются сразу параметры.
Типа такого:
Синтаксис:
Используется csharp
Action[] ArrProbe;
void Start () {
    ArrProbe = new Action[]{Call (numbSub, numbSub), Call (1,2), Call (1,1)}
}
void Call(int type, int count){
}

Но массив по сути будет состоять из одного и того же метода, но с разными параметрами
Юнька ругается : "Cannot implicitly convert type `void' to `System.Action'". Это понятно. Но как это исправить?
Может кто знает как?
Без параметров почему-то работает. Просто методов предполагается штук 15 и из вызов зависит от рандома, т.е. городоить switch/if ваще не вариант.
Заранее спасибо.)
Последний раз редактировалось greatPretender 03 июл 2017, 18:51, всего редактировалось 1 раз.
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Как сделать Массив из методов с параметрами

Сообщение greatPretender 02 июл 2017, 14:48

Засунул всё в словарь.
Синтаксис:
Используется csharp
DictProbe = new Dictionary <int, Action> {
    {1, () => Call (numbSub, numbSub)},
    {2, () => Call (1, 2)},
    {3, () => Call (numbSub, numbSub)},
    {4, () => Call (numbSub, numbSub)}
};

Не знаю, будет ли работать, но ошибка ушла.
Норм?))
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Как сделать Массив из методов с параметрами

Сообщение olegknyazev 03 июл 2017, 08:23

По-моему отличное решение! :)
Soft Mask - A replacement of Unity's UI Mask with alpha blending
Аватара пользователя
olegknyazev
UNец
 
Сообщения: 4
Зарегистрирован: 02 июл 2017, 11:03
  • Сайт

Re: Как сделать Массив из методов с параметрами

Сообщение snezhok_13 03 июл 2017, 12:07

greatPretender писал(а):Юнька ругается : "Cannot implicitly convert type `void' to `System.Action'". Это понятно. Но как это исправить?
Может кто знает как?

Здесь происходит вычисление общего типа для массива, так как вы написали вызов метода, а не имя метода, то тип этой конструкции = типу возвращаемому из метода, тоесть - void. Вам помогут лямбды, и вы их использовали, но все равно терзают смутные сомнения о нужде в таком подходе :)
Разработка игр, немножко игровая журналистика, сейчас делаем Календарь: даты выхода игр
Аватара пользователя
snezhok_13
UNIверсал
 
Сообщения: 450
Зарегистрирован: 09 сен 2013, 11:12
Skype: s.coremission
  • Сайт

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

Сообщение greatPretender 03 июл 2017, 18:57

Задебагил. Работает. Радостно. )
Я не шарю в проганьи; лямбы, экшэны и делегаты я до сих пор не могу прочухать без словесного человеческого объяснения, поэтому пользую, что робит.)
Конструкция нужна для того, чтобы при постоянных выкидывания рандомного значения от 0 до 100%, мне нужно смотреть какой процент получается и в какой критерий она попадает. Критерии это массивы [10%, 30%, 35%, 80%] - примерно так, они ещё и меняются.
По номеру элемента в массиве я получаю какая функция должна сработать. И её беру из словаря по ключу , совпадающему с номером элмента в массиве ))) хех, вот такой велосипед)
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

Сообщение seaman 04 июл 2017, 09:13

Если метод один и тот же, только параметры разные - можно держать в массиве не методы а параметры.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

Сообщение greatPretender 04 июл 2017, 12:50

seaman писал(а):Если метод один и тот же, только параметры разные - можно держать в массиве не методы а параметры.

Это да, но ведь тут не будет выигрыша ни в оптимизации, ни в строках кода. Или я не прав?
Да и скорей всего у меня будет не один метод в словаре.
++++++++++++++++
Меня вот больше другое заботит.
У меня словарь раздулся пока до 15 парк ключ-значение. Этот словарь у меня играет роль хранилища, просто даёт значение по ключу.
А есть ещё один словарь на те же 15 соотв-нно пар, там хранятся критерии выпадения этих методов (в процентах).
Т.е. например, рандом выдал цифру 78%, а он в словаре допустим в конце:
{5%, 10%, 12%, 15%, 30%, 45%, 60%, 65%, 66%, 69%, 70%, 75%, 80%, 85%, 90%, 100%}
и подпадает под критерий 80%.
То чтобы выпал метод, который выпадает с таким знач-е процентов, foreach должен пробежать первые сколько там 12 значений на проверку 78% < 80%, прежде чем получу нужный ключ.
А потом будут вместо этого другие словари , где будет много нулей и 80% будет в конце.
Вот и вопрос: Сильно ли это напряг , если это будет вызывать раз 4-10 сек корутиной в контексте кучи других вычислений?
Это для ИИ и это 1/30 примерно его вычислений в стратегии боя.
Может есть другие структуры, которые сразу выдают значение по схеме "ключ-значение", а не так, перебирая?

Или я парюсь, и эта капля в море современных возможностей вычисления, ведь это 3д-графика?)))
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

Сообщение ilkalawson 04 июл 2017, 13:23

так и ищите по ключу свое значение вместо перебора всех елементов.
Синтаксис:
Используется csharp
try {
 var value = dictionary[key];
} catch(Exception e) {}
ilkalawson
UNIверсал
 
Сообщения: 412
Зарегистрирован: 19 янв 2015, 20:38
Skype: lawsonunity

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

Сообщение greatPretender 04 июл 2017, 19:01

ilkalawson писал(а):так и ищите по ключу свое значение вместо перебора всех елементов.
Синтаксис:
Используется csharp
try {
 var value = dictionary[key];
} catch(Exception e) {}

Try-catch ещё не юзал, не мог понять чёза зверь. Сейчас вроде нашёл внятное описание. Интересно, но ...
Не понял как мне сделать обработку исключений в моё примере.
Ситуация:
1. допустим рандом мне дал число rnd=78%.
2. мне нужно получить ключ , который соотв-ет условию: rnd<(минимального значения в словаре) , т.е. получается соотв-ет значению 80%.
3. получаем номер ключа = 13.
Вопрос:
Какой мне нужно написать код, чтобы обрабатывал этот запрос без for и foreach. Подскажите, я не догоняю.))
И интересно как внутренне работает try-catch, не будет ли его подход избыточно грузить, чем просто перебор foreach такого относительно небольшого словаря))
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

Сообщение samana 06 июл 2017, 10:58

greatPretender писал(а):Ситуация:
1. допустим рандом мне дал число rnd=78%.
2. мне нужно получить ключ , который соотв-ет условию: rnd<(минимального значения в словаре) , т.е. получается соотв-ет значению 80%.
3. получаем номер ключа = 13.
Вопрос:
Какой мне нужно написать код, чтобы обрабатывал этот запрос без for и foreach. Подскажите, я не догоняю.))


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

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

Сообщение greatPretender 07 июл 2017, 11:39

samana писал(а):
greatPretender писал(а):Ситуация:
1. допустим рандом мне дал число rnd=78%.
2. мне нужно получить ключ , который соотв-ет условию: rnd<(минимального значения в словаре) , т.е. получается соотв-ет значению 80%.
3. получаем номер ключа = 13.
Вопрос:
Какой мне нужно написать код, чтобы обрабатывал этот запрос без for и foreach. Подскажите, я не догоняю.))


Если этот рандом у вас только для этого словаря, то может есть смысл просто выбрать случайное значение из словаря?
А в остальных случаях видимо только перебором, но не думаю, что это будет очень загружать, если у вас всего 15 значений.

Нее, у меня же словарь не из сто элементов , типо {1, 2, 3, ... 99, 100}, чтобы вот так слёту получать по каждому проценту вероятности нужный ключ. А интервалами сделано 5%, 11%, 22% => 5%, 16%, 38%.
Ладно, оставлю перебор foreach пока. Просто интересно было так, на будущее, как это через try-catch можно сделать.)
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

Сообщение samana 07 июл 2017, 12:15

Не, не, я думал так:

Синтаксис:
Используется csharp
Dictionary<int, System.Action> dic = new Dictionary<int, System.Action>();
dic.Add(1, () => Debug.Log("1 %"));
dic.Add(12, () => Debug.Log("12 %"));
dic.Add(53, () => Debug.Log("53 %"));
dic.Add(88, () => Debug.Log("88 %"));

int rand = Random.Range(0, dic.Count); // случайное число от 0 до 3
int[] keys = dic.Select(x => x.Key).ToArray(); //создаём массив ключей словаря, можно создать где-то единожды
dic[keys[rand]].Invoke(); //вызываем случайный Action из словаря
}


p.s. Try-catch просто позволяет словить ошибку и обработать её без сбоя приложения. В вашем случае я не знаю как он может пригодится.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

Сообщение ilkalawson 07 июл 2017, 16:18

Просто интересно было так, на будущее, как это через try-catch можно сделать

в случае если у вас отсутствует ключ вы получите ошибку, try catch позволяет просто обойти эту ошибку без остановки всего приложения.
Samana прав, в случае когда известно что ключ точно существует эта схема с исключением не нужна.
можно без Select
Синтаксис:
Используется csharp
int[] keys = dic.Keys.ToArray();// using System.Linq
int rand = Random.Range(0, keys.Lenght); // случайное число от 0 до 3
dic[keys[rand]].Invoke(); //вызываем случайный Action из словаря
ilkalawson
UNIверсал
 
Сообщения: 412
Зарегистрирован: 19 янв 2015, 20:38
Skype: lawsonunity

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

Сообщение samana 07 июл 2017, 17:25

ilkalawson писал(а):можно без Select
Синтаксис:
Используется csharp
int[] keys = dic.Keys.ToArray();

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

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

Сообщение greatPretender 07 июл 2017, 20:26

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

След.

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

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

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