Простая система событий/сообщений [ГОТОВО]

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

Простая система событий/сообщений [ГОТОВО]

Сообщение [bm] 29 апр 2011, 15:00

Делюсь с обществом своим простым менеджером событий:

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

public delegate void EventHandler();
public delegate void EventHandlerArg(object obj);
public delegate void EventHandlerArgs(object[] objects);

#pragma warning disable

public class EventManager
{
    private static readonly Dictionary<string, EventHandler> eventHandlers = new Dictionary<string, EventHandler>();
    private static readonly Dictionary<string, EventHandlerArg> eventHandlersArg = new Dictionary<string, EventHandlerArg>();
    private static readonly Dictionary<string, EventHandlerArgs> eventHandlersArgs = new Dictionary<string, EventHandlerArgs>();

    public static void AddListener(string message, EventHandler handler)
    {
        if (eventHandlers.ContainsKey(message))
        {
            eventHandlers[message] += handler;
        }
        else
        {
            eventHandlers.Add(message, handler);
       }
    }

    public static void RemoveListener(string message, EventHandler handler)
    {
        if (eventHandlers.ContainsKey(message))
        {
            eventHandlers[message] -= handler;
        }
    }

    public static void AddListener(string message, EventHandlerArg handler)
    {
        if (eventHandlersArg.ContainsKey(message))
        {
            eventHandlersArg[message] += handler;
        }
        else
        {
            eventHandlersArg.Add(message, handler);
        }
    }

    public static void RemoveListener(string message, EventHandlerArg handler)
    {
        if (eventHandlersArg.ContainsKey(message))
        {
            eventHandlersArg[message] -= handler;
        }
        else
        {
            Debug.LogWarning("you tried to remove event named: " + message + " , but it's absent or it was removed.");
        }
    }

    public static void Invoke(string message)
    {
        if (eventHandlers.ContainsKey(message))
        {
            eventHandlers[message]();
        }
        else
        {
            Debug.LogWarning("you tried to call event named: " + message + " , but it's absent or it was removed.");
        }
    }

    public static void Invoke(string message, object argument)
    {
        if (eventHandlersArg.ContainsKey(message))
        {
            eventHandlersArg[message](argument);
        }
        else
        {
            Debug.LogWarning("you tried to call event named: " + message + " , but it's absent or it was removed.");
        }
    }
}
 


Пример:

аттачим скрипт к нескольким объектам:
Синтаксис:
Используется csharp
using UnityEngine;

public class Listener: MonoBehaviour
{
        void Start()
        {
             EventManager.AddListener("PrintMessage", Test);
        }

        void Test(object msg)
        {
             string message = (string)msg;
             Debug.Log(gameObject.GetInstanceID() + " said: " + message);
        }

        void OnDisable()
        {
            EventManager.RemoveListener("PrintMessage", Test);
        }
}
 


вызываем так из любого скрипта:

EventManager.Invoke("PrintMessage", "Hello World!);
Последний раз редактировалось [bm] 30 апр 2011, 20:18, всего редактировалось 1 раз.
Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск

Re: Простая система событий/сообщений [ГОТОВО]

Сообщение gnoblin 29 апр 2011, 16:38

спс! :)

а ещё есть минималистичный Messenger.cs от prime31 (можно найти в его пакадже на github)

Как по количеству кода так у тебя вроде бы вышло короче ).

Ещё было бы круто примеров для популяризации подхода /:)
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Простая система событий/сообщений [ГОТОВО]

Сообщение DbIMok 29 апр 2011, 16:52

правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Простая система событий/сообщений [ГОТОВО]

Сообщение Order 29 апр 2011, 17:35

Вот бы коментов еще...

Делал подобную систему, только я потом через case запускал нужные функции, а в этом примере какой принцип ?
Добавить rusorder в Skype , _juc4you@mail.ru ;
Платные консультации, программирование ваших проектов Unity3d,C#,IOS,Android.
Скрытый текст:
_ttp://www.youtube.com/watch?v=1m2qTnatSjM&list=UUjcKNvONEUHCILG7QrX1NFg
Order
Старожил
 
Сообщения: 805
Зарегистрирован: 21 фев 2010, 10:34

Re: Простая система событий/сообщений [ГОТОВО]

Сообщение Neodrop 29 апр 2011, 17:44

Я сложение мерял на скорость давно. Ещё на 2.x.x версиях Юньки, когда свой Antares Manager писал.
Может в текущей версии MONO всё бодрее.
Правда сомнения есть всё-же :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Простая система событий/сообщений [ГОТОВО]

Сообщение [bm] 30 апр 2011, 20:09

Сделал сие после просмотра примера от Prime31, и по подобию AntaresManger.

string, в названии события, медленнее int в 20 раз, но удобство берет свое. Пробовал enum - медленнее string в разы.

Насчет сложения делегатов как-то не переживаю. Все же не думаю что за фрейм будет 1000+ вызовов.
Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск

Re: Простая система событий/сообщений [ГОТОВО]

Сообщение Mr_Anderson 30 апр 2011, 21:55

Значит, по Вашим тестам использование Enum в качестве ключа Dictionary будет хуже String по скорости доступа к значению? Как тестировали?
Mr_Anderson
UNIт
 
Сообщения: 143
Зарегистрирован: 16 апр 2009, 13:32

Re: Простая система событий/сообщений [ГОТОВО]

Сообщение [bm] 01 май 2011, 19:51

Mr_Anderson писал(а):Значит, по Вашим тестам использование Enum в качестве ключа Dictionary будет хуже String по скорости доступа к значению? Как тестировали?

просто, изменяем в классе string на enum (тем самым я хотел создать список предсказуемых евентов), и вызываем 1000+ раз, далее высчитывая время и делаем выводы.
Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск

Re: Простая система событий/сообщений [ГОТОВО]

Сообщение Neodrop 01 май 2011, 20:46

Antares.Manager держит 6000+ в миллисекунду (пустой метод).
Antares.VIZIO.Manager во много раз больше (почти скорость нативного вызова).

:-?

Но, то что сам напишешь, всегда удобнее :ymparty:
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт


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

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

Сейчас этот форум просматривают: Google [Bot] и гости: 10