С Новым годом! Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
2 / 2 / 0
Регистрация: 14.11.2019
Сообщений: 46

Система событий

24.10.2021, 01:09. Показов 2356. Ответов 13

Студворк — интернет-сервис помощи студентам
Привет! Помогите любителю.
У меня есть статичный класс, в который я записываю все события в сцене.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using UnityEngine;
 
public static class Events
{
    //все событие записываем сюда:
    public static readonly Event OnGameStarted = new Event();
    public static readonly Event OnCapOpenAnimEnded = new Event();
    public static readonly Event<string> OnBoxOpened = new Event<string>();
 
}
 
 
 
 
public class Event
{
    private event Action _action;
 
    public void Invoke()
    {
        _action.Invoke();
    }
 
    public void AddListener(Action listener)
    {
        _action += listener; 
        _action += listener;
    }
    public void RemoveListener(Action listener)
    {
        _action -= listener;
    }
}
 
public class Event<T>
{
    private event Action<T> _action;
 
    public void Invoke(T param)
    {
        _action.Invoke(param);
    }
 
    public void AddListener(Action<T> listener)
    {
        _action += listener; 
        _action += listener;
    }
    public void RemoveListener(Action<T> listener)
    {
        _action -= listener;
    }
}
Допустим я хочу подписать на один и тот же ивент несколько классов (объектов). Но для каких-то классов нужно передать 1 параметр(например string), для других 2, а остальным вообще аргументы не нужны. Как поступить в этом случае? Я же не могу сделать перегрузку ивента.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.10.2021, 01:09
Ответы с готовыми решениями:

Система событий
Учу потихоньку Юнити, наткнулся на видео &quot;Система...

Система событий
Доброго времени суток, решил подытожить для себя, как же все таки работает система Event-ов, в Qt, в частности QEventLoop, eventHandler и...

Система событий PhysX. Передать информацию о столкновении
Здравствуйте. Всех с Новым Годом! Пишу игровой движок. В своем движке использую PhysX SDK для симуляции физики. В PhysX есть класс...

13
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
24.10.2021, 03:39
C#
1
Action<BoxClass>
BoxClass - класс, который будет содержать все нужные поля.
0
2 / 2 / 0
Регистрация: 14.11.2019
Сообщений: 46
24.10.2021, 11:50  [ТС]
Не совсем понял для чего создавать класс. Я и так могу передавать любые параметры. Проблема в том что я вызываю событие в которые передаю параметры, допустим 3. Но эти параметры не всем нужны, кому-то нужно просто это же событие, но он не будет ничего делать с параметрами.
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
24.10.2021, 12:12
Blascovich, событию должно быть всё равно кто на него подписан. Задача события - оповестить всех подписчиков и передать все необходимые параметры (если они есть), которые как-то связаны с этим событием.
Ваши объекты на сцене просто подписываются на нужные события и всё. Если им нужны какие-то данные из параметров события, то они ими пользуются.

Я так и не понял для чего вы создаёте классы public class Event и public class Event<T>, причём в которых происходит двойная подписка...
Ведь есть уже готовые делегаты (Action, Func) и тип event.
0
2 / 2 / 0
Регистрация: 14.11.2019
Сообщений: 46
24.10.2021, 12:56  [ТС]
тут 2 класса Event, в одном я передаю параметры через делегат Action, в другом нет

Добавлено через 2 минуты
в каком месте происходит двойная подписка?
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
24.10.2021, 13:12
Цитата Сообщение от Blascovich Посмотреть сообщение
в каком месте происходит двойная подписка?
Например здесь
C#
1
2
3
4
5
public void AddListener(Action listener)
{
    _action += listener;
    _action += listener;
}
0
2 / 2 / 0
Регистрация: 14.11.2019
Сообщений: 46
24.10.2021, 13:38  [ТС]
спасибо, не увидел.
Но я так и не понял как быть в моём случае с параметрами?)
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
24.10.2021, 13:58
Я не знаю, зачем вам все события в одном месте и будет ли это удобно. Но если что, то события можно создать просто:
C#
1
2
3
4
5
public static event Action GameStarted;
public static event Action GameOver;
public static event Action<Vector3> Explosion; // событие передаёт место взрыва
public static event Action<string> BoxOpened; // событие передаёт текст из открытой коробки
public static event Action<int> PlayerDamaged; // событие передаёт нанесённый урон игрока
Цитата Сообщение от Blascovich Посмотреть сообщение
Допустим я хочу подписать на один и тот же ивент несколько классов (объектов). Но для каких-то классов нужно передать 1 параметр(например string), для других 2, а остальным вообще аргументы не нужны.
Попробуйте конкретно описать то, что вы хотите получить в итоге. Например какие два объекта подписаны на одно событие, но им нужны разные параметры?
0
2 / 2 / 0
Регистрация: 14.11.2019
Сообщений: 46
24.10.2021, 14:09  [ТС]
Например открылась коробочка. В ней лежит предмет.
Я создаю Action с параметрами (GameObject Box, string itemName)

Есть класс со списком, в который я заношу все открывавшиеся игроком коробки в сцене.
Ему нужен только параметр GameObject Box.

Также есть класс игрока, которому нужен параметр itemName.

Но естественно, если я подписываю методы классов на этот Action, то нужно указывать 2 параметра. Собственно вопрос и состоял в том, как мне не плодить кучу одних и тех же событий с разными параметрами для разных классов, а создать одно событие, из которого подписчики возьмут нужный для себя параметр. Возможна ли такая реализация?
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
24.10.2021, 14:35
Так здесь нет никаких проблем, каждый подписчик берёт только нужную ему информацию передаваемую с событием.

Подписки на конкретное событие выглядит у всех объектов одинаково, но никто ведь не заставляет подписчика вообще трогать параметры из этого события... даже если их там целая куча.

Коробочка открылась, создала своё событие с параметрами и всё. Пусть игрок подписывается на это событие и делает всё что угодно при его возникновении. Если ему нужны данные из события, то пусть ими пользуется, а если ему ничего не надо, то пусть и не пользуется. В чём загвоздка?
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
24.10.2021, 14:37
Могу еще раз продублировать своё сообщение. Ты или делаешь 3 разных ивента (что тупо), либо упаковываешь параметры в бокс, коробку, обертку, называй как хочешь. А в методах используешь лишь те параметры, которые тебе нужны. Сесть на 2 стула одновременно не получится, как бы того не хотелось.
0
2 / 2 / 0
Регистрация: 14.11.2019
Сообщений: 46
24.10.2021, 14:48  [ТС]
Может я что-то не понимаю, но когда я подписываю метод обработки события, то я не могу использовать только один из параметров, сигнатура события меня вынуждает обрабатывать 2 параметра.

То есть у игрока метод CheckBox() подписан на событие OnBoxOpen(GameObject Box, itemName).
И в этом методе CheckBox() я должен обработать оба параметра, то есть CheckBox(GameObject Box, itemName), хотя ему нужен только itemName.

Добавлено через 1 минуту
1Max1, спасибо за ответ, но я не совсем понял реализацию.
Можешь более развёрнуто написать на примере одного события?
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
24.10.2021, 15:32
Лучший ответ Сообщение было отмечено Blascovich как решение

Решение

Цитата Сообщение от Blascovich Посмотреть сообщение
Может я что-то не понимаю, но когда я подписываю метод обработки события, то я не могу использовать только один из параметров, сигнатура события меня вынуждает обрабатывать 2 параметра.
Да, обработчик события должен принимать все параметры, которые событие рассылает.
Но никто не вынуждает вас использовать эти параметры. Вы просто создаёте нужную сигнатуру метода и всё.

Допустим у вас существует событие открытия коробочки
C#
1
public static event Action<GameObject, string> BoxOpened;
Далее всем кому нужно узнавать об этом событии - подписывается на него.
Здесь игрок делает подписку на это событие и просто выводит сообщение в консоль. Но может и ничего не делать, вообще ничего.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Player
{
    public Player()
    {
        GameEvents.BoxOpened += GameEvents_BoxOpened;
    }
 
    private void GameEvents_BoxOpened(GameObject box, string itemName)
    {
        // здесь игрок просто узнал, что произошло событие "Открытие Коробки",
        // он совершенно не обязан реагировать на параметры.
 
        // Если ему нужно только itemName, то нет проблем
        Debug.Log("Я нашел " + itemName);
    }
}
0
2 / 2 / 0
Регистрация: 14.11.2019
Сообщений: 46
24.10.2021, 16:49  [ТС]
блин, всё так просто...от души!)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.10.2021, 16:49
Помогаю со студенческими работами здесь

В Журнале событий есть строка с Уровень: Критический, в Общие:"Система перезагрузилась, не завершив полностью работу
Запускал Полную проверку KIS, спустя время посмотрел, KIS не был открыт, а при запуске WIN7, запуск KIS-а не стоит. В Журнале событий...

Сгенерировать 30 случайных событий с интенсивностью 10 событий в час с помощью мастера функций
Добрый день! Помогите решить.:( Задача: Сгенерировать 30 случайных событий с интенсивностью 10 событий в час с помощью мастера функций MS...

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

Суммой двух событий А и В называется событие С, состоящее…1) в наступлении хотя бы одного из событий А и В2
Суммой двух событий А и В называется событие С, состоящее… 1) в наступлении хотя бы одного из событий А и В 2) в наступлении события А...

Произведением двух событий А и В называется событие С, состоящее…1) в наступлении хотя бы одного из событий
Произведением двух событий А и В называется событие С, состоящее… 1) в наступлении хотя бы одного из событий А и В 2) в наступлении...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru