Unreal Engine 4 http://uengine.ru/forum/ |
|
Unreal C++ общие вопросы. http://uengine.ru/forum/viewtopic.php?f=19&t=12369 |
Страница 4 из 8 |
Автор: | Andy_rst [ 22 янв 2018, 09:28 ] |
Заголовок сообщения: | Re: Re: |
Snake писал(а): Snake писал(а): еще вопрос: UObject - задать в конструкторе или изменить имя(отображаемое в редакторе) обьекта ? возможно? как? virtual bool Rename ( const TCHAR * NewName, UObject * NewOuter, ERenameFlags Flags ) но что- то не так, крашит двигло... Rename(*FString(GetNameSafe(Obj) + GetNameSafe(this)), Obj, REN_ForceGlobalUnique); В PostInitProperties вызвать? |
Автор: | Snake [ 22 янв 2018, 09:52 ] |
Заголовок сообщения: | |
Andy_rst , зделал массив булевый у каждого стола... если за него отвечает официант, он добавляет в массив булевую свою. и записывает в ассоциативный массив адресс - Код: class UWaiter //класс официант { ... TMap<int32,int32> ServiceBollAdress //tableID , boolID ... } /////////////////////////// class UTable { void DrinkBeer() {};// TArray<bool> bNeedBeerTables; //по сути это - кеш булевых из официантов }; //////////////////////////// //булевые из официанта в столы //где в метод вставить это кусок для инициализации // и аналогичным способов обновлять булевые значения уже в каком-то друго методе for (int i = 0; i < Waiter.Num(); i++) //задаем булевые массивы в столах и записываем адреса { for (int j = 0; j < Waiter[j]->HereTableCachedID.Num(); j++) { //boolID int32 d =Tables[Waiter[j]->HereTableCachedI[j]].bNeedBeerTables.Add(bNeedBeer[Waiter[j]->HereTableCachedI[j]]); ServiceBollAdress.Add(Waiter[j]->HereTableCachedI[j], d); //add to TMap } } //////////// ... void CafeRun() { for (int j = 0; j < Waiter.Num(); j++)//цикл официантов { for (int i = 0; i < Waiter[j]->HereTableCachedID.Num(); i++) //цикл обслуживаемых столов у официанта { //проверяем нужно ли нести на стол пиво //содержит ли булевый массив true //это должно быть быстро по идее if (Tables[Waiter[j]->HereTableCachedID].bNeedBeerTables.Contains(true)) { Waiter[j]->SetBeer(Tables[Waiter[j]->HereTableCachedID]);//несем пиво } } } TablesDrinkBeer(); //столы выпивают пиво } немного грязно именно в такой записи потому что айди столов и ключи ассоциативного массива булевых адресов дублируется поэтому их нужно обьединить в одну переменную. проверка булевого массива содержит ли он true - если зависит от размера массива, тогда проверка столов с одним официантом будет мгновенная, а с большим кол-вом официантов пропорциональна их количству на данный стол. так что я думаю что это неплохой способ. по сути это официант выставляет и убирает таблички на стол "свободная касса!", и запоминает какя из табличек его. если на столе есть хоть одна табличка значит стол обслуживается. можно наоброт в столы записывать адреса булевых в официантах... и читать булевые прямо из официантов. но тогда становится неудобная проверка в цикле хоть и по прямым адресам, не будет мозможности для быстрой .Contains(true) естественно в оригинальная задача не связанна с кафе... поток данных просто аналогичный. |
Автор: | Snake [ 22 янв 2018, 10:10 ] |
Заголовок сообщения: | |
Цитата: В PostInitProperties вызвать? хм... неа не хотит: Код: virtual void PostInitProperties() override { Super::PostInitProperties(); Rename(*FString(GetNameSafe(this->GetOuter()) + GetNameSafe(this)), this->GetOuter(), REN_ForceGlobalUnique); } краш... оно мне по сути только для дебага нужно... чтоб видеть кому принадлежит у обжект по его имени... а ну еще немного смущает... что есть одноименные уобжекты в редакторе... понятно что имя для редактора не определяет идентификацию обжекта, но все же... |
Автор: | Andy_rst [ 22 янв 2018, 10:31 ] |
Заголовок сообщения: | Re: |
Snake писал(а): Цитата: В PostInitProperties вызвать? хм... неа не хотит: Код: virtual void PostInitProperties() override { Super::PostInitProperties(); Rename(*FString(GetNameSafe(this->GetOuter()) + GetNameSafe(this)), this->GetOuter(), REN_ForceGlobalUnique); } краш... оно мне по сути только для дебага нужно... чтоб видеть кому принадлежит у обжект по его имени... а ну еще немного смущает... что есть одноименные уобжекты в редакторе... понятно что имя для редактора не определяет идентификацию обжекта, но все же... Возможно: UObject::Rename is looking for a const TCHAR* const TCHAR * NewName const TCHAR* newName = *FString(GetNameSafe(this->GetOuter()) + GetNameSafe(this)); или const TCHAR * newName = ANSI_TO_TCHAR(....); |
Автор: | Snake [ 22 янв 2018, 10:44 ] |
Заголовок сообщения: | |
все равно крашит...с бриак-понитом на Rename() надо пример у епкиов найти...у какого клааса может быть такая ерунда? |
Автор: | Andy_rst [ 22 янв 2018, 11:03 ] |
Заголовок сообщения: | Re: |
Snake писал(а): все равно крашит...с бриак-понитом на Rename() надо пример у епкиов найти...у какого клааса может быть такая ерунда? // Rename component to avoid naming conflicts in the case where we rerun the SCS and name the new components the same way. FName const NewBaseName( *(FString::Printf(TEXT("TRASH_%s"), *Component->GetClass()->GetName())) ); FName const NewObjectName = MakeUniqueObjectName(this, GetClass(), NewBaseName); Component->Rename(*NewObjectName.ToString(), this, REN_ForceNoResetLoaders|REN_DontCreateRedirectors|REN_NonTransactional); |
Автор: | Snake [ 22 янв 2018, 23:32 ] |
Заголовок сообщения: | |
Andy_rst , по примеру этого кода - работает! Благодарю. только с флагами не совсем понятно... какие нужны, какие нет. |
Автор: | Andy_rst [ 23 янв 2018, 12:59 ] |
Заголовок сообщения: | Re: |
Snake писал(а): Andy_rst , по примеру этого кода - работает! Благодарю. только с флагами не совсем понятно... какие нужны, какие нет. Это внутри движка, в одном из мест где удаляется actor, скорее всего тип флага(ов) нужно смотреть, но какие точно сложный вопрос. |
Автор: | Snake [ 23 янв 2018, 13:22 ] |
Заголовок сообщения: | |
елси нужно тупо изменить имя и больше ничего. в момент изменения имени только Outer связан с обьектом, обьект больше ни на кого не завязан. тоесть владельца не меняем, и указатели на обьект присваиваются уже после изменения имени... переконструировать или обновлять какие либо переменные тоже не нужно. и обьект дальше должен работать как обычно. формулировки у флагом такие неконкретные... что их назначение непонятное. |
Автор: | Snake [ 25 янв 2018, 08:51 ] |
Заголовок сообщения: | |
хочу с делегатами на С++ разобраться... и мне требуется немного помощи: по порядку: декларирование? в каком классе должна быть декларация в том котором вызывается ивент, или в том в котором мы хотим его забиндить. тоесть как это работает? делегат привязывается к существующему ивенту? и вызывает бинд функцию когда сработал привязанный ивент? хм пример какойто... Код: class MyClass { bool MyBool; void changeBool(bool NewValue) { Mybool = NewValue; } } //в другом хедере class OtherClass { MyClass* SomeName; virtual void UpdateBoolInSomeName(); } нужно чтоб в классе OtherClass срабатывал ивент UpdateBoolInSomeName() каждый раз когда в переменной SomeClass будет срабвтывать ивент changeBool() Example? |
Страница 4 из 8 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |