Полезное

Мы Вконтакте

Discord канал

#
Аватара пользователя
Пользователь
Сообщения: 1904
Maxonyx , "пердварительное обявление" тут то что нужно, спасибо я уже разобрался.
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 1904
проблема...
интерфейс написанный на С++, и присвоеный какому-нибудь классу уже в блуепринтах, не работает в С++
подробнее:
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 ) ;

а в новом виде я не совсем понимаю что происходит...
собственно чтоб починить код я б хотел исправить просто переписав получения указателя на интерфейс...
???
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 1904
ммм...
веротятно реф никак не получить ... это странно...
интерфейсы поломанны? потому что обходной путь выглядит как костыль...
но в багрепортах анриала нет упоминания вообще о существовании проблемы...
только вопросы на ансверхабе, которым в ответ дают этот обходной путь...
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 1904
на discord-е подсказали ответ:

Код:
TScriptInterface<IMyInterface> MyInterface;
...
//надо все равно как-то проверять есть ли у обьекта этот интерфейс,
//можно указать любой обьект, и все будет нормально, пока не будут вызваны методы интерфейса
//и это приведет к крашу движка
//поэтому:
if (ActorInstance ->GetClass()->ImplementsInterface(UMyInterface::StaticClass())) {
     MyInterface.SetObject(ActorInstance );
}
...
if(MyInterface.GetObject()) // - в принципе если обьект статичен то не нужно проверять...
{
    MyInterface->Execute_MyInterfaceFunction ( ActorInstance ) ;
}

это работает
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 1904
ммм такой вопрос:
есть например
bool bInitialized;
булевая если которая false то нужно запретить выполняться какому то коду...

и нужно постоянно проверять например:
Код:
void fn()
{
    if(!bInitialized)
    {break;}
    ....
}

и т.п.

я смотрю по другому коду анриала
есть например
check()
и другое тут
UE_4.18\Engine\Source\Runtime\Core\Public\Misc\AssertionMacros.h
но не пойму как ими правильно пользоваться.
что то типа
check(bInitialized);
обьясните как это работает?
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 1904
понятно, ту ответили нормально :
https://answers.unrealengine.com/questi ... ort=oldest
check() не для развилки а для гарантированного результата... если он false программа свернется с ошибкой насколько я понял.
и еще можно почитать тут:
https://docs.unrealengine.com/latest/IN ... ssertions/
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 1904
немного С++, пива, и задачка:

задачка
кафе:
для примера: 7 столов ,2 две официантки ,
каждая обслуживает некое количество столов, в том числе один и тот же стол может быть у нескольких официанток
можно принести >1 за стол.
пиво нужно носить каждый "тик"(вызов), его на столах все(!) выпивают за этот же "тик"
если пиво не принесли, а ивент выпивки сработал -КРАШ программы. -__-


для более подробного примерного представления о чем :


Изображение
для тех кто ознакомился с кодом -
вопрос!
задавать столам bNeedBeerTables из официантов, при условии один стол могут обслуживать сколько угодно официантов...
и желательно не проверять этот стол по всем официантам
тоесть по картинке:
полностью отключаем первого официанта у него столы 1, 2, 3
его массив bNeedBeer{false,false,false}
и нужно теперь эти данные передать в bNeedBeerTables
по сути нужно выдергивать необслуживаемые официантами столы из цикла бухалова : вот это ивент блокировать Tables[i]->DrinkBeer()
как бы это грамотно это организовать без цикличной проверки стола по всем официантам
нужен ивент в кафе void разогнать_посетителей(НеобслуживаемыйСтол), который будет инициирован официантом...
что-то типа:
Код:
void разогнать_посетителей(int32 НеобслуживаемыйСтолID)
{
  bNeedBeerTables[НеобслуживаемыйСтолID] = false;
  //но непонятно как по простому узнать вдруг этот стол обслуживается другой официанткой
  //как-то надо регистрировать это дело ... но чет не соображу как это максимально просто сделать
}

_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 1904
еще вопрос:
UObject - задать в конструкторе или изменить имя(отображаемое в редакторе) обьекта ? возможно? как?
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 848
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 у стола.
_________________
https://www.facebook.com/groups/uejob/
Аватара пользователя
Пользователь
Сообщения: 1904
Snake писал(а):
еще вопрос:
UObject - задать в конструкторе или изменить имя(отображаемое в редакторе) обьекта ? возможно? как?

virtual bool Rename
(
const TCHAR * NewName,
UObject * NewOuter,
ERenameFlags Flags
)
но что- то не так, крашит двигло...

Rename(*FString(GetNameSafe(Obj) + GetNameSafe(this)), Obj, REN_ForceGlobalUnique);
_________________
we need to go deeper


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

UEngine.ru © 2017
Все права защищены. При копировании материалов с сайта, ссылка на первоисточник обязательна.
Яндекс.Метрика
Главная страница