Unreal Engine 4 http://uengine.ru/forum/ |
|
Unreal C++ общие вопросы. http://uengine.ru/forum/viewtopic.php?f=19&t=12369 |
Страница 3 из 8 |
Автор: | Snake [ 17 янв 2018, 11:24 ] |
Заголовок сообщения: | |
Maxonyx , "пердварительное обявление" тут то что нужно, спасибо я уже разобрался. |
Автор: | Snake [ 17 янв 2018, 18:41 ] |
Заголовок сообщения: | |
проблема... интерфейс написанный на С++, и присвоеный какому-нибудь классу уже в блуепринтах, не работает в С++ подробнее: https://wiki.unrealengine.com/Interfaces_And_Blueprints Код: //было auto MyInterface = InterfaceCast < IMyInterface > ( ActorInstance ) ; if ( MyInterface ) { // Другой код } //стало if ( ActorInstance - > GetClass ( ) - > ImplementsInterface ( UMyInterface :: StaticClass ( ) ) ) { // Другой код } но мне нужен реф на интерфейс такой как в первом варианте получаем, возможно получить указатель из нового вида? потому что новый вызов методов интерфейса выглядит так: Код: if ( ActorInstance - > GetClass ( ) - > ImplementsInterface ( UMyInterface :: StaticClass ( ) ) ) { IMyInterface :: Execute_MyInterfaceFunction ( ActorInstance ) ; } а раньше я мог после определения интерфейса и проверки на валидность, в любом участке кода: Код: MyInterface ->Execute_MyInterfaceFunction ( ActorInstance ) ; а в новом виде я не совсем понимаю что происходит... собственно чтоб починить код я б хотел исправить просто переписав получения указателя на интерфейс... ??? |
Автор: | Snake [ 17 янв 2018, 19:36 ] |
Заголовок сообщения: | |
ммм... веротятно реф никак не получить ... это странно... интерфейсы поломанны? потому что обходной путь выглядит как костыль... но в багрепортах анриала нет упоминания вообще о существовании проблемы... только вопросы на ансверхабе, которым в ответ дают этот обходной путь... |
Автор: | Snake [ 17 янв 2018, 20:22 ] |
Заголовок сообщения: | |
на discord-е подсказали ответ: Код: TScriptInterface<IMyInterface> MyInterface; ... //надо все равно как-то проверять есть ли у обьекта этот интерфейс, //можно указать любой обьект, и все будет нормально, пока не будут вызваны методы интерфейса //и это приведет к крашу движка //поэтому: if (ActorInstance ->GetClass()->ImplementsInterface(UMyInterface::StaticClass())) { MyInterface.SetObject(ActorInstance ); } ... if(MyInterface.GetObject()) // - в принципе если обьект статичен то не нужно проверять... { MyInterface->Execute_MyInterfaceFunction ( ActorInstance ) ; } это работает |
Автор: | Snake [ 21 янв 2018, 10:48 ] |
Заголовок сообщения: | |
ммм такой вопрос: есть например bool bInitialized; булевая если которая false то нужно запретить выполняться какому то коду... и нужно постоянно проверять например: Код: void fn() { if(!bInitialized) {break;} .... } и т.п. я смотрю по другому коду анриала есть например check() и другое тут UE_4.18\Engine\Source\Runtime\Core\Public\Misc\AssertionMacros.h но не пойму как ими правильно пользоваться. что то типа check(bInitialized); обьясните как это работает? |
Автор: | Snake [ 21 янв 2018, 11:02 ] |
Заголовок сообщения: | |
понятно, ту ответили нормально : https://answers.unrealengine.com/questi ... ort=oldest check() не для развилки а для гарантированного результата... если он false программа свернется с ошибкой насколько я понял. и еще можно почитать тут: https://docs.unrealengine.com/latest/IN ... ssertions/ |
Автор: | Snake [ 21 янв 2018, 12:39 ] |
Заголовок сообщения: | |
немного С++, пива, и задачка: задачка кафе: для примера: 7 столов ,2 две официантки , каждая обслуживает некое количество столов, в том числе один и тот же стол может быть у нескольких официанток можно принести >1 за стол. пиво нужно носить каждый "тик"(вызов), его на столах все(!) выпивают за этот же "тик" если пиво не принесли, а ивент выпивки сработал -КРАШ программы. -__- для более подробного примерного представления о чем : для тех кто ознакомился с кодом - вопрос! задавать столам bNeedBeerTables из официантов, при условии один стол могут обслуживать сколько угодно официантов... и желательно не проверять этот стол по всем официантам тоесть по картинке: полностью отключаем первого официанта у него столы 1, 2, 3 его массив bNeedBeer{false,false,false} и нужно теперь эти данные передать в bNeedBeerTables по сути нужно выдергивать необслуживаемые официантами столы из цикла бухалова : вот это ивент блокировать Tables[i]->DrinkBeer() как бы это грамотно это организовать без цикличной проверки стола по всем официантам нужен ивент в кафе void разогнать_посетителей(НеобслуживаемыйСтол), который будет инициирован официантом... что-то типа: Код: void разогнать_посетителей(int32 НеобслуживаемыйСтолID)
{ bNeedBeerTables[НеобслуживаемыйСтолID] = false; //но непонятно как по простому узнать вдруг этот стол обслуживается другой официанткой //как-то надо регистрировать это дело ... но чет не соображу как это максимально просто сделать } |
Автор: | Snake [ 21 янв 2018, 15:23 ] |
Заголовок сообщения: | |
еще вопрос: UObject - задать в конструкторе или изменить имя(отображаемое в редакторе) обьекта ? возможно? как? |
Автор: | Andy_rst [ 22 янв 2018, 09:01 ] |
Заголовок сообщения: | Re: |
Snake писал(а): немного С++, пива, и задачка: задачка Ну возможно самое простой забиндить через event dispatcher ивенты на каждого официанта: - Официант_Идет_принимать_заказ, где параметр int = СтолID - Официант_Расcчитал_стол, где параметр int = СтолID - Официант_Принес_пиво, где int = СтолID в эвентах, в зависимости от вызванного event, в массив столов по СтолID заносим стейт стола, что-то вроде: СтолРасчитан, СтолПьет, СтолОжидаетЗаказ, СтолЖдетОфицианта далее в void разогнать_посетителей(int32 столID) { switch столID->СтейтСтола: { case СтолРасчитан: ... разгоняем стол break; case СтолОжидаетЗаказ: ... логика break; default: break; } } Либо просто после того как официант облсужил стол, через какой-то delay вызвать РазогнатьПосетелителй event у стола. |
Автор: | Snake [ 22 янв 2018, 09:23 ] |
Заголовок сообщения: | Re: |
Snake писал(а): еще вопрос: UObject - задать в конструкторе или изменить имя(отображаемое в редакторе) обьекта ? возможно? как? virtual bool Rename ( const TCHAR * NewName, UObject * NewOuter, ERenameFlags Flags ) но что- то не так, крашит двигло... Rename(*FString(GetNameSafe(Obj) + GetNameSafe(this)), Obj, REN_ForceGlobalUnique); |
Страница 3 из 8 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |