Size: a a a

2021 February 07

M

Max in Unreal Engine
Aleksei DTG
вот если ты напрямую из своего персонажа дёрнешь шмотки, врагов и UI (а вот анимации как раз - норм) - это плохо
А вот использовать событие  условный callback - OnTakeAnyDamage (такой уже есть в классе эктора, но предположим ты свой создал) - это хорошо
ну я же могу также создать OnTakeAnyDamage и вызывать ивенты через интерфейс?) или я чего-то не понимаю
источник

AD

Aleksei DTG in Unreal Engine
Max
но и в случае с диспатчером его надо подключить
да, но здесь есть приниципильная разница, в случае с диспатчером твой персонаж не будет ничего знать ни об
1. Интерфейсе
2. Врагах
3. Шмотках
И это правильно потому что  уменьшается связность, как кода, так и ассетов в блюпринтах, завтра твой коллега Вася перепишет интерфейс, Коля изменит интерфейс класса врагов, а Петя переработает систему шмоток, в результате весь твой код в персонаже упадёт, и ты будешь постоянно его дописывать под новые интерфейсы. (это просто пример, всё зависит от многих факторов, как там на практике это конкретно происходит - надо спросить у тех, кто в больших командах работает)
источник

AD

Aleksei DTG in Unreal Engine
Max
ну я же могу также создать OnTakeAnyDamage и вызывать ивенты через интерфейс?) или я чего-то не понимаю
видимо не понимаешь, причём тут OnTakeAnyDamage и вызов ивентов напрямую вообще? Между ними нет совершенно никакой связи, вернее это противоположные вещи
источник

M

Max in Unreal Engine
Aleksei DTG
да, но здесь есть приниципильная разница, в случае с диспатчером твой персонаж не будет ничего знать ни об
1. Интерфейсе
2. Врагах
3. Шмотках
И это правильно потому что  уменьшается связность, как кода, так и ассетов в блюпринтах, завтра твой коллега Вася перепишет интерфейс, Коля изменит интерфейс класса врагов, а Петя переработает систему шмоток, в результате весь твой код в персонаже упадёт, и ты будешь постоянно его дописывать под новые интерфейсы. (это просто пример, всё зависит от многих факторов, как там на практике это конкретно происходит - надо спросить у тех, кто в больших командах работает)
ок. тогда зачем нужен интерфейс если диспатчер так хорош? что ни коля ни вася не испортят логику?
источник

AD

Aleksei DTG in Unreal Engine
Max
ок. тогда зачем нужен интерфейс если диспатчер так хорош? что ни коля ни вася не испортят логику?
потому что это разные вещи для разных целей. Возвращаясь к примеру с UI: есть универсальный виджет HP который можно повесить как на игрока, так и на противника

Виджет обновляет свою информацию путём функции обратного вызова на целевом экторе. Т.е. у эктора меняется HP, вызывается диспатчер OnHealthChanged, на который UI заранее заботливо подписался.
Но тут есть интересный момент, как я сказал - виджет универсальный. он умеет показывать здоровье игрока, npc и даже деревянных ящиков на уровне. Но это 3 разных класса, не имеющих общих предков кроме AActor.
Значит, в каждом из них свой уникальный диспатчер, сигнализирующий об изменении HP
Далее, плохой вариант: UI пытается понять к какому классу принадлежит его эктор, делает каст и подписывается на конкретный делегат

Хороший вариант: есть, к примеру, интерфейс, возвращающий этот делегат. Эти 3 класса его имплементируют. UI через интерфейс получает ссылку на этот делегат и подписывается на него (это условный пример, в BP так делать нельзя). Таким образом он не знает какой класс на другом конце, ему достаточно знать, что там есть данная функция, всё остальное его не волнует
Ещё более удобный вариант для анрила: ищем в экторе компонент, отвечающий за хп (Если такой имеется), подписываемся на его делегат. Будет работать с любым эктором, в котором есть такой компонент. И не надо тогда делать интерфейс
источник

AD

Aleksei DTG in Unreal Engine
ну или простейший пример: стрельнул в кого-то трейсом, и через интерфейс применил условный ApplyDamage, если актор его реализует - получит дамагу. Пример не сильно релевантен анрилу, т.к. там уже есть функции TakeDamage и они объявлены не в отдельном интерфейсе, а в AActor.h, но если бы ты писал свой фреймворк с нуля, то возможно захотел бы сделать что-то типа IDamageable
источник

M

Max in Unreal Engine
Aleksei DTG
ну или простейший пример: стрельнул в кого-то трейсом, и через интерфейс применил условный ApplyDamage, если актор его реализует - получит дамагу. Пример не сильно релевантен анрилу, т.к. там уже есть функции TakeDamage и они объявлены не в отдельном интерфейсе, а в AActor.h, но если бы ты писал свой фреймворк с нуля, то возможно захотел бы сделать что-то типа IDamageable
короче создал триггер. в первом случае я крашу кубики из характера  когда игрок получает урон (диспатчер, красные кубики). во втором случае крашу из триггера когда игрок оверлапит его. когда я размножил их через альт, выходит у диспатчера преимущество, т.к. чтобы поменять всем копиям через интерфейс надо еще цикл писать. видимо пойму существенную разницу только на каком нибудь большом проекте на конкретном примере в чем преимущество например интерфейса перед диспатчером в рамках бп) потому что если на таком простом примере смотреть, то да, диспатчер удобнее
источник

AD

Aleksei DTG in Unreal Engine
Max
короче создал триггер. в первом случае я крашу кубики из характера  когда игрок получает урон (диспатчер, красные кубики). во втором случае крашу из триггера когда игрок оверлапит его. когда я размножил их через альт, выходит у диспатчера преимущество, т.к. чтобы поменять всем копиям через интерфейс надо еще цикл писать. видимо пойму существенную разницу только на каком нибудь большом проекте на конкретном примере в чем преимущество например интерфейса перед диспатчером в рамках бп) потому что если на таком простом примере смотреть, то да, диспатчер удобнее
лично я бы посоветовал просто почитать различную литературу по разработке ПО, тогда станет понятнее. Но это просто совет.
источник

MM

Mark Marker in Unreal Engine
Aleksei DTG
лично я бы посоветовал просто почитать различную литературу по разработке ПО, тогда станет понятнее. Но это просто совет.
+
источник

M

Max in Unreal Engine
когда есть масса свободного времени, читать все обо всем, согласен, хорошо
источник

M

Max in Unreal Engine
в рамках ограниченного времени пытаешься понять как что работает и зачем нужно по мере использования этого в проекте
источник

M

Max in Unreal Engine
я гуглил, но на форумах толком нормальной инфы не нашел с примерами использования
источник

VA

Vladimir Alyamkin in Unreal Engine
Max
короче создал триггер. в первом случае я крашу кубики из характера  когда игрок получает урон (диспатчер, красные кубики). во втором случае крашу из триггера когда игрок оверлапит его. когда я размножил их через альт, выходит у диспатчера преимущество, т.к. чтобы поменять всем копиям через интерфейс надо еще цикл писать. видимо пойму существенную разницу только на каком нибудь большом проекте на конкретном примере в чем преимущество например интерфейса перед диспатчером в рамках бп) потому что если на таком простом примере смотреть, то да, диспатчер удобнее
я чет не догоняю как ты интерфейс и диспатчер вообще рядом ставишь
источник

VA

Vladimir Alyamkin in Unreal Engine
вопрос выглядит как то так счас: в чем преимущества вилки перед тарелкой.
источник

NS

Nick Samarin in Unreal Engine
Vladimir Alyamkin
вопрос выглядит как то так счас: в чем преимущества вилки перед тарелкой.
с вилки руками есть неудобно :)
источник

M

Max in Unreal Engine
Max
немного путает область применения интерфейсов и диспатчеров. к примеру у меня есть триггер, по оверлапу которого включается свет, открываются шторы, запускается музыкальный центр. Я пишу в тригере ивент или диспатчер и потом обращаюсь к ивентам разных бп на уровне. В чем координальные различия?
@ufnah изначально вопрос был про область применения вилки и тарелки) Леша сказал что при использовании интерфейса другие коллеги могут мне все попортить, отсюда родился вопрос, накой тогда интерфейс)
источник

M

Max in Unreal Engine
если брать пример с получением дамага персом и передачей инфы другим бп. то это по сути можно сделать и с помощью обоих. собственно тогда вопрос. в чем принципиальные различия применения  именно в блюпринтах? сейчас кажется что диспатчером удобнее пользоваться для передачи инфы между бп чтобы каждый не знал друг о друге
источник

CA

Cubic Angle in Unreal Engine
Max
@ufnah изначально вопрос был про область применения вилки и тарелки) Леша сказал что при использовании интерфейса другие коллеги могут мне все попортить, отсюда родился вопрос, накой тогда интерфейс)
интерфейс - это ооп и разрыв связей

отлично помогает
источник

AD

Aleksei DTG in Unreal Engine
Max
@ufnah изначально вопрос был про область применения вилки и тарелки) Леша сказал что при использовании интерфейса другие коллеги могут мне все попортить, отсюда родился вопрос, накой тогда интерфейс)
попортить тебе может сильное связывание, а не интерфейс
источник

AD

Aleksei DTG in Unreal Engine
интерфейс как-раз таки тебя избавляет от такого связывания
источник